@gusto/embedded-react-sdk 0.56.4 → 0.56.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/components/Common/DocumentEmbed/DocumentEmbed.js +18 -0
  3. package/dist/components/Common/DocumentEmbed/DocumentEmbed.js.map +1 -0
  4. package/dist/components/Common/DocumentViewer/DocumentViewer.js +35 -29
  5. package/dist/components/Common/DocumentViewer/DocumentViewer.js.map +1 -1
  6. package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js +6 -3
  7. package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js.map +1 -1
  8. package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js +6 -3
  9. package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js.map +1 -1
  10. package/dist/components/Company/AssignSignatory/useAssignSignatory.js +8 -5
  11. package/dist/components/Company/AssignSignatory/useAssignSignatory.js.map +1 -1
  12. package/dist/components/Company/BankAccount/BankAccountForm/context.js +6 -3
  13. package/dist/components/Company/BankAccount/BankAccountForm/context.js.map +1 -1
  14. package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js +6 -3
  15. package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
  16. package/dist/components/Company/FederalTaxes/useFederalTaxes.js +11 -8
  17. package/dist/components/Company/FederalTaxes/useFederalTaxes.js.map +1 -1
  18. package/dist/components/Company/Industry/Context.js +9 -6
  19. package/dist/components/Company/Industry/Context.js.map +1 -1
  20. package/dist/components/Company/Locations/LocationForm/useLocationForm.js +6 -3
  21. package/dist/components/Company/Locations/LocationForm/useLocationForm.js.map +1 -1
  22. package/dist/components/Company/Locations/LocationsList/useLocationsList.js +6 -3
  23. package/dist/components/Company/Locations/LocationsList/useLocationsList.js.map +1 -1
  24. package/dist/components/Company/OnboardingOverview/context.js +6 -3
  25. package/dist/components/Company/OnboardingOverview/context.js.map +1 -1
  26. package/dist/components/Company/StateTaxes/StateTaxesForm/context.js +6 -3
  27. package/dist/components/Company/StateTaxes/StateTaxesForm/context.js.map +1 -1
  28. package/dist/components/Company/StateTaxes/StateTaxesList/context.js +6 -3
  29. package/dist/components/Company/StateTaxes/StateTaxesList/context.js.map +1 -1
  30. package/dist/components/Company/StateTaxes/TaxRateManagement/context.js +6 -3
  31. package/dist/components/Company/StateTaxes/TaxRateManagement/context.js.map +1 -1
  32. package/dist/components/Contractor/ContractorList/management/ManagementContractorList.js +64 -61
  33. package/dist/components/Contractor/ContractorList/management/ManagementContractorList.js.map +1 -1
  34. package/dist/components/Contractor/ContractorList/management/ManagementContractorListView.js +133 -134
  35. package/dist/components/Contractor/ContractorList/management/ManagementContractorListView.js.map +1 -1
  36. package/dist/components/Contractor/ContractorListFlow/ContractorListFlow.js.map +1 -1
  37. package/dist/components/Contractor/ContractorListFlow/ContractorListFlowComponents.js +22 -9
  38. package/dist/components/Contractor/ContractorListFlow/ContractorListFlowComponents.js.map +1 -1
  39. package/dist/components/Contractor/ContractorListFlow/contractorListStateMachine.js +51 -20
  40. package/dist/components/Contractor/ContractorListFlow/contractorListStateMachine.js.map +1 -1
  41. package/dist/components/Contractor/Dismissal/Dismissal.js +77 -0
  42. package/dist/components/Contractor/Dismissal/Dismissal.js.map +1 -0
  43. package/dist/components/Contractor/Dismissal/DismissalPresentation.js +57 -0
  44. package/dist/components/Contractor/Dismissal/DismissalPresentation.js.map +1 -0
  45. package/dist/components/Contractor/Dismissal/useDismissal/useDismissal.js +44 -0
  46. package/dist/components/Contractor/Dismissal/useDismissal/useDismissal.js.map +1 -0
  47. package/dist/components/Contractor/Payments/PaymentStatement/PaymentStatementPresentation.js +45 -41
  48. package/dist/components/Contractor/Payments/PaymentStatement/PaymentStatementPresentation.js.map +1 -1
  49. package/dist/components/Contractor/exports/contractorManagement.js +56 -54
  50. package/dist/components/Contractor/exports/contractorManagement.js.map +1 -1
  51. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js +6 -3
  52. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
  53. package/dist/components/Payroll/GrossUpModal/GrossUpModal.js +3 -2
  54. package/dist/components/Payroll/GrossUpModal/GrossUpModal.js.map +1 -1
  55. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js +201 -196
  56. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js.map +1 -1
  57. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/fields.js +55 -52
  58. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/fields.js.map +1 -1
  59. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeSchema.js +38 -29
  60. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeSchema.js.map +1 -1
  61. package/dist/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.js +17 -14
  62. package/dist/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.js.map +1 -1
  63. package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.js +72 -68
  64. package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.js.map +1 -1
  65. package/dist/components/Payroll/usePreparedPayrollData.js +10 -7
  66. package/dist/components/Payroll/usePreparedPayrollData.js.map +1 -1
  67. package/dist/contexts/ComponentAdapter/useComponentContext.js.map +1 -1
  68. package/dist/i18n/I18n.js +1 -0
  69. package/dist/i18n/I18n.js.map +1 -1
  70. package/dist/i18n/en/Contractor.Dismissal.json.js +20 -0
  71. package/dist/i18n/en/Contractor.Dismissal.json.js.map +1 -0
  72. package/dist/i18n/en/Contractor.Payments.PaymentStatement.json.js +2 -2
  73. package/dist/i18n/en/Payroll.PayrollEditEmployee.json.js +38 -38
  74. package/dist/i18n/en/Payroll.UNSTABLE_PayrollEditEmployee.json.js +31 -31
  75. package/dist/i18n/en/common.json.js +37 -35
  76. package/dist/i18n/en/common.json.js.map +1 -1
  77. package/dist/package.json.js +1 -1
  78. package/dist/shared/constants.js +1 -0
  79. package/dist/shared/constants.js.map +1 -1
  80. package/dist/src/components/Common/DocumentEmbed/DocumentEmbed.d.ts +3 -0
  81. package/dist/src/components/Common/DocumentEmbed/DocumentEmbedTypes.d.ts +25 -0
  82. package/dist/src/components/Common/DocumentEmbed/index.d.ts +2 -0
  83. package/dist/src/components/Contractor/ContractorList/management/ManagementContractorList.d.ts +2 -0
  84. package/dist/src/components/Contractor/ContractorList/management/ManagementContractorListView.d.ts +3 -1
  85. package/dist/src/components/Contractor/ContractorListFlow/ContractorListFlow.d.ts +6 -4
  86. package/dist/src/components/Contractor/ContractorListFlow/ContractorListFlowComponents.d.ts +2 -0
  87. package/dist/src/components/Contractor/ContractorListFlow/contractorListStateMachine.d.ts +1 -0
  88. package/dist/src/components/Contractor/ContractorListFlow/contractorListStateMachine.test.d.ts +1 -0
  89. package/dist/src/components/Contractor/Dismissal/Dismissal.d.ts +45 -0
  90. package/dist/src/components/Contractor/Dismissal/DismissalPresentation.d.ts +17 -0
  91. package/dist/src/components/Contractor/Dismissal/useDismissal/useDismissal.d.ts +41 -0
  92. package/dist/src/components/Contractor/Dismissal/useDismissal/useDismissal.test.d.ts +1 -0
  93. package/dist/src/components/Contractor/exports/contractorManagement.d.ts +1 -0
  94. package/dist/src/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeSchema.d.ts +19 -0
  95. package/dist/src/contexts/ComponentAdapter/componentAdapterTypes.d.ts +1 -0
  96. package/dist/src/contexts/ComponentAdapter/useComponentContext.d.ts +5 -2
  97. package/dist/src/i18n/en/common.json.d.ts +3 -0
  98. package/dist/src/i18n/types.d.ts +47 -0
  99. package/dist/src/shared/constants.d.ts +2 -0
  100. package/docs/guides/endpoint-inventory.json +18 -0
  101. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ManagementContractorListView.js","sources":["../../../../../src/components/Contractor/ContractorList/management/ManagementContractorListView.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { UseContractorListResult, ContractorWithActions } from '../shared/useContractorList'\nimport type { ContractorTab } from './ManagementContractorList'\nimport { DataView, EmptyData, useDataView, Flex, VisuallyHidden } from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { HamburgerMenu } from '@/components/Common/HamburgerMenu'\nimport { ContractorOnboardingStatusBadge } from '@/components/Common/OnboardingStatusBadge'\nimport TrashCanSvg from '@/assets/icons/trashcan.svg?react'\nimport XCircleSvg from '@/assets/icons/x-circle.svg?react'\nimport EyeSvg from '@/assets/icons/eye.svg?react'\nimport SlashCircleSvg from '@/assets/icons/slash-circle.svg?react'\nimport PlusCircleIcon from '@/assets/icons/plus-circle.svg?react'\nimport { firstLastName } from '@/helpers/formattedStrings'\nimport { normalizeToDate, formatDateLong, formatDateLongWithYear } from '@/helpers/dateFormatting'\nimport { CONTRACTOR_TYPE, ContractorOnboardingStatus } from '@/shared/constants'\n\n/** @internal */\nexport interface ManagementContractorListViewProps extends Pick<\n Extract<UseContractorListResult, { isLoading: false }>,\n 'pagination' | 'status'\n> {\n /** CSS class name applied to the root element. */\n className?: string\n contractors: ContractorWithActions[]\n isFetching: boolean\n selectedTab: ContractorTab\n onTabChange: (tab: ContractorTab) => void\n onEdit: (contractorId: string) => void\n onView: (contractorId: string) => void\n onDismiss: (contractorId: string) => void\n onRehire: (contractorId: string) => void\n onDelete: (contractorId: string) => Promise<void>\n onCancelSelfOnboarding: (contractorId: string) => Promise<void>\n onCancelDismissal: (contractorId: string) => Promise<void>\n onCancelRehire: (contractorId: string) => Promise<void>\n onAddContractor: () => void\n}\n\nfunction contractorDisplayName(contractor: ContractorWithActions) {\n return contractor.type === CONTRACTOR_TYPE.BUSINESS\n ? (contractor.businessName ?? '')\n : firstLastName({ first_name: contractor.firstName, last_name: contractor.lastName })\n}\n\nfunction ContractorNameCell({ contractor }: { contractor: ContractorWithActions }) {\n const Components = useComponentContext()\n return (\n <Flex flexDirection=\"column\" gap={0}>\n <Components.Text size=\"sm\" weight=\"medium\">\n {contractorDisplayName(contractor)}\n </Components.Text>\n <Components.Text variant=\"supporting\" size=\"sm\">\n {contractor.type ?? '–'}\n </Components.Text>\n </Flex>\n )\n}\n\nfunction formatBadgeDate(dateStr: string): string {\n const date = normalizeToDate(dateStr)\n if (!date) return ''\n const isSameYear = date.getFullYear() === new Date().getFullYear()\n return isSameYear ? formatDateLong(date) : formatDateLongWithYear(date)\n}\n\nfunction isOnboardingEditReview(onboardingStatus?: string | null) {\n return (\n onboardingStatus === ContractorOnboardingStatus.ADMIN_ONBOARDING_REVIEW ||\n onboardingStatus === ContractorOnboardingStatus.SELF_ONBOARDING_REVIEW\n )\n}\n\n/** @internal */\nexport function ManagementContractorListView({\n className,\n contractors,\n isFetching,\n selectedTab,\n onTabChange,\n status,\n pagination,\n onEdit,\n onView,\n onDismiss,\n onRehire,\n onDelete,\n onCancelSelfOnboarding,\n onCancelDismissal,\n onCancelRehire,\n onAddContractor,\n}: ManagementContractorListViewProps) {\n const { t } = useTranslation('Contractor.ManagementContractorList')\n const Components = useComponentContext()\n const [contractorToRemove, setContractorToRemove] = useState<string | null>(null)\n const [cancelAction, setCancelAction] = useState<{\n contractorId: string\n type: 'dismissal' | 'rehire'\n } | null>(null)\n\n // Columns, item-menu shape, and empty-state copy stay pinned to the previously\n // committed tab until the new tab's data lands, so they swap in one paint together\n // with `contractors`/`pagination` instead of flashing ahead of the still-stale rows\n // that `keepPreviousData` is rendering.\n const [committedTab, setCommittedTab] = useState(selectedTab)\n useEffect(() => {\n if (!isFetching) {\n setCommittedTab(selectedTab)\n }\n }, [selectedTab, isFetching])\n\n const tabs = [\n { id: 'active', label: t('tabs.active'), content: null },\n { id: 'onboarding', label: t('tabs.onboarding'), content: null },\n { id: 'dismissed', label: t('tabs.dismissed'), content: null },\n ]\n\n const getColumns = () => {\n const nameColumn = {\n key: 'name',\n title: t('nameLabel'),\n render: (contractor: ContractorWithActions) => <ContractorNameCell contractor={contractor} />,\n }\n\n if (committedTab === 'active') {\n return [\n nameColumn,\n {\n key: 'rate',\n title: t('rateLabel'),\n render: (contractor: ContractorWithActions) =>\n contractor.wageType === 'Hourly' && contractor.hourlyRate\n ? t('rateHourly', { rate: `$${contractor.hourlyRate}` })\n : (contractor.wageType ?? '–'),\n },\n {\n key: 'status',\n title: <VisuallyHidden>{t('statusColumnLabel')}</VisuallyHidden>,\n render: (contractor: ContractorWithActions) => {\n if (contractor.upcomingEmployment?.startDate) {\n return (\n <Components.Badge status=\"info\">\n {t('startsBadge', {\n date: formatBadgeDate(contractor.upcomingEmployment.startDate),\n })}\n </Components.Badge>\n )\n }\n if (contractor.dismissalDate) {\n return (\n <Components.Badge status=\"warning\">\n {t('lastDayBadge', { date: formatBadgeDate(contractor.dismissalDate) })}\n </Components.Badge>\n )\n }\n return null\n },\n },\n ]\n }\n\n if (committedTab === 'onboarding') {\n return [\n nameColumn,\n {\n key: 'status',\n title: t('onboardingStatusLabel'),\n render: (contractor: ContractorWithActions) => (\n <Flex alignItems=\"center\" gap={8}>\n <ContractorOnboardingStatusBadge\n onboarded={contractor.onboarded}\n onboardingStatus={contractor.onboardingStatus}\n />\n {contractor.onboardingStatus === ContractorOnboardingStatus.ONBOARDING_COMPLETED &&\n contractor.upcomingEmployment?.startDate && (\n <Components.Badge status=\"info\">\n {t('startsBadge', {\n date: formatBadgeDate(contractor.upcomingEmployment.startDate),\n })}\n </Components.Badge>\n )}\n </Flex>\n ),\n },\n ]\n }\n\n return [\n nameColumn,\n {\n key: 'dismissalDate',\n title: t('dismissalDateLabel'),\n render: (contractor: ContractorWithActions) =>\n contractor.dismissalDate ? formatBadgeDate(contractor.dismissalDate) : '–',\n },\n ]\n }\n\n const { ...dataViewProps } = useDataView({\n data: contractors,\n columns: getColumns(),\n itemMenu: contractor => {\n if (committedTab === 'onboarding') {\n const menuItems = []\n\n if (contractor.allowedActions.includes('cancel_self_onboarding')) {\n menuItems.push({\n label: t('cancelSelfOnboardingCta'),\n onClick: () => {\n void onCancelSelfOnboarding(contractor.uuid)\n },\n icon: <XCircleSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('delete')) {\n menuItems.push({\n label: t('removeCta'),\n onClick: () => {\n setContractorToRemove(contractor.uuid)\n },\n icon: <TrashCanSvg aria-hidden />,\n })\n }\n\n return (\n <Flex alignItems=\"center\" justifyContent=\"flex-end\" gap={4}>\n {contractor.allowedActions.includes('edit') && (\n <Components.Button\n variant=\"secondary\"\n onClick={() => {\n onEdit(contractor.uuid)\n }}\n >\n {isOnboardingEditReview(contractor.onboardingStatus)\n ? t('reviewCta')\n : t('continueCta')}\n </Components.Button>\n )}\n <HamburgerMenu\n items={menuItems}\n triggerLabel={t('hamburgerTitle', { name: contractorDisplayName(contractor) })}\n />\n </Flex>\n )\n }\n\n const menuItems = []\n\n if (contractor.allowedActions.includes('view')) {\n menuItems.push({\n label: t('viewDetailsCta'),\n onClick: () => {\n onView(contractor.uuid)\n },\n icon: <EyeSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('cancel_rehire')) {\n menuItems.push({\n label: t('cancelRehireCta'),\n onClick: () => {\n setCancelAction({ contractorId: contractor.uuid, type: 'rehire' })\n },\n icon: <XCircleSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('cancel_dismissal')) {\n menuItems.push({\n label: t('cancelDismissalCta'),\n onClick: () => {\n setCancelAction({ contractorId: contractor.uuid, type: 'dismissal' })\n },\n icon: <XCircleSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('dismiss')) {\n menuItems.push({\n label: t('dismissCta'),\n onClick: () => {\n onDismiss(contractor.uuid)\n },\n icon: <SlashCircleSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('rehire')) {\n menuItems.push({\n label: t('rehireCta'),\n onClick: () => {\n onRehire(contractor.uuid)\n },\n icon: <PlusCircleIcon aria-hidden />,\n })\n }\n\n return (\n <HamburgerMenu\n items={menuItems}\n triggerLabel={t('hamburgerTitle', { name: contractorDisplayName(contractor) })}\n />\n )\n },\n isFetching,\n pagination,\n emptyState: () => (\n <EmptyData\n title={t(`emptyState.${committedTab}.title`)}\n description={t(`emptyState.${committedTab}.description`)}\n />\n ),\n })\n\n return (\n <>\n <Flex className={className} flexDirection=\"column\" gap={32}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Components.Heading as=\"h2\">{t('title')}</Components.Heading>\n <Components.Button variant=\"secondary\" onClick={onAddContractor}>\n {t('addContractorCta')}\n </Components.Button>\n </Flex>\n\n <Flex flexDirection=\"column\" gap={0}>\n <Components.Tabs\n tabs={tabs}\n selectedId={selectedTab}\n onSelectionChange={id => {\n onTabChange(id as ContractorTab)\n }}\n aria-label={t('tabsLabel')}\n />\n\n <DataView label={t('contractorListLabel')} {...dataViewProps} />\n </Flex>\n </Flex>\n\n <Components.Dialog\n isOpen={!!contractorToRemove}\n onClose={() => {\n setContractorToRemove(null)\n }}\n onPrimaryActionClick={async () => {\n if (contractorToRemove) {\n try {\n await onDelete(contractorToRemove)\n setContractorToRemove(null)\n } catch {\n // Keep dialog open on error\n }\n }\n }}\n isPrimaryActionLoading={status.isPending}\n isDestructive\n title={t('removeDialog.title')}\n primaryActionLabel={t('removeDialog.confirmCta')}\n closeActionLabel={t('removeDialog.cancelCta')}\n >\n {t('removeDialog.description')}\n </Components.Dialog>\n\n <Components.Dialog\n isOpen={!!cancelAction}\n onClose={() => {\n setCancelAction(null)\n }}\n onPrimaryActionClick={async () => {\n if (!cancelAction) return\n try {\n if (cancelAction.type === 'rehire') {\n await onCancelRehire(cancelAction.contractorId)\n } else {\n await onCancelDismissal(cancelAction.contractorId)\n }\n setCancelAction(null)\n } catch {\n // Keep dialog open on error\n }\n }}\n isPrimaryActionLoading={status.isPending}\n title={\n cancelAction?.type === 'rehire'\n ? t('cancelRehireDialog.title')\n : t('cancelDismissalDialog.title')\n }\n primaryActionLabel={\n cancelAction?.type === 'rehire'\n ? t('cancelRehireDialog.confirmCta')\n : t('cancelDismissalDialog.confirmCta')\n }\n closeActionLabel={\n cancelAction?.type === 'rehire'\n ? t('cancelRehireDialog.cancelCta')\n : t('cancelDismissalDialog.cancelCta')\n }\n >\n {cancelAction?.type === 'rehire'\n ? t('cancelRehireDialog.description')\n : t('cancelDismissalDialog.description')}\n </Components.Dialog>\n </>\n )\n}\n"],"names":["contractorDisplayName","contractor","CONTRACTOR_TYPE","firstLastName","ContractorNameCell","Components","useComponentContext","jsxs","Flex","jsx","formatBadgeDate","dateStr","date","normalizeToDate","formatDateLong","formatDateLongWithYear","isOnboardingEditReview","onboardingStatus","ContractorOnboardingStatus","ManagementContractorListView","className","contractors","isFetching","selectedTab","onTabChange","status","pagination","onEdit","onView","onDismiss","onRehire","onDelete","onCancelSelfOnboarding","onCancelDismissal","onCancelRehire","onAddContractor","t","useTranslation","contractorToRemove","setContractorToRemove","useState","cancelAction","setCancelAction","committedTab","setCommittedTab","useEffect","tabs","getColumns","nameColumn","VisuallyHidden","ContractorOnboardingStatusBadge","dataViewProps","useDataView","menuItems","XCircleSvg","TrashCanSvg","HamburgerMenu","EyeSvg","SlashCircleSvg","PlusCircleIcon","EmptyData","Fragment","id","DataView"],"mappings":"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"}
1
+ {"version":3,"file":"ManagementContractorListView.js","sources":["../../../../../src/components/Contractor/ContractorList/management/ManagementContractorListView.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { UseContractorListResult, ContractorWithActions } from '../shared/useContractorList'\nimport { getContractorDisplayName } from '../../shared/helpers'\nimport type { ContractorTab } from './ManagementContractorList'\nimport { DataView, EmptyData, useDataView, Flex, VisuallyHidden } from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { HamburgerMenu } from '@/components/Common/HamburgerMenu'\nimport { ContractorOnboardingStatusBadge } from '@/components/Common/OnboardingStatusBadge'\nimport TrashCanSvg from '@/assets/icons/trashcan.svg?react'\nimport XCircleSvg from '@/assets/icons/x-circle.svg?react'\nimport EyeSvg from '@/assets/icons/eye.svg?react'\nimport SlashCircleSvg from '@/assets/icons/slash-circle.svg?react'\nimport PlusCircleIcon from '@/assets/icons/plus-circle.svg?react'\nimport { normalizeToDate, formatDateLong, formatDateLongWithYear } from '@/helpers/dateFormatting'\nimport { ContractorOnboardingStatus } from '@/shared/constants'\n\n/** @internal */\nexport interface ManagementContractorListViewProps extends Pick<\n Extract<UseContractorListResult, { isLoading: false }>,\n 'pagination' | 'status'\n> {\n /** CSS class name applied to the root element. */\n className?: string\n contractors: ContractorWithActions[]\n isFetching: boolean\n selectedTab: ContractorTab\n onTabChange: (tab: ContractorTab) => void\n /** Success message to display in an alert above the list, typically after a dismissal is scheduled. */\n successMessage?: string\n onEdit: (contractorId: string) => void\n onView: (contractorId: string) => void\n onDismiss: (contractorId: string) => void\n onRehire: (contractorId: string) => void\n onDelete: (contractorId: string) => Promise<void>\n onCancelSelfOnboarding: (contractorId: string) => Promise<void>\n onCancelDismissal: (contractorId: string) => Promise<void>\n onCancelRehire: (contractorId: string) => Promise<void>\n onAddContractor: () => void\n}\n\nfunction ContractorNameCell({ contractor }: { contractor: ContractorWithActions }) {\n const Components = useComponentContext()\n return (\n <Flex flexDirection=\"column\" gap={0}>\n <Components.Text size=\"sm\" weight=\"medium\">\n {getContractorDisplayName(contractor)}\n </Components.Text>\n <Components.Text variant=\"supporting\" size=\"sm\">\n {contractor.type ?? '–'}\n </Components.Text>\n </Flex>\n )\n}\n\nfunction formatBadgeDate(dateStr: string): string {\n const date = normalizeToDate(dateStr)\n if (!date) return ''\n const isSameYear = date.getFullYear() === new Date().getFullYear()\n return isSameYear ? formatDateLong(date) : formatDateLongWithYear(date)\n}\n\nfunction isOnboardingEditReview(onboardingStatus?: string | null) {\n return (\n onboardingStatus === ContractorOnboardingStatus.ADMIN_ONBOARDING_REVIEW ||\n onboardingStatus === ContractorOnboardingStatus.SELF_ONBOARDING_REVIEW\n )\n}\n\n/** @internal */\nexport function ManagementContractorListView({\n className,\n contractors,\n isFetching,\n selectedTab,\n onTabChange,\n successMessage,\n status,\n pagination,\n onEdit,\n onView,\n onDismiss,\n onRehire,\n onDelete,\n onCancelSelfOnboarding,\n onCancelDismissal,\n onCancelRehire,\n onAddContractor,\n}: ManagementContractorListViewProps) {\n const { t } = useTranslation('Contractor.ManagementContractorList')\n const Components = useComponentContext()\n const [contractorToRemove, setContractorToRemove] = useState<string | null>(null)\n const [cancelAction, setCancelAction] = useState<{\n contractorId: string\n type: 'dismissal' | 'rehire'\n } | null>(null)\n\n // Columns, item-menu shape, and empty-state copy stay pinned to the previously\n // committed tab until the new tab's data lands, so they swap in one paint together\n // with `contractors`/`pagination` instead of flashing ahead of the still-stale rows\n // that `keepPreviousData` is rendering.\n const [committedTab, setCommittedTab] = useState(selectedTab)\n useEffect(() => {\n if (!isFetching) {\n setCommittedTab(selectedTab)\n }\n }, [selectedTab, isFetching])\n\n const tabs = [\n { id: 'active', label: t('tabs.active'), content: null },\n { id: 'onboarding', label: t('tabs.onboarding'), content: null },\n { id: 'dismissed', label: t('tabs.dismissed'), content: null },\n ]\n\n const getColumns = () => {\n const nameColumn = {\n key: 'name',\n title: t('nameLabel'),\n render: (contractor: ContractorWithActions) => <ContractorNameCell contractor={contractor} />,\n }\n\n if (committedTab === 'active') {\n return [\n nameColumn,\n {\n key: 'rate',\n title: t('rateLabel'),\n render: (contractor: ContractorWithActions) =>\n contractor.wageType === 'Hourly' && contractor.hourlyRate\n ? t('rateHourly', { rate: `$${contractor.hourlyRate}` })\n : (contractor.wageType ?? '–'),\n },\n {\n key: 'status',\n title: <VisuallyHidden>{t('statusColumnLabel')}</VisuallyHidden>,\n render: (contractor: ContractorWithActions) => {\n if (contractor.upcomingEmployment?.startDate) {\n return (\n <Components.Badge status=\"info\">\n {t('startsBadge', {\n date: formatBadgeDate(contractor.upcomingEmployment.startDate),\n })}\n </Components.Badge>\n )\n }\n if (contractor.dismissalDate) {\n return (\n <Components.Badge status=\"warning\">\n {t('lastDayBadge', { date: formatBadgeDate(contractor.dismissalDate) })}\n </Components.Badge>\n )\n }\n return null\n },\n },\n ]\n }\n\n if (committedTab === 'onboarding') {\n return [\n nameColumn,\n {\n key: 'status',\n title: t('onboardingStatusLabel'),\n render: (contractor: ContractorWithActions) => (\n <Flex alignItems=\"center\" gap={8}>\n <ContractorOnboardingStatusBadge\n onboarded={contractor.onboarded}\n onboardingStatus={contractor.onboardingStatus}\n />\n {contractor.onboardingStatus === ContractorOnboardingStatus.ONBOARDING_COMPLETED &&\n contractor.upcomingEmployment?.startDate && (\n <Components.Badge status=\"info\">\n {t('startsBadge', {\n date: formatBadgeDate(contractor.upcomingEmployment.startDate),\n })}\n </Components.Badge>\n )}\n </Flex>\n ),\n },\n ]\n }\n\n return [\n nameColumn,\n {\n key: 'dismissalDate',\n title: t('dismissalDateLabel'),\n render: (contractor: ContractorWithActions) =>\n contractor.dismissalDate ? formatBadgeDate(contractor.dismissalDate) : '–',\n },\n ]\n }\n\n const { ...dataViewProps } = useDataView({\n data: contractors,\n columns: getColumns(),\n itemMenu: contractor => {\n if (committedTab === 'onboarding') {\n const menuItems = []\n\n if (contractor.allowedActions.includes('cancel_self_onboarding')) {\n menuItems.push({\n label: t('cancelSelfOnboardingCta'),\n onClick: () => {\n void onCancelSelfOnboarding(contractor.uuid)\n },\n icon: <XCircleSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('delete')) {\n menuItems.push({\n label: t('removeCta'),\n onClick: () => {\n setContractorToRemove(contractor.uuid)\n },\n icon: <TrashCanSvg aria-hidden />,\n })\n }\n\n return (\n <Flex alignItems=\"center\" justifyContent=\"flex-end\" gap={4}>\n {contractor.allowedActions.includes('edit') && (\n <Components.Button\n variant=\"secondary\"\n onClick={() => {\n onEdit(contractor.uuid)\n }}\n >\n {isOnboardingEditReview(contractor.onboardingStatus)\n ? t('reviewCta')\n : t('continueCta')}\n </Components.Button>\n )}\n <HamburgerMenu\n items={menuItems}\n triggerLabel={t('hamburgerTitle', { name: getContractorDisplayName(contractor) })}\n />\n </Flex>\n )\n }\n\n const menuItems = []\n\n if (contractor.allowedActions.includes('view')) {\n menuItems.push({\n label: t('viewDetailsCta'),\n onClick: () => {\n onView(contractor.uuid)\n },\n icon: <EyeSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('cancel_rehire')) {\n menuItems.push({\n label: t('cancelRehireCta'),\n onClick: () => {\n setCancelAction({ contractorId: contractor.uuid, type: 'rehire' })\n },\n icon: <XCircleSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('cancel_dismissal')) {\n menuItems.push({\n label: t('cancelDismissalCta'),\n onClick: () => {\n setCancelAction({ contractorId: contractor.uuid, type: 'dismissal' })\n },\n icon: <XCircleSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('dismiss')) {\n menuItems.push({\n label: t('dismissCta'),\n onClick: () => {\n onDismiss(contractor.uuid)\n },\n icon: <SlashCircleSvg aria-hidden />,\n })\n }\n\n if (contractor.allowedActions.includes('rehire')) {\n menuItems.push({\n label: t('rehireCta'),\n onClick: () => {\n onRehire(contractor.uuid)\n },\n icon: <PlusCircleIcon aria-hidden />,\n })\n }\n\n return (\n <HamburgerMenu\n items={menuItems}\n triggerLabel={t('hamburgerTitle', { name: getContractorDisplayName(contractor) })}\n />\n )\n },\n isFetching,\n pagination,\n emptyState: () => (\n <EmptyData\n title={t(`emptyState.${committedTab}.title`)}\n description={t(`emptyState.${committedTab}.description`)}\n />\n ),\n })\n\n return (\n <>\n <Flex className={className} flexDirection=\"column\" gap={32}>\n {successMessage && <Components.Alert label={successMessage} status=\"success\" />}\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Components.Heading as=\"h2\">{t('title')}</Components.Heading>\n <Components.Button variant=\"secondary\" onClick={onAddContractor}>\n {t('addContractorCta')}\n </Components.Button>\n </Flex>\n\n <Flex flexDirection=\"column\" gap={0}>\n <Components.Tabs\n tabs={tabs}\n selectedId={selectedTab}\n onSelectionChange={id => {\n onTabChange(id as ContractorTab)\n }}\n aria-label={t('tabsLabel')}\n />\n\n <DataView label={t('contractorListLabel')} {...dataViewProps} />\n </Flex>\n </Flex>\n\n <Components.Dialog\n isOpen={!!contractorToRemove}\n onClose={() => {\n setContractorToRemove(null)\n }}\n onPrimaryActionClick={async () => {\n if (contractorToRemove) {\n try {\n await onDelete(contractorToRemove)\n setContractorToRemove(null)\n } catch {\n // Keep dialog open on error\n }\n }\n }}\n isPrimaryActionLoading={status.isPending}\n isDestructive\n title={t('removeDialog.title')}\n primaryActionLabel={t('removeDialog.confirmCta')}\n closeActionLabel={t('removeDialog.cancelCta')}\n >\n {t('removeDialog.description')}\n </Components.Dialog>\n\n <Components.Dialog\n isOpen={!!cancelAction}\n onClose={() => {\n setCancelAction(null)\n }}\n onPrimaryActionClick={async () => {\n if (!cancelAction) return\n try {\n if (cancelAction.type === 'rehire') {\n await onCancelRehire(cancelAction.contractorId)\n } else {\n await onCancelDismissal(cancelAction.contractorId)\n }\n setCancelAction(null)\n } catch {\n // Keep dialog open on error\n }\n }}\n isPrimaryActionLoading={status.isPending}\n title={\n cancelAction?.type === 'rehire'\n ? t('cancelRehireDialog.title')\n : t('cancelDismissalDialog.title')\n }\n primaryActionLabel={\n cancelAction?.type === 'rehire'\n ? t('cancelRehireDialog.confirmCta')\n : t('cancelDismissalDialog.confirmCta')\n }\n closeActionLabel={\n cancelAction?.type === 'rehire'\n ? t('cancelRehireDialog.cancelCta')\n : t('cancelDismissalDialog.cancelCta')\n }\n >\n {cancelAction?.type === 'rehire'\n ? t('cancelRehireDialog.description')\n : t('cancelDismissalDialog.description')}\n </Components.Dialog>\n </>\n )\n}\n"],"names":["ContractorNameCell","contractor","Components","useComponentContext","jsxs","Flex","jsx","getContractorDisplayName","formatBadgeDate","dateStr","date","normalizeToDate","formatDateLong","formatDateLongWithYear","isOnboardingEditReview","onboardingStatus","ContractorOnboardingStatus","ManagementContractorListView","className","contractors","isFetching","selectedTab","onTabChange","successMessage","status","pagination","onEdit","onView","onDismiss","onRehire","onDelete","onCancelSelfOnboarding","onCancelDismissal","onCancelRehire","onAddContractor","t","useTranslation","contractorToRemove","setContractorToRemove","useState","cancelAction","setCancelAction","committedTab","setCommittedTab","useEffect","tabs","getColumns","nameColumn","VisuallyHidden","ContractorOnboardingStatusBadge","dataViewProps","useDataView","menuItems","XCircleSvg","TrashCanSvg","HamburgerMenu","EyeSvg","SlashCircleSvg","PlusCircleIcon","EmptyData","Fragment","id","DataView"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ContractorListFlow.js","sources":["../../../../src/components/Contractor/ContractorListFlow/ContractorListFlow.tsx"],"sourcesContent":["import { createMachine } from 'robot3'\nimport { useMemo } from 'react'\nimport { contractorListStateMachine } from './contractorListStateMachine'\nimport {\n ContractorListContextual,\n type ContractorListFlowContextInterface,\n type ContractorListFlowProps,\n} from './ContractorListFlowComponents'\nimport { Flow } from '@/components/Flow/Flow'\n\n/**\n * Hub for viewing and managing a company's contractors, including onboarding new ones.\n *\n * @remarks\n * Drop-in entry point for browsing a company's contractors. Begins on the\n * management contractor list and routes into {@link DashboardFlow} when the\n * admin selects \"View details\" on a row, or directly into the Profile step\n * of contractor onboarding — the same Profile → Address → Payment Method →\n * New Hire Report → Submit sequence used by\n * {@link ContractorOnboarding.OnboardingFlow | OnboardingFlow} — when the\n * admin clicks \"Add contractor\" or selects \"Continue\"/\"Review\" on an\n * onboarding-tab row. A \"Back to contractors\" header is added above the\n * dashboard; the onboarding steps show their own progress header instead,\n * matching `OnboardingFlow`'s own screens exactly. Submitting, or cancelling\n * from any step, returns to this list.\n *\n * \"Dismiss\" and \"Rehire\" have no corresponding sub-flow yet and are not\n * handled internally — they continue to fire their documented events\n * (`contractor/dismiss`, `contractor/rehire`) straight through `onEvent` for\n * the host app to handle, exactly as they do outside this flow.\n *\n * The flow forwards every event emitted by its blocks to `onEvent`;\n * see the events table on each block for the full set of events and\n * payloads observable from this flow.\n *\n * @components\n * - {@link ContractorList}\n * - {@link DashboardFlow}\n * - {@link ContractorOnboarding.ContractorProfile | ContractorProfile}\n * - {@link ContractorOnboarding.Address | Address}\n * - {@link ContractorOnboarding.PaymentMethod | PaymentMethod}\n * - {@link ContractorOnboarding.NewHireReport | NewHireReport}\n * - {@link ContractorOnboarding.ContractorSubmit | ContractorSubmit}\n *\n * @param props - See {@link ContractorListFlowProps}.\n * @returns The contractor list workflow with internal navigation to the dashboard and onboarding steps.\n * @public\n * @group Flow components\n *\n * @example\n * ```tsx title=\"App.tsx\"\n * import { ContractorManagement } from '@gusto/embedded-react-sdk'\n *\n * function MyApp() {\n * return (\n * <ContractorManagement.ContractorListFlow\n * companyId=\"a007e1ab-3595-43c2-ab4b-af7a5af2e365\"\n * onEvent={() => {}}\n * />\n * )\n * }\n * ```\n */\nexport const ContractorListFlow = ({ companyId, onEvent }: ContractorListFlowProps) => {\n const machine = useMemo(\n () =>\n createMachine(\n 'list',\n contractorListStateMachine,\n (initialContext: ContractorListFlowContextInterface) => ({\n ...initialContext,\n component: ContractorListContextual,\n companyId,\n selfOnboarding: false,\n }),\n ),\n [companyId],\n )\n return <Flow machine={machine} onEvent={onEvent} />\n}\n"],"names":["ContractorListFlow","companyId","onEvent","machine","useMemo","createMachine","contractorListStateMachine","initialContext","ContractorListContextual","jsx","Flow"],"mappings":";;;;;;AA+DO,MAAMA,IAAqB,CAAC,EAAE,WAAAC,GAAW,SAAAC,QAAuC;AACrF,QAAMC,IAAUC;AAAA,IACd,MACEC;AAAA,MACE;AAAA,MACAC;AAAA,MACA,CAACC,OAAwD;AAAA,QACvD,GAAGA;AAAA,QACH,WAAWC;AAAA,QACX,WAAAP;AAAA,QACA,gBAAgB;AAAA,MAAA;AAAA,IAClB;AAAA,IAEJ,CAACA,CAAS;AAAA,EAAA;AAEZ,SAAO,gBAAAQ,EAACC,GAAA,EAAK,SAAAP,GAAkB,SAAAD,EAAA,CAAkB;AACnD;"}
1
+ {"version":3,"file":"ContractorListFlow.js","sources":["../../../../src/components/Contractor/ContractorListFlow/ContractorListFlow.tsx"],"sourcesContent":["import { createMachine } from 'robot3'\nimport { useMemo } from 'react'\nimport { contractorListStateMachine } from './contractorListStateMachine'\nimport {\n ContractorListContextual,\n type ContractorListFlowContextInterface,\n type ContractorListFlowProps,\n} from './ContractorListFlowComponents'\nimport { Flow } from '@/components/Flow/Flow'\n\n/**\n * Hub for viewing and managing a company's contractors, including onboarding new ones.\n *\n * @remarks\n * Drop-in entry point for browsing a company's contractors. Begins on the\n * management contractor list and routes into {@link DashboardFlow} when the\n * admin selects \"View details\" on a row, or directly into the Profile step\n * of contractor onboarding — the same Profile → Address → Payment Method →\n * New Hire Report → Submit sequence used by\n * {@link ContractorOnboarding.OnboardingFlow | OnboardingFlow} — when the\n * admin clicks \"Add contractor\" or selects \"Continue\"/\"Review\" on an\n * onboarding-tab row. A \"Back to contractors\" header is added above the\n * dashboard; the onboarding steps show their own progress header instead,\n * matching `OnboardingFlow`'s own screens exactly. Submitting, or cancelling\n * from any step, returns to this list.\n *\n * \"Dismiss\" routes into {@link Dismissal}, a standalone form for scheduling\n * the contractor's dismissal date. \"Rehire\" has no corresponding sub-flow yet\n * and is not handled internally — it continues to fire its documented event\n * (`contractor/rehire`) straight through `onEvent` for the host app to\n * handle, exactly as it does outside this flow.\n *\n * The flow forwards every event emitted by its blocks to `onEvent`;\n * see the events table on each block for the full set of events and\n * payloads observable from this flow.\n *\n * @components\n * - {@link ContractorList}\n * - {@link DashboardFlow}\n * - {@link Dismissal}\n * - {@link ContractorOnboarding.ContractorProfile | ContractorProfile}\n * - {@link ContractorOnboarding.Address | Address}\n * - {@link ContractorOnboarding.PaymentMethod | PaymentMethod}\n * - {@link ContractorOnboarding.NewHireReport | NewHireReport}\n * - {@link ContractorOnboarding.ContractorSubmit | ContractorSubmit}\n *\n * @param props - See {@link ContractorListFlowProps}.\n * @returns The contractor list workflow with internal navigation to the dashboard and onboarding steps.\n * @public\n * @group Flow components\n *\n * @example\n * ```tsx title=\"App.tsx\"\n * import { ContractorManagement } from '@gusto/embedded-react-sdk'\n *\n * function MyApp() {\n * return (\n * <ContractorManagement.ContractorListFlow\n * companyId=\"a007e1ab-3595-43c2-ab4b-af7a5af2e365\"\n * onEvent={() => {}}\n * />\n * )\n * }\n * ```\n */\nexport const ContractorListFlow = ({ companyId, onEvent }: ContractorListFlowProps) => {\n const machine = useMemo(\n () =>\n createMachine(\n 'list',\n contractorListStateMachine,\n (initialContext: ContractorListFlowContextInterface) => ({\n ...initialContext,\n component: ContractorListContextual,\n companyId,\n selfOnboarding: false,\n }),\n ),\n [companyId],\n )\n return <Flow machine={machine} onEvent={onEvent} />\n}\n"],"names":["ContractorListFlow","companyId","onEvent","machine","useMemo","createMachine","contractorListStateMachine","initialContext","ContractorListContextual","jsx","Flow"],"mappings":";;;;;;AAiEO,MAAMA,IAAqB,CAAC,EAAE,WAAAC,GAAW,SAAAC,QAAuC;AACrF,QAAMC,IAAUC;AAAA,IACd,MACEC;AAAA,MACE;AAAA,MACAC;AAAA,MACA,CAACC,OAAwD;AAAA,QACvD,GAAGA;AAAA,QACH,WAAWC;AAAA,QACX,WAAAP;AAAA,QACA,gBAAgB;AAAA,MAAA;AAAA,IAClB;AAAA,IAEJ,CAACA,CAAS;AAAA,EAAA;AAEZ,SAAO,gBAAAQ,EAACC,GAAA,EAAK,SAAAP,GAAkB,SAAAD,EAAA,CAAkB;AACnD;"}
@@ -1,18 +1,31 @@
1
1
  import { jsx as r } from "react/jsx-runtime";
2
- import { ManagementContractorList as e } from "../ContractorList/management/ManagementContractorList.js";
2
+ import { ManagementContractorList as c } from "../ContractorList/management/ManagementContractorList.js";
3
+ import { Dismissal as e } from "../Dismissal/Dismissal.js";
3
4
  import { useFlow as n } from "../../Flow/useFlow.js";
4
- import { ensureRequired as a } from "../../../helpers/ensureRequired.js";
5
+ import { ensureRequired as s } from "../../../helpers/ensureRequired.js";
5
6
  import { DashboardFlow as m } from "../Dashboard/DashboardFlow.js";
6
- function d() {
7
- const { companyId: o, onEvent: t } = n();
8
- return /* @__PURE__ */ r(e, { companyId: a(o), onEvent: t });
7
+ function I() {
8
+ const { companyId: o, onEvent: t, successMessage: a } = n();
9
+ return /* @__PURE__ */ r(
10
+ c,
11
+ {
12
+ companyId: s(o),
13
+ onEvent: t,
14
+ successMessage: a
15
+ }
16
+ );
9
17
  }
10
- function f() {
18
+ function x() {
11
19
  const { contractorId: o, onEvent: t } = n();
12
- return /* @__PURE__ */ r(m, { contractorId: a(o), onEvent: t });
20
+ return /* @__PURE__ */ r(m, { contractorId: s(o), onEvent: t });
21
+ }
22
+ function C() {
23
+ const { contractorId: o, onEvent: t } = n();
24
+ return /* @__PURE__ */ r(e, { contractorId: s(o), onEvent: t });
13
25
  }
14
26
  export {
15
- d as ContractorListContextual,
16
- f as DashboardFlowContextual
27
+ I as ContractorListContextual,
28
+ x as DashboardFlowContextual,
29
+ C as DismissalContextual
17
30
  };
18
31
  //# sourceMappingURL=ContractorListFlowComponents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContractorListFlowComponents.js","sources":["../../../../src/components/Contractor/ContractorListFlow/ContractorListFlowComponents.tsx"],"sourcesContent":["import { ManagementContractorList } from '../ContractorList/management/ManagementContractorList'\nimport { DashboardFlow } from '../Dashboard'\nimport { type OnboardingFlowContextInterface } from '../OnboardingFlow/OnboardingFlowComponents'\nimport { useFlow } from '@/components/Flow/useFlow'\nimport type { BaseComponentInterface } from '@/components/Base'\nimport { ensureRequired } from '@/helpers/ensureRequired'\n\n/**\n * Props for {@link ContractorListFlow}.\n *\n * @public\n */\nexport interface ContractorListFlowProps extends BaseComponentInterface<never> {\n /** The associated company identifier. */\n companyId: string\n}\n\n// Extends OnboardingFlowContextInterface (rather than FlowContextInterface directly) so this\n// machine's context is shape-compatible with the shared contractor-onboarding step states it\n// spreads in from onboardingStateMachine.ts (see createContractorOnboardingSteps) — those\n// states' reducers and Contextual components (ProfileContextual, AddressContextual, etc.) are\n// typed against OnboardingFlowContextInterface.\n/** @internal */\nexport type ContractorListFlowContextInterface = OnboardingFlowContextInterface\n\n/** @internal */\nexport function ContractorListContextual() {\n const { companyId, onEvent } = useFlow<ContractorListFlowContextInterface>()\n return <ManagementContractorList companyId={ensureRequired(companyId)} onEvent={onEvent} />\n}\n\n/** @internal */\nexport function DashboardFlowContextual() {\n const { contractorId, onEvent } = useFlow<ContractorListFlowContextInterface>()\n return <DashboardFlow contractorId={ensureRequired(contractorId)} onEvent={onEvent} />\n}\n"],"names":["ContractorListContextual","companyId","onEvent","useFlow","ManagementContractorList","ensureRequired","DashboardFlowContextual","contractorId","DashboardFlow"],"mappings":";;;;;AA0BO,SAASA,IAA2B;AACzC,QAAM,EAAE,WAAAC,GAAW,SAAAC,EAAA,IAAYC,EAAA;AAC/B,2BAAQC,GAAA,EAAyB,WAAWC,EAAeJ,CAAS,GAAG,SAAAC,GAAkB;AAC3F;AAGO,SAASI,IAA0B;AACxC,QAAM,EAAE,cAAAC,GAAc,SAAAL,EAAA,IAAYC,EAAA;AAClC,2BAAQK,GAAA,EAAc,cAAcH,EAAeE,CAAY,GAAG,SAAAL,GAAkB;AACtF;"}
1
+ {"version":3,"file":"ContractorListFlowComponents.js","sources":["../../../../src/components/Contractor/ContractorListFlow/ContractorListFlowComponents.tsx"],"sourcesContent":["import { ManagementContractorList } from '../ContractorList/management/ManagementContractorList'\nimport { DashboardFlow } from '../Dashboard'\nimport { Dismissal } from '../Dismissal/Dismissal'\nimport { type OnboardingFlowContextInterface } from '../OnboardingFlow/OnboardingFlowComponents'\nimport { useFlow } from '@/components/Flow/useFlow'\nimport type { BaseComponentInterface } from '@/components/Base'\nimport { ensureRequired } from '@/helpers/ensureRequired'\n\n/**\n * Props for {@link ContractorListFlow}.\n *\n * @public\n */\nexport interface ContractorListFlowProps extends BaseComponentInterface<never> {\n /** The associated company identifier. */\n companyId: string\n}\n\n// Extends OnboardingFlowContextInterface (rather than FlowContextInterface directly) so this\n// machine's context is shape-compatible with the shared contractor-onboarding step states it\n// spreads in from onboardingStateMachine.ts (see createContractorOnboardingSteps) — those\n// states' reducers and Contextual components (ProfileContextual, AddressContextual, etc.) are\n// typed against OnboardingFlowContextInterface.\n/** @internal */\nexport type ContractorListFlowContextInterface = OnboardingFlowContextInterface\n\n/** @internal */\nexport function ContractorListContextual() {\n const { companyId, onEvent, successMessage } = useFlow<ContractorListFlowContextInterface>()\n return (\n <ManagementContractorList\n companyId={ensureRequired(companyId)}\n onEvent={onEvent}\n successMessage={successMessage}\n />\n )\n}\n\n/** @internal */\nexport function DashboardFlowContextual() {\n const { contractorId, onEvent } = useFlow<ContractorListFlowContextInterface>()\n return <DashboardFlow contractorId={ensureRequired(contractorId)} onEvent={onEvent} />\n}\n\n/** @internal */\nexport function DismissalContextual() {\n const { contractorId, onEvent } = useFlow<ContractorListFlowContextInterface>()\n return <Dismissal contractorId={ensureRequired(contractorId)} onEvent={onEvent} />\n}\n"],"names":["ContractorListContextual","companyId","onEvent","successMessage","useFlow","jsx","ManagementContractorList","ensureRequired","DashboardFlowContextual","contractorId","DashboardFlow","DismissalContextual","Dismissal"],"mappings":";;;;;;AA2BO,SAASA,IAA2B;AACzC,QAAM,EAAE,WAAAC,GAAW,SAAAC,GAAS,gBAAAC,EAAA,IAAmBC,EAAA;AAC/C,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAeN,CAAS;AAAA,MACnC,SAAAC;AAAA,MACA,gBAAAC;AAAA,IAAA;AAAA,EAAA;AAGN;AAGO,SAASK,IAA0B;AACxC,QAAM,EAAE,cAAAC,GAAc,SAAAP,EAAA,IAAYE,EAAA;AAClC,2BAAQM,GAAA,EAAc,cAAcH,EAAeE,CAAY,GAAG,SAAAP,GAAkB;AACtF;AAGO,SAASS,IAAsB;AACpC,QAAM,EAAE,cAAAF,GAAc,SAAAP,EAAA,IAAYE,EAAA;AAClC,2BAAQQ,GAAA,EAAU,cAAcL,EAAeE,CAAY,GAAG,SAAAP,GAAkB;AAClF;"}
@@ -1,40 +1,71 @@
1
- import { state as r, transition as a, reduce as n } from "robot3";
2
- import { createContractorOnboardingSteps as i, contractorCreateTransition as s, contractorUpdateTransition as T } from "../OnboardingFlow/onboardingStateMachine.js";
3
- import { DashboardFlowContextual as d, ContractorListContextual as e } from "./ContractorListFlowComponents.js";
1
+ import { state as s, transition as a, reduce as r } from "robot3";
2
+ import { createContractorOnboardingSteps as d, contractorCreateTransition as T, contractorUpdateTransition as C } from "../OnboardingFlow/onboardingStateMachine.js";
3
+ import { ContractorListContextual as c, DashboardFlowContextual as m, DismissalContextual as l } from "./ContractorListFlowComponents.js";
4
4
  import { componentEvents as o } from "../../../shared/constants.js";
5
- const m = {
5
+ const i = {
6
6
  type: "minimal",
7
7
  back: {
8
8
  labelKey: "backToListCta",
9
9
  namespace: "Contractor.ManagementContractorList",
10
10
  event: o.CONTRACTOR_RETURN_TO_LIST
11
11
  }
12
- }, p = n(
12
+ }, n = r(
13
13
  (t) => ({
14
14
  ...t,
15
- component: e,
15
+ component: c,
16
16
  header: null,
17
- contractorId: void 0
17
+ contractorId: void 0,
18
+ successMessage: void 0
18
19
  })
19
- ), O = {
20
- list: r(
20
+ ), S = {
21
+ list: s(
21
22
  a(
22
23
  o.CONTRACTOR_VIEW,
23
24
  "dashboard",
24
- n(
25
- (t, c) => ({
25
+ r(
26
+ (t, e) => ({
26
27
  ...t,
27
- component: d,
28
- header: m,
29
- contractorId: c.payload.contractorId
28
+ component: m,
29
+ header: i,
30
+ contractorId: e.payload.contractorId
30
31
  })
31
32
  )
32
33
  ),
33
- s,
34
- T
34
+ a(
35
+ o.CONTRACTOR_DISMISS,
36
+ "dismiss",
37
+ r(
38
+ (t, e) => ({
39
+ ...t,
40
+ component: l,
41
+ header: i,
42
+ contractorId: e.payload.contractorId,
43
+ successMessage: void 0
44
+ })
45
+ )
46
+ ),
47
+ T,
48
+ C
35
49
  ),
36
- dashboard: r(
37
- a(o.CONTRACTOR_RETURN_TO_LIST, "list", p)
50
+ dashboard: s(
51
+ a(o.CONTRACTOR_RETURN_TO_LIST, "list", n)
52
+ ),
53
+ dismiss: s(
54
+ a(o.CONTRACTOR_RETURN_TO_LIST, "list", n),
55
+ a(o.CANCEL, "list", n),
56
+ a(
57
+ o.CONTRACTOR_DISMISSAL_SCHEDULED,
58
+ "list",
59
+ r(
60
+ (t, e) => ({
61
+ ...t,
62
+ component: c,
63
+ header: null,
64
+ contractorId: void 0,
65
+ successMessage: e.payload.message
66
+ })
67
+ )
68
+ )
38
69
  ),
39
70
  // Spreads in the same Profile → Address → Payment Method → New Hire Report → Submit states
40
71
  // ContractorOnboarding.OnboardingFlow uses, rather than mounting that flow as a nested
@@ -46,9 +77,9 @@ const m = {
46
77
  // waitForExplicitSubmitDone: true because this list (unlike OnboardingFlow's own) has no
47
78
  // success-banner mechanism — without it, an admin completing onboarding would be swept back
48
79
  // to the list the instant they click Submit, with no confirmation at all.
49
- ...i(e, { waitForExplicitSubmitDone: !0 })
80
+ ...d(c, { waitForExplicitSubmitDone: !0 })
50
81
  };
51
82
  export {
52
- O as contractorListStateMachine
83
+ S as contractorListStateMachine
53
84
  };
54
85
  //# sourceMappingURL=contractorListStateMachine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contractorListStateMachine.js","sources":["../../../../src/components/Contractor/ContractorListFlow/contractorListStateMachine.ts"],"sourcesContent":["import { transition, reduce, state } from 'robot3'\nimport {\n contractorCreateTransition,\n contractorUpdateTransition,\n createContractorOnboardingSteps,\n} from '../OnboardingFlow/onboardingStateMachine'\nimport {\n ContractorListContextual,\n DashboardFlowContextual,\n type ContractorListFlowContextInterface,\n} from './ContractorListFlowComponents'\nimport { componentEvents } from '@/shared/constants'\nimport type { MachineEventType, MachineTransition } from '@/types/Helpers'\nimport type { FlowHeaderConfig } from '@/components/Flow/useFlow'\n\ntype EventPayloads = {\n [componentEvents.CONTRACTOR_VIEW]: { contractorId: string }\n}\n\nconst backToListHeader: FlowHeaderConfig = {\n type: 'minimal',\n back: {\n labelKey: 'backToListCta',\n namespace: 'Contractor.ManagementContractorList',\n event: componentEvents.CONTRACTOR_RETURN_TO_LIST,\n },\n}\n\nconst returnToList = reduce(\n (ctx: ContractorListFlowContextInterface): ContractorListFlowContextInterface => ({\n ...ctx,\n component: ContractorListContextual,\n header: null,\n contractorId: undefined,\n }),\n)\n\n/** @internal */\nexport const contractorListStateMachine = {\n list: state<MachineTransition>(\n transition(\n componentEvents.CONTRACTOR_VIEW,\n 'dashboard',\n reduce(\n (\n ctx: ContractorListFlowContextInterface,\n ev: MachineEventType<EventPayloads, typeof componentEvents.CONTRACTOR_VIEW>,\n ): ContractorListFlowContextInterface => ({\n ...ctx,\n component: DashboardFlowContextual,\n header: backToListHeader,\n contractorId: ev.payload.contractorId,\n }),\n ),\n ),\n contractorCreateTransition,\n contractorUpdateTransition,\n ),\n dashboard: state<MachineTransition>(\n transition(componentEvents.CONTRACTOR_RETURN_TO_LIST, 'list', returnToList),\n ),\n // Spreads in the same Profile → Address → Payment Method → New Hire Report → Submit states\n // ContractorOnboarding.OnboardingFlow uses, rather than mounting that flow as a nested\n // component — see createContractorOnboardingSteps' own doc comment for why. Every\n // 'list'-targeting transition inside these states (cancel, submit-done) resolves against\n // this machine's own `list` state above, since state names resolve against whichever\n // machine they end up spread into.\n //\n // waitForExplicitSubmitDone: true because this list (unlike OnboardingFlow's own) has no\n // success-banner mechanism — without it, an admin completing onboarding would be swept back\n // to the list the instant they click Submit, with no confirmation at all.\n ...createContractorOnboardingSteps(ContractorListContextual, { waitForExplicitSubmitDone: true }),\n}\n"],"names":["backToListHeader","componentEvents","returnToList","reduce","ctx","ContractorListContextual","contractorListStateMachine","state","transition","ev","DashboardFlowContextual","contractorCreateTransition","contractorUpdateTransition","createContractorOnboardingSteps"],"mappings":";;;;AAmBA,MAAMA,IAAqC;AAAA,EACzC,MAAM;AAAA,EACN,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,OAAOC,EAAgB;AAAA,EAAA;AAE3B,GAEMC,IAAeC;AAAA,EACnB,CAACC,OAAiF;AAAA,IAChF,GAAGA;AAAA,IACH,WAAWC;AAAA,IACX,QAAQ;AAAA,IACR,cAAc;AAAA,EAAA;AAElB,GAGaC,IAA6B;AAAA,EACxC,MAAMC;AAAA,IACJC;AAAA,MACEP,EAAgB;AAAA,MAChB;AAAA,MACAE;AAAA,QACE,CACEC,GACAK,OACwC;AAAA,UACxC,GAAGL;AAAA,UACH,WAAWM;AAAA,UACX,QAAQV;AAAA,UACR,cAAcS,EAAG,QAAQ;AAAA,QAAA;AAAA,MAC3B;AAAA,IACF;AAAA,IAEFE;AAAA,IACAC;AAAA,EAAA;AAAA,EAEF,WAAWL;AAAA,IACTC,EAAWP,EAAgB,2BAA2B,QAAQC,CAAY;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY5E,GAAGW,EAAgCR,GAA0B,EAAE,2BAA2B,IAAM;AAClG;"}
1
+ {"version":3,"file":"contractorListStateMachine.js","sources":["../../../../src/components/Contractor/ContractorListFlow/contractorListStateMachine.ts"],"sourcesContent":["import { transition, reduce, state } from 'robot3'\nimport {\n contractorCreateTransition,\n contractorUpdateTransition,\n createContractorOnboardingSteps,\n} from '../OnboardingFlow/onboardingStateMachine'\nimport {\n ContractorListContextual,\n DashboardFlowContextual,\n DismissalContextual,\n type ContractorListFlowContextInterface,\n} from './ContractorListFlowComponents'\nimport { componentEvents } from '@/shared/constants'\nimport type { MachineEventType, MachineTransition } from '@/types/Helpers'\nimport type { FlowHeaderConfig } from '@/components/Flow/useFlow'\n\ntype EventPayloads = {\n [componentEvents.CONTRACTOR_VIEW]: { contractorId: string }\n [componentEvents.CONTRACTOR_DISMISS]: { contractorId: string }\n [componentEvents.CONTRACTOR_DISMISSAL_SCHEDULED]: {\n contractorId: string\n endDate: string\n message: string\n }\n}\n\nconst backToListHeader: FlowHeaderConfig = {\n type: 'minimal',\n back: {\n labelKey: 'backToListCta',\n namespace: 'Contractor.ManagementContractorList',\n event: componentEvents.CONTRACTOR_RETURN_TO_LIST,\n },\n}\n\nconst returnToList = reduce(\n (ctx: ContractorListFlowContextInterface): ContractorListFlowContextInterface => ({\n ...ctx,\n component: ContractorListContextual,\n header: null,\n contractorId: undefined,\n successMessage: undefined,\n }),\n)\n\n/** @internal */\nexport const contractorListStateMachine = {\n list: state<MachineTransition>(\n transition(\n componentEvents.CONTRACTOR_VIEW,\n 'dashboard',\n reduce(\n (\n ctx: ContractorListFlowContextInterface,\n ev: MachineEventType<EventPayloads, typeof componentEvents.CONTRACTOR_VIEW>,\n ): ContractorListFlowContextInterface => ({\n ...ctx,\n component: DashboardFlowContextual,\n header: backToListHeader,\n contractorId: ev.payload.contractorId,\n }),\n ),\n ),\n transition(\n componentEvents.CONTRACTOR_DISMISS,\n 'dismiss',\n reduce(\n (\n ctx: ContractorListFlowContextInterface,\n ev: MachineEventType<EventPayloads, typeof componentEvents.CONTRACTOR_DISMISS>,\n ): ContractorListFlowContextInterface => ({\n ...ctx,\n component: DismissalContextual,\n header: backToListHeader,\n contractorId: ev.payload.contractorId,\n successMessage: undefined,\n }),\n ),\n ),\n contractorCreateTransition,\n contractorUpdateTransition,\n ),\n dashboard: state<MachineTransition>(\n transition(componentEvents.CONTRACTOR_RETURN_TO_LIST, 'list', returnToList),\n ),\n dismiss: state<MachineTransition>(\n transition(componentEvents.CONTRACTOR_RETURN_TO_LIST, 'list', returnToList),\n transition(componentEvents.CANCEL, 'list', returnToList),\n transition(\n componentEvents.CONTRACTOR_DISMISSAL_SCHEDULED,\n 'list',\n reduce(\n (\n ctx: ContractorListFlowContextInterface,\n ev: MachineEventType<\n EventPayloads,\n typeof componentEvents.CONTRACTOR_DISMISSAL_SCHEDULED\n >,\n ): ContractorListFlowContextInterface => ({\n ...ctx,\n component: ContractorListContextual,\n header: null,\n contractorId: undefined,\n successMessage: ev.payload.message,\n }),\n ),\n ),\n ),\n // Spreads in the same Profile → Address → Payment Method → New Hire Report → Submit states\n // ContractorOnboarding.OnboardingFlow uses, rather than mounting that flow as a nested\n // component — see createContractorOnboardingSteps' own doc comment for why. Every\n // 'list'-targeting transition inside these states (cancel, submit-done) resolves against\n // this machine's own `list` state above, since state names resolve against whichever\n // machine they end up spread into.\n //\n // waitForExplicitSubmitDone: true because this list (unlike OnboardingFlow's own) has no\n // success-banner mechanism — without it, an admin completing onboarding would be swept back\n // to the list the instant they click Submit, with no confirmation at all.\n ...createContractorOnboardingSteps(ContractorListContextual, { waitForExplicitSubmitDone: true }),\n}\n"],"names":["backToListHeader","componentEvents","returnToList","reduce","ctx","ContractorListContextual","contractorListStateMachine","state","transition","ev","DashboardFlowContextual","DismissalContextual","contractorCreateTransition","contractorUpdateTransition","createContractorOnboardingSteps"],"mappings":";;;;AA0BA,MAAMA,IAAqC;AAAA,EACzC,MAAM;AAAA,EACN,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,OAAOC,EAAgB;AAAA,EAAA;AAE3B,GAEMC,IAAeC;AAAA,EACnB,CAACC,OAAiF;AAAA,IAChF,GAAGA;AAAA,IACH,WAAWC;AAAA,IACX,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,gBAAgB;AAAA,EAAA;AAEpB,GAGaC,IAA6B;AAAA,EACxC,MAAMC;AAAA,IACJC;AAAA,MACEP,EAAgB;AAAA,MAChB;AAAA,MACAE;AAAA,QACE,CACEC,GACAK,OACwC;AAAA,UACxC,GAAGL;AAAA,UACH,WAAWM;AAAA,UACX,QAAQV;AAAA,UACR,cAAcS,EAAG,QAAQ;AAAA,QAAA;AAAA,MAC3B;AAAA,IACF;AAAA,IAEFD;AAAA,MACEP,EAAgB;AAAA,MAChB;AAAA,MACAE;AAAA,QACE,CACEC,GACAK,OACwC;AAAA,UACxC,GAAGL;AAAA,UACH,WAAWO;AAAA,UACX,QAAQX;AAAA,UACR,cAAcS,EAAG,QAAQ;AAAA,UACzB,gBAAgB;AAAA,QAAA;AAAA,MAClB;AAAA,IACF;AAAA,IAEFG;AAAA,IACAC;AAAA,EAAA;AAAA,EAEF,WAAWN;AAAA,IACTC,EAAWP,EAAgB,2BAA2B,QAAQC,CAAY;AAAA,EAAA;AAAA,EAE5E,SAASK;AAAA,IACPC,EAAWP,EAAgB,2BAA2B,QAAQC,CAAY;AAAA,IAC1EM,EAAWP,EAAgB,QAAQ,QAAQC,CAAY;AAAA,IACvDM;AAAA,MACEP,EAAgB;AAAA,MAChB;AAAA,MACAE;AAAA,QACE,CACEC,GACAK,OAIwC;AAAA,UACxC,GAAGL;AAAA,UACH,WAAWC;AAAA,UACX,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,gBAAgBI,EAAG,QAAQ;AAAA,QAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYF,GAAGK,EAAgCT,GAA0B,EAAE,2BAA2B,IAAM;AAClG;"}
@@ -0,0 +1,77 @@
1
+ import { jsx as o } from "react/jsx-runtime";
2
+ import { useTranslation as D } from "react-i18next";
3
+ import { useDismissal as f } from "./useDismissal/useDismissal.js";
4
+ import { DismissalPresentation as C } from "./DismissalPresentation.js";
5
+ import { BaseBoundaries as p, BaseLayout as c } from "../../Base/Base.js";
6
+ import { useComponentDictionary as d, useI18n as g } from "../../../i18n/I18n.js";
7
+ import { componentEvents as m } from "../../../shared/constants.js";
8
+ import { formatDateToStringDate as S } from "../../../helpers/dateFormatting.js";
9
+ function b({ FallbackComponent: t, LoaderComponent: r, ...n }) {
10
+ return /* @__PURE__ */ o(
11
+ p,
12
+ {
13
+ componentName: "Contractor.Dismissal",
14
+ FallbackComponent: t,
15
+ LoaderComponent: r,
16
+ children: /* @__PURE__ */ o(h, { LoaderComponent: r, ...n })
17
+ }
18
+ );
19
+ }
20
+ function h({
21
+ contractorId: t,
22
+ onEvent: r,
23
+ dictionary: n,
24
+ className: e,
25
+ LoaderComponent: s
26
+ }) {
27
+ d("Contractor.Dismissal", n), g("Contractor.Dismissal");
28
+ const i = f({ contractorId: t });
29
+ return i.isLoading ? /* @__PURE__ */ o(
30
+ c,
31
+ {
32
+ isLoading: !0,
33
+ error: i.errorHandling.errors,
34
+ LoaderComponent: s
35
+ }
36
+ ) : /* @__PURE__ */ o(
37
+ y,
38
+ {
39
+ contractorId: t,
40
+ onEvent: r,
41
+ className: e,
42
+ LoaderComponent: s,
43
+ dismissal: i
44
+ }
45
+ );
46
+ }
47
+ function y({
48
+ contractorId: t,
49
+ onEvent: r,
50
+ className: n,
51
+ LoaderComponent: e,
52
+ dismissal: s
53
+ }) {
54
+ const { t: i } = D("Contractor.Dismissal"), u = () => {
55
+ r(m.CANCEL);
56
+ }, l = async ({ endDate: a }) => {
57
+ await s.actions.dismiss(a) && r(m.CONTRACTOR_DISMISSAL_SCHEDULED, {
58
+ contractorId: t,
59
+ endDate: S(a),
60
+ message: i("successMessage")
61
+ });
62
+ };
63
+ return /* @__PURE__ */ o(c, { error: s.errorHandling.errors, LoaderComponent: e, children: /* @__PURE__ */ o(
64
+ C,
65
+ {
66
+ contractor: s.data.contractor,
67
+ isPending: s.status.isPending,
68
+ onCancel: u,
69
+ onSubmit: l,
70
+ className: n
71
+ }
72
+ ) });
73
+ }
74
+ export {
75
+ b as Dismissal
76
+ };
77
+ //# sourceMappingURL=Dismissal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dismissal.js","sources":["../../../../src/components/Contractor/Dismissal/Dismissal.tsx"],"sourcesContent":["import { useTranslation } from 'react-i18next'\nimport { useDismissal, type UseDismissalReady } from './useDismissal/useDismissal'\nimport { DismissalPresentation, type DismissalFormData } from './DismissalPresentation'\nimport { BaseBoundaries, BaseLayout, type BaseComponentInterface } from '@/components/Base/Base'\nimport type { OnEventType } from '@/components/Base/useBase'\nimport type { LoaderComponentType } from '@/components/Base'\nimport { useI18n, useComponentDictionary } from '@/i18n'\nimport { componentEvents, type EventType } from '@/shared/constants'\nimport { formatDateToStringDate } from '@/helpers/dateFormatting'\n\n/**\n * Props for {@link Dismissal}.\n *\n * @public\n */\nexport interface DismissalProps extends BaseComponentInterface<'Contractor.Dismissal'> {\n /** The contractor identifier to dismiss. */\n contractorId: string\n}\n\n/**\n * Standalone form for scheduling a contractor's dismissal.\n *\n * @remarks\n * Fetches the contractor, renders a single \"Dismissal date\" field bounded to\n * the day after their start date, and schedules the dismissal on submit.\n * Does not remove or hide the contractor itself — the dismissal can be\n * cancelled up until the date takes effect.\n *\n * @events\n * | Event | Description | Data |\n * | ----- | ----------- | ---- |\n * | `contractor/dismissal/scheduled` | Fired after the dismissal is successfully scheduled | `{ contractorId: string, endDate: string, message: string }` |\n * | `CANCEL` | Fired when the user clicks Cancel | — |\n *\n * @param props - See {@link DismissalProps}.\n * @returns The dismissal form.\n * @public\n * @group Block components\n *\n * @example\n * ```tsx\n * import { ContractorManagement } from '@gusto/embedded-react-sdk'\n *\n * function MyComponent() {\n * return (\n * <ContractorManagement.Dismissal\n * contractorId=\"4b3f930f-82cd-48a8-b797-798686e12e5e\"\n * onEvent={() => {}}\n * />\n * )\n * }\n * ```\n */\nexport function Dismissal({ FallbackComponent, LoaderComponent, ...props }: DismissalProps) {\n return (\n <BaseBoundaries\n componentName=\"Contractor.Dismissal\"\n FallbackComponent={FallbackComponent}\n LoaderComponent={LoaderComponent}\n >\n <DismissalContent LoaderComponent={LoaderComponent} {...props} />\n </BaseBoundaries>\n )\n}\n\ninterface DismissalContentProps {\n contractorId: string\n onEvent: OnEventType<EventType, unknown>\n dictionary?: DismissalProps['dictionary']\n className?: string\n LoaderComponent?: LoaderComponentType\n}\n\nfunction DismissalContent({\n contractorId,\n onEvent,\n dictionary,\n className,\n LoaderComponent,\n}: DismissalContentProps) {\n useComponentDictionary('Contractor.Dismissal', dictionary)\n useI18n('Contractor.Dismissal')\n\n const dismissal = useDismissal({ contractorId })\n\n if (dismissal.isLoading) {\n return (\n <BaseLayout\n isLoading\n error={dismissal.errorHandling.errors}\n LoaderComponent={LoaderComponent}\n />\n )\n }\n\n return (\n <DismissalReady\n contractorId={contractorId}\n onEvent={onEvent}\n className={className}\n LoaderComponent={LoaderComponent}\n dismissal={dismissal}\n />\n )\n}\n\ninterface DismissalReadyProps {\n contractorId: string\n onEvent: OnEventType<EventType, unknown>\n className?: string\n LoaderComponent?: LoaderComponentType\n dismissal: UseDismissalReady\n}\n\nfunction DismissalReady({\n contractorId,\n onEvent,\n className,\n LoaderComponent,\n dismissal,\n}: DismissalReadyProps) {\n const { t } = useTranslation('Contractor.Dismissal')\n\n const handleCancel = () => {\n onEvent(componentEvents.CANCEL)\n }\n\n const handleSubmit = async ({ endDate }: DismissalFormData) => {\n const result = await dismissal.actions.dismiss(endDate)\n if (!result) return\n\n onEvent(componentEvents.CONTRACTOR_DISMISSAL_SCHEDULED, {\n contractorId,\n endDate: formatDateToStringDate(endDate),\n message: t('successMessage'),\n })\n }\n\n return (\n <BaseLayout error={dismissal.errorHandling.errors} LoaderComponent={LoaderComponent}>\n <DismissalPresentation\n contractor={dismissal.data.contractor}\n isPending={dismissal.status.isPending}\n onCancel={handleCancel}\n onSubmit={handleSubmit}\n className={className}\n />\n </BaseLayout>\n )\n}\n"],"names":["Dismissal","FallbackComponent","LoaderComponent","props","jsx","BaseBoundaries","DismissalContent","contractorId","onEvent","dictionary","className","useComponentDictionary","useI18n","dismissal","useDismissal","BaseLayout","DismissalReady","t","useTranslation","handleCancel","componentEvents","handleSubmit","endDate","formatDateToStringDate","DismissalPresentation"],"mappings":";;;;;;;;AAsDO,SAASA,EAAU,EAAE,mBAAAC,GAAmB,iBAAAC,GAAiB,GAAGC,KAAyB;AAC1F,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,mBAAAJ;AAAA,MACA,iBAAAC;AAAA,MAEA,UAAA,gBAAAE,EAACE,GAAA,EAAiB,iBAAAJ,GAAmC,GAAGC,EAAA,CAAO;AAAA,IAAA;AAAA,EAAA;AAGrE;AAUA,SAASG,EAAiB;AAAA,EACxB,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,iBAAAR;AACF,GAA0B;AACxB,EAAAS,EAAuB,wBAAwBF,CAAU,GACzDG,EAAQ,sBAAsB;AAE9B,QAAMC,IAAYC,EAAa,EAAE,cAAAP,GAAc;AAE/C,SAAIM,EAAU,YAEV,gBAAAT;AAAA,IAACW;AAAA,IAAA;AAAA,MACC,WAAS;AAAA,MACT,OAAOF,EAAU,cAAc;AAAA,MAC/B,iBAAAX;AAAA,IAAA;AAAA,EAAA,IAMJ,gBAAAE;AAAA,IAACY;AAAA,IAAA;AAAA,MACC,cAAAT;AAAA,MACA,SAAAC;AAAA,MACA,WAAAE;AAAA,MACA,iBAAAR;AAAA,MACA,WAAAW;AAAA,IAAA;AAAA,EAAA;AAGN;AAUA,SAASG,EAAe;AAAA,EACtB,cAAAT;AAAA,EACA,SAAAC;AAAA,EACA,WAAAE;AAAA,EACA,iBAAAR;AAAA,EACA,WAAAW;AACF,GAAwB;AACtB,QAAM,EAAE,GAAAI,EAAA,IAAMC,EAAe,sBAAsB,GAE7CC,IAAe,MAAM;AACzB,IAAAX,EAAQY,EAAgB,MAAM;AAAA,EAChC,GAEMC,IAAe,OAAO,EAAE,SAAAC,QAAiC;AAE7D,IADe,MAAMT,EAAU,QAAQ,QAAQS,CAAO,KAGtDd,EAAQY,EAAgB,gCAAgC;AAAA,MACtD,cAAAb;AAAA,MACA,SAASgB,EAAuBD,CAAO;AAAA,MACvC,SAASL,EAAE,gBAAgB;AAAA,IAAA,CAC5B;AAAA,EACH;AAEA,2BACGF,GAAA,EAAW,OAAOF,EAAU,cAAc,QAAQ,iBAAAX,GACjD,UAAA,gBAAAE;AAAA,IAACoB;AAAA,IAAA;AAAA,MACC,YAAYX,EAAU,KAAK;AAAA,MAC3B,WAAWA,EAAU,OAAO;AAAA,MAC5B,UAAUM;AAAA,MACV,UAAUE;AAAA,MACV,WAAAX;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -0,0 +1,57 @@
1
+ import { jsx as e, jsxs as r } from "react/jsx-runtime";
2
+ import { useTranslation as b } from "react-i18next";
3
+ import m from "zod";
4
+ import { useForm as x, FormProvider as v } from "react-hook-form";
5
+ import { zodResolver as g } from "@hookform/resolvers/zod";
6
+ import { getContractorDisplayName as y } from "../shared/helpers.js";
7
+ import { Flex as o } from "../../Common/Flex/Flex.js";
8
+ import { ActionsLayout as C } from "../../Common/ActionsLayout/ActionsLayout.js";
9
+ import { Form as F } from "../../Common/Form/Form.js";
10
+ import { useComponentContext as R } from "../../../contexts/ComponentAdapter/useComponentContext.js";
11
+ import { useI18n as j } from "../../../i18n/I18n.js";
12
+ import { addDays as q, normalizeToDate as z } from "../../../helpers/dateFormatting.js";
13
+ import { DatePickerField as S } from "../../Common/Fields/DatePickerField/DatePickerField.js";
14
+ const T = m.object({
15
+ endDate: m.date({ error: "validation.endDateRequired" })
16
+ });
17
+ function J({
18
+ contractor: i,
19
+ isPending: a,
20
+ onSubmit: d,
21
+ onCancel: c,
22
+ className: u
23
+ }) {
24
+ const { Alert: p, Heading: f, Text: n, Button: s } = R();
25
+ j("Contractor.Dismissal");
26
+ const { t } = b("Contractor.Dismissal"), l = x({
27
+ resolver: g(T),
28
+ defaultValues: {}
29
+ }), D = y(i), h = i.startDate ? q(z(i.startDate), 1) : void 0;
30
+ return /* @__PURE__ */ e(v, { ...l, children: /* @__PURE__ */ e(F, { onSubmit: l.handleSubmit(d), children: /* @__PURE__ */ r(o, { className: u, flexDirection: "column", gap: 24, children: [
31
+ /* @__PURE__ */ r(o, { flexDirection: "column", gap: 4, children: [
32
+ /* @__PURE__ */ e(f, { as: "h2", children: t("title", { name: D }) }),
33
+ /* @__PURE__ */ e(n, { variant: "supporting", children: t("subtitle") })
34
+ ] }),
35
+ /* @__PURE__ */ r(o, { flexDirection: "column", gap: 24, children: [
36
+ /* @__PURE__ */ e(
37
+ S,
38
+ {
39
+ name: "endDate",
40
+ label: t("form.endDate.label"),
41
+ isRequired: !0,
42
+ minDate: h,
43
+ errorMessage: t("validation.endDateRequired")
44
+ }
45
+ ),
46
+ /* @__PURE__ */ e(p, { status: "info", label: t("alert.label"), children: /* @__PURE__ */ e(n, { children: t("alert.text") }) })
47
+ ] }),
48
+ /* @__PURE__ */ r(C, { children: [
49
+ /* @__PURE__ */ e(s, { variant: "secondary", onClick: c, isDisabled: a, children: t("actions.cancel") }),
50
+ /* @__PURE__ */ e(s, { type: "submit", variant: "primary", isLoading: a, children: t("actions.submit") })
51
+ ] })
52
+ ] }) }) });
53
+ }
54
+ export {
55
+ J as DismissalPresentation
56
+ };
57
+ //# sourceMappingURL=DismissalPresentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DismissalPresentation.js","sources":["../../../../src/components/Contractor/Dismissal/DismissalPresentation.tsx"],"sourcesContent":["import { useTranslation } from 'react-i18next'\nimport z from 'zod'\nimport { FormProvider, useForm } from 'react-hook-form'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport type { Contractor } from '@gusto/embedded-api/models/components/contractor'\nimport { getContractorDisplayName } from '../shared/helpers'\nimport { Flex, ActionsLayout, DatePickerField } from '@/components/Common'\nimport { Form as HtmlForm } from '@/components/Common/Form/Form'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\nimport { normalizeToDate, addDays } from '@/helpers/dateFormatting'\n\ninterface DismissalPresentationProps {\n contractor: Contractor\n isPending: boolean\n onSubmit: (data: DismissalFormData) => void\n onCancel: () => void\n /** CSS class name applied to the root element. */\n className?: string\n}\n\n/** @internal */\nexport interface DismissalFormData {\n /** The effective date of the dismissal — the contractor's last day. */\n endDate: Date\n}\n\nconst dismissalSchema = z.object({\n endDate: z.date({ error: 'validation.endDateRequired' }),\n})\n\n/** @internal */\nexport function DismissalPresentation({\n contractor,\n isPending,\n onSubmit,\n onCancel,\n className,\n}: DismissalPresentationProps) {\n const { Alert, Heading, Text, Button } = useComponentContext()\n useI18n('Contractor.Dismissal')\n const { t } = useTranslation('Contractor.Dismissal')\n\n const formMethods = useForm<DismissalFormData>({\n resolver: zodResolver(dismissalSchema),\n defaultValues: {},\n })\n\n const name = getContractorDisplayName(contractor)\n const minDate = contractor.startDate\n ? addDays(normalizeToDate(contractor.startDate)!, 1)\n : undefined\n\n return (\n <FormProvider {...formMethods}>\n <HtmlForm onSubmit={formMethods.handleSubmit(onSubmit)}>\n <Flex className={className} flexDirection=\"column\" gap={24}>\n <Flex flexDirection=\"column\" gap={4}>\n <Heading as=\"h2\">{t('title', { name })}</Heading>\n <Text variant=\"supporting\">{t('subtitle')}</Text>\n </Flex>\n\n <Flex flexDirection=\"column\" gap={24}>\n <DatePickerField\n name=\"endDate\"\n label={t('form.endDate.label')}\n isRequired\n minDate={minDate}\n errorMessage={t('validation.endDateRequired')}\n />\n <Alert status=\"info\" label={t('alert.label')}>\n <Text>{t('alert.text')}</Text>\n </Alert>\n </Flex>\n\n <ActionsLayout>\n <Button variant=\"secondary\" onClick={onCancel} isDisabled={isPending}>\n {t('actions.cancel')}\n </Button>\n <Button type=\"submit\" variant=\"primary\" isLoading={isPending}>\n {t('actions.submit')}\n </Button>\n </ActionsLayout>\n </Flex>\n </HtmlForm>\n </FormProvider>\n )\n}\n"],"names":["dismissalSchema","z","DismissalPresentation","contractor","isPending","onSubmit","onCancel","className","Alert","Heading","Text","Button","useComponentContext","useI18n","useTranslation","formMethods","useForm","zodResolver","name","getContractorDisplayName","minDate","addDays","normalizeToDate","FormProvider","jsx","HtmlForm","jsxs","Flex","DatePickerField","ActionsLayout"],"mappings":";;;;;;;;;;;;;AA2BA,MAAMA,IAAkBC,EAAE,OAAO;AAAA,EAC/B,SAASA,EAAE,KAAK,EAAE,OAAO,8BAA8B;AACzD,CAAC;AAGM,SAASC,EAAsB;AAAA,EACpC,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AACF,GAA+B;AAC7B,QAAM,EAAE,OAAAC,GAAO,SAAAC,GAAS,MAAAC,GAAM,QAAAC,EAAA,IAAWC,EAAA;AACzC,EAAAC,EAAQ,sBAAsB;AAC9B,QAAM,EAAE,EAAA,IAAMC,EAAe,sBAAsB,GAE7CC,IAAcC,EAA2B;AAAA,IAC7C,UAAUC,EAAYjB,CAAe;AAAA,IACrC,eAAe,CAAA;AAAA,EAAC,CACjB,GAEKkB,IAAOC,EAAyBhB,CAAU,GAC1CiB,IAAUjB,EAAW,YACvBkB,EAAQC,EAAgBnB,EAAW,SAAS,GAAI,CAAC,IACjD;AAEJ,2BACGoB,GAAA,EAAc,GAAGR,GAChB,UAAA,gBAAAS,EAACC,KAAS,UAAUV,EAAY,aAAaV,CAAQ,GACnD,UAAA,gBAAAqB,EAACC,GAAA,EAAK,WAAApB,GAAsB,eAAc,UAAS,KAAK,IACtD,UAAA;AAAA,IAAA,gBAAAmB,EAACC,GAAA,EAAK,eAAc,UAAS,KAAK,GAChC,UAAA;AAAA,MAAA,gBAAAH,EAACf,GAAA,EAAQ,IAAG,MAAM,UAAA,EAAE,SAAS,EAAE,MAAAS,EAAA,CAAM,GAAE;AAAA,wBACtCR,GAAA,EAAK,SAAQ,cAAc,UAAA,EAAE,UAAU,EAAA,CAAE;AAAA,IAAA,GAC5C;AAAA,IAEA,gBAAAgB,EAACC,GAAA,EAAK,eAAc,UAAS,KAAK,IAChC,UAAA;AAAA,MAAA,gBAAAH;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,EAAE,oBAAoB;AAAA,UAC7B,YAAU;AAAA,UACV,SAAAR;AAAA,UACA,cAAc,EAAE,4BAA4B;AAAA,QAAA;AAAA,MAAA;AAAA,MAE9C,gBAAAI,EAAChB,GAAA,EAAM,QAAO,QAAO,OAAO,EAAE,aAAa,GACzC,UAAA,gBAAAgB,EAACd,GAAA,EAAM,UAAA,EAAE,YAAY,GAAE,EAAA,CACzB;AAAA,IAAA,GACF;AAAA,sBAECmB,GAAA,EACC,UAAA;AAAA,MAAA,gBAAAL,EAACb,GAAA,EAAO,SAAQ,aAAY,SAASL,GAAU,YAAYF,GACxD,UAAA,EAAE,gBAAgB,EAAA,CACrB;AAAA,MACA,gBAAAoB,EAACb,GAAA,EAAO,MAAK,UAAS,SAAQ,WAAU,WAAWP,GAChD,UAAA,EAAE,gBAAgB,EAAA,CACrB;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,GACF,GACF;AAEJ;"}
@@ -0,0 +1,44 @@
1
+ import { useContractorsGet as g } from "@gusto/embedded-api/react-query/contractorsGet";
2
+ import { useContractorsPostV1ContractorsContractorUuidTerminationMutation as E } from "@gusto/embedded-api/react-query/contractorsPostV1ContractorsContractorUuidTermination";
3
+ import { RFCDate as p } from "@gusto/embedded-api/types/rfcdate";
4
+ import { useBaseSubmit as C } from "../../../Base/useBaseSubmit.js";
5
+ import { composeErrorHandler as b } from "../../../../partner-hook-utils/composeErrorHandler.js";
6
+ import { formatDateToStringDate as y } from "../../../../helpers/dateFormatting.js";
7
+ import { GENERIC_API_ERROR_MESSAGE as D } from "../../../../types/sdkError.js";
8
+ function G({ contractorId: o }) {
9
+ const t = g({ contractorUuid: o }), s = E(), {
10
+ baseSubmitHandler: c,
11
+ error: m,
12
+ setError: u
13
+ } = C("Contractor.Dismissal"), r = b([t], { submitError: m, setSubmitError: u }), d = s.isPending, l = async (n) => {
14
+ let i;
15
+ return await c(n, async (f) => {
16
+ await s.mutateAsync({
17
+ request: {
18
+ contractorUuid: o,
19
+ requestBody: { endDate: new p(y(f)) }
20
+ }
21
+ }), i = { mode: "create", data: void 0 };
22
+ }), i;
23
+ }, { data: e, isLoading: a } = t;
24
+ return a || !e?.contractor ? {
25
+ isLoading: !0,
26
+ errorHandling: !a && !t.error ? {
27
+ ...r,
28
+ errors: [
29
+ ...r.errors,
30
+ { category: "internal_error", message: D, fieldErrors: [] }
31
+ ]
32
+ } : r
33
+ } : {
34
+ isLoading: !1,
35
+ data: { contractor: e.contractor },
36
+ status: { isPending: d },
37
+ actions: { dismiss: l },
38
+ errorHandling: r
39
+ };
40
+ }
41
+ export {
42
+ G as useDismissal
43
+ };
44
+ //# sourceMappingURL=useDismissal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDismissal.js","sources":["../../../../../src/components/Contractor/Dismissal/useDismissal/useDismissal.ts"],"sourcesContent":["import { useContractorsGet } from '@gusto/embedded-api/react-query/contractorsGet'\nimport { useContractorsPostV1ContractorsContractorUuidTerminationMutation } from '@gusto/embedded-api/react-query/contractorsPostV1ContractorsContractorUuidTermination'\nimport { RFCDate } from '@gusto/embedded-api/types/rfcdate'\nimport type { Contractor } from '@gusto/embedded-api/models/components/contractor'\nimport { useBaseSubmit } from '@/components/Base/useBaseSubmit'\nimport { composeErrorHandler } from '@/partner-hook-utils/composeErrorHandler'\nimport type { BaseHookReady, HookLoadingResult, HookSubmitResult } from '@/partner-hook-utils/types'\nimport { formatDateToStringDate } from '@/helpers/dateFormatting'\nimport { GENERIC_API_ERROR_MESSAGE } from '@/types/sdkError'\n\n/**\n * Props for {@link useDismissal}.\n *\n * @public\n */\nexport interface UseDismissalProps {\n /** The contractor identifier to dismiss. */\n contractorId: string\n}\n\n/**\n * Ready state of {@link useDismissal}.\n *\n * @public\n */\nexport interface UseDismissalReady extends BaseHookReady<\n { contractor: Contractor },\n { isPending: boolean }\n> {\n /** Actions available when the hook has loaded. */\n actions: {\n /** Schedules a dismissal effective on `endDate`. */\n dismiss: (endDate: Date) => Promise<HookSubmitResult<unknown> | undefined>\n }\n}\n\n/**\n * Return type of {@link useDismissal}.\n *\n * @public\n */\nexport type UseDismissalResult = HookLoadingResult | UseDismissalReady\n\n/**\n * Fetches a contractor and exposes an action to schedule their dismissal.\n *\n * @param input - The contractor to dismiss.\n * @returns A {@link HookLoadingResult} while the contractor is being fetched, or a {@link UseDismissalReady} once it has arrived.\n * @public\n */\nexport function useDismissal({ contractorId }: UseDismissalProps): UseDismissalResult {\n const contractorQuery = useContractorsGet({ contractorUuid: contractorId })\n const dismissMutation = useContractorsPostV1ContractorsContractorUuidTerminationMutation()\n\n const {\n baseSubmitHandler,\n error: submitError,\n setError: setSubmitError,\n } = useBaseSubmit('Contractor.Dismissal')\n\n const errorHandling = composeErrorHandler([contractorQuery], { submitError, setSubmitError })\n\n const isPending = dismissMutation.isPending\n\n const dismiss = async (endDate: Date): Promise<HookSubmitResult<unknown> | undefined> => {\n let submitResult: HookSubmitResult<unknown> | undefined\n\n await baseSubmitHandler(endDate, async date => {\n await dismissMutation.mutateAsync({\n request: {\n contractorUuid: contractorId,\n requestBody: { endDate: new RFCDate(formatDateToStringDate(date)!) },\n },\n })\n submitResult = { mode: 'create', data: undefined }\n })\n\n return submitResult\n }\n\n const { data, isLoading } = contractorQuery\n\n if (isLoading || !data?.contractor) {\n // A settled query (not `isLoading`) with no query `error` but also no `contractor` in the\n // response body would otherwise report `isLoading: true` forever with an empty error list —\n // `contractor` is optional on the response type, so this isn't a thrown error we'd catch via\n // `composeErrorHandler`. Surface it as an error so the host sees a real failure state instead\n // of a stuck spinner.\n const settledWithNoContractor = !isLoading && !contractorQuery.error\n return {\n isLoading: true,\n errorHandling: settledWithNoContractor\n ? {\n ...errorHandling,\n errors: [\n ...errorHandling.errors,\n { category: 'internal_error', message: GENERIC_API_ERROR_MESSAGE, fieldErrors: [] },\n ],\n }\n : errorHandling,\n }\n }\n\n return {\n isLoading: false,\n data: { contractor: data.contractor },\n status: { isPending },\n actions: { dismiss },\n errorHandling,\n }\n}\n"],"names":["useDismissal","contractorId","contractorQuery","useContractorsGet","dismissMutation","useContractorsPostV1ContractorsContractorUuidTerminationMutation","baseSubmitHandler","submitError","setSubmitError","useBaseSubmit","errorHandling","composeErrorHandler","isPending","dismiss","endDate","submitResult","date","RFCDate","formatDateToStringDate","data","isLoading","GENERIC_API_ERROR_MESSAGE"],"mappings":";;;;;;;AAkDO,SAASA,EAAa,EAAE,cAAAC,KAAuD;AACpF,QAAMC,IAAkBC,EAAkB,EAAE,gBAAgBF,GAAc,GACpEG,IAAkBC,EAAA,GAElB;AAAA,IACJ,mBAAAC;AAAA,IACA,OAAOC;AAAA,IACP,UAAUC;AAAA,EAAA,IACRC,EAAc,sBAAsB,GAElCC,IAAgBC,EAAoB,CAACT,CAAe,GAAG,EAAE,aAAAK,GAAa,gBAAAC,GAAgB,GAEtFI,IAAYR,EAAgB,WAE5BS,IAAU,OAAOC,MAAkE;AACvF,QAAIC;AAEJ,iBAAMT,EAAkBQ,GAAS,OAAME,MAAQ;AAC7C,YAAMZ,EAAgB,YAAY;AAAA,QAChC,SAAS;AAAA,UACP,gBAAgBH;AAAA,UAChB,aAAa,EAAE,SAAS,IAAIgB,EAAQC,EAAuBF,CAAI,CAAE,EAAA;AAAA,QAAE;AAAA,MACrE,CACD,GACDD,IAAe,EAAE,MAAM,UAAU,MAAM,OAAA;AAAA,IACzC,CAAC,GAEMA;AAAA,EACT,GAEM,EAAE,MAAAI,GAAM,WAAAC,EAAA,IAAclB;AAE5B,SAAIkB,KAAa,CAACD,GAAM,aAOf;AAAA,IACL,WAAW;AAAA,IACX,eAH8B,CAACC,KAAa,CAAClB,EAAgB,QAIzD;AAAA,MACE,GAAGQ;AAAA,MACH,QAAQ;AAAA,QACN,GAAGA,EAAc;AAAA,QACjB,EAAE,UAAU,kBAAkB,SAASW,GAA2B,aAAa,CAAA,EAAC;AAAA,MAAE;AAAA,IACpF,IAEFX;AAAA,EAAA,IAID;AAAA,IACL,WAAW;AAAA,IACX,MAAM,EAAE,YAAYS,EAAK,WAAA;AAAA,IACzB,QAAQ,EAAE,WAAAP,EAAA;AAAA,IACV,SAAS,EAAE,SAAAC,EAAA;AAAA,IACX,eAAAH;AAAA,EAAA;AAEJ;"}