jupyterhub/theme/static/js/admin.js

297 lines
7.8 KiB
JavaScript

// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
require(["jquery", "moment", "jhapi", "utils"], function (
$,
moment,
JHAPI,
utils,
) {
"use strict";
var base_url = window.jhdata.base_url;
var prefix = window.jhdata.prefix;
var admin_access = window.jhdata.admin_access;
var options_form = window.jhdata.options_form;
var api = new JHAPI(base_url);
function getRow(element) {
var original = element;
while (!element.hasClass("server-row")) {
element = element.parent();
if (element[0].tagName === "BODY") {
console.error("Couldn't find row for", original);
throw new Error("No server-row found");
}
}
return element;
}
function resort(col, order) {
var query = window.location.search.slice(1).split("&");
// if col already present in args, remove it
var i = 0;
while (i < query.length) {
if (query[i] === "sort=" + col) {
query.splice(i, 1);
if (query[i] && query[i].substr(0, 6) === "order=") {
query.splice(i, 1);
}
} else {
i += 1;
}
}
// add new order to the front
if (order) {
query.unshift("order=" + order);
}
query.unshift("sort=" + col);
// reload page with new order
window.location = window.location.pathname + "?" + query.join("&");
}
$("th").map(function (i, th) {
th = $(th);
var col = th.data("sort");
if (!col || col.length === 0) {
return;
}
var order = th.find("i").hasClass("fa-sort-desc") ? "asc" : "desc";
th.find("a").click(function () {
resort(col, order);
});
});
$(".time-col").map(function (i, el) {
// convert ISO datestamps to nice momentjs ones
el = $(el);
var m = moment(new Date(el.text().trim()));
el.text(m.isValid() ? m.fromNow() : "Never");
});
$(".stop-server").click(function () {
var el = $(this);
var row = getRow(el);
var serverName = row.data("server-name");
var user = row.data("user");
el.text("stopping...");
var stop = function (options) {
return api.stop_server(user, options);
};
if (serverName !== "") {
stop = function (options) {
return api.stop_named_server(user, serverName, options);
};
}
stop({
success: function () {
el.text("stop " + serverName).addClass("hidden");
row.find(".access-server").addClass("hidden");
row.find(".start-server").removeClass("hidden");
},
});
});
$(".delete-server").click(function () {
var el = $(this);
var row = getRow(el);
var serverName = row.data("server-name");
var user = row.data("user");
el.text("deleting...");
api.delete_named_server(user, serverName, {
success: function () {
row.remove();
},
});
});
$(".access-server").map(function (i, el) {
el = $(el);
var row = getRow(el);
var user = row.data("user");
var serverName = row.data("server-name");
el.attr(
"href",
utils.url_path_join(prefix, "user", user, serverName) + "/",
);
});
if (admin_access && options_form) {
// if admin access and options form are enabled
// link to spawn page instead of making API requests
$(".start-server").map(function (i, el) {
el = $(el);
var row = getRow(el);
var user = row.data("user");
var serverName = row.data("server-name");
el.attr(
"href",
utils.url_path_join(prefix, "hub/spawn", user, serverName),
);
});
// cannot start all servers in this case
// since it would mean opening a bunch of tabs
$("#start-all-servers").addClass("hidden");
} else {
$(".start-server").click(function () {
var el = $(this);
var row = getRow(el);
var user = row.data("user");
var serverName = row.data("server-name");
el.text("starting...");
var start = function (options) {
return api.start_server(user, options);
};
if (serverName !== "") {
start = function (options) {
return api.start_named_server(user, serverName, options);
};
}
start({
success: function () {
el.text("start " + serverName).addClass("hidden");
row.find(".stop-server").removeClass("hidden");
row.find(".access-server").removeClass("hidden");
},
});
});
}
$(".edit-user").click(function () {
var el = $(this);
var row = getRow(el);
var user = row.data("user");
var admin = row.data("admin");
var dialog = $("#edit-user-dialog");
dialog.data("user", user);
dialog.find(".username-input").val(user);
dialog.find(".admin-checkbox").attr("checked", admin === "True");
dialog.modal();
});
$("#edit-user-dialog")
.find(".save-button")
.click(function () {
var dialog = $("#edit-user-dialog");
var user = dialog.data("user");
var name = dialog.find(".username-input").val();
var admin = dialog.find(".admin-checkbox").prop("checked");
api.edit_user(
user,
{
admin: admin,
name: name,
},
{
success: function () {
window.location.reload();
},
},
);
});
$(".delete-user").click(function () {
var el = $(this);
var row = getRow(el);
var user = row.data("user");
var dialog = $("#delete-user-dialog");
dialog.find(".delete-username").text(user);
dialog.modal();
});
$("#delete-user-dialog")
.find(".delete-button")
.click(function () {
var dialog = $("#delete-user-dialog");
var username = dialog.find(".delete-username").text();
console.log("deleting", username);
api.delete_user(username, {
success: function () {
window.location.reload();
},
});
});
$("#add-users").click(function () {
var dialog = $("#add-users-dialog");
dialog.find(".username-input").val("");
dialog.find(".admin-checkbox").prop("checked", false);
dialog.modal();
});
$("#add-users-dialog")
.find(".save-button")
.click(function () {
var dialog = $("#add-users-dialog");
var lines = dialog.find(".username-input").val().split("\n");
var admin = dialog.find(".admin-checkbox").prop("checked");
var usernames = [];
lines.map(function (line) {
var username = line.trim();
if (username.length) {
usernames.push(username);
}
});
api.add_users(
usernames,
{ admin: admin },
{
success: function () {
window.location.reload();
},
},
);
});
$("#stop-all-servers").click(function () {
$("#stop-all-servers-dialog").modal();
});
$("#start-all-servers").click(function () {
$("#start-all-servers-dialog").modal();
});
$("#stop-all-servers-dialog")
.find(".stop-all-button")
.click(function () {
// stop all clicks all the active stop buttons
$(".stop-server").not(".hidden").click();
});
function start(el) {
return function () {
$(el).click();
};
}
$("#start-all-servers-dialog")
.find(".start-all-button")
.click(function () {
$(".start-server")
.not(".hidden")
.each(function (i) {
setTimeout(start(this), i * 500);
});
});
$("#shutdown-hub").click(function () {
var dialog = $("#shutdown-hub-dialog");
dialog.find("input[type=checkbox]").prop("checked", true);
dialog.modal();
});
$("#shutdown-hub-dialog")
.find(".shutdown-button")
.click(function () {
var dialog = $("#shutdown-hub-dialog");
var servers = dialog.find(".shutdown-servers-checkbox").prop("checked");
var proxy = dialog.find(".shutdown-proxy-checkbox").prop("checked");
api.shutdown_hub({
proxy: proxy,
servers: servers,
});
});
});