Refine Jitsi participant copy

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Scott Idem
2026-05-06 14:39:45 -04:00
parent 25e35f6f96
commit e64252b839
2 changed files with 37 additions and 34 deletions

View File

@@ -533,7 +533,7 @@ Shown above the meeting list when data is loaded. Stats reflect the **filtered +
- **Total Duration** — sum of all session durations (HH:MM:SS) - **Total Duration** — sum of all session durations (HH:MM:SS)
In grouped view, each room header also shows its own subtotals (meeting count, unique participants by Novi UUID when available). In grouped view, each room header also shows its own subtotals (meeting count, unique participants by Novi UUID when available).
Each meeting instance now includes a **Copy names** button so staff can grab the full participant list for pasting into follow-up reports. Each meeting instance keeps the full participant list visible; the **Copy names** button is edit-mode only so staff can grab the list for follow-up reports without exposing extra controls to normal viewers.
### Caching / Load Behavior ### Caching / Load Behavior

View File

@@ -811,7 +811,6 @@ function export_json() {
{@const mods = m.real_participants.filter((p) => p.role === 'moderator')} {@const mods = m.real_participants.filter((p) => p.role === 'moderator')}
{@const others = m.real_participants.filter((p) => p.role !== 'moderator')} {@const others = m.real_participants.filter((p) => p.role !== 'moderator')}
{@const all_names = m.real_participants.map((p) => `${p.displayName} (${p.role})`).join('\n')} {@const all_names = m.real_participants.map((p) => `${p.displayName} (${p.role})`).join('\n')}
{@const participant_copy_text = build_participant_copy_text(m.real_participants)}
<tr <tr
class="border-surface-200-800 hover:bg-surface-100-900 border-b transition-colors duration-200"> class="border-surface-200-800 hover:bg-surface-100-900 border-b transition-colors duration-200">
<td <td
@@ -861,22 +860,24 @@ function export_json() {
{others.map((p) => p.displayName).join(', ')} {others.map((p) => p.displayName).join(', ')}
</div> </div>
{/if} {/if}
<button {#if $ae_loc.edit_mode}
type="button" <button
onclick={() => type="button"
copy_participants( onclick={() =>
m.meeting_id, copy_participants(
m.real_participants m.meeting_id,
)} m.real_participants
class="inline-flex items-center gap-1 rounded border border-surface-200-800 bg-surface-100-900 px-2 py-1 text-xs font-medium transition-colors hover:bg-surface-200-800" )}
title="Copy participants to clipboard"> class="inline-flex items-center gap-1 rounded border border-surface-200-800 bg-surface-100-900 px-2 py-1 text-xs font-medium transition-colors hover:bg-surface-200-800"
<span title="Copy participants to clipboard">
class="fas fa-copy" <span
aria-hidden="true"></span> class="fas fa-copy"
{copied_participants_meeting_id === m.meeting_id aria-hidden="true"></span>
? 'Copied' {copied_participants_meeting_id === m.meeting_id
: 'Copy names'} ? 'Copied'
</button> : 'Copy names'}
</button>
{/if}
</div> </div>
{/if} {/if}
</td> </td>
@@ -1050,22 +1051,24 @@ function export_json() {
class="text-xs tracking-wide uppercase opacity-40"> class="text-xs tracking-wide uppercase opacity-40">
Final Participants ({meeting.real_participant_count}) Final Participants ({meeting.real_participant_count})
</div> </div>
<button {#if $ae_loc.edit_mode}
type="button" <button
onclick={() => type="button"
copy_participants( onclick={() =>
meeting.meeting_id, copy_participants(
meeting.real_participants meeting.meeting_id,
)} meeting.real_participants
class="inline-flex items-center gap-1 rounded border border-surface-200-800 bg-surface-100-900 px-2 py-1 text-xs font-medium transition-colors hover:bg-surface-200-800" )}
title="Copy participants to clipboard"> class="inline-flex items-center gap-1 rounded border border-surface-200-800 bg-surface-100-900 px-2 py-1 text-xs font-medium transition-colors hover:bg-surface-200-800"
<span title="Copy participants to clipboard">
class="fas fa-copy" <span
aria-hidden="true"></span> class="fas fa-copy"
{copied_participants_meeting_id === meeting.meeting_id aria-hidden="true"></span>
? 'Copied' {copied_participants_meeting_id === meeting.meeting_id
: 'Copy names'} ? 'Copied'
</button> : 'Copy names'}
</button>
{/if}
</div> </div>
{#if meeting.real_participants && meeting.real_participants.length > 0} {#if meeting.real_participants && meeting.real_participants.length > 0}
<table class="w-full text-sm"> <table class="w-full text-sm">