feat: sidebar nav (default), group member management, per-customer ticketing identity mapping

- Navigation: new per-user setting (default "side") renders the page links as a
  left sidebar while keeping theme/bell/avatar/logout in the top-right; falls
  back to a top bar under 760px or when set to "top". Profile selector added.
- Group conversations: record a creatorId; the creator gets a "Manage members"
  button to add/remove participants (new GET/POST/DELETE members endpoints,
  creator-only). Existing groups backfilled.
- Customer ticketing: admin can map each assigned consultant to their username
  in that customer's ticketing system. Per-customer mapping takes precedence
  over the consultant's global ticketingIdentities during sync.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
etalon
2026-06-13 11:05:33 +02:00
parent 0d28f69320
commit e8beb7d4f3
16 changed files with 367 additions and 19 deletions
+19 -1
View File
@@ -11,7 +11,10 @@
<section class="chat-main card">
<div class="spread">
<h2 id="chat-title">Select a conversation</h2>
<span class="muted" id="typing-indicator" aria-live="polite"></span>
<span style="display:flex;align-items:center;gap:10px">
<span class="muted" id="typing-indicator" aria-live="polite"></span>
<button class="btn small" id="chat-members" type="button" hidden>Manage members</button>
</span>
</div>
<div id="chat-messages" class="chat-messages" aria-live="polite"></div>
<form id="chat-form" hidden>
@@ -66,6 +69,21 @@
</form>
</dialog>
<dialog id="members-dialog">
<div class="stack" style="min-width:420px">
<div class="spread">
<h2 style="margin:0">Group members</h2>
<button class="btn small" type="button" id="mm-close">Close</button>
</div>
<ul id="mm-list" class="conv-list"></ul>
<div class="field" id="mm-add-wrap">
<label for="mm-search">Add someone</label>
<input type="search" id="mm-search" placeholder="Search people…">
<div id="mm-results" role="listbox" aria-label="Search results"></div>
</div>
</div>
</dialog>
<dialog id="lightbox" class="lightbox">
<img id="lightbox-img" alt="">
</dialog>