diff --git a/react/src/dashboard/components/modals/ModalDuplicatesPicker.tsx b/react/src/dashboard/components/modals/ModalDuplicatesPicker.tsx index 86f05ba94..c8ab6c216 100644 --- a/react/src/dashboard/components/modals/ModalDuplicatesPicker.tsx +++ b/react/src/dashboard/components/modals/ModalDuplicatesPicker.tsx @@ -20,13 +20,13 @@ export default function ModalDuplicatesPicker({ hero_title = '', hero_subtitle = '', enableToggles = true, - label_on = '', - label_off = '', + label_on = 'Aanmaken', + label_off = 'Overslaan', items, onConfirm, onCancel, button_cancel = 'Annuleren', - button_none = 'Alles overslaan', + button_none = 'Alle overslaan', button_all = 'Ja op alles', button_confirm = 'Bevestigen', }: { @@ -36,8 +36,8 @@ export default function ModalDuplicatesPicker({ hero_title?: string; hero_subtitle: string | Array; enableToggles: boolean; - label_on: string; - label_off: string; + label_on?: string; + label_off?: string; items: Array; onConfirm: (data: { list: Array; uids?: Array }) => void; onCancel: () => void; diff --git a/react/src/dashboard/components/modals/ModalPayoutsUpload.tsx b/react/src/dashboard/components/modals/ModalPayoutsUpload.tsx index 4f81663d6..32d5a78c1 100644 --- a/react/src/dashboard/components/modals/ModalPayoutsUpload.tsx +++ b/react/src/dashboard/components/modals/ModalPayoutsUpload.tsx @@ -193,8 +193,6 @@ export default function ModalPayoutsUpload({ hero_title={'Er zijn fouten opgetreden bij het importeren van de uitbetalingen'} hero_subtitle={message} enableToggles={false} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={items.map((item) => ({ _uid: uniqueId('rand_'), label: `Rij: ${item[0]}: ${item[3] || item[2]['email'] || item[2]['bsn'] || ''} - ${item[1]}`, diff --git a/react/src/dashboard/components/modals/ModalPrevalidationRequestsUpload.tsx b/react/src/dashboard/components/modals/ModalPrevalidationRequestsUpload.tsx index 2df4dd5db..f6f20faf4 100644 --- a/react/src/dashboard/components/modals/ModalPrevalidationRequestsUpload.tsx +++ b/react/src/dashboard/components/modals/ModalPrevalidationRequestsUpload.tsx @@ -185,8 +185,6 @@ export default function ModalPrevalidationRequestsUpload({ hero_title={'Er zijn fouten opgetreden bij het importeren van de aanvragers'} hero_subtitle={message} enableToggles={false} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={items.map((item) => ({ value: `Rij: ${item[0]}: ${item[2]} - ${item[1]}`, _uid: uniqueId('rand_'), diff --git a/react/src/dashboard/components/modals/ModalPrevalidationsUpload.tsx b/react/src/dashboard/components/modals/ModalPrevalidationsUpload.tsx index 56dd8033d..ba1593629 100644 --- a/react/src/dashboard/components/modals/ModalPrevalidationsUpload.tsx +++ b/react/src/dashboard/components/modals/ModalPrevalidationsUpload.tsx @@ -223,8 +223,6 @@ export default function ModalPrevalidationsUpload({ hero_title={'Er zijn fouten opgetreden bij het importeren van de aanvragers'} hero_subtitle={message} enableToggles={false} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={items.map((item) => ({ value: `Rij: ${item[0]}: ${item[2]} - ${item[1]}`, _uid: uniqueId('rand_'), @@ -478,8 +476,6 @@ export default function ModalPrevalidationsUpload({ hero_title={title} hero_subtitle={subtitle} enableToggles={false} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={items} onConfirm={() => { setHideModal(false); @@ -514,8 +510,6 @@ export default function ModalPrevalidationsUpload({ hero_subtitle={subtitle} enableToggles={true} label_on={'Aanpassen'} - label_off={'Overslaan'} - button_none={'Alles overslaan'} button_all={'Pas alles aan'} items={items} onConfirm={({ list }) => { @@ -766,6 +760,82 @@ export default function ModalPrevalidationsUpload({ ], ); + const showDuplicateRows = useCallback( + (rows = []) => { + const message = [ + `${rows.length} van ${data.length}`, + 'rij(en) uit het bulkbestand zijn niet', + 'geïmporteerd vanwege dubbele waarden.', + 'Bekijk het bestand bij welke rij(en) het mis gaat.', + ].join(' '); + + pushDanger('Waarschuwing', message); + setHideModal(true); + + openModal((modal) => ( + { + reset(); + setHideModal(false); + }} + onCancel={() => { + reset(); + setHideModal(false); + }} + /> + )); + }, + [data, openModal, pushDanger, reset], + ); + + const checkDuplicates = useCallback(() => { + return new Promise((resolve, reject) => { + const submitData: RowDataPropData[] = JSON.parse(JSON.stringify(data)); + const keyMap = new Map(); + const duplicates = []; + + submitData.forEach((item, index) => { + const primary_key = item?.[fund.csv_primary_key]; + const normalized_key = typeof primary_key === 'string' ? primary_key.toLowerCase() : primary_key; + + if (!normalized_key) { + return; + } + + if (!keyMap.has(normalized_key)) { + keyMap.set(normalized_key, [index]); + } else { + keyMap.get(normalized_key).push(index); + } + }); + + keyMap.forEach((indexes) => { + if (indexes.length > 1) { + indexes.forEach((i) => { + const originalValue = submitData[i]?.[fund.csv_primary_key]; + + duplicates.push({ + value: `Rij: ${i + 1}: ${fund?.csv_primary_key} - ${originalValue}`, + _uid: uniqueId('rand_'), + }); + }); + } + }); + + if (duplicates.length) { + showDuplicateRows(duplicates); + reject(); + } + + resolve(true); + }); + }, [data, fund?.csv_primary_key, showDuplicateRows]); + const submitCollectionCheck = useCallback(() => { setCsvProgress(CSVProgress.uploading); abortRef.current = false; @@ -854,14 +924,16 @@ export default function ModalPrevalidationsUpload({ ]); const onConfirmUpload = useCallback(() => { - setCsvComparing(true); + checkDuplicates().then(() => { + setCsvComparing(true); - pushSuccess('Inladen...', 'Inladen van gegevens voor controle op dubbele waarden!', { - icon: 'download-outline', - }); + pushSuccess('Inladen...', 'Inladen van gegevens voor controle op dubbele waarden!', { + icon: 'download-outline', + }); - submitCollectionCheck(); - }, [pushSuccess, submitCollectionCheck]); + submitCollectionCheck(); + }, console.error); + }, [checkDuplicates, pushSuccess, submitCollectionCheck]); const onDragEvent = useCallback((e: React.DragEvent, isDragOver: boolean) => { e?.preventDefault(); diff --git a/react/src/dashboard/components/modals/ModalReservationUpload.tsx b/react/src/dashboard/components/modals/ModalReservationUpload.tsx index 95d2d548d..089848414 100644 --- a/react/src/dashboard/components/modals/ModalReservationUpload.tsx +++ b/react/src/dashboard/components/modals/ModalReservationUpload.tsx @@ -196,8 +196,6 @@ export default function ModalReservationUpload({ 'Om de reserveringen alsnog aan te maken dient het bestand aangepast en opnieuw aangeboden te worden.', ]} enableToggles={true} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={items.map((item) => ({ _uid: uniqueId('rand_'), label: item[2]?.['number'] ? item[2]?.['number'] + ' - ' + item[1] : item[1], diff --git a/react/src/dashboard/components/modals/ModalVoucherCreate.tsx b/react/src/dashboard/components/modals/ModalVoucherCreate.tsx index dd43c2425..f7be132ab 100644 --- a/react/src/dashboard/components/modals/ModalVoucherCreate.tsx +++ b/react/src/dashboard/components/modals/ModalVoucherCreate.tsx @@ -248,8 +248,6 @@ export default function ModalVoucherCreate({ 'Deze e-mailadressen bezitten al een tegoed van dit fonds.', ]} enableToggles={true} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={items} onConfirm={onConfirm} onCancel={onCancel} @@ -276,8 +274,6 @@ export default function ModalVoucherCreate({ 'Deze burgerservicenummers bezitten al een tegoed van dit fonds.', ]} enableToggles={true} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={items} onConfirm={onConfirm} onCancel={onCancel} diff --git a/react/src/dashboard/components/modals/ModalVoucherTransactionsUpload.tsx b/react/src/dashboard/components/modals/ModalVoucherTransactionsUpload.tsx index f48f53ed6..7be5cbd17 100644 --- a/react/src/dashboard/components/modals/ModalVoucherTransactionsUpload.tsx +++ b/react/src/dashboard/components/modals/ModalVoucherTransactionsUpload.tsx @@ -193,8 +193,6 @@ export default function ModalVoucherTransactionsUpload({ hero_title={'Transactie aanmaken mislukt!'} hero_subtitle={[validation ? messageValidation : message]} enableToggles={false} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={items.map((item) => ({ _uid: uniqueId('rand_'), label: `Rij: ${item[0]}: ${item[2]['uid'] || ''} - ${item[1]}`, diff --git a/react/src/dashboard/components/modals/ModalVouchersUpload.tsx b/react/src/dashboard/components/modals/ModalVouchersUpload.tsx index d642f953e..2b1f9759e 100644 --- a/react/src/dashboard/components/modals/ModalVouchersUpload.tsx +++ b/react/src/dashboard/components/modals/ModalVouchersUpload.tsx @@ -305,11 +305,8 @@ export default function ModalVouchersUpload({ `Er zijn ${lowAmountOptions.length} tegoeden met een laag bedrag.`, 'Wilt u doorgaan?', ]} - button_none={'Alle overslaan'} button_all={'Alle aanmaken'} enableToggles={true} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={lowAmountOptions} onConfirm={(data) => { resolve(pickSelectedOrUnflagged(originalRows, data.uids, lowAmountOptionIds)); @@ -348,11 +345,8 @@ export default function ModalVouchersUpload({ `Weet u zeker dat u voor ${duplicateOptions.length} e-mailadres(sen) een extra tegoed wilt aanmaken?`, 'Deze e-mailadressen bezitten al een tegoed van dit fonds.', ]} - button_none={'Alle overslaan'} button_all={'Alle aanmaken'} enableToggles={true} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={duplicateOptions} onConfirm={(data) => { resolve(pickSelectedOrUnflagged(originalRows, data.uids, duplicateOptionIds)); @@ -393,10 +387,7 @@ export default function ModalVouchersUpload({ 'Deze bsn(s) bezitten al een tegoed van dit fonds.', ]} enableToggles={true} - button_none={'Alle overslaan'} button_all={'Alle aanmaken'} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={bsnOptions} onConfirm={(data) => { resolve(pickSelectedOrUnflagged(originalRows, data.uids, bsnOptionIds)); @@ -614,8 +605,6 @@ export default function ModalVouchersUpload({ hero_title={'Er zijn fouten opgetreden bij het importeren van de tegoeden'} hero_subtitle={message} enableToggles={false} - label_on={'Aanmaken'} - label_off={'Overslaan'} items={items.map((item) => ({ _uid: uniqueId('rand_'), label: `Rij: ${item[0]}: ${item[2]['email'] || item[2]['bsn'] || ''} - ${item[1]}`,