Add server creation UI + user-server access assignment (step 3)

New admin-only page at /servers-settings (templates/servers.html) lists
servers and creates new ones via POST /servers (ID/name/interface/
addresses/port, key pair generated server-side). Nav gets a "Servers"
link.

templates/users_settings.html gains a multi-select "Server Access"
field wired to the server_ids support added to create-user/update-user
in the previous commit, so admins can now actually assign non-admin
users to specific servers through the UI.
This commit is contained in:
sysops
2026-07-11 23:24:05 +02:00
parent 5b72a7c118
commit 3842c7a534
6 changed files with 396 additions and 1 deletions
+40 -1
View File
@@ -53,6 +53,12 @@ Users Settings
</label>
</div>
</div>
<div class="form-group">
<label for="_server_ids" class="control-label">Server Access</label>
<select multiple class="form-control" id="_server_ids" name="_server_ids">
</select>
<small class="form-text text-muted">Servers this user (if non-admin) may access. Admins always have access to all servers.</small>
</div>
</div>
<div class="modal-footer justify-content-between">
@@ -163,6 +169,32 @@ Users Settings
const button = $(event.relatedTarget);
const user_name = button.data('username');
// populate the server access select with the current list of servers
$.ajax({
cache: false,
method: 'GET',
url: '{{.basePath}}/servers',
dataType: 'json',
contentType: "application/json",
success: function (servers) {
const select = modal.find("#_server_ids");
select.empty();
$.each(servers, function (index, srv) {
select.append($('<option>').val(srv.id).text(srv.name + " (" + srv.id + ")"));
});
// if editing an existing user, pre-select their granted servers now that
// the option list exists
if (user_name !== "") {
select.val(select.data('preselect') || []);
}
},
error: function (jqXHR, exception) {
const responseJson = jQuery.parseJSON(jqXHR.responseText);
toastr.error(responseJson['message']);
}
});
// update user modal data
if (user_name !== "") {
$.ajax({
@@ -180,6 +212,10 @@ Users Settings
modal.find("#_user_password").val("");
modal.find("#_user_password").prop("placeholder", "Leave empty to keep the password unchanged")
modal.find("#_admin").prop("checked", user.admin);
// remember the granted server ids so the select can pre-select them
// once its options have been populated (see the servers ajax above)
modal.find("#_server_ids").data('preselect', user.server_ids || []);
modal.find("#_server_ids").val(user.server_ids || []);
},
error: function (jqXHR, exception) {
const responseJson = jQuery.parseJSON(jqXHR.responseText);
@@ -193,6 +229,7 @@ Users Settings
modal.find("#_user_password").val("");
modal.find("#_user_password").prop("placeholder", "")
modal.find("#_admin").prop("checked", false);
modal.find("#_server_ids").data('preselect', []);
}
});
});
@@ -205,11 +242,13 @@ Users Settings
if ($("#_admin").is(':checked')) {
admin = true;
}
const server_ids = $("#_server_ids").val() || [];
const data = {
"username": username,
"password": password,
"previous_username": previous_username,
"admin": admin
"admin": admin,
"server_ids": server_ids
};
if (previous_username !== "") {