diff --git a/frontend/src/routes/campaign/+page.svelte b/frontend/src/routes/campaign/+page.svelte index 20ddf6c..7df3006 100644 --- a/frontend/src/routes/campaign/+page.svelte +++ b/frontend/src/routes/campaign/+page.svelte @@ -144,6 +144,8 @@ let templateMap = new BiMap({}); let recipientGroupsByID = {}; let recipientGroupMap = new BiMap({}); + let recipientGroupRecipients = {}; // stores actual recipients for each group + let isRecipientModalVisible = false; let denyPages = []; let denyPageMap = new BiMap({}); let allowDenyMap = new BiMap({}); @@ -1037,11 +1039,13 @@ }; */ - const onAddReceipientGroup = (group) => { + const onAddReceipientGroup = async (group) => { const groupLabel = recipientGroupMap.byValue(group); const groupData = recipientGroupsByID[groupLabel]; formValues.selectedCount += groupData.recipientCount; refreshEndTimeBySendSpread(); + // load recipients for preview + await loadRecipientsForGroup(groupLabel); }; const onRemoveReceipientGroup = (group) => { @@ -1049,6 +1053,51 @@ const groupData = recipientGroupsByID[groupLabel]; formValues.selectedCount -= groupData.recipientCount; refreshEndTimeBySendSpread(); + // remove recipients from cache (groupLabel is actually the ID) + delete recipientGroupRecipients[groupLabel]; + }; + + const loadRecipientsForGroup = async (groupID) => { + console.log('loadRecipientsForGroup called with groupID:', groupID); + + // skip if already loaded + if (recipientGroupRecipients[groupID]) { + console.log('recipients already loaded for group:', groupID); + return; + } + + try { + console.log('fetching recipients for group:', groupID); + const res = await api.recipient.getAllByGroupID(groupID, { perPage: 1000 }); + console.log('api response:', res); + + if (res.success && res.data?.rows) { + console.log('successfully loaded', res.data.rows.length, 'recipients for group:', groupID); + recipientGroupRecipients[groupID] = res.data.rows; + // trigger reactivity + recipientGroupRecipients = recipientGroupRecipients; + } else { + console.warn('api call succeeded but no data returned for group:', groupID); + recipientGroupRecipients[groupID] = []; + } + } catch (error) { + console.error('failed to load recipients for group:', groupID, error); + recipientGroupRecipients[groupID] = []; + } + }; + + const loadAllSelectedRecipients = async () => { + console.log('loadAllSelectedRecipients called for groups:', formValues.recipientGroups); + + // load recipients for all selected groups + const promises = formValues.recipientGroups.map((groupName) => { + const groupID = recipientGroupMap.byValue(groupName); + console.log('mapping groupName to groupID:', groupName, '=>', groupID); + return loadRecipientsForGroup(groupID); + }); + await Promise.all(promises); + + console.log('all recipients loaded:', recipientGroupRecipients); }; const refreshEndTimeBySendSpread = (milliseconds) => { @@ -1215,7 +1264,12 @@ {/each} - +
-
+
Recipient Groups
+ + {#if formValues.recipientGroups.length > 0} +
+ +
+ {/if} {:else if currentStep === 3} @@ -1838,20 +1921,49 @@ > Recipients -
- Groups: - - {formValues.recipientGroups.length - ? formValues.recipientGroups.join(', ') - : 'None selected'} - +
+
+ Groups: + + {formValues.recipientGroups.length + ? formValues.recipientGroups.join(', ') + : 'None selected'} + - Total: - {formValues.selectedCount} recipients + Total: + {formValues.selectedCount} recipients +
+ + {#if formValues.recipientGroups.length > 0} + + {/if}
@@ -2179,6 +2291,83 @@ + + (isRecipientModalVisible = false)} + > +
+
+

+ Total: {formValues.selectedCount} recipients +

+
+ +
+ {#each formValues.recipientGroups as groupName} + {@const groupID = recipientGroupMap.byValue(groupName)} + {@const recipients = recipientGroupRecipients[groupID] || []} +
+
+ + + + + {groupName} + +
+ {#if recipients.length > 0} +
+ {#each recipients as recipient} +
+ + {recipient.email} + + {#if recipient.firstName || recipient.lastName} + + {recipient.firstName || ''} + {recipient.lastName || ''} + + {/if} +
+ {/each} +
+ {:else} +

+ Loading recipients... +

+ {/if} +
+
+
+ {/each} +
+
+
+