mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-12 20:43:02 +00:00
Add "spawn new" button
This commit is contained in:
@@ -29,6 +29,7 @@ const ServerDashboard = (props) => {
|
|||||||
|
|
||||||
var [errorAlert, setErrorAlert] = useState(null);
|
var [errorAlert, setErrorAlert] = useState(null);
|
||||||
var [sortMethod, setSortMethod] = useState(null);
|
var [sortMethod, setSortMethod] = useState(null);
|
||||||
|
var [disabledButtons, setDisabledButtons] = useState({});
|
||||||
|
|
||||||
var user_data = useSelector((state) => state.user_data),
|
var user_data = useSelector((state) => state.user_data),
|
||||||
user_page = useSelector((state) => state.user_page),
|
user_page = useSelector((state) => state.user_page),
|
||||||
@@ -241,9 +242,10 @@ const ServerDashboard = (props) => {
|
|||||||
...(e.servers || {}),
|
...(e.servers || {}),
|
||||||
});
|
});
|
||||||
return userServers.map((server) => {
|
return userServers.map((server) => {
|
||||||
|
server = { name: "", ...server };
|
||||||
return (
|
return (
|
||||||
<tr key={i + "row"} className="user-row">
|
<tr key={i + "row"} className="user-row">
|
||||||
{!(server || {}).name && (
|
{!server.name && (
|
||||||
<td
|
<td
|
||||||
data-testid="user-row-name"
|
data-testid="user-row-name"
|
||||||
rowspan={userServers.length}
|
rowspan={userServers.length}
|
||||||
@@ -251,7 +253,7 @@ const ServerDashboard = (props) => {
|
|||||||
{e.name}
|
{e.name}
|
||||||
</td>
|
</td>
|
||||||
)}
|
)}
|
||||||
{!(server || {}).name && (
|
{!server.name && (
|
||||||
<td
|
<td
|
||||||
data-testid="user-row-admin"
|
data-testid="user-row-admin"
|
||||||
rowspan={userServers.length}
|
rowspan={userServers.length}
|
||||||
@@ -261,19 +263,28 @@ const ServerDashboard = (props) => {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<td data-testid="user-row-name">
|
<td data-testid="user-row-name">
|
||||||
{(server || {}).name || "[MAIN]"}
|
{server.name || "[MAIN]"}
|
||||||
</td>
|
</td>
|
||||||
<td data-testid="user-row-last-activity">
|
<td data-testid="user-row-last-activity">
|
||||||
{(server || {}).last_activity
|
{server.last_activity
|
||||||
? timeSince(server.last_activity)
|
? timeSince(server.last_activity)
|
||||||
: "Never"}
|
: "Never"}
|
||||||
</td>
|
</td>
|
||||||
<td data-testid="user-row-server-activity">
|
<td data-testid="user-row-server-activity">
|
||||||
{server != null ? (
|
{server.started ? (
|
||||||
// Stop Single-user server
|
// Stop Single-user server
|
||||||
|
<>
|
||||||
<button
|
<button
|
||||||
className="btn btn-danger btn-xs stop-button"
|
className="btn btn-danger btn-xs stop-button"
|
||||||
onClick={() =>
|
disabled={
|
||||||
|
disabledButtons[
|
||||||
|
`stop__${e.name}__${server.name}`
|
||||||
|
] || false
|
||||||
|
}
|
||||||
|
onClick={() => {
|
||||||
|
setDisabledButtons({
|
||||||
|
[`stop__${e.name}__${server.name}`]: true,
|
||||||
|
});
|
||||||
stopServer(e.name, server.name)
|
stopServer(e.name, server.name)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.status < 300) {
|
if (res.status < 300) {
|
||||||
@@ -293,16 +304,38 @@ const ServerDashboard = (props) => {
|
|||||||
})
|
})
|
||||||
.catch(() =>
|
.catch(() =>
|
||||||
setErrorAlert(`Failed to stop server.`)
|
setErrorAlert(`Failed to stop server.`)
|
||||||
)
|
);
|
||||||
}
|
}}
|
||||||
>
|
>
|
||||||
Stop Server
|
Stop Server
|
||||||
</button>
|
</button>
|
||||||
|
<a
|
||||||
|
href={`/user/${e.name}${
|
||||||
|
server && server.name && "/" + server.name
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className="btn btn-primary btn-xs"
|
||||||
|
style={{ marginRight: 20 }}
|
||||||
|
>
|
||||||
|
Access Server
|
||||||
|
</button>
|
||||||
|
</a>
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
// Start Single-user server
|
// Start Single-user server
|
||||||
|
<>
|
||||||
<button
|
<button
|
||||||
className="btn btn-primary btn-xs start-button"
|
className="btn btn-success btn-xs start-button"
|
||||||
onClick={() =>
|
disabled={
|
||||||
|
disabledButtons[
|
||||||
|
`start__${e.name}__${server.name}`
|
||||||
|
] || false
|
||||||
|
}
|
||||||
|
onClick={() => {
|
||||||
|
setDisabledButtons({
|
||||||
|
[`start__${e.name}__${server.name}`]: true,
|
||||||
|
});
|
||||||
startServer(e.name, (server || {}).name)
|
startServer(e.name, (server || {}).name)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.status < 300) {
|
if (res.status < 300) {
|
||||||
@@ -322,11 +355,24 @@ const ServerDashboard = (props) => {
|
|||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
setErrorAlert(`Failed to start server.`);
|
setErrorAlert(`Failed to start server.`);
|
||||||
})
|
});
|
||||||
}
|
}}
|
||||||
>
|
>
|
||||||
Start Server
|
Restart Server
|
||||||
</button>
|
</button>
|
||||||
|
<a
|
||||||
|
href={`/spawn/${e.name}${
|
||||||
|
server.name && "/" + server.name
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className="btn btn-secondary btn-xs"
|
||||||
|
style={{ marginRight: 20 }}
|
||||||
|
>
|
||||||
|
Spawn New
|
||||||
|
</button>
|
||||||
|
</a>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@@ -346,18 +392,6 @@ const ServerDashboard = (props) => {
|
|||||||
>
|
>
|
||||||
edit user
|
edit user
|
||||||
</button>
|
</button>
|
||||||
<a
|
|
||||||
href={`/user/${e.name}${
|
|
||||||
server && server.name && "/" + server.name
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
<button
|
|
||||||
className="btn btn-primary btn-xs"
|
|
||||||
style={{ marginRight: 20 }}
|
|
||||||
>
|
|
||||||
Access Server
|
|
||||||
</button>
|
|
||||||
</a>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
);
|
);
|
||||||
|
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user