{#if showAdd && canManage}
{/if} {#if mergeMode && mergeSource}
Merge: "{mergeSource.preferred_name || mergeSource.email}" will be merged into the participant you select below. All their tickets and volunteer records will move to the target.
{#if mergeTarget}
Target: {mergeTarget.preferred_name || mergeTarget.email} ({mergeTarget.email})
{:else}
Click a participant row below to select as merge target.
{/if}
{/if} {#if error}
{error}
{/if} {#if success}
{success}
{/if} {#if ($allParticipants ?? []).length === 0}
No participants yet

Import a CSV or wait for volunteer signups.

{:else}
{#if canManage}{/if} {#each filtered as p (p.id)} {@const pts = ticketsFor(p.id)} {@const ci = checkedInCount(p.id)} {@const isExpanded = expandedId === p.id} {@const isMergeTarget = mergeMode && mergeSource?.id !== p.id} {@const isEditing = editId === p.id} {#if isEditing} {:else} { mergeTarget = p } : null} style={mergeMode && mergeSource?.id !== p.id ? 'cursor:pointer' : ''} > {#if canManage} {/if} {/if} {#if isExpanded && !isEditing} {/if} {/each}
Name Email Tickets Status
{p.preferred_name || '—'} {#if p.pronouns} · {p.pronouns} {/if} {#if p.note}
{p.note}
{/if}
{p.email || '—'} {#if p.phone}
{p.phone}
{/if}
{#if pts.length > 0} {:else} {/if} {#if pts.length > 0} {ci}/{pts.length} in {:else} No ticket {/if} {#if !mergeMode} {/if}
{#each pts as tk (tk.id)}
{tk.name || '(unnamed)'} {#if tk.ticket_type} · {tk.ticket_type} {/if} {#if tk.external_id} · #{tk.external_id} {/if} {#if tk.code}
{tk.code} {#if p.email && canManage} {/if}
{/if}
{#if tk.checked_in_at} Checked in {fmtTime(tk.checked_in_at)} {:else} Not checked in {/if}
{tk.source}
{/each} {#if canManage} {#if addTicketFor === p.id}
addTicket(e, p.id)}>
{:else} {/if} {/if}
{/if}