Add chat nick to admin users

This commit is contained in:
rajchales-monito
2026-07-29 22:33:22 +02:00
parent cac3deb11a
commit 16e44c5f79
4 changed files with 94 additions and 24 deletions
+37 -5
View File
@@ -280,13 +280,23 @@ label { display: grid; gap: 6px; color: var(--muted); font-size: 13px; }
.admin-user-form {
grid-column: 1 / -1;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 8px;
padding: 10px;
border: 1px solid var(--line);
border-radius: 8px;
background: #fbfdfb;
}
.admin-user-form label:nth-child(3),
.admin-user-form label {
min-width: 0;
}
.admin-user-form label:nth-child(4),
.admin-user-form button {
grid-column: 1 / -1;
}
.admin-user-form button {
padding: 10px 12px;
}
.admin-users-list {
grid-column: 1 / -1;
display: grid;
@@ -294,10 +304,10 @@ label { display: grid; gap: 6px; color: var(--muted); font-size: 13px; }
}
.admin-user-item {
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto auto auto;
grid-template-columns: minmax(0, 1fr);
align-items: center;
gap: 8px;
padding: 9px 10px;
padding: 10px;
border: 1px solid var(--line);
border-radius: 8px;
background: #fff;
@@ -311,7 +321,19 @@ label { display: grid; gap: 6px; color: var(--muted); font-size: 13px; }
color: var(--muted);
font-size: 12px;
}
.admin-user-item .admin-user-actions {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.admin-user-item button {
padding: 7px 9px;
font-size: 12px;
}
.password-mask {
display: inline-flex;
align-items: center;
min-height: 30px;
font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
letter-spacing: 1px;
}
@@ -322,6 +344,16 @@ label { display: grid; gap: 6px; color: var(--muted); font-size: 13px; }
#adminUsersStatus {
grid-column: 1 / -1;
}
@media (max-width: 1100px) {
.admin-user-form {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 720px) {
.admin-user-form {
grid-template-columns: 1fr;
}
}
.list-tools {
padding: 10px 14px;
border-bottom: 1px solid var(--line);
+3
View File
@@ -206,6 +206,9 @@
<label>Jmeno
<input name="displayName" autocomplete="off" placeholder="Petr">
</label>
<label>Nick v chatu
<input name="chatNick" autocomplete="off" placeholder="Petr">
</label>
<label>Heslo
<input name="password" type="password" autocomplete="new-password" placeholder="min. 8 znaku" required>
</label>
+29 -5
View File
@@ -507,6 +507,7 @@ async function createAdminUser(event) {
body: {
username: data.get("username"),
displayName: data.get("displayName"),
chatNick: data.get("chatNick"),
password: data.get("password")
}
}).catch((error) => error);
@@ -523,6 +524,7 @@ async function createAdminUser(event) {
async function handleAdminUserClick(event) {
const resetButton = event.target.closest("[data-reset-admin-user]");
const renameButton = event.target.closest("[data-rename-admin-user]");
const nickButton = event.target.closest("[data-nick-admin-user]");
const deleteButton = event.target.closest("[data-delete-admin-user]");
if (renameButton) {
const id = renameButton.dataset.renameAdminUser;
@@ -543,6 +545,25 @@ async function handleAdminUserClick(event) {
}
setAdminUsersStatus(adminUserError(result));
}
if (nickButton) {
const id = nickButton.dataset.nickAdminUser;
const user = state.adminUsers.find((item) => String(item.id) === String(id));
if (!user || user.isSystem) return;
const chatNick = window.prompt(`Nick v chatu pro ${user.username}`, user.chatNick || user.displayName || user.username);
if (chatNick === null) return;
setAdminUsersStatus("Ukladam nick...");
const result = await api(`/api/admin/users/${id}`, {
method: "PATCH",
body: { chatNick }
}).catch((error) => error);
if (result?.users) {
state.adminUsers = result.users;
renderAdminUsers();
setAdminUsersStatus("Nick ulozen.");
return;
}
setAdminUsersStatus(adminUserError(result));
}
if (resetButton) {
const id = resetButton.dataset.resetAdminUser;
const user = state.adminUsers.find((item) => String(item.id) === String(id));
@@ -584,12 +605,15 @@ function renderAdminUsers() {
<article class="admin-user-item">
<div>
<strong>${escapeHtml(user.displayName || user.username)}</strong>
<span>${escapeHtml(user.username)} &middot; ${user.isSystem ? "systemovy .env ucet" : "BO ucet"}</span>
<span>${escapeHtml(user.username)} &middot; chat: ${escapeHtml(user.chatNick || user.displayName || user.username)} &middot; ${user.isSystem ? "systemovy .env ucet" : "BO ucet"}</span>
</div>
<div class="admin-user-actions">
<span class="password-mask" title="Heslo se nezobrazuje">${user.hasPassword ? "&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;" : "bez hesla"}</span>
<button type="button" data-rename-admin-user="${user.id}" ${user.isSystem ? "disabled" : ""}>Jmeno</button>
<button type="button" data-nick-admin-user="${user.id}" ${user.isSystem ? "disabled" : ""}>Nick</button>
<button type="button" data-reset-admin-user="${user.id}" ${user.isSystem ? "disabled" : ""}>Reset hesla</button>
<button type="button" data-delete-admin-user="${user.id}" ${user.isSystem ? "disabled" : ""}>Smazat</button>
</div>
<span class="password-mask" title="Heslo se nezobrazuje">${user.hasPassword ? "&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;" : "bez hesla"}</span>
<button type="button" data-rename-admin-user="${user.id}" ${user.isSystem ? "disabled" : ""}>Jmeno</button>
<button type="button" data-reset-admin-user="${user.id}" ${user.isSystem ? "disabled" : ""}>Reset hesla</button>
<button type="button" data-delete-admin-user="${user.id}" ${user.isSystem ? "disabled" : ""}>Smazat</button>
</article>
`).join("") : `<p class="empty">Zatim tu nejsou zadni BO uzivatele.</p>`;
}