diff --git a/src/routes/private/events/event/archived/+page.svelte b/src/routes/private/events/event/archived/+page.svelte index 37cdb56..050d66d 100644 --- a/src/routes/private/events/event/archived/+page.svelte +++ b/src/routes/private/events/event/archived/+page.svelte @@ -1,6 +1,8 @@ + +
+
+ {#if loading} +
+
+ {:else} +

{event?.name}

+
+
+ Date: + {event?.date} +
+
+ {/if} +
+
diff --git a/src/routes/private/events/event/archived/components/Statistics.svelte b/src/routes/private/events/event/archived/components/Statistics.svelte new file mode 100644 index 0000000..526483b --- /dev/null +++ b/src/routes/private/events/event/archived/components/Statistics.svelte @@ -0,0 +1,73 @@ + + +
+ + + + + + + + + + + + + + + + + + + + +
CategoryCount
+
+ + + + Total participants +
+
+ {#if loading} +
+ {:else} + {totalParticipants} + {/if} +
+
+ + + + Scanned participants +
+
+ {#if loading} +
+ {:else} + {scannedParticipants} + {/if} +
+
diff --git a/src/routes/private/events/event/view/+page.svelte b/src/routes/private/events/event/view/+page.svelte index d9f4413..5a36662 100644 --- a/src/routes/private/events/event/view/+page.svelte +++ b/src/routes/private/events/event/view/+page.svelte @@ -10,6 +10,7 @@ import EmailSending from './components/EmailSending.svelte'; import EmailResults from './components/EmailResults.svelte'; import ErrorMessage from './components/ErrorMessage.svelte'; + import Statistics from './components/Statistics.svelte'; let { data } = $props(); @@ -262,7 +263,6 @@ - +
+

Statistics

+ p.scanned).length} + emailSentCount={participants.filter(p => p.email_sent).length} + pendingCount={participants.filter(p => !p.email_sent).length} + /> +
+ + + + interface Participant { + id: string; + email_sent: boolean; + } + + interface EmailProgress { + sent: number; + total: number; + } + + let { + loading, + participants, + sendingEmails, + emailProgress, + event, + onSendEmails + } = $props<{ + loading: boolean; + participants: Participant[]; + sendingEmails: boolean; + emailProgress: EmailProgress; + event: any | null; + onSendEmails: () => void; + }>(); + + // Using the $derived rune to calculate uncontacted participants + let uncontactedParticipantsCount = $derived(participants.filter(p => !p.email_sent).length); + + +
+
+

Send Emails

+ {#if !loading} +
+ {uncontactedParticipantsCount} uncontacted participants +
+ {:else} +
+ Loading participants... +
+ {/if} +
+ + {#if loading} +
+ {:else if sendingEmails} +
+
+ + + + + Sending {emailProgress.total} emails... Please wait. +
+
+ {:else} +
+ {#if uncontactedParticipantsCount > 0} +
+
+ + + + + Warning: Do not close this window while emails are being sent. The process may take several minutes. + +
+
+ +
+ +
+ {:else} +
+
+ + + +
+

All participants have been contacted!

+

No pending emails to send.

+
+ {/if} +
+ {/if} +
diff --git a/src/routes/private/events/event/view/components/ParticipantsTable.svelte b/src/routes/private/events/event/view/components/ParticipantsTable.svelte index 5595401..1660920 100644 --- a/src/routes/private/events/event/view/components/ParticipantsTable.svelte +++ b/src/routes/private/events/event/view/components/ParticipantsTable.svelte @@ -30,7 +30,7 @@ }>(); -
+

Participants