Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | import { memo, useCallback } from 'react'; import { FormattedMessage } from 'react-intl'; import { useSnackbars } from '@allshares/studio-design-system'; import { VariableType, type Quota } from '@amalia/amalia-lang/tokens/types'; import { useUpsertQuotasAssignments } from '@amalia/assignments/quotas/state'; import { toError } from '@amalia/ext/typescript'; import { BulkCsvImportModal } from '@amalia/kernel/data-imports/components'; import { usePlansList } from '@amalia/payout-definition/state'; import { useCurrentCompany } from '@amalia/tenants/companies/state'; import { useTeams } from '@amalia/tenants/teams/state'; import { useAuthorizedProfiles } from '@amalia/tenants/users/profile/state'; import { QUOTA_FREQUENCY_COLUMNS, QUOTA_TYPE_AND_FREQUENCY_CSV_TEMPLATE, QUOTA_TYPE_ID_COLUMN, } from '../quotas-csv.constants'; import { transformCsvQuotaRowsToUpsertQuotaAssignmentRequests } from '../quotas-csv.transform'; import { type CsvQuotaRow } from '../quotas-csv.types'; export type QuotaValuesBulkCsvImportModalProps = { readonly isOpen: boolean; readonly onClose: () => void; readonly quota: Pick<Quota, 'format' | 'frequency' | 'id' | 'name' | 'type'>; readonly selectedYear: number; }; export const QuotaValuesBulkCsvImportModal = memo(function QuotaValuesBulkCsvImportModal({ isOpen, onClose, quota, selectedYear, }: QuotaValuesBulkCsvImportModalProps) { const { snackSuccess, snackError } = useSnackbars(); const { mutateAsync: upsertQuotasAssignments } = useUpsertQuotasAssignments(); const { data: company } = useCurrentCompany(); /** Fetch plans, users or teams when the modal opens, based on quota type. */ const { data: plans } = usePlansList({}, { enabled: isOpen && quota.type === VariableType.plan }); const { data: users } = useAuthorizedProfiles({ enabled: isOpen && quota.type === VariableType.user }); const { teamsList: teams } = useTeams({}, { enabled: isOpen && quota.type === VariableType.team }); const handleSubmitUploadedRows = useCallback( async (csvQuotaRows: CsvQuotaRow[]) => { try { await upsertQuotasAssignments({ quotas: transformCsvQuotaRowsToUpsertQuotaAssignmentRequests({ csvQuotaRows, quota, teams, plans, users, year: selectedYear, defaultCurrency: company.currency, }), }); snackSuccess( <FormattedMessage defaultMessage="“{quotaName}” has been successfully updated." values={{ quotaName: quota.name }} />, ); onClose(); } catch (error) { snackError( <FormattedMessage defaultMessage="“{quotaName}” could not be updated: {errorMessage}." values={{ quotaName: quota.name, errorMessage: toError(error).message, }} />, ); } }, [ upsertQuotasAssignments, quota, teams, plans, users, selectedYear, company.currency, snackSuccess, snackError, onClose, ], ); return ( <BulkCsvImportModal isOpen={isOpen} mandatoryColumns={[QUOTA_TYPE_ID_COLUMN[quota.type]]} optionalColumns={QUOTA_FREQUENCY_COLUMNS[quota.frequency]} templateLink={QUOTA_TYPE_AND_FREQUENCY_CSV_TEMPLATE[quota.type][quota.frequency]} onClose={onClose} onSubmit={handleSubmitUploadedRows} /> ); }); |