Skip to content

Commit 4eaab13

Browse files
committed
Group buttons in Api and User view
1 parent 1a6f430 commit 4eaab13

File tree

8 files changed

+94
-40
lines changed

8 files changed

+94
-40
lines changed

build/go-generate/minifyStaticContent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,5 +138,5 @@ func fileExists(filename string) bool {
138138
// Version codes can be changed in updateVersionNumbers.go
139139

140140
const jsAdminVersion = 10
141-
const jsE2EVersion = 5
141+
const jsE2EVersion = 6
142142
const cssMainVersion = 5

internal/webserver/web/static/js/admin_ui_api.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ function addRowApi(apiKey, publicId) {
162162
cellLastUsed.innerText = "Never";
163163

164164

165+
const btnGroup = document.createElement("div");
166+
btnGroup.className = "btn-group";
167+
btnGroup.setAttribute("role", "group");
168+
169+
165170
// === Buttons Cell ===
166171
const copyButton = document.createElement('button');
167172
copyButton.type = 'button';
@@ -185,9 +190,9 @@ function addRowApi(apiKey, publicId) {
185190
deleteIcon.className = 'bi bi-trash3';
186191
deleteButton.appendChild(deleteIcon);
187192

188-
cellButtons.appendChild(copyButton);
189-
cellButtons.appendChild(document.createTextNode(' ')); // space between buttons
190-
cellButtons.appendChild(deleteButton);
193+
btnGroup.appendChild(copyButton);
194+
btnGroup.appendChild(deleteButton);
195+
cellButtons.appendChild(btnGroup);
191196

192197
// === Permissions Cell ===
193198
const perms = [{

internal/webserver/web/static/js/admin_ui_users.js

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ function addNewUser() {
193193

194194
function addRowUser(userid, name) {
195195

196+
userid = sanitizeId(userid);
197+
196198
let table = document.getElementById("usertable");
197199
let row = table.insertRow(1);
198200
row.id = "row-" + userid;
@@ -215,28 +217,66 @@ function addRowUser(userid, name) {
215217
cellGroup.innerText = "User";
216218
cellLastOnline.innerText = "Never";
217219
cellUploads.innerText = "0";
218-
let buttonResetPw = '<button id="pwchange-' + userid + '" type="button" class="btn btn-outline-light btn-sm" onclick="showResetPwModal(\'' + userid + '\', \'' + name + '\')" title="Reset Password"><i class="bi bi-key-fill"></i></button>&nbsp; ';
219-
cellActions.innerHTML = '<button id="changeRank_' + userid + '" type="button" onclick="changeRank( ' + userid + ' , \'ADMIN\', \'changeRank_' + userid + '\')" title="Promote User" class="btn btn-outline-light btn-sm"><i class="bi bi-chevron-double-up"></i></button>&nbsp; <button id="delete-' + userid + '" type="button" class="btn btn-outline-danger btn-sm" onclick="showDeleteModal(' + userid + ', \'' + name + '\')" title="Delete"><i class="bi bi-trash3"></i></button>';
220+
221+
// Create one button group
222+
const btnGroup = document.createElement("div");
223+
btnGroup.className = "btn-group";
224+
btnGroup.setAttribute("role", "group");
225+
226+
// Password reset button (optional)
220227
if (isInternalAuth) {
221-
cellActions.innerHTML = buttonResetPw+cellActions.innerHTML;
228+
const btnResetPw = document.createElement("button");
229+
btnResetPw.id = `pwchange-${userid}`;
230+
btnResetPw.type = "button";
231+
btnResetPw.className = "btn btn-outline-light btn-sm";
232+
btnResetPw.title = "Reset Password";
233+
btnResetPw.onclick = () => showResetPwModal(userid, name);
234+
btnResetPw.innerHTML = `<i class="bi bi-key-fill"></i>`;
235+
btnGroup.appendChild(btnResetPw);
222236
}
223237

238+
// Promote button
239+
const btnPromote = document.createElement("button");
240+
btnPromote.id = `changeRank_${userid}`;
241+
btnPromote.type = "button";
242+
btnPromote.className = "btn btn-outline-light btn-sm";
243+
btnPromote.title = "Promote User";
244+
btnPromote.onclick = () => changeRank(userid, 'ADMIN', `changeRank_${userid}`);
245+
btnPromote.innerHTML = `<i class="bi bi-chevron-double-up"></i>`;
246+
btnGroup.appendChild(btnPromote);
247+
248+
// Delete button
249+
const btnDelete = document.createElement("button");
250+
btnDelete.id = `delete-${userid}`;
251+
btnDelete.type = "button";
252+
btnDelete.className = "btn btn-outline-danger btn-sm";
253+
btnDelete.title = "Delete";
254+
btnDelete.onclick = () => showDeleteModal(userid, name);
255+
btnDelete.innerHTML = `<i class="bi bi-trash3"></i>`;
256+
btnGroup.appendChild(btnDelete);
257+
258+
// Insert button group into cellActions
259+
cellActions.innerHTML = '';
260+
cellActions.appendChild(btnGroup);
261+
262+
// Permissions
224263
cellPermissions.innerHTML = `
225-
<i id="perm_replace_` + userid + `" class="bi bi-recycle perm-notgranted " title="Replace own uploads" onclick='changeUserPermission(` + userid + `,"PERM_REPLACE", "perm_replace_` + userid + `");'></i>
226-
227-
<i id="perm_list_` + userid + `" class="bi bi-eye perm-notgranted " title="List other uploads" onclick='changeUserPermission(` + userid + `,"PERM_LIST", "perm_list_` + userid + `");'></i>
228-
229-
<i id="perm_edit_` + userid + `" class="bi bi-pencil perm-notgranted " title="Edit other uploads" onclick='changeUserPermission(` + userid + `,"PERM_EDIT", "perm_edit_` + userid + `");'></i>
230-
231-
<i id="perm_delete_` + userid + `" class="bi bi-trash3 perm-notgranted " title="Delete other uploads" onclick='changeUserPermission(` + userid + `,"PERM_DELETE", "perm_delete_` + userid + `");'></i>
232-
233-
<i id="perm_replace_other_` + userid + `" class="bi bi-arrow-left-right perm-notgranted " title="Replace other uploads" onclick='changeUserPermission(` + userid + `,"PERM_REPLACE_OTHER", "perm_replace_other_` + userid + `");'></i>
234-
235-
<i id="perm_logs_` + userid + `" class="bi bi-card-list perm-notgranted " title="Manage system logs" onclick='changeUserPermission(` + userid + `,"PERM_LOGS", "perm_logs_` + userid + `");'></i>
236-
237-
<i id="perm_users_` + userid + `" class="bi bi-people perm-notgranted " title="Manage users" onclick='changeUserPermission(` + userid + `,"PERM_USERS", "perm_users_` + userid + `");'></i>
238-
239-
<i id="perm_api_` + userid + `" class="bi bi-sliders2 perm-notgranted " title="Manage API keys" onclick='changeUserPermission(` + userid + `,"PERM_API", "perm_api_` + userid + `");'></i>`;
264+
<i id="perm_replace_${userid}" class="bi bi-recycle perm-notgranted " title="Replace own uploads" onclick='changeUserPermission(${userid},"PERM_REPLACE", "perm_replace_${userid}");'></i>
265+
266+
<i id="perm_list_${userid}" class="bi bi-eye perm-notgranted " title="List other uploads" onclick='changeUserPermission(${userid},"PERM_LIST", "perm_list_${userid}");'></i>
267+
268+
<i id="perm_edit_${userid}" class="bi bi-pencil perm-notgranted " title="Edit other uploads" onclick='changeUserPermission(${userid},"PERM_EDIT", "perm_edit_${userid}");'></i>
269+
270+
<i id="perm_delete_${userid}" class="bi bi-trash3 perm-notgranted " title="Delete other uploads" onclick='changeUserPermission(${userid},"PERM_DELETE", "perm_delete_${userid}");'></i>
271+
272+
<i id="perm_replace_other_${userid}" class="bi bi-arrow-left-right perm-notgranted " title="Replace other uploads" onclick='changeUserPermission(${userid},"PERM_REPLACE_OTHER", "perm_replace_other_${userid}");'></i>
273+
274+
<i id="perm_logs_${userid}" class="bi bi-card-list perm-notgranted " title="Manage system logs" onclick='changeUserPermission(${userid},"PERM_LOGS", "perm_logs_${userid}");'></i>
275+
276+
<i id="perm_users_${userid}" class="bi bi-people perm-notgranted " title="Manage users" onclick='changeUserPermission(${userid},"PERM_USERS", "perm_users_${userid}");'></i>
277+
278+
<i id="perm_api_${userid}" class="bi bi-sliders2 perm-notgranted " title="Manage API keys" onclick='changeUserPermission(${userid},"PERM_API", "perm_api_${userid}");'></i>`;
279+
240280

241281
setTimeout(() => {
242282

@@ -247,5 +287,12 @@ function addRowUser(userid, name) {
247287
cellPermissions.classList.remove("newUser");
248288
cellActions.classList.remove("newUser");
249289
}, 700);
290+
}
250291

292+
function sanitizeId(id) {
293+
const numericId = id.toString().trim();
294+
if (!/^\d+$/.test(numericId)) {
295+
throw new Error("Invalid ID: must contain only digits.");
296+
}
297+
return numericId;
251298
}

internal/webserver/web/static/js/min/admin.min.10.js

Lines changed: 15 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/webserver/web/static/js/min/end2end_admin.min.5.js renamed to internal/webserver/web/static/js/min/end2end_admin.min.6.js

File renamed without changes.

internal/webserver/web/static/js/min/end2end_download.min.5.js renamed to internal/webserver/web/static/js/min/end2end_download.min.6.js

File renamed without changes.

internal/webserver/web/templates/html_users.tmpl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@
5757

5858
</td>
5959
<td>
60+
<div class="btn-group" role="group">
6061
{{if $.IsInternalAuth}}
61-
<button id="pwchange-{{ .User.Id }}" type="button" class="btn btn-outline-light btn-sm" {{if or (eq .User.UserLevel 0) (eq .User.Id $.ActiveUser.Id)}}disabled{{end}} onclick="showResetPwModal('{{ .User.Id }}', '{{ .User.Name }}')" title="Reset Password"><i class="bi bi-key-fill"></i></button>&nbsp;
62+
<button id="pwchange-{{ .User.Id }}" type="button" class="btn btn-outline-light btn-sm" {{if or (eq .User.UserLevel 0) (eq .User.Id $.ActiveUser.Id)}}disabled{{end}} onclick="showResetPwModal('{{ .User.Id }}', '{{ .User.Name }}')" title="Reset Password"><i class="bi bi-key-fill"></i></button>
6263
{{end}}
6364

6465
{{if gt .User.UserLevel 1}}
@@ -70,7 +71,8 @@
7071
{{ end }}
7172

7273

73-
&nbsp;<button id="delete-{{ .User.Id }}" type="button" class="btn btn-outline-danger btn-sm" {{if or (eq .User.UserLevel 0) (eq .User.Id $.ActiveUser.Id)}}disabled{{end}} onclick="showDeleteModal('{{ .User.Id }}', '{{ .User.Name }}')" title="Delete"><i class="bi bi-trash3"></i></button></td>
74+
<button id="delete-{{ .User.Id }}" type="button" class="btn btn-outline-danger btn-sm" {{if or (eq .User.UserLevel 0) (eq .User.Id $.ActiveUser.Id)}}disabled{{end}} onclick="showDeleteModal('{{ .User.Id }}', '{{ .User.Name }}')" title="Delete"><i class="bi bi-trash3"></i></button>
75+
</div></td>
7476
</tr>
7577
{{ end }}
7678
</tbody>

internal/webserver/web/templates/string_constants.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
// use a cached version, if the file has been updated
66
{{define "js_admin_version"}}10{{end}}
77
{{define "js_dropzone_version"}}5{{end}}
8-
{{define "js_e2eversion"}}5{{end}}
8+
{{define "js_e2eversion"}}6{{end}}
99
{{define "css_main"}}5{{end}}

0 commit comments

Comments
 (0)