Allow renaming visitors

This commit is contained in:
rajchales-monito
2026-07-24 12:37:50 +02:00
parent b4e1d0ee1b
commit 45169e8113
3 changed files with 132 additions and 9 deletions
+40 -2
View File
@@ -215,6 +215,13 @@ $("#visitorList").addEventListener("click", async (event) => {
await openConversation(conversationId);
});
$("#conversationHeader").addEventListener("click", async (event) => {
const button = event.target.closest("[data-rename-visitor]");
if (!button) return;
event.preventDefault();
await renameVisitor(button.dataset.renameVisitor);
});
async function showApp() {
$("#loginView").classList.add("hidden");
$("#appView").classList.remove("hidden");
@@ -353,7 +360,7 @@ function syncConversationVisitors() {
}
function conversationVisitorName(item) {
return item.visitor?.name || item.visitor?.email || item.visitorLabel || "Navstevnik";
return item.visitorAlias || item.visitor?.name || item.visitor?.email || item.visitorLabel || "Navstevnik";
}
function renderVisitors() {
@@ -419,7 +426,10 @@ function renderActive() {
$("#conversationHeader").innerHTML = `
<div class="visitor-head">
<div class="visitor-summary-row">
<h2>${escapeHtml(conversationVisitorName(conversation))}</h2>
<button class="visitor-name-edit" type="button" data-rename-visitor="${escapeHtml(conversation.visitorToken)}" title="Prejmenovat navstevnika">
<span>${escapeHtml(conversationVisitorName(conversation))}</span>
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 17.5V20h2.5L17.8 8.7l-2.5-2.5L4 17.5Zm15.7-11.1a1 1 0 0 0 0-1.4L18.3 3.6a1 1 0 0 0-1.4 0l-1 1 2.5 2.5 1.3-.7Z"></path></svg>
</button>
${presenceDot(conversation.visitorPresence)}
<span title="Zeme">${visitorCountry(conversation)}</span>
<span title="Doba na webu">${formatDuration(conversation.sessionSeconds)}</span>
@@ -440,6 +450,34 @@ function renderActive() {
$("#messages").scrollTop = $("#messages").scrollHeight;
}
async function renameVisitor(visitorToken) {
if (!state.active?.conversation || !visitorToken) return;
const currentName = conversationVisitorName(state.active.conversation);
const nextName = window.prompt("Prejmenovat navstevnika", state.active.conversation.visitorAlias || currentName);
if (nextName === null) return;
const result = await api(`/api/admin/visitors/${encodeURIComponent(visitorToken)}`, {
method: "PATCH",
body: { displayName: nextName }
});
applyVisitorRename(visitorToken, result.label, result.displayName);
}
function applyVisitorRename(visitorToken, label, alias) {
const update = (item) => item.visitorToken === visitorToken
? { ...item, visitorLabel: label, visitorAlias: alias || "" }
: item;
state.conversations = state.conversations.map(update);
state.visitors = state.visitors.map((visitor) => visitor.id === visitorToken
? { ...visitor, label, visitorAlias: alias || "" }
: visitor);
if (state.active?.conversation?.visitorToken === visitorToken) {
state.active.conversation = update(state.active.conversation);
}
renderConversations();
renderVisitors();
if (state.active) renderActive();
}
function adminReadReceipt(conversation, messages) {
const lastAdminMessage = [...messages].reverse().find((message) => message.senderType === "admin");
if (!lastAdminMessage) return "";