@gusto/embedded-react-sdk 0.55.2 → 0.55.4

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 (159) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/components/Common/DataView/DataCards/DataCards.d.ts +2 -1
  3. package/dist/components/Common/DataView/DataCards/DataCards.js +63 -54
  4. package/dist/components/Common/DataView/DataCards/DataCards.js.map +1 -1
  5. package/dist/components/Common/DataView/DataCards/DataCards.module.scss.js +14 -12
  6. package/dist/components/Common/DataView/DataCards/DataCards.module.scss.js.map +1 -1
  7. package/dist/components/Common/DataView/DataTable/DataTable.d.ts +2 -1
  8. package/dist/components/Common/DataView/DataTable/DataTable.js +75 -66
  9. package/dist/components/Common/DataView/DataTable/DataTable.js.map +1 -1
  10. package/dist/components/Common/DataView/DataTable/DataTable.module.scss.js +8 -4
  11. package/dist/components/Common/DataView/DataTable/DataTable.module.scss.js.map +1 -1
  12. package/dist/components/Common/DataView/DataView.js +18 -17
  13. package/dist/components/Common/DataView/DataView.js.map +1 -1
  14. package/dist/components/Common/FieldLayout/FieldLayout.js +6 -6
  15. package/dist/components/Common/Fieldset/Fieldset.js +6 -6
  16. package/dist/components/Common/HorizontalFieldLayout/HorizontalFieldLayout.js +6 -6
  17. package/dist/components/Common/UI/MultiSelectComboBox/MultiSelectComboBox.js +58 -49
  18. package/dist/components/Common/UI/MultiSelectComboBox/MultiSelectComboBox.js.map +1 -1
  19. package/dist/components/Common/UI/MultiSelectComboBox/MultiSelectComboBox.module.scss.js +14 -10
  20. package/dist/components/Common/UI/MultiSelectComboBox/MultiSelectComboBox.module.scss.js.map +1 -1
  21. package/dist/components/Common/UI/MultiSelectComboBox/MultiSelectComboBoxTypes.d.ts +4 -0
  22. package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js +3 -4
  23. package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js.map +1 -1
  24. package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js +3 -4
  25. package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js.map +1 -1
  26. package/dist/components/Company/AssignSignatory/useAssignSignatory.js +5 -6
  27. package/dist/components/Company/AssignSignatory/useAssignSignatory.js.map +1 -1
  28. package/dist/components/Company/BankAccount/BankAccountForm/context.js +3 -4
  29. package/dist/components/Company/BankAccount/BankAccountForm/context.js.map +1 -1
  30. package/dist/components/Company/DocumentSigner/DocumentList/DocumentList.d.ts +4 -0
  31. package/dist/components/Company/DocumentSigner/DocumentList/DocumentList.js.map +1 -1
  32. package/dist/components/Company/DocumentSigner/DocumentList/List.js +11 -8
  33. package/dist/components/Company/DocumentSigner/DocumentList/List.js.map +1 -1
  34. package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js +3 -4
  35. package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
  36. package/dist/components/Company/FederalTaxes/useFederalTaxes.js +5 -6
  37. package/dist/components/Company/FederalTaxes/useFederalTaxes.js.map +1 -1
  38. package/dist/components/Company/Industry/Context.js +6 -7
  39. package/dist/components/Company/Industry/Context.js.map +1 -1
  40. package/dist/components/Company/Locations/LocationForm/useLocationForm.js +3 -4
  41. package/dist/components/Company/Locations/LocationForm/useLocationForm.js.map +1 -1
  42. package/dist/components/Company/Locations/LocationsList/List.js +27 -25
  43. package/dist/components/Company/Locations/LocationsList/List.js.map +1 -1
  44. package/dist/components/Company/Locations/LocationsList/LocationsList.js +41 -36
  45. package/dist/components/Company/Locations/LocationsList/LocationsList.js.map +1 -1
  46. package/dist/components/Company/Locations/LocationsList/useLocationsList.d.ts +1 -0
  47. package/dist/components/Company/Locations/LocationsList/useLocationsList.js +3 -4
  48. package/dist/components/Company/Locations/LocationsList/useLocationsList.js.map +1 -1
  49. package/dist/components/Company/OnboardingOverview/context.js +3 -4
  50. package/dist/components/Company/OnboardingOverview/context.js.map +1 -1
  51. package/dist/components/Company/StateTaxes/StateTaxesForm/Form.d.ts +9 -2
  52. package/dist/components/Company/StateTaxes/StateTaxesForm/Form.js +19 -18
  53. package/dist/components/Company/StateTaxes/StateTaxesForm/Form.js.map +1 -1
  54. package/dist/components/Company/StateTaxes/StateTaxesForm/StateTaxesForm.js +63 -62
  55. package/dist/components/Company/StateTaxes/StateTaxesForm/StateTaxesForm.js.map +1 -1
  56. package/dist/components/Company/StateTaxes/StateTaxesForm/context.js +3 -4
  57. package/dist/components/Company/StateTaxes/StateTaxesForm/context.js.map +1 -1
  58. package/dist/components/Company/StateTaxes/StateTaxesList/context.js +3 -4
  59. package/dist/components/Company/StateTaxes/StateTaxesList/context.js.map +1 -1
  60. package/dist/components/Company/StateTaxes/TaxRateManagement/AddTaxRateDialog.js +69 -65
  61. package/dist/components/Company/StateTaxes/TaxRateManagement/AddTaxRateDialog.js.map +1 -1
  62. package/dist/components/Company/StateTaxes/TaxRateManagement/context.js +3 -4
  63. package/dist/components/Company/StateTaxes/TaxRateManagement/context.js.map +1 -1
  64. package/dist/components/Company/StateTaxes/TaxRateManagement/toHistoryRows.js +30 -23
  65. package/dist/components/Company/StateTaxes/TaxRateManagement/toHistoryRows.js.map +1 -1
  66. package/dist/components/Company/StateTaxes/shared/RequirementFields.d.ts +8 -4
  67. package/dist/components/Company/StateTaxes/shared/RequirementFields.js +13 -12
  68. package/dist/components/Company/StateTaxes/shared/RequirementFields.js.map +1 -1
  69. package/dist/components/Company/StateTaxes/shared/prepareRequirements.d.ts +29 -0
  70. package/dist/components/Company/StateTaxes/shared/prepareRequirements.js +24 -0
  71. package/dist/components/Company/StateTaxes/shared/prepareRequirements.js.map +1 -0
  72. package/dist/components/Company/StateTaxes/shared/prepareRequirements.test.d.ts +1 -0
  73. package/dist/components/Contractor/Payments/PaymentsList/PaymentsList.js +68 -55
  74. package/dist/components/Contractor/Payments/PaymentsList/PaymentsList.js.map +1 -1
  75. package/dist/components/Contractor/Payments/PaymentsList/PaymentsListPresentation.js +36 -35
  76. package/dist/components/Contractor/Payments/PaymentsList/PaymentsListPresentation.js.map +1 -1
  77. package/dist/components/Employee/Compensation/shared/useJobForm/useJobForm.js +116 -116
  78. package/dist/components/Employee/Compensation/shared/useJobForm/useJobForm.js.map +1 -1
  79. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/DocumentList.d.ts +4 -0
  80. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/DocumentList.js +19 -19
  81. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/DocumentList.js.map +1 -1
  82. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/List.js +16 -13
  83. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/List.js.map +1 -1
  84. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js +3 -4
  85. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
  86. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentSigner.d.ts +4 -0
  87. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentSigner.js.map +1 -1
  88. package/dist/components/Employee/Paystubs/management/PaystubsCard/PaystubsCard.js +84 -96
  89. package/dist/components/Employee/Paystubs/management/PaystubsCard/PaystubsCard.js.map +1 -1
  90. package/dist/components/Flow/Flow.js +22 -22
  91. package/dist/components/Flow/Flow.js.map +1 -1
  92. package/dist/components/Flow/useFlow.js +3 -3
  93. package/dist/components/InformationRequests/InformationRequests.d.ts +1 -1
  94. package/dist/components/InformationRequests/InformationRequests.js +68 -53
  95. package/dist/components/InformationRequests/InformationRequests.js.map +1 -1
  96. package/dist/components/Payroll/GrossUpModal/GrossUpModal.js +2 -3
  97. package/dist/components/Payroll/GrossUpModal/GrossUpModal.js.map +1 -1
  98. package/dist/components/Payroll/OffCycleCreation/OffCycleCreation.js +87 -81
  99. package/dist/components/Payroll/OffCycleCreation/OffCycleCreation.js.map +1 -1
  100. package/dist/components/Payroll/OffCycleCreation/OffCycleCreationPresentation.d.ts +1 -1
  101. package/dist/components/Payroll/OffCycleCreation/OffCycleCreationPresentation.js +86 -67
  102. package/dist/components/Payroll/OffCycleCreation/OffCycleCreationPresentation.js.map +1 -1
  103. package/dist/components/Payroll/OffCycleCreation/OffCycleCreationTypes.d.ts +4 -0
  104. package/dist/components/Payroll/OffCycleDeductionsSetting/OffCycleDeductionsSetting.d.ts +1 -1
  105. package/dist/components/Payroll/OffCycleDeductionsSetting/OffCycleDeductionsSetting.js +26 -21
  106. package/dist/components/Payroll/OffCycleDeductionsSetting/OffCycleDeductionsSetting.js.map +1 -1
  107. package/dist/components/Payroll/OffCyclePayPeriodDateForm/OffCyclePayPeriodDateFormPresentation.d.ts +8 -1
  108. package/dist/components/Payroll/OffCyclePayPeriodDateForm/OffCyclePayPeriodDateFormPresentation.js +29 -17
  109. package/dist/components/Payroll/OffCyclePayPeriodDateForm/OffCyclePayPeriodDateFormPresentation.js.map +1 -1
  110. package/dist/components/Payroll/OffCycleTaxWithholdingTable/OffCycleTaxWithholdingTable.js +21 -18
  111. package/dist/components/Payroll/OffCycleTaxWithholdingTable/OffCycleTaxWithholdingTable.js.map +1 -1
  112. package/dist/components/Payroll/OffCycleTaxWithholdingTable/OffCycleTaxWithholdingTable.module.scss.js +9 -7
  113. package/dist/components/Payroll/OffCycleTaxWithholdingTable/OffCycleTaxWithholdingTable.module.scss.js.map +1 -1
  114. package/dist/components/Payroll/OffCycleTaxWithholdingTable/OffCycleTaxWithholdingTableTypes.d.ts +2 -0
  115. package/dist/components/Payroll/OffCycleTaxWithholdingTable/OffCycleTaxWithholdingTableTypes.js.map +1 -1
  116. package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js +200 -199
  117. package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js.map +1 -1
  118. package/dist/components/Payroll/PayrollConfiguration/usePayrollConfigurationData.d.ts +3 -2
  119. package/dist/components/Payroll/PayrollConfiguration/usePayrollConfigurationData.js +32 -32
  120. package/dist/components/Payroll/PayrollConfiguration/usePayrollConfigurationData.js.map +1 -1
  121. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js +254 -243
  122. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js.map +1 -1
  123. package/dist/components/Payroll/PayrollHistory/PayrollHistory.js +83 -76
  124. package/dist/components/Payroll/PayrollHistory/PayrollHistory.js.map +1 -1
  125. package/dist/components/Payroll/PayrollHistory/PayrollHistoryPresentation.js +23 -22
  126. package/dist/components/Payroll/PayrollHistory/PayrollHistoryPresentation.js.map +1 -1
  127. package/dist/components/Payroll/PayrollList/PayrollList.js +108 -97
  128. package/dist/components/Payroll/PayrollList/PayrollList.js.map +1 -1
  129. package/dist/components/Payroll/PayrollList/PayrollListPresentation.js +38 -37
  130. package/dist/components/Payroll/PayrollList/PayrollListPresentation.js.map +1 -1
  131. package/dist/components/Payroll/PayrollOverview/PayrollOverview.d.ts +8 -1
  132. package/dist/components/Payroll/PayrollOverview/PayrollOverview.js +196 -174
  133. package/dist/components/Payroll/PayrollOverview/PayrollOverview.js.map +1 -1
  134. package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.d.ts +3 -1
  135. package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js +173 -163
  136. package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js.map +1 -1
  137. package/dist/components/Payroll/helpers.d.ts +0 -15
  138. package/dist/components/Payroll/helpers.js +13 -18
  139. package/dist/components/Payroll/helpers.js.map +1 -1
  140. package/dist/components/Payroll/usePreparedPayrollData.js +8 -9
  141. package/dist/components/Payroll/usePreparedPayrollData.js.map +1 -1
  142. package/dist/helpers/openPdfInNewTab.d.ts +15 -0
  143. package/dist/helpers/openPdfInNewTab.js +28 -0
  144. package/dist/helpers/openPdfInNewTab.js.map +1 -0
  145. package/dist/i18n/en/Company.DocumentList.json.js +34 -32
  146. package/dist/i18n/en/Company.DocumentList.json.js.map +1 -1
  147. package/dist/i18n/en/Company.StateTaxes.json.js +1 -1
  148. package/dist/i18n/en/Employee.DocumentSigner.json.js +24 -22
  149. package/dist/i18n/en/Employee.DocumentSigner.json.js.map +1 -1
  150. package/dist/i18n/en/Payroll.OffCycleCreation.json.js +11 -9
  151. package/dist/i18n/en/Payroll.OffCycleCreation.json.js.map +1 -1
  152. package/dist/i18n/en/Payroll.OffCycleTaxWithholding.json.js +7 -7
  153. package/dist/i18n/en/Payroll.PayrollEditEmployee.json.js +29 -27
  154. package/dist/i18n/en/Payroll.PayrollEditEmployee.json.js.map +1 -1
  155. package/dist/i18n/en/Payroll.PayrollOverview.json.js +41 -39
  156. package/dist/i18n/en/Payroll.PayrollOverview.json.js.map +1 -1
  157. package/dist/i18n/types.d.ts +331 -1
  158. package/dist/style.css +1 -1
  159. package/package.json +21 -21
@@ -1 +1 @@
1
- {"version":3,"file":"PayrollEditEmployeePresentation.js","sources":["../../../../src/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.tsx"],"sourcesContent":["import { FormProvider, useFieldArray, useForm, useWatch } from 'react-hook-form'\nimport { useMemo, useRef, useState } from 'react'\nimport type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport type {\n FixedCompensations,\n PayrollEmployeeCompensationsType,\n PayrollEmployeeCompensationsTypePaidTimeOff,\n Reimbursements as Reimbursement,\n} from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport { PayrollEmployeeCompensationsTypePaymentMethod } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollFixedCompensationTypesType } from '@gusto/embedded-api/models/components/payrollfixedcompensationtypestype'\nimport type { PayScheduleShow as PayScheduleObject } from '@gusto/embedded-api/models/components/payscheduleshow'\nimport { useTranslation } from 'react-i18next'\nimport { z } from 'zod'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport styles from './PayrollEditEmployeePresentation.module.scss'\nimport { TimeOffField, PayoutTimeOffField } from './TimeOffField'\nimport {\n Flex,\n Grid,\n TextInputField,\n RadioGroupField,\n DataView,\n useDataView,\n EmptyData,\n} from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\nimport { Form } from '@/components/Common/Form'\nimport { formatNumberAsCurrency, firstLastName } from '@/helpers/formattedStrings'\nimport { getAdditionalEarningsCompensations, calculateGrossPay } from '@/components/Payroll/helpers'\nimport { PayrollCategory, isOffCyclePayroll } from '@/components/Payroll/payrollTypes'\nimport {\n COMPENSATION_NAME_DOUBLE_OVERTIME,\n COMPENSATION_NAME_OVERTIME,\n COMPENSATION_NAME_REGULAR_HOURS,\n HOURS_COMPENSATION_NAMES,\n EXCLUDED_ADDITIONAL_EARNINGS,\n COMPENSATION_NAME_REIMBURSEMENT,\n COMPENSATION_NAME_BONUS,\n COMPENSATION_NAME_PAYCHECK_TIPS,\n COMPENSATION_NAME_CORRECTION_PAYMENT,\n COMPENSATION_NAME_COMMISSION,\n COMPENSATION_NAME_CASH_TIPS,\n} from '@/shared/constants'\nimport useContainerBreakpoints from '@/hooks/useContainerBreakpoints/useContainerBreakpoints'\nimport PlusCircleIcon from '@/assets/icons/plus-circle.svg?react'\nimport TrashCanSvg from '@/assets/icons/trashcan.svg?react'\n\ninterface PayrollEditEmployeeProps {\n onSave: (updatedCompensation: PayrollEmployeeCompensationsType) => void\n onCancel: () => void\n employee: Employee\n employeeCompensation?: PayrollEmployeeCompensationsType\n isPending?: boolean\n fixedCompensationTypes: PayrollFixedCompensationTypesType[]\n payPeriodStartDate?: string\n paySchedule?: PayScheduleObject\n payrollCategory?: PayrollCategory\n withReimbursements?: boolean\n hasDirectDepositSetup?: boolean\n}\n\nconst ReimbursementFormSchema = z.object({\n uuid: z.string().nullable().optional(),\n description: z.string(),\n amount: z.string(),\n recurring: z.boolean().optional(),\n})\n\nconst PayrollEditEmployeeFormSchema = z.object({\n hourlyCompensations: z.record(z.string(), z.record(z.string(), z.string().optional())),\n timeOffCompensations: z.record(z.string(), z.string().optional()),\n finalPayoutCompensations: z.record(z.string(), z.string().optional()),\n fixedCompensations: z.record(z.string(), z.string().optional()),\n reimbursements: z.array(ReimbursementFormSchema),\n paymentMethod: z.enum(PayrollEmployeeCompensationsTypePaymentMethod).optional(),\n})\n\n/** @internal */\nexport type PayrollEditEmployeeFormValues = z.infer<typeof PayrollEditEmployeeFormSchema>\n\nconst buildCompensationFromFormData = (\n formData: PayrollEditEmployeeFormValues,\n employeeCompensation: PayrollEmployeeCompensationsType | undefined,\n timeOff: PayrollEmployeeCompensationsTypePaidTimeOff[],\n primaryJobUuid?: string,\n payrollCategory: PayrollCategory = PayrollCategory.Regular,\n): PayrollEmployeeCompensationsType => {\n const updatedCompensation = {\n ...employeeCompensation,\n paymentMethod: formData.paymentMethod,\n }\n\n updatedCompensation.hourlyCompensations = employeeCompensation?.hourlyCompensations?.map(\n compensation => {\n const hours =\n compensation.jobUuid && compensation.name\n ? formData.hourlyCompensations[compensation.jobUuid]?.[compensation.name]\n : undefined\n return hours\n ? {\n ...compensation,\n hours,\n }\n : compensation\n },\n )\n\n updatedCompensation.paidTimeOff = timeOff.map(timeOffEntry => {\n const isDismissal = payrollCategory === PayrollCategory.Dismissal\n const { finalPayoutUnusedHoursInput: _, ...timeOffWithoutPayout } = timeOffEntry\n\n if (isDismissal) {\n const finalPayout =\n formData.finalPayoutCompensations[timeOffEntry.name!] ??\n timeOffEntry.finalPayoutUnusedHoursInput\n return {\n ...timeOffEntry,\n hours: formData.timeOffCompensations[timeOffEntry.name!] || '0',\n ...(finalPayout != null ? { finalPayoutUnusedHoursInput: finalPayout || '0' } : {}),\n }\n }\n\n return {\n ...timeOffWithoutPayout,\n hours: formData.timeOffCompensations[timeOffEntry.name!] || '0',\n }\n })\n\n // Off-cycle payrolls today use the legacy single Reimbursement field in fixed_compensations\n // because the backend feature flag `emb_off_cycle_disable_named_reimbursements` (default: true,\n // expected removal 2026-09-01) rejects named entries in the itemized `reimbursements[]` array.\n // TODO(post-2026-09-01): once that flag is removed, unify on the itemized path for all categories.\n const usesItemizedReimbursements = !isOffCyclePayroll(payrollCategory)\n\n const updatedFixedCompensations: FixedCompensations[] = []\n\n Object.entries(formData.fixedCompensations).forEach(([fixedCompensationName, formAmount]) => {\n const isReimbursementEntry =\n fixedCompensationName.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase()\n\n // Regular payrolls write reimbursements via the itemized array; never let the legacy\n // fixed_compensations entry slip through (the backend rejects it on v2025-11-15+).\n if (isReimbursementEntry && usesItemizedReimbursements) {\n return\n }\n\n const existingFixedCompensation = employeeCompensation?.fixedCompensations?.find(\n fixedCompensation =>\n fixedCompensation.name?.toLowerCase() === fixedCompensationName.toLowerCase(),\n )\n\n if (formAmount !== undefined && formAmount !== '') {\n if (existingFixedCompensation) {\n updatedFixedCompensations.push({\n name: existingFixedCompensation.name,\n jobUuid: existingFixedCompensation.jobUuid,\n amount: formAmount,\n })\n } else if (parseFloat(formAmount) !== 0) {\n updatedFixedCompensations.push({\n name: fixedCompensationName,\n jobUuid: primaryJobUuid,\n amount: formAmount,\n })\n }\n }\n })\n\n updatedCompensation.fixedCompensations = updatedFixedCompensations\n\n if (usesItemizedReimbursements) {\n updatedCompensation.reimbursements = formData.reimbursements.map(reimbursement => ({\n amount: reimbursement.amount,\n description:\n reimbursement.description.trim() === '' ? null : reimbursement.description.trim(),\n uuid: reimbursement.uuid ?? null,\n recurring: reimbursement.recurring,\n }))\n } else {\n // Off-cycle: ensure no itemized array leaks through. The container also strips this defensively.\n updatedCompensation.reimbursements = []\n }\n\n return updatedCompensation\n}\n\n/** @internal */\nexport const PayrollEditEmployeePresentation = ({\n onSave,\n onCancel,\n employee,\n employeeCompensation,\n isPending = false,\n fixedCompensationTypes,\n payPeriodStartDate,\n paySchedule,\n payrollCategory = PayrollCategory.Regular,\n withReimbursements = true,\n hasDirectDepositSetup = true,\n}: PayrollEditEmployeeProps) => {\n const { Button, ButtonIcon, Heading, Text, TextInput } = useComponentContext()\n\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n useI18n('Payroll.PayrollEditEmployee')\n\n const primaryJob = employee.jobs?.find(job => job.primary)\n const primaryJobHasHourlyCompensations = employeeCompensation?.hourlyCompensations?.some(\n c => c.jobUuid === primaryJob?.uuid,\n )\n const hourlyJobs = primaryJob && primaryJobHasHourlyCompensations ? [primaryJob] : []\n\n const containerRef = useRef<HTMLDivElement>(null)\n const breakpoints = useContainerBreakpoints({\n ref: containerRef,\n })\n const isSmallOrGreater = breakpoints.includes('small')\n\n employeeCompensation?.hourlyCompensations?.forEach(compensation => {\n const job = employee.jobs?.find(job => job.uuid === compensation.jobUuid)\n if (job && !hourlyJobs.find(hourlyJob => hourlyJob.uuid === job.uuid)) {\n hourlyJobs.push(job)\n }\n })\n\n const timeOff = (employeeCompensation?.paidTimeOff || []).filter(entry => entry.name)\n\n const additionalEarnings = getAdditionalEarningsCompensations({\n flsaStatus: primaryJob?.compensations?.[0]?.flsaStatus,\n existingFixedCompensations: employeeCompensation?.fixedCompensations || [],\n primaryJobUuid: primaryJob?.uuid,\n fixedCompensationTypes,\n excludedTypes: EXCLUDED_ADDITIONAL_EARNINGS,\n })\n\n // Off-cycle payrolls use the legacy single Reimbursement field in fixed_compensations because\n // the backend `emb_off_cycle_disable_named_reimbursements` flag (default: true, expected\n // removal 2026-09-01) rejects named entries in the itemized `reimbursements[]` array.\n // TODO(post-2026-09-01): unify on the itemized path once that flag is removed.\n const usesItemizedReimbursements = !isOffCyclePayroll(payrollCategory)\n\n const initialReimbursements: Reimbursement[] = useMemo(\n () =>\n withReimbursements && usesItemizedReimbursements\n ? (employeeCompensation?.reimbursements ?? [])\n : [],\n [withReimbursements, usesItemizedReimbursements, employeeCompensation?.reimbursements],\n )\n\n const existingReimbursementFixedCompensation = useMemo(\n () =>\n employeeCompensation?.fixedCompensations?.find(\n comp => comp.name?.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase(),\n ),\n [employeeCompensation?.fixedCompensations],\n )\n\n const showLegacyReimbursementField =\n withReimbursements && !usesItemizedReimbursements && Boolean(primaryJob?.uuid)\n\n const findMatchingCompensation = (jobUuid: string, compensationName: string) => {\n return employeeCompensation?.hourlyCompensations?.find(\n compensation =>\n compensation.jobUuid === jobUuid &&\n compensation.name?.toLowerCase() === compensationName.toLowerCase(),\n )\n }\n\n const getCompensationLabel = (compensationName?: string) => {\n switch (compensationName) {\n case COMPENSATION_NAME_REGULAR_HOURS:\n return t('compensationNames.regularHours')\n case COMPENSATION_NAME_OVERTIME:\n return t('compensationNames.overtime')\n case COMPENSATION_NAME_DOUBLE_OVERTIME:\n return t('compensationNames.doubleOvertime')\n default:\n return compensationName\n }\n }\n\n const getFixedCompensationLabel = (compensationName?: string) => {\n switch (compensationName) {\n case COMPENSATION_NAME_BONUS:\n return t('fixedCompensationNames.bonus')\n case COMPENSATION_NAME_PAYCHECK_TIPS:\n return t('fixedCompensationNames.paycheckTips')\n case COMPENSATION_NAME_CORRECTION_PAYMENT:\n return t('fixedCompensationNames.correctionPayment')\n case COMPENSATION_NAME_COMMISSION:\n return t('fixedCompensationNames.commission')\n case COMPENSATION_NAME_CASH_TIPS:\n return t('fixedCompensationNames.cashTips')\n case COMPENSATION_NAME_REIMBURSEMENT:\n return t('fixedCompensationNames.reimbursement')\n default:\n return compensationName\n }\n }\n\n const defaultValues = {\n hourlyCompensations: (() => {\n const hourlyCompensations: PayrollEditEmployeeFormValues['hourlyCompensations'] = {}\n\n hourlyJobs.forEach(hourlyJob => {\n HOURS_COMPENSATION_NAMES.forEach(compensationName => {\n const matchingCompensation = findMatchingCompensation(hourlyJob.uuid, compensationName)\n if (matchingCompensation) {\n if (!hourlyCompensations[hourlyJob.uuid]) {\n hourlyCompensations[hourlyJob.uuid] = {}\n }\n hourlyCompensations[hourlyJob.uuid]![matchingCompensation.name!] =\n matchingCompensation.hours ? parseFloat(matchingCompensation.hours).toString() : ''\n }\n })\n })\n\n return hourlyCompensations\n })(),\n\n timeOffCompensations: (() => {\n const timeOffCompensations: PayrollEditEmployeeFormValues['timeOffCompensations'] = {}\n\n timeOff.forEach(timeOffCompensation => {\n timeOffCompensations[timeOffCompensation.name!] = timeOffCompensation.hours\n ? parseFloat(timeOffCompensation.hours).toString()\n : ''\n })\n\n return timeOffCompensations\n })(),\n\n finalPayoutCompensations: (() => {\n const finalPayoutCompensations: PayrollEditEmployeeFormValues['finalPayoutCompensations'] = {}\n\n timeOff.forEach(timeOffCompensation => {\n finalPayoutCompensations[timeOffCompensation.name!] =\n timeOffCompensation.finalPayoutUnusedHoursInput ?? '0'\n })\n\n return finalPayoutCompensations\n })(),\n\n fixedCompensations: (() => {\n const fixedCompensations: PayrollEditEmployeeFormValues['fixedCompensations'] = {}\n\n additionalEarnings.forEach(fixedComp => {\n fixedCompensations[fixedComp.name!] = fixedComp.amount ?? ''\n })\n\n if (showLegacyReimbursementField) {\n fixedCompensations[COMPENSATION_NAME_REIMBURSEMENT] =\n existingReimbursementFixedCompensation?.amount ?? '0.00'\n }\n\n return fixedCompensations\n })(),\n\n reimbursements: initialReimbursements.map(reimbursement => ({\n uuid: reimbursement.uuid ?? null,\n description: reimbursement.description ?? '',\n amount: reimbursement.amount,\n recurring: reimbursement.recurring ?? false,\n })),\n\n paymentMethod:\n employeeCompensation?.paymentMethod ||\n PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit,\n }\n\n const formHandlers = useForm<PayrollEditEmployeeFormValues>({\n resolver: zodResolver(PayrollEditEmployeeFormSchema),\n defaultValues,\n })\n\n const {\n fields: reimbursementFields,\n append: appendReimbursement,\n remove: removeReimbursement,\n update: updateReimbursement,\n } = useFieldArray({\n control: formHandlers.control,\n name: 'reimbursements',\n })\n\n const handleRemoveReimbursement = (index: number) => {\n const field = reimbursementFields[index]\n if (!field) return\n\n if (field.uuid) {\n updateReimbursement(index, { ...field, amount: '0' })\n } else {\n removeReimbursement(index)\n }\n }\n\n type VisibleReimbursementRow = (typeof reimbursementFields)[number] & {\n originalIndex: number\n }\n\n const visibleReimbursementRows: VisibleReimbursementRow[] = reimbursementFields\n .map((field, originalIndex) => ({ ...field, originalIndex }))\n .filter(row => parseFloat(row.amount || '0') !== 0)\n\n const [isAddingReimbursement, setIsAddingReimbursement] = useState(false)\n const [draftReimbursementDescription, setDraftReimbursementDescription] = useState('')\n const [draftReimbursementAmount, setDraftReimbursementAmount] = useState('')\n\n const resetReimbursementDraft = () => {\n setIsAddingReimbursement(false)\n setDraftReimbursementDescription('')\n setDraftReimbursementAmount('')\n }\n\n const handleSaveReimbursementDraft = () => {\n const trimmedAmount = draftReimbursementAmount.trim()\n const parsedAmount = parseFloat(trimmedAmount || '0')\n if (Number.isNaN(parsedAmount) || parsedAmount <= 0) {\n return\n }\n\n appendReimbursement({\n uuid: null,\n description: draftReimbursementDescription.trim(),\n amount: parsedAmount.toFixed(2),\n recurring: false,\n })\n resetReimbursementDraft()\n }\n\n const reimbursementDataViewProps = useDataView<VisibleReimbursementRow>({\n data: visibleReimbursementRows,\n columns: [\n {\n key: 'description',\n title: t('reimbursementDescriptionColumn'),\n render: row => row.description.trim() || t('reimbursementUnnamedFallback'),\n },\n {\n key: 'amount',\n title: t('reimbursementAmountColumn'),\n render: row => formatNumberAsCurrency(parseFloat(row.amount || '0')),\n },\n {\n key: 'recurring',\n title: t('reimbursementTypeColumn'),\n render: row =>\n row.recurring ? t('reimbursementTypeRecurring') : t('reimbursementTypeOneTime'),\n },\n ],\n itemMenu: row => {\n if (row.recurring) return null\n const displayDescription = row.description.trim() || t('reimbursementUnnamedFallback')\n return (\n <ButtonIcon\n variant=\"tertiary\"\n onClick={() => {\n handleRemoveReimbursement(row.originalIndex)\n }}\n aria-label={t('removeReimbursementLabel', { description: displayDescription })}\n >\n <TrashCanSvg aria-hidden />\n </ButtonIcon>\n )\n },\n emptyState: () => (\n <EmptyData title={t('reimbursementEmptyTitle')}>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsAddingReimbursement(true)\n }}\n icon={<PlusCircleIcon aria-hidden />}\n >\n {t('addReimbursementCta')}\n </Button>\n </EmptyData>\n ),\n })\n\n const watchedFormData = useWatch({\n control: formHandlers.control,\n })\n\n const currentGrossPay = useMemo(() => {\n try {\n const hourlyCompensations: Record<string, Record<string, string | undefined>> = {}\n if (watchedFormData.hourlyCompensations) {\n Object.entries(watchedFormData.hourlyCompensations).forEach(([jobId, compensations]) => {\n if (compensations) {\n hourlyCompensations[jobId] = compensations\n }\n })\n }\n\n const reimbursementsWithDefaults: PayrollEditEmployeeFormValues['reimbursements'] = (\n watchedFormData.reimbursements ?? []\n ).map(reimbursement => ({\n uuid: reimbursement.uuid ?? null,\n description: reimbursement.description ?? '',\n amount: reimbursement.amount ?? '0',\n recurring: reimbursement.recurring,\n }))\n\n const formDataWithDefaults: PayrollEditEmployeeFormValues = {\n hourlyCompensations,\n timeOffCompensations: watchedFormData.timeOffCompensations || {},\n finalPayoutCompensations: watchedFormData.finalPayoutCompensations || {},\n fixedCompensations: watchedFormData.fixedCompensations || {},\n reimbursements: reimbursementsWithDefaults,\n paymentMethod: watchedFormData.paymentMethod,\n }\n\n const updatedCompensation = buildCompensationFromFormData(\n formDataWithDefaults,\n employeeCompensation,\n (employeeCompensation?.paidTimeOff || []).filter(entry => entry.name),\n primaryJob?.uuid,\n payrollCategory,\n )\n\n return calculateGrossPay(\n updatedCompensation,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n )\n } catch {\n return employeeCompensation\n ? calculateGrossPay(\n employeeCompensation,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n )\n : 0\n }\n }, [\n watchedFormData,\n employeeCompensation,\n primaryJob?.uuid,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n ])\n\n const employeeName = firstLastName({\n first_name: employee.firstName,\n last_name: employee.lastName,\n })\n\n const onSubmit = (data: PayrollEditEmployeeFormValues) => {\n const updatedCompensation = buildCompensationFromFormData(\n data,\n employeeCompensation,\n timeOff,\n primaryJob?.uuid,\n payrollCategory,\n )\n onSave(updatedCompensation)\n }\n\n const formattedCurrentGrossPay = formatNumberAsCurrency(currentGrossPay || 0)\n\n const actions = (\n <Flex\n flexDirection={isSmallOrGreater ? 'row' : 'column'}\n justifyContent={isSmallOrGreater ? 'flex-end' : 'normal'}\n alignItems={isSmallOrGreater ? 'flex-start' : 'stretch'}\n gap={12}\n >\n <Button variant=\"secondary\" onClick={onCancel} title={t('cancelCta')}>\n {t('cancelCta')}\n </Button>\n <Button\n onClick={formHandlers.handleSubmit(onSubmit)}\n title={t('saveCta')}\n isLoading={isPending}\n >\n {t('saveCta')}\n </Button>\n </Flex>\n )\n\n return (\n <div ref={containerRef} className={styles.container}>\n <div\n className={`${styles.headerSection} ${!isSmallOrGreater ? styles.headerSectionSticky : ''}`}\n >\n <Flex justifyContent=\"space-between\">\n <Flex flexDirection=\"column\" gap={isSmallOrGreater ? 8 : 2}>\n <Heading as=\"h1\" styledAs={isSmallOrGreater ? 'h2' : 'h4'}>\n {t('pageTitle', { employeeName })}\n </Heading>\n {isSmallOrGreater ? (\n <Flex flexDirection=\"column\" gap={6}>\n <Heading as=\"h2\" styledAs=\"h3\">\n {formattedCurrentGrossPay}\n </Heading>\n <Text className={styles.grossPayLabel}>{t('grossPayLabel')}</Text>\n </Flex>\n ) : (\n <Heading as=\"h2\" styledAs=\"h6\" className={styles.grossPayLabel}>\n {t('grossPayLabelMobile', { grossPay: formattedCurrentGrossPay })}\n </Heading>\n )}\n </Flex>\n {isSmallOrGreater && actions}\n </Flex>\n </div>\n <FormProvider {...formHandlers}>\n <Form>\n {hourlyJobs.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\">{t('regularHoursTitle')}</Heading>\n {hourlyJobs.map(hourlyJob => (\n <Flex key={hourlyJob.uuid} flexDirection=\"column\" gap={8}>\n {hourlyJobs.length > 1 && <Heading as=\"h4\">{hourlyJob.title}</Heading>}\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {HOURS_COMPENSATION_NAMES.map(compensationName => {\n const employeeHourlyCompensation = findMatchingCompensation(\n hourlyJob.uuid,\n compensationName,\n )\n if (employeeHourlyCompensation) {\n return (\n <TextInputField\n key={compensationName}\n type=\"number\"\n min={0}\n adornmentEnd={t('hoursUnit')}\n isRequired\n label={getCompensationLabel(compensationName)}\n name={`hourlyCompensations.${hourlyJob.uuid}.${employeeHourlyCompensation.name}`}\n />\n )\n }\n })}\n </Grid>\n </Flex>\n ))}\n </div>\n )}\n {timeOff.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {payrollCategory === PayrollCategory.Dismissal\n ? t('timeOffTitleDismissal')\n : t('timeOffTitle')}\n </Heading>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {timeOff.map(timeOffEntry => (\n <TimeOffField\n key={timeOffEntry.name}\n timeOff={timeOffEntry}\n employee={employee}\n />\n ))}\n </Grid>\n </div>\n )}\n {payrollCategory === PayrollCategory.Dismissal && timeOff.length > 0 && (\n <div className={styles.fieldGroup}>\n <Flex flexDirection=\"column\" gap={4}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('finalPayoutTitle')}\n </Heading>\n <Text variant=\"supporting\">{t('finalPayoutDescription')}</Text>\n </Flex>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {timeOff.map(timeOffEntry => (\n <PayoutTimeOffField\n key={`payout-${timeOffEntry.name}`}\n timeOff={timeOffEntry}\n employee={employee}\n />\n ))}\n </Grid>\n </div>\n )}\n {additionalEarnings.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('additionalEarningsTitle')}\n </Heading>\n <Grid\n gridTemplateColumns={{ base: '1fr', small: [320, 320], large: [320, 320, 320] }}\n gap={20}\n >\n {additionalEarnings.map(fixedCompensation => (\n <TextInputField\n key={fixedCompensation.name}\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={getFixedCompensationLabel(fixedCompensation.name)}\n name={`fixedCompensations.${fixedCompensation.name}`}\n />\n ))}\n </Grid>\n </div>\n )}\n {showLegacyReimbursementField && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('reimbursementTitle')}\n </Heading>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n <TextInputField\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={getFixedCompensationLabel(COMPENSATION_NAME_REIMBURSEMENT)}\n name={`fixedCompensations.${COMPENSATION_NAME_REIMBURSEMENT}`}\n />\n </Grid>\n </div>\n )}\n {withReimbursements && usesItemizedReimbursements && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('reimbursementTitle')}\n </Heading>\n {!(visibleReimbursementRows.length === 0 && isAddingReimbursement) && (\n <DataView label={t('reimbursementsTableLabel')} {...reimbursementDataViewProps} />\n )}\n {isAddingReimbursement ? (\n <Flex flexDirection=\"column\" gap={12}>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n <TextInput\n name=\"newReimbursementDescription\"\n label={t('reimbursementDescriptionLabel')}\n placeholder={t('reimbursementDescriptionPlaceholder')}\n value={draftReimbursementDescription}\n onChange={setDraftReimbursementDescription}\n />\n <TextInput\n name=\"newReimbursementAmount\"\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={t('reimbursementAmountLabel')}\n value={draftReimbursementAmount}\n onChange={setDraftReimbursementAmount}\n />\n </Grid>\n <Flex gap={12}>\n <Button onClick={handleSaveReimbursementDraft}>\n {t('saveReimbursementCta')}\n </Button>\n <Button variant=\"secondary\" onClick={resetReimbursementDraft}>\n {t('cancelReimbursementCta')}\n </Button>\n </Flex>\n </Flex>\n ) : (\n visibleReimbursementRows.length > 0 && (\n <div>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsAddingReimbursement(true)\n }}\n title={t('addReimbursementLink')}\n icon={<PlusCircleIcon aria-hidden />}\n >\n {t('addReimbursementLink')}\n </Button>\n </div>\n )\n )}\n </div>\n )}\n {hasDirectDepositSetup && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('paymentMethodTitle')}\n </Heading>\n <RadioGroupField\n name=\"paymentMethod\"\n isRequired\n label={t('paymentMethodLabel')}\n description={t('paymentMethodDescription')}\n options={[\n {\n value: PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit,\n label: t('paymentMethodOptions.directDeposit'),\n },\n {\n value: PayrollEmployeeCompensationsTypePaymentMethod.Check,\n label: t('paymentMethodOptions.check'),\n },\n ]}\n />\n </div>\n )}\n </Form>\n {!isSmallOrGreater && actions}\n </FormProvider>\n </div>\n )\n}\n"],"names":["ReimbursementFormSchema","z","PayrollEditEmployeeFormSchema","PayrollEmployeeCompensationsTypePaymentMethod","buildCompensationFromFormData","formData","employeeCompensation","timeOff","primaryJobUuid","payrollCategory","PayrollCategory","updatedCompensation","compensation","hours","timeOffEntry","isDismissal","_","timeOffWithoutPayout","finalPayout","usesItemizedReimbursements","isOffCyclePayroll","updatedFixedCompensations","fixedCompensationName","formAmount","COMPENSATION_NAME_REIMBURSEMENT","existingFixedCompensation","fixedCompensation","reimbursement","PayrollEditEmployeePresentation","onSave","onCancel","employee","isPending","fixedCompensationTypes","payPeriodStartDate","paySchedule","withReimbursements","hasDirectDepositSetup","Button","ButtonIcon","Heading","Text","TextInput","useComponentContext","t","useTranslation","useI18n","primaryJob","job","primaryJobHasHourlyCompensations","c","hourlyJobs","containerRef","useRef","isSmallOrGreater","useContainerBreakpoints","hourlyJob","entry","additionalEarnings","getAdditionalEarningsCompensations","EXCLUDED_ADDITIONAL_EARNINGS","initialReimbursements","useMemo","existingReimbursementFixedCompensation","comp","showLegacyReimbursementField","findMatchingCompensation","jobUuid","compensationName","getCompensationLabel","COMPENSATION_NAME_REGULAR_HOURS","COMPENSATION_NAME_OVERTIME","COMPENSATION_NAME_DOUBLE_OVERTIME","getFixedCompensationLabel","COMPENSATION_NAME_BONUS","COMPENSATION_NAME_PAYCHECK_TIPS","COMPENSATION_NAME_CORRECTION_PAYMENT","COMPENSATION_NAME_COMMISSION","COMPENSATION_NAME_CASH_TIPS","defaultValues","hourlyCompensations","HOURS_COMPENSATION_NAMES","matchingCompensation","timeOffCompensations","timeOffCompensation","finalPayoutCompensations","fixedCompensations","fixedComp","formHandlers","useForm","zodResolver","reimbursementFields","appendReimbursement","removeReimbursement","updateReimbursement","useFieldArray","handleRemoveReimbursement","index","field","visibleReimbursementRows","originalIndex","row","isAddingReimbursement","setIsAddingReimbursement","useState","draftReimbursementDescription","setDraftReimbursementDescription","draftReimbursementAmount","setDraftReimbursementAmount","resetReimbursementDraft","handleSaveReimbursementDraft","trimmedAmount","parsedAmount","reimbursementDataViewProps","useDataView","formatNumberAsCurrency","displayDescription","jsx","TrashCanSvg","EmptyData","PlusCircleIcon","watchedFormData","useWatch","currentGrossPay","jobId","compensations","reimbursementsWithDefaults","formDataWithDefaults","calculateGrossPay","employeeName","firstLastName","onSubmit","data","formattedCurrentGrossPay","actions","jsxs","Flex","styles","FormProvider","Form","Grid","employeeHourlyCompensation","TextInputField","TimeOffField","PayoutTimeOffField","DataView","RadioGroupField"],"mappings":"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"}
1
+ {"version":3,"file":"PayrollEditEmployeePresentation.js","sources":["../../../../src/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.tsx"],"sourcesContent":["import { FormProvider, useFieldArray, useForm, useWatch } from 'react-hook-form'\nimport { useMemo, useRef, useState } from 'react'\nimport type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport type {\n FixedCompensations,\n PayrollEmployeeCompensationsType,\n PayrollEmployeeCompensationsTypePaidTimeOff,\n Reimbursements as Reimbursement,\n} from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport { PayrollEmployeeCompensationsTypePaymentMethod } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollFixedCompensationTypesType } from '@gusto/embedded-api/models/components/payrollfixedcompensationtypestype'\nimport type { PayScheduleShow as PayScheduleObject } from '@gusto/embedded-api/models/components/payscheduleshow'\nimport { useTranslation } from 'react-i18next'\nimport { z } from 'zod'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport styles from './PayrollEditEmployeePresentation.module.scss'\nimport { TimeOffField, PayoutTimeOffField } from './TimeOffField'\nimport {\n Flex,\n Grid,\n TextInputField,\n RadioGroupField,\n DataView,\n useDataView,\n EmptyData,\n} from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\nimport { Form } from '@/components/Common/Form'\nimport { formatNumberAsCurrency, firstLastName } from '@/helpers/formattedStrings'\nimport { getAdditionalEarningsCompensations, calculateGrossPay } from '@/components/Payroll/helpers'\nimport { PayrollCategory, isOffCyclePayroll } from '@/components/Payroll/payrollTypes'\nimport {\n COMPENSATION_NAME_DOUBLE_OVERTIME,\n COMPENSATION_NAME_OVERTIME,\n COMPENSATION_NAME_REGULAR_HOURS,\n HOURS_COMPENSATION_NAMES,\n EXCLUDED_ADDITIONAL_EARNINGS,\n COMPENSATION_NAME_REIMBURSEMENT,\n COMPENSATION_NAME_BONUS,\n COMPENSATION_NAME_PAYCHECK_TIPS,\n COMPENSATION_NAME_CORRECTION_PAYMENT,\n COMPENSATION_NAME_COMMISSION,\n COMPENSATION_NAME_CASH_TIPS,\n} from '@/shared/constants'\nimport useContainerBreakpoints from '@/hooks/useContainerBreakpoints/useContainerBreakpoints'\nimport PlusCircleIcon from '@/assets/icons/plus-circle.svg?react'\nimport TrashCanSvg from '@/assets/icons/trashcan.svg?react'\n\ninterface PayrollEditEmployeeProps {\n onSave: (updatedCompensation: PayrollEmployeeCompensationsType) => void\n onCancel: () => void\n employee: Employee\n employeeCompensation?: PayrollEmployeeCompensationsType\n isPending?: boolean\n fixedCompensationTypes: PayrollFixedCompensationTypesType[]\n payPeriodStartDate?: string\n paySchedule?: PayScheduleObject\n payrollCategory?: PayrollCategory\n withReimbursements?: boolean\n hasDirectDepositSetup?: boolean\n}\n\nconst ReimbursementFormSchema = z.object({\n uuid: z.string().nullable().optional(),\n description: z.string(),\n amount: z.string(),\n recurring: z.boolean().optional(),\n})\n\nconst DraftReimbursementSchema = z.object({\n description: z.string(),\n amount: z.string().refine(\n val => {\n const num = parseFloat(val)\n return !Number.isNaN(num) && num > 0\n },\n { message: 'validations.reimbursementAmount' },\n ),\n})\n\n// A native `min={0}` only constrains the stepper: it does not stop a typed \"-50\", and the\n// SDK's <form> is noValidate so the browser never enforces it either. Negative amounts\n// therefore reached the platform and came back only as a submit-time error (SDK-1285).\n// Applied via z.record below, this covers every additional earning -- correction payment\n// included -- because they all share the fixedCompensations record.\nconst nonNegativeAmountSchema = z\n .string()\n .optional()\n .refine(val => !val || parseFloat(val) >= 0, { message: 'validations.negativeAmount' })\n\nconst PayrollEditEmployeeFormSchema = z.object({\n hourlyCompensations: z.record(z.string(), z.record(z.string(), z.string().optional())),\n timeOffCompensations: z.record(z.string(), z.string().optional()),\n finalPayoutCompensations: z.record(z.string(), z.string().optional()),\n fixedCompensations: z.record(z.string(), nonNegativeAmountSchema),\n reimbursements: z.array(ReimbursementFormSchema),\n paymentMethod: z.enum(PayrollEmployeeCompensationsTypePaymentMethod).optional(),\n})\n\n/** @internal */\nexport type PayrollEditEmployeeFormValues = z.infer<typeof PayrollEditEmployeeFormSchema>\n\nconst buildCompensationFromFormData = (\n formData: PayrollEditEmployeeFormValues,\n employeeCompensation: PayrollEmployeeCompensationsType | undefined,\n timeOff: PayrollEmployeeCompensationsTypePaidTimeOff[],\n primaryJobUuid?: string,\n payrollCategory: PayrollCategory = PayrollCategory.Regular,\n): PayrollEmployeeCompensationsType => {\n const updatedCompensation = {\n ...employeeCompensation,\n paymentMethod: formData.paymentMethod,\n }\n\n updatedCompensation.hourlyCompensations = employeeCompensation?.hourlyCompensations?.map(\n compensation => {\n const hours =\n compensation.jobUuid && compensation.name\n ? formData.hourlyCompensations[compensation.jobUuid]?.[compensation.name]\n : undefined\n return hours\n ? {\n ...compensation,\n hours,\n }\n : compensation\n },\n )\n\n updatedCompensation.paidTimeOff = timeOff.map(timeOffEntry => {\n const isDismissal = payrollCategory === PayrollCategory.Dismissal\n const { finalPayoutUnusedHoursInput: _, ...timeOffWithoutPayout } = timeOffEntry\n\n if (isDismissal) {\n const finalPayout =\n formData.finalPayoutCompensations[timeOffEntry.name!] ??\n timeOffEntry.finalPayoutUnusedHoursInput\n return {\n ...timeOffEntry,\n hours: formData.timeOffCompensations[timeOffEntry.name!] || '0',\n ...(finalPayout != null ? { finalPayoutUnusedHoursInput: finalPayout || '0' } : {}),\n }\n }\n\n return {\n ...timeOffWithoutPayout,\n hours: formData.timeOffCompensations[timeOffEntry.name!] || '0',\n }\n })\n\n // Off-cycle payrolls today use the legacy single Reimbursement field in fixed_compensations\n // because the backend feature flag `emb_off_cycle_disable_named_reimbursements` (default: true,\n // expected removal 2026-09-01) rejects named entries in the itemized `reimbursements[]` array.\n // TODO(post-2026-09-01): once that flag is removed, unify on the itemized path for all categories.\n const usesItemizedReimbursements = !isOffCyclePayroll(payrollCategory)\n\n const updatedFixedCompensations: FixedCompensations[] = []\n\n Object.entries(formData.fixedCompensations).forEach(([fixedCompensationName, formAmount]) => {\n const isReimbursementEntry =\n fixedCompensationName.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase()\n\n // Regular payrolls write reimbursements via the itemized array; never let the legacy\n // fixed_compensations entry slip through (the backend rejects it on v2025-11-15+).\n if (isReimbursementEntry && usesItemizedReimbursements) {\n return\n }\n\n const existingFixedCompensation = employeeCompensation?.fixedCompensations?.find(\n fixedCompensation =>\n fixedCompensation.name?.toLowerCase() === fixedCompensationName.toLowerCase(),\n )\n\n if (formAmount !== undefined && formAmount !== '') {\n if (existingFixedCompensation) {\n updatedFixedCompensations.push({\n name: existingFixedCompensation.name,\n jobUuid: existingFixedCompensation.jobUuid,\n amount: formAmount,\n })\n } else if (parseFloat(formAmount) !== 0) {\n updatedFixedCompensations.push({\n name: fixedCompensationName,\n jobUuid: primaryJobUuid,\n amount: formAmount,\n })\n }\n }\n })\n\n updatedCompensation.fixedCompensations = updatedFixedCompensations\n\n if (usesItemizedReimbursements) {\n updatedCompensation.reimbursements = formData.reimbursements.map(reimbursement => ({\n amount: reimbursement.amount,\n description:\n reimbursement.description.trim() === '' ? null : reimbursement.description.trim(),\n uuid: reimbursement.uuid ?? null,\n recurring: reimbursement.recurring,\n }))\n } else {\n // Off-cycle: ensure no itemized array leaks through. The container also strips this defensively.\n updatedCompensation.reimbursements = []\n }\n\n return updatedCompensation\n}\n\n/** @internal */\nexport const PayrollEditEmployeePresentation = ({\n onSave,\n onCancel,\n employee,\n employeeCompensation,\n isPending = false,\n fixedCompensationTypes,\n payPeriodStartDate,\n paySchedule,\n payrollCategory = PayrollCategory.Regular,\n withReimbursements = true,\n hasDirectDepositSetup = true,\n}: PayrollEditEmployeeProps) => {\n const { Button, ButtonIcon, Heading, Text } = useComponentContext()\n\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n useI18n('Payroll.PayrollEditEmployee')\n\n const primaryJob = employee.jobs?.find(job => job.primary)\n const primaryJobHasHourlyCompensations = employeeCompensation?.hourlyCompensations?.some(\n c => c.jobUuid === primaryJob?.uuid,\n )\n const hourlyJobs = primaryJob && primaryJobHasHourlyCompensations ? [primaryJob] : []\n\n const containerRef = useRef<HTMLDivElement>(null)\n const breakpoints = useContainerBreakpoints({\n ref: containerRef,\n })\n const isSmallOrGreater = breakpoints.includes('small')\n\n employeeCompensation?.hourlyCompensations?.forEach(compensation => {\n const job = employee.jobs?.find(job => job.uuid === compensation.jobUuid)\n if (job && !hourlyJobs.find(hourlyJob => hourlyJob.uuid === job.uuid)) {\n hourlyJobs.push(job)\n }\n })\n\n const timeOff = (employeeCompensation?.paidTimeOff || []).filter(entry => entry.name)\n\n const additionalEarnings = getAdditionalEarningsCompensations({\n flsaStatus: primaryJob?.compensations?.[0]?.flsaStatus,\n existingFixedCompensations: employeeCompensation?.fixedCompensations || [],\n primaryJobUuid: primaryJob?.uuid,\n fixedCompensationTypes,\n excludedTypes: EXCLUDED_ADDITIONAL_EARNINGS,\n })\n\n // Off-cycle payrolls use the legacy single Reimbursement field in fixed_compensations because\n // the backend `emb_off_cycle_disable_named_reimbursements` flag (default: true, expected\n // removal 2026-09-01) rejects named entries in the itemized `reimbursements[]` array.\n // TODO(post-2026-09-01): unify on the itemized path once that flag is removed.\n const usesItemizedReimbursements = !isOffCyclePayroll(payrollCategory)\n\n const initialReimbursements: Reimbursement[] = useMemo(\n () =>\n withReimbursements && usesItemizedReimbursements\n ? (employeeCompensation?.reimbursements ?? [])\n : [],\n [withReimbursements, usesItemizedReimbursements, employeeCompensation?.reimbursements],\n )\n\n const existingReimbursementFixedCompensation = useMemo(\n () =>\n employeeCompensation?.fixedCompensations?.find(\n comp => comp.name?.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase(),\n ),\n [employeeCompensation?.fixedCompensations],\n )\n\n const showLegacyReimbursementField =\n withReimbursements && !usesItemizedReimbursements && Boolean(primaryJob?.uuid)\n\n const findMatchingCompensation = (jobUuid: string, compensationName: string) => {\n return employeeCompensation?.hourlyCompensations?.find(\n compensation =>\n compensation.jobUuid === jobUuid &&\n compensation.name?.toLowerCase() === compensationName.toLowerCase(),\n )\n }\n\n const getCompensationLabel = (compensationName?: string) => {\n switch (compensationName) {\n case COMPENSATION_NAME_REGULAR_HOURS:\n return t('compensationNames.regularHours')\n case COMPENSATION_NAME_OVERTIME:\n return t('compensationNames.overtime')\n case COMPENSATION_NAME_DOUBLE_OVERTIME:\n return t('compensationNames.doubleOvertime')\n default:\n return compensationName\n }\n }\n\n const getFixedCompensationLabel = (compensationName?: string) => {\n switch (compensationName) {\n case COMPENSATION_NAME_BONUS:\n return t('fixedCompensationNames.bonus')\n case COMPENSATION_NAME_PAYCHECK_TIPS:\n return t('fixedCompensationNames.paycheckTips')\n case COMPENSATION_NAME_CORRECTION_PAYMENT:\n return t('fixedCompensationNames.correctionPayment')\n case COMPENSATION_NAME_COMMISSION:\n return t('fixedCompensationNames.commission')\n case COMPENSATION_NAME_CASH_TIPS:\n return t('fixedCompensationNames.cashTips')\n case COMPENSATION_NAME_REIMBURSEMENT:\n return t('fixedCompensationNames.reimbursement')\n default:\n return compensationName\n }\n }\n\n const defaultValues = {\n hourlyCompensations: (() => {\n const hourlyCompensations: PayrollEditEmployeeFormValues['hourlyCompensations'] = {}\n\n hourlyJobs.forEach(hourlyJob => {\n HOURS_COMPENSATION_NAMES.forEach(compensationName => {\n const matchingCompensation = findMatchingCompensation(hourlyJob.uuid, compensationName)\n if (matchingCompensation) {\n if (!hourlyCompensations[hourlyJob.uuid]) {\n hourlyCompensations[hourlyJob.uuid] = {}\n }\n hourlyCompensations[hourlyJob.uuid]![matchingCompensation.name!] =\n matchingCompensation.hours ? parseFloat(matchingCompensation.hours).toString() : ''\n }\n })\n })\n\n return hourlyCompensations\n })(),\n\n timeOffCompensations: (() => {\n const timeOffCompensations: PayrollEditEmployeeFormValues['timeOffCompensations'] = {}\n\n timeOff.forEach(timeOffCompensation => {\n timeOffCompensations[timeOffCompensation.name!] = timeOffCompensation.hours\n ? parseFloat(timeOffCompensation.hours).toString()\n : ''\n })\n\n return timeOffCompensations\n })(),\n\n finalPayoutCompensations: (() => {\n const finalPayoutCompensations: PayrollEditEmployeeFormValues['finalPayoutCompensations'] = {}\n\n timeOff.forEach(timeOffCompensation => {\n finalPayoutCompensations[timeOffCompensation.name!] =\n timeOffCompensation.finalPayoutUnusedHoursInput ?? '0'\n })\n\n return finalPayoutCompensations\n })(),\n\n fixedCompensations: (() => {\n const fixedCompensations: PayrollEditEmployeeFormValues['fixedCompensations'] = {}\n\n additionalEarnings.forEach(fixedComp => {\n fixedCompensations[fixedComp.name!] = fixedComp.amount ?? ''\n })\n\n if (showLegacyReimbursementField) {\n fixedCompensations[COMPENSATION_NAME_REIMBURSEMENT] =\n existingReimbursementFixedCompensation?.amount ?? '0.00'\n }\n\n return fixedCompensations\n })(),\n\n reimbursements: initialReimbursements.map(reimbursement => ({\n uuid: reimbursement.uuid ?? null,\n description: reimbursement.description ?? '',\n amount: reimbursement.amount,\n recurring: reimbursement.recurring ?? false,\n })),\n\n paymentMethod:\n employeeCompensation?.paymentMethod ||\n PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit,\n }\n\n const formHandlers = useForm<PayrollEditEmployeeFormValues>({\n resolver: zodResolver(PayrollEditEmployeeFormSchema),\n defaultValues,\n })\n\n const {\n fields: reimbursementFields,\n append: appendReimbursement,\n remove: removeReimbursement,\n update: updateReimbursement,\n } = useFieldArray({\n control: formHandlers.control,\n name: 'reimbursements',\n })\n\n const handleRemoveReimbursement = (index: number) => {\n const field = reimbursementFields[index]\n if (!field) return\n\n if (field.uuid) {\n updateReimbursement(index, { ...field, amount: '0' })\n } else {\n removeReimbursement(index)\n }\n }\n\n type VisibleReimbursementRow = (typeof reimbursementFields)[number] & {\n originalIndex: number\n }\n\n const visibleReimbursementRows: VisibleReimbursementRow[] = reimbursementFields\n .map((field, originalIndex) => ({ ...field, originalIndex }))\n .filter(row => parseFloat(row.amount || '0') !== 0)\n\n const [isAddingReimbursement, setIsAddingReimbursement] = useState(false)\n\n type DraftReimbursementValues = z.infer<typeof DraftReimbursementSchema>\n\n const draftForm = useForm<DraftReimbursementValues>({\n resolver: zodResolver(DraftReimbursementSchema),\n defaultValues: { description: '', amount: '' },\n })\n\n const resetReimbursementDraft = () => {\n setIsAddingReimbursement(false)\n draftForm.reset()\n }\n\n const onDraftReimbursementValid = (data: DraftReimbursementValues) => {\n const parsedAmount = parseFloat(data.amount)\n appendReimbursement({\n uuid: null,\n description: data.description.trim(),\n amount: parsedAmount.toFixed(2),\n recurring: false,\n })\n resetReimbursementDraft()\n }\n\n const reimbursementDataViewProps = useDataView<VisibleReimbursementRow>({\n data: visibleReimbursementRows,\n columns: [\n {\n key: 'description',\n title: t('reimbursementDescriptionColumn'),\n render: row => row.description.trim() || t('reimbursementUnnamedFallback'),\n },\n {\n key: 'amount',\n title: t('reimbursementAmountColumn'),\n render: row => formatNumberAsCurrency(parseFloat(row.amount || '0')),\n },\n {\n key: 'recurring',\n title: t('reimbursementTypeColumn'),\n render: row =>\n row.recurring ? t('reimbursementTypeRecurring') : t('reimbursementTypeOneTime'),\n },\n ],\n itemMenu: row => {\n if (row.recurring) return null\n const displayDescription = row.description.trim() || t('reimbursementUnnamedFallback')\n return (\n <ButtonIcon\n variant=\"tertiary\"\n onClick={() => {\n handleRemoveReimbursement(row.originalIndex)\n }}\n aria-label={t('removeReimbursementLabel', { description: displayDescription })}\n >\n <TrashCanSvg aria-hidden />\n </ButtonIcon>\n )\n },\n emptyState: () => (\n <EmptyData title={t('reimbursementEmptyTitle')}>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsAddingReimbursement(true)\n }}\n icon={<PlusCircleIcon aria-hidden />}\n >\n {t('addReimbursementCta')}\n </Button>\n </EmptyData>\n ),\n })\n\n const watchedFormData = useWatch({\n control: formHandlers.control,\n })\n\n const currentGrossPay = useMemo(() => {\n try {\n const hourlyCompensations: Record<string, Record<string, string | undefined>> = {}\n if (watchedFormData.hourlyCompensations) {\n Object.entries(watchedFormData.hourlyCompensations).forEach(([jobId, compensations]) => {\n if (compensations) {\n hourlyCompensations[jobId] = compensations\n }\n })\n }\n\n const reimbursementsWithDefaults: PayrollEditEmployeeFormValues['reimbursements'] = (\n watchedFormData.reimbursements ?? []\n ).map(reimbursement => ({\n uuid: reimbursement.uuid ?? null,\n description: reimbursement.description ?? '',\n amount: reimbursement.amount ?? '0',\n recurring: reimbursement.recurring,\n }))\n\n const formDataWithDefaults: PayrollEditEmployeeFormValues = {\n hourlyCompensations,\n timeOffCompensations: watchedFormData.timeOffCompensations || {},\n finalPayoutCompensations: watchedFormData.finalPayoutCompensations || {},\n fixedCompensations: watchedFormData.fixedCompensations || {},\n reimbursements: reimbursementsWithDefaults,\n paymentMethod: watchedFormData.paymentMethod,\n }\n\n const updatedCompensation = buildCompensationFromFormData(\n formDataWithDefaults,\n employeeCompensation,\n (employeeCompensation?.paidTimeOff || []).filter(entry => entry.name),\n primaryJob?.uuid,\n payrollCategory,\n )\n\n return calculateGrossPay(\n updatedCompensation,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n )\n } catch {\n return employeeCompensation\n ? calculateGrossPay(\n employeeCompensation,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n )\n : 0\n }\n }, [\n watchedFormData,\n employeeCompensation,\n primaryJob?.uuid,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n ])\n\n const employeeName = firstLastName({\n first_name: employee.firstName,\n last_name: employee.lastName,\n })\n\n const onSubmit = (data: PayrollEditEmployeeFormValues) => {\n const updatedCompensation = buildCompensationFromFormData(\n data,\n employeeCompensation,\n timeOff,\n primaryJob?.uuid,\n payrollCategory,\n )\n onSave(updatedCompensation)\n }\n\n const formattedCurrentGrossPay = formatNumberAsCurrency(currentGrossPay || 0)\n\n const actions = (\n <Flex\n flexDirection={isSmallOrGreater ? 'row' : 'column'}\n justifyContent={isSmallOrGreater ? 'flex-end' : 'normal'}\n alignItems={isSmallOrGreater ? 'flex-start' : 'stretch'}\n gap={12}\n >\n <Button variant=\"secondary\" onClick={onCancel} title={t('cancelCta')}>\n {t('cancelCta')}\n </Button>\n <Button\n onClick={formHandlers.handleSubmit(onSubmit)}\n title={t('saveCta')}\n isLoading={isPending}\n >\n {t('saveCta')}\n </Button>\n </Flex>\n )\n\n return (\n <div ref={containerRef} className={styles.container}>\n <div\n className={`${styles.headerSection} ${!isSmallOrGreater ? styles.headerSectionSticky : ''}`}\n >\n <Flex justifyContent=\"space-between\">\n <Flex flexDirection=\"column\" gap={isSmallOrGreater ? 8 : 2}>\n <Heading as=\"h1\" styledAs={isSmallOrGreater ? 'h2' : 'h4'}>\n {t('pageTitle', { employeeName })}\n </Heading>\n {isSmallOrGreater ? (\n <Flex flexDirection=\"column\" gap={6}>\n <Heading as=\"h2\" styledAs=\"h3\">\n {formattedCurrentGrossPay}\n </Heading>\n <Text className={styles.grossPayLabel}>{t('grossPayLabel')}</Text>\n </Flex>\n ) : (\n <Heading as=\"h2\" styledAs=\"h6\" className={styles.grossPayLabel}>\n {t('grossPayLabelMobile', { grossPay: formattedCurrentGrossPay })}\n </Heading>\n )}\n </Flex>\n {isSmallOrGreater && actions}\n </Flex>\n </div>\n <FormProvider {...formHandlers}>\n <Form>\n {hourlyJobs.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\">{t('regularHoursTitle')}</Heading>\n {hourlyJobs.map(hourlyJob => (\n <Flex key={hourlyJob.uuid} flexDirection=\"column\" gap={8}>\n {hourlyJobs.length > 1 && <Heading as=\"h4\">{hourlyJob.title}</Heading>}\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {HOURS_COMPENSATION_NAMES.map(compensationName => {\n const employeeHourlyCompensation = findMatchingCompensation(\n hourlyJob.uuid,\n compensationName,\n )\n if (employeeHourlyCompensation) {\n return (\n <TextInputField\n key={compensationName}\n type=\"number\"\n min={0}\n adornmentEnd={t('hoursUnit')}\n isRequired\n label={getCompensationLabel(compensationName)}\n name={`hourlyCompensations.${hourlyJob.uuid}.${employeeHourlyCompensation.name}`}\n />\n )\n }\n })}\n </Grid>\n </Flex>\n ))}\n </div>\n )}\n {timeOff.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {payrollCategory === PayrollCategory.Dismissal\n ? t('timeOffTitleDismissal')\n : t('timeOffTitle')}\n </Heading>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {timeOff.map(timeOffEntry => (\n <TimeOffField\n key={timeOffEntry.name}\n timeOff={timeOffEntry}\n employee={employee}\n />\n ))}\n </Grid>\n </div>\n )}\n {payrollCategory === PayrollCategory.Dismissal && timeOff.length > 0 && (\n <div className={styles.fieldGroup}>\n <Flex flexDirection=\"column\" gap={4}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('finalPayoutTitle')}\n </Heading>\n <Text variant=\"supporting\">{t('finalPayoutDescription')}</Text>\n </Flex>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {timeOff.map(timeOffEntry => (\n <PayoutTimeOffField\n key={`payout-${timeOffEntry.name}`}\n timeOff={timeOffEntry}\n employee={employee}\n />\n ))}\n </Grid>\n </div>\n )}\n {additionalEarnings.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('additionalEarningsTitle')}\n </Heading>\n <Grid\n gridTemplateColumns={{ base: '1fr', small: [320, 320], large: [320, 320, 320] }}\n gap={20}\n >\n {additionalEarnings.map(fixedCompensation => (\n <TextInputField\n key={fixedCompensation.name}\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={getFixedCompensationLabel(fixedCompensation.name)}\n name={`fixedCompensations.${fixedCompensation.name}`}\n // useField only surfaces this once react-hook-form has flagged the\n // field, and the schema's only rule here is the negative-amount check.\n errorMessage={t('validations.negativeAmount')}\n />\n ))}\n </Grid>\n </div>\n )}\n {showLegacyReimbursementField && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('reimbursementTitle')}\n </Heading>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n <TextInputField\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={getFixedCompensationLabel(COMPENSATION_NAME_REIMBURSEMENT)}\n name={`fixedCompensations.${COMPENSATION_NAME_REIMBURSEMENT}`}\n errorMessage={t('validations.negativeAmount')}\n />\n </Grid>\n </div>\n )}\n {withReimbursements && usesItemizedReimbursements && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('reimbursementTitle')}\n </Heading>\n {!(visibleReimbursementRows.length === 0 && isAddingReimbursement) && (\n <DataView label={t('reimbursementsTableLabel')} {...reimbursementDataViewProps} />\n )}\n {isAddingReimbursement ? (\n <FormProvider {...draftForm}>\n <Flex flexDirection=\"column\" gap={12}>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n <TextInputField\n name=\"description\"\n label={t('reimbursementDescriptionLabel')}\n placeholder={t('reimbursementDescriptionPlaceholder')}\n />\n <TextInputField\n name=\"amount\"\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={t('reimbursementAmountLabel')}\n errorMessage={t('validations.reimbursementAmount')}\n />\n </Grid>\n <Flex gap={12}>\n <Button onClick={draftForm.handleSubmit(onDraftReimbursementValid)}>\n {t('saveReimbursementCta')}\n </Button>\n <Button variant=\"secondary\" onClick={resetReimbursementDraft}>\n {t('cancelReimbursementCta')}\n </Button>\n </Flex>\n </Flex>\n </FormProvider>\n ) : (\n visibleReimbursementRows.length > 0 && (\n <div>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsAddingReimbursement(true)\n }}\n title={t('addReimbursementLink')}\n icon={<PlusCircleIcon aria-hidden />}\n >\n {t('addReimbursementLink')}\n </Button>\n </div>\n )\n )}\n </div>\n )}\n {hasDirectDepositSetup && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('paymentMethodTitle')}\n </Heading>\n <RadioGroupField\n name=\"paymentMethod\"\n isRequired\n label={t('paymentMethodLabel')}\n description={t('paymentMethodDescription')}\n options={[\n {\n value: PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit,\n label: t('paymentMethodOptions.directDeposit'),\n },\n {\n value: PayrollEmployeeCompensationsTypePaymentMethod.Check,\n label: t('paymentMethodOptions.check'),\n },\n ]}\n />\n </div>\n )}\n </Form>\n {!isSmallOrGreater && actions}\n </FormProvider>\n </div>\n )\n}\n"],"names":["ReimbursementFormSchema","z","DraftReimbursementSchema","val","num","nonNegativeAmountSchema","PayrollEditEmployeeFormSchema","PayrollEmployeeCompensationsTypePaymentMethod","buildCompensationFromFormData","formData","employeeCompensation","timeOff","primaryJobUuid","payrollCategory","PayrollCategory","updatedCompensation","compensation","hours","timeOffEntry","isDismissal","_","timeOffWithoutPayout","finalPayout","usesItemizedReimbursements","isOffCyclePayroll","updatedFixedCompensations","fixedCompensationName","formAmount","COMPENSATION_NAME_REIMBURSEMENT","existingFixedCompensation","fixedCompensation","reimbursement","PayrollEditEmployeePresentation","onSave","onCancel","employee","isPending","fixedCompensationTypes","payPeriodStartDate","paySchedule","withReimbursements","hasDirectDepositSetup","Button","ButtonIcon","Heading","Text","useComponentContext","t","useTranslation","useI18n","primaryJob","job","primaryJobHasHourlyCompensations","c","hourlyJobs","containerRef","useRef","isSmallOrGreater","useContainerBreakpoints","hourlyJob","entry","additionalEarnings","getAdditionalEarningsCompensations","EXCLUDED_ADDITIONAL_EARNINGS","initialReimbursements","useMemo","existingReimbursementFixedCompensation","comp","showLegacyReimbursementField","findMatchingCompensation","jobUuid","compensationName","getCompensationLabel","COMPENSATION_NAME_REGULAR_HOURS","COMPENSATION_NAME_OVERTIME","COMPENSATION_NAME_DOUBLE_OVERTIME","getFixedCompensationLabel","COMPENSATION_NAME_BONUS","COMPENSATION_NAME_PAYCHECK_TIPS","COMPENSATION_NAME_CORRECTION_PAYMENT","COMPENSATION_NAME_COMMISSION","COMPENSATION_NAME_CASH_TIPS","defaultValues","hourlyCompensations","HOURS_COMPENSATION_NAMES","matchingCompensation","timeOffCompensations","timeOffCompensation","finalPayoutCompensations","fixedCompensations","fixedComp","formHandlers","useForm","zodResolver","reimbursementFields","appendReimbursement","removeReimbursement","updateReimbursement","useFieldArray","handleRemoveReimbursement","index","field","visibleReimbursementRows","originalIndex","row","isAddingReimbursement","setIsAddingReimbursement","useState","draftForm","resetReimbursementDraft","onDraftReimbursementValid","data","parsedAmount","reimbursementDataViewProps","useDataView","formatNumberAsCurrency","displayDescription","jsx","TrashCanSvg","EmptyData","PlusCircleIcon","watchedFormData","useWatch","currentGrossPay","jobId","compensations","reimbursementsWithDefaults","formDataWithDefaults","calculateGrossPay","employeeName","firstLastName","onSubmit","formattedCurrentGrossPay","actions","jsxs","Flex","styles","FormProvider","Form","Grid","employeeHourlyCompensation","TextInputField","TimeOffField","PayoutTimeOffField","DataView","RadioGroupField"],"mappings":"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"}
@@ -1,87 +1,94 @@
1
- import { jsx as i } from "react/jsx-runtime";
2
- import { useState as E, useCallback as I } from "react";
3
- import { usePayrollsListSuspense as O } from "@gusto/embedded-api/react-query/payrollsList";
4
- import { usePayrollsCancelMutation as A } from "@gusto/embedded-api/react-query/payrollsCancel";
5
- import { useWireInRequestsListSuspense as V } from "@gusto/embedded-api/react-query/wireInRequestsList";
6
- import { QueryParamSortOrder as H, QueryParamPayrollTypes as s, ProcessingStatuses as M } from "@gusto/embedded-api/models/operations/getv1companiescompanyidpayrolls";
7
- import { PayrollHistoryPresentation as U } from "./PayrollHistoryPresentation.js";
8
- import { BaseComponent as q } from "../../Base/Base.js";
9
- import { useBase as F } from "../../Base/useBase.js";
10
- import { componentEvents as l } from "../../../shared/constants.js";
11
- import { useComponentDictionary as N, useI18n as T } from "../../../i18n/I18n.js";
12
- import { usePagination as Y } from "../../../hooks/usePagination/usePagination.js";
13
- import { useDateRangeFilter as b } from "../../../hooks/useDateRangeFilter/useDateRangeFilter.js";
14
- function se(e) {
15
- return /* @__PURE__ */ i(q, { ...e, children: /* @__PURE__ */ i(K, { ...e, children: e.children }) });
1
+ import { jsx as o } from "react/jsx-runtime";
2
+ import { useState as M, useCallback as U } from "react";
3
+ import { keepPreviousData as F } from "@tanstack/react-query";
4
+ import { usePayrollsList as V } from "@gusto/embedded-api/react-query/payrollsList";
5
+ import { usePayrollsCancelMutation as q } from "@gusto/embedded-api/react-query/payrollsCancel";
6
+ import { useWireInRequestsListSuspense as N } from "@gusto/embedded-api/react-query/wireInRequestsList";
7
+ import { QueryParamSortOrder as T, QueryParamPayrollTypes as i, ProcessingStatuses as B } from "@gusto/embedded-api/models/operations/getv1companiescompanyidpayrolls";
8
+ import { PayrollHistoryPresentation as Y } from "./PayrollHistoryPresentation.js";
9
+ import { BaseComponent as b, BaseLayout as x } from "../../Base/Base.js";
10
+ import { useBase as W } from "../../Base/useBase.js";
11
+ import { componentEvents as c } from "../../../shared/constants.js";
12
+ import { useComponentDictionary as k, useI18n as K } from "../../../i18n/I18n.js";
13
+ import { usePagination as Q } from "../../../hooks/usePagination/usePagination.js";
14
+ import { useDateRangeFilter as j } from "../../../hooks/useDateRangeFilter/useDateRangeFilter.js";
15
+ function me(e) {
16
+ return /* @__PURE__ */ o(b, { ...e, children: /* @__PURE__ */ o(J, { ...e, children: e.children }) });
16
17
  }
17
- const x = 3, B = () => {
18
+ const v = 3, z = () => {
18
19
  const e = /* @__PURE__ */ new Date();
19
- return e.setMonth(e.getMonth() - x), e;
20
- }, W = () => /* @__PURE__ */ new Date(), K = ({ onEvent: e, companyId: r, dictionary: p }) => {
21
- N("Payroll.PayrollHistory", p), T("Payroll.PayrollHistory");
22
- const [P, n] = E(null), { baseSubmitHandler: d } = F(), { currentPage: g, itemsPerPage: D, getPaginationProps: f, resetPage: c } = Y(), u = b({
23
- initialStartDate: B(),
24
- initialEndDate: W(),
25
- onFilterChange: I(() => {
26
- c();
27
- }, [c])
28
- }), m = u.getApiDateParams(), { data: y } = O({
29
- companyId: r,
30
- processingStatuses: [M.Processed],
31
- payrollTypes: [
32
- s.Regular,
33
- s.OffCycle,
34
- s.External
35
- ],
36
- includeOffCycle: !0,
37
- include: ["totals", "payroll_status_meta"],
38
- sortOrder: H.Desc,
39
- startDate: m.startDate,
40
- endDate: m.endDate,
41
- page: g,
42
- per: D
43
- }), C = y.payrollList || [], R = f(y.httpMeta.response.headers), { data: L } = V({
44
- companyUuid: r
45
- }), h = L.wireInRequestList ?? [], { mutateAsync: S, isPending: w } = A();
46
- return /* @__PURE__ */ i(
47
- U,
20
+ return e.setMonth(e.getMonth() - v), e;
21
+ }, G = () => /* @__PURE__ */ new Date(), J = ({ onEvent: e, companyId: n, dictionary: y, LoaderComponent: P }) => {
22
+ k("Payroll.PayrollHistory", y), K("Payroll.PayrollHistory");
23
+ const [d, s] = M(null), { baseSubmitHandler: g } = W(), { currentPage: D, itemsPerPage: f, getPaginationProps: C, resetPage: u } = Q(), m = j({
24
+ initialStartDate: z(),
25
+ initialEndDate: G(),
26
+ onFilterChange: U(() => {
27
+ u();
28
+ }, [u])
29
+ }), p = m.getApiDateParams(), { data: l, isFetching: R } = V(
48
30
  {
49
- payrollHistory: C,
50
- wireInRequests: h,
51
- pagination: R,
52
- onViewSummary: (t, o, a) => {
53
- e(l.RUN_PAYROLL_SUMMARY_VIEWED, { payrollId: t, startDate: o, endDate: a });
54
- },
55
- onViewReceipt: (t, o, a) => {
56
- e(l.RUN_PAYROLL_RECEIPT_VIEWED, { payrollId: t, startDate: o, endDate: a });
57
- },
58
- onCancelPayroll: async (t) => {
59
- const o = t.payrollUuid || t.uuid;
60
- try {
61
- await d(o, async (a) => {
62
- const _ = await S({
63
- request: {
64
- companyId: r,
65
- payrollId: a
66
- }
67
- });
68
- e(l.RUN_PAYROLL_CANCELLED, { payrollId: a, result: _ });
69
- });
70
- } finally {
71
- n(null);
72
- }
73
- },
74
- cancelDialogItem: P,
75
- onCancelDialogOpen: n,
31
+ companyId: n,
32
+ processingStatuses: [B.Processed],
33
+ payrollTypes: [
34
+ i.Regular,
35
+ i.OffCycle,
36
+ i.External
37
+ ],
38
+ includeOffCycle: !0,
39
+ include: ["totals", "payroll_status_meta"],
40
+ sortOrder: T.Desc,
41
+ startDate: p.startDate,
42
+ endDate: p.endDate,
43
+ page: D,
44
+ per: f
45
+ },
46
+ { placeholderData: F, throwOnError: !0 }
47
+ ), L = l?.payrollList || [], { data: h } = N({
48
+ companyUuid: n
49
+ }), w = h.wireInRequestList ?? [], { mutateAsync: E, isPending: O } = q(), S = (t, r, a) => {
50
+ e(c.RUN_PAYROLL_SUMMARY_VIEWED, { payrollId: t, startDate: r, endDate: a });
51
+ }, _ = (t, r, a) => {
52
+ e(c.RUN_PAYROLL_RECEIPT_VIEWED, { payrollId: t, startDate: r, endDate: a });
53
+ }, I = async (t) => {
54
+ const r = t.payrollUuid || t.uuid;
55
+ try {
56
+ await g(r, async (a) => {
57
+ const H = await E({
58
+ request: {
59
+ companyId: n,
60
+ payrollId: a
61
+ }
62
+ });
63
+ e(c.RUN_PAYROLL_CANCELLED, { payrollId: a, result: H });
64
+ });
65
+ } finally {
66
+ s(null);
67
+ }
68
+ };
69
+ if (!l)
70
+ return /* @__PURE__ */ o(x, { isLoading: !0, LoaderComponent: P });
71
+ const A = C(l.httpMeta.response.headers, R);
72
+ return /* @__PURE__ */ o(
73
+ Y,
74
+ {
75
+ payrollHistory: L,
76
+ wireInRequests: w,
77
+ pagination: A,
78
+ onViewSummary: S,
79
+ onViewReceipt: _,
80
+ onCancelPayroll: I,
81
+ cancelDialogItem: d,
82
+ onCancelDialogOpen: s,
76
83
  onCancelDialogClose: () => {
77
- n(null);
84
+ s(null);
78
85
  },
79
- isLoading: w,
80
- dateRangeFilter: u
86
+ isLoading: O,
87
+ dateRangeFilter: m
81
88
  }
82
89
  );
83
90
  };
84
91
  export {
85
- se as PayrollHistory
92
+ me as PayrollHistory
86
93
  };
87
94
  //# sourceMappingURL=PayrollHistory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PayrollHistory.js","sources":["../../../../src/components/Payroll/PayrollHistory/PayrollHistory.tsx"],"sourcesContent":["import { useState, useCallback } from 'react'\nimport { usePayrollsListSuspense } from '@gusto/embedded-api/react-query/payrollsList'\nimport { usePayrollsCancelMutation } from '@gusto/embedded-api/react-query/payrollsCancel'\nimport { useWireInRequestsListSuspense } from '@gusto/embedded-api/react-query/wireInRequestsList'\nimport {\n ProcessingStatuses,\n QueryParamPayrollTypes,\n QueryParamSortOrder as SortOrder,\n} from '@gusto/embedded-api/models/operations/getv1companiescompanyidpayrolls'\nimport type { Payroll } from '@gusto/embedded-api/models/components/payrollshow'\nimport { PayrollHistoryPresentation } from './PayrollHistoryPresentation'\nimport type { BaseComponentInterface } from '@/components/Base/Base'\nimport { BaseComponent } from '@/components/Base/Base'\nimport { useBase } from '@/components/Base/useBase'\nimport { componentEvents } from '@/shared/constants'\nimport { useComponentDictionary, useI18n } from '@/i18n'\nimport { usePagination } from '@/hooks/usePagination/usePagination'\nimport { useDateRangeFilter } from '@/hooks/useDateRangeFilter/useDateRangeFilter'\n\n/**\n * Props for the {@link PayrollHistory} component.\n *\n * @public\n */\nexport interface PayrollHistoryProps extends BaseComponentInterface<'Payroll.PayrollHistory'> {\n /** Identifier of the company whose processed payrolls should be listed. */\n companyId: string\n}\n\n/**\n * Displays historical payroll records with filtering and management capabilities.\n *\n * @remarks\n * Lists processed regular, off-cycle, and external payrolls for a company and supports filtering by\n * pay period, viewing payroll summaries and receipts, and cancelling processed payrolls when they\n * remain within the cancellation window. Each row shows the pay period, payroll type, pay date,\n * status, and total pay amount.\n *\n * @events\n * | Event | Description | Data |\n * | ----- | ----------- | ---- |\n * | `runPayroll/summary/viewed` | User views a payroll summary | `{ payrollId: string; startDate?: string; endDate?: string }` |\n * | `runPayroll/receipt/viewed` | User views a payroll receipt | `{ payrollId: string; startDate?: string; endDate?: string }` |\n * | `runPayroll/cancelled` | A payroll is cancelled | `{ payrollId: string; result: PayrollsCancelResponse }` |\n *\n * @param props - See {@link PayrollHistoryProps}.\n * @returns The rendered payroll history view.\n * @public\n */\nexport function PayrollHistory(props: PayrollHistoryProps) {\n return (\n <BaseComponent {...props}>\n <Root {...props}>{props.children}</Root>\n </BaseComponent>\n )\n}\n\nconst DEFAULT_LOOKBACK_MONTHS = 3\n\nconst getDefaultStartDate = (): Date => {\n const date = new Date()\n date.setMonth(date.getMonth() - DEFAULT_LOOKBACK_MONTHS)\n return date\n}\n\nconst getDefaultEndDate = (): Date => new Date()\n\nconst Root = ({ onEvent, companyId, dictionary }: PayrollHistoryProps) => {\n useComponentDictionary('Payroll.PayrollHistory', dictionary)\n useI18n('Payroll.PayrollHistory')\n\n const [cancelDialogItem, setCancelDialogItem] = useState<Payroll | null>(null)\n const { baseSubmitHandler } = useBase()\n const { currentPage, itemsPerPage, getPaginationProps, resetPage } = usePagination()\n\n const dateRangeFilter = useDateRangeFilter({\n initialStartDate: getDefaultStartDate(),\n initialEndDate: getDefaultEndDate(),\n onFilterChange: useCallback(() => {\n resetPage()\n }, [resetPage]),\n })\n const dateFilterParams = dateRangeFilter.getApiDateParams()\n\n const { data: payrollsData } = usePayrollsListSuspense({\n companyId,\n processingStatuses: [ProcessingStatuses.Processed],\n payrollTypes: [\n QueryParamPayrollTypes.Regular,\n QueryParamPayrollTypes.OffCycle,\n QueryParamPayrollTypes.External,\n ],\n includeOffCycle: true,\n include: ['totals', 'payroll_status_meta'],\n sortOrder: SortOrder.Desc,\n startDate: dateFilterParams.startDate,\n endDate: dateFilterParams.endDate,\n page: currentPage,\n per: itemsPerPage,\n })\n\n const payrollHistory = payrollsData.payrollList || []\n const paginationProps = getPaginationProps(payrollsData.httpMeta.response.headers)\n\n const { data: wireInRequestsData } = useWireInRequestsListSuspense({\n companyUuid: companyId,\n })\n\n const wireInRequests = wireInRequestsData.wireInRequestList ?? []\n\n const { mutateAsync: cancelPayroll, isPending: isCancelling } = usePayrollsCancelMutation()\n\n const handleViewSummary = (payrollId: string, startDate?: string, endDate?: string) => {\n onEvent(componentEvents.RUN_PAYROLL_SUMMARY_VIEWED, { payrollId, startDate, endDate })\n }\n\n const handleViewReceipt = (payrollId: string, startDate?: string, endDate?: string) => {\n onEvent(componentEvents.RUN_PAYROLL_RECEIPT_VIEWED, { payrollId, startDate, endDate })\n }\n\n const handleCancelPayroll = async (item: Payroll) => {\n const payrollId = item.payrollUuid || item.uuid!\n try {\n await baseSubmitHandler(payrollId, async id => {\n const result = await cancelPayroll({\n request: {\n companyId,\n payrollId: id,\n },\n })\n\n onEvent(componentEvents.RUN_PAYROLL_CANCELLED, { payrollId: id, result })\n })\n } finally {\n setCancelDialogItem(null)\n }\n }\n\n return (\n <PayrollHistoryPresentation\n payrollHistory={payrollHistory}\n wireInRequests={wireInRequests}\n pagination={paginationProps}\n onViewSummary={handleViewSummary}\n onViewReceipt={handleViewReceipt}\n onCancelPayroll={handleCancelPayroll}\n cancelDialogItem={cancelDialogItem}\n onCancelDialogOpen={setCancelDialogItem}\n onCancelDialogClose={() => {\n setCancelDialogItem(null)\n }}\n isLoading={isCancelling}\n dateRangeFilter={dateRangeFilter}\n />\n )\n}\n"],"names":["PayrollHistory","props","jsx","BaseComponent","Root","DEFAULT_LOOKBACK_MONTHS","getDefaultStartDate","date","getDefaultEndDate","onEvent","companyId","dictionary","useComponentDictionary","useI18n","cancelDialogItem","setCancelDialogItem","useState","baseSubmitHandler","useBase","currentPage","itemsPerPage","getPaginationProps","resetPage","usePagination","dateRangeFilter","useDateRangeFilter","useCallback","dateFilterParams","payrollsData","usePayrollsListSuspense","ProcessingStatuses","QueryParamPayrollTypes","SortOrder","payrollHistory","paginationProps","wireInRequestsData","useWireInRequestsListSuspense","wireInRequests","cancelPayroll","isCancelling","usePayrollsCancelMutation","PayrollHistoryPresentation","payrollId","startDate","endDate","componentEvents","item","id","result"],"mappings":"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"}
1
+ {"version":3,"file":"PayrollHistory.js","sources":["../../../../src/components/Payroll/PayrollHistory/PayrollHistory.tsx"],"sourcesContent":["import { useState, useCallback } from 'react'\nimport { keepPreviousData } from '@tanstack/react-query'\nimport { usePayrollsList } from '@gusto/embedded-api/react-query/payrollsList'\nimport { usePayrollsCancelMutation } from '@gusto/embedded-api/react-query/payrollsCancel'\nimport { useWireInRequestsListSuspense } from '@gusto/embedded-api/react-query/wireInRequestsList'\nimport {\n ProcessingStatuses,\n QueryParamPayrollTypes,\n QueryParamSortOrder as SortOrder,\n} from '@gusto/embedded-api/models/operations/getv1companiescompanyidpayrolls'\nimport type { Payroll } from '@gusto/embedded-api/models/components/payrollshow'\nimport { PayrollHistoryPresentation } from './PayrollHistoryPresentation'\nimport type { BaseComponentInterface } from '@/components/Base/Base'\nimport { BaseComponent, BaseLayout } from '@/components/Base/Base'\nimport { useBase } from '@/components/Base/useBase'\nimport { componentEvents } from '@/shared/constants'\nimport { useComponentDictionary, useI18n } from '@/i18n'\nimport { usePagination } from '@/hooks/usePagination/usePagination'\nimport { useDateRangeFilter } from '@/hooks/useDateRangeFilter/useDateRangeFilter'\n\n/**\n * Props for the {@link PayrollHistory} component.\n *\n * @public\n */\nexport interface PayrollHistoryProps extends BaseComponentInterface<'Payroll.PayrollHistory'> {\n /** Identifier of the company whose processed payrolls should be listed. */\n companyId: string\n}\n\n/**\n * Displays historical payroll records with filtering and management capabilities.\n *\n * @remarks\n * Lists processed regular, off-cycle, and external payrolls for a company and supports filtering by\n * pay period, viewing payroll summaries and receipts, and cancelling processed payrolls when they\n * remain within the cancellation window. Each row shows the pay period, payroll type, pay date,\n * status, and total pay amount.\n *\n * @events\n * | Event | Description | Data |\n * | ----- | ----------- | ---- |\n * | `runPayroll/summary/viewed` | User views a payroll summary | `{ payrollId: string; startDate?: string; endDate?: string }` |\n * | `runPayroll/receipt/viewed` | User views a payroll receipt | `{ payrollId: string; startDate?: string; endDate?: string }` |\n * | `runPayroll/cancelled` | A payroll is cancelled | `{ payrollId: string; result: PayrollsCancelResponse }` |\n *\n * @param props - See {@link PayrollHistoryProps}.\n * @returns The rendered payroll history view.\n * @public\n */\nexport function PayrollHistory(props: PayrollHistoryProps) {\n return (\n <BaseComponent {...props}>\n <Root {...props}>{props.children}</Root>\n </BaseComponent>\n )\n}\n\nconst DEFAULT_LOOKBACK_MONTHS = 3\n\nconst getDefaultStartDate = (): Date => {\n const date = new Date()\n date.setMonth(date.getMonth() - DEFAULT_LOOKBACK_MONTHS)\n return date\n}\n\nconst getDefaultEndDate = (): Date => new Date()\n\nconst Root = ({ onEvent, companyId, dictionary, LoaderComponent }: PayrollHistoryProps) => {\n useComponentDictionary('Payroll.PayrollHistory', dictionary)\n useI18n('Payroll.PayrollHistory')\n\n const [cancelDialogItem, setCancelDialogItem] = useState<Payroll | null>(null)\n const { baseSubmitHandler } = useBase()\n const { currentPage, itemsPerPage, getPaginationProps, resetPage } = usePagination()\n\n const dateRangeFilter = useDateRangeFilter({\n initialStartDate: getDefaultStartDate(),\n initialEndDate: getDefaultEndDate(),\n onFilterChange: useCallback(() => {\n resetPage()\n }, [resetPage]),\n })\n const dateFilterParams = dateRangeFilter.getApiDateParams()\n\n const { data: payrollsData, isFetching } = usePayrollsList(\n {\n companyId,\n processingStatuses: [ProcessingStatuses.Processed],\n payrollTypes: [\n QueryParamPayrollTypes.Regular,\n QueryParamPayrollTypes.OffCycle,\n QueryParamPayrollTypes.External,\n ],\n includeOffCycle: true,\n include: ['totals', 'payroll_status_meta'],\n sortOrder: SortOrder.Desc,\n startDate: dateFilterParams.startDate,\n endDate: dateFilterParams.endDate,\n page: currentPage,\n per: itemsPerPage,\n },\n { placeholderData: keepPreviousData, throwOnError: true },\n )\n\n const payrollHistory = payrollsData?.payrollList || []\n\n const { data: wireInRequestsData } = useWireInRequestsListSuspense({\n companyUuid: companyId,\n })\n\n const wireInRequests = wireInRequestsData.wireInRequestList ?? []\n\n const { mutateAsync: cancelPayroll, isPending: isCancelling } = usePayrollsCancelMutation()\n\n const handleViewSummary = (payrollId: string, startDate?: string, endDate?: string) => {\n onEvent(componentEvents.RUN_PAYROLL_SUMMARY_VIEWED, { payrollId, startDate, endDate })\n }\n\n const handleViewReceipt = (payrollId: string, startDate?: string, endDate?: string) => {\n onEvent(componentEvents.RUN_PAYROLL_RECEIPT_VIEWED, { payrollId, startDate, endDate })\n }\n\n const handleCancelPayroll = async (item: Payroll) => {\n const payrollId = item.payrollUuid || item.uuid!\n try {\n await baseSubmitHandler(payrollId, async id => {\n const result = await cancelPayroll({\n request: {\n companyId,\n payrollId: id,\n },\n })\n\n onEvent(componentEvents.RUN_PAYROLL_CANCELLED, { payrollId: id, result })\n })\n } finally {\n setCancelDialogItem(null)\n }\n }\n\n if (!payrollsData) {\n return <BaseLayout isLoading LoaderComponent={LoaderComponent} />\n }\n\n const paginationProps = getPaginationProps(payrollsData.httpMeta.response.headers, isFetching)\n\n return (\n <PayrollHistoryPresentation\n payrollHistory={payrollHistory}\n wireInRequests={wireInRequests}\n pagination={paginationProps}\n onViewSummary={handleViewSummary}\n onViewReceipt={handleViewReceipt}\n onCancelPayroll={handleCancelPayroll}\n cancelDialogItem={cancelDialogItem}\n onCancelDialogOpen={setCancelDialogItem}\n onCancelDialogClose={() => {\n setCancelDialogItem(null)\n }}\n isLoading={isCancelling}\n dateRangeFilter={dateRangeFilter}\n />\n )\n}\n"],"names":["PayrollHistory","props","jsx","BaseComponent","Root","DEFAULT_LOOKBACK_MONTHS","getDefaultStartDate","date","getDefaultEndDate","onEvent","companyId","dictionary","LoaderComponent","useComponentDictionary","useI18n","cancelDialogItem","setCancelDialogItem","useState","baseSubmitHandler","useBase","currentPage","itemsPerPage","getPaginationProps","resetPage","usePagination","dateRangeFilter","useDateRangeFilter","useCallback","dateFilterParams","payrollsData","isFetching","usePayrollsList","ProcessingStatuses","QueryParamPayrollTypes","SortOrder","keepPreviousData","payrollHistory","wireInRequestsData","useWireInRequestsListSuspense","wireInRequests","cancelPayroll","isCancelling","usePayrollsCancelMutation","handleViewSummary","payrollId","startDate","endDate","componentEvents","handleViewReceipt","handleCancelPayroll","item","id","result","BaseLayout","paginationProps","PayrollHistoryPresentation"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs as d, jsx as r } from "react/jsx-runtime";
2
2
  import { useTranslation as M } from "react-i18next";
3
3
  import { getPayrollTypeLabel as E, calculateTotalPayroll as H, canCancelPayroll as U } from "../helpers.js";
4
4
  import { Flex as s } from "../../Common/Flex/Flex.js";
5
- import { EmptyData as p } from "../../Common/EmptyData/EmptyData.js";
5
+ import { EmptyData as y } from "../../Common/EmptyData/EmptyData.js";
6
6
  import { HamburgerMenu as j } from "../../Common/HamburgerMenu/HamburgerMenu.js";
7
7
  import { DateRangeFilter as N } from "../../Common/DateRangeFilter/DateRangeFilter.js";
8
8
  import { useComponentContext as O } from "../../../contexts/ComponentAdapter/useComponentContext.js";
@@ -15,9 +15,9 @@ import B from "../../../assets/icons/icon-receipt-outline.svg.js";
15
15
  import { PayrollStatusBadges as I } from "../PayrollStatusBadges/PayrollStatusBadges.js";
16
16
  import { DataView as W } from "../../Common/DataView/DataView.js";
17
17
  const se = ({
18
- payrollHistory: y,
19
- wireInRequests: u,
20
- pagination: D,
18
+ payrollHistory: u,
19
+ wireInRequests: D,
20
+ pagination: c,
21
21
  onViewSummary: f,
22
22
  onViewReceipt: h,
23
23
  onCancelPayroll: P,
@@ -27,26 +27,26 @@ const se = ({
27
27
  isLoading: b = !1,
28
28
  dateRangeFilter: o
29
29
  }) => {
30
- const { Heading: g, Text: c, Dialog: w } = O();
30
+ const { Heading: g, Text: m, Dialog: F } = O();
31
31
  Y("Payroll.PayrollHistory");
32
- const { t: e } = M("Payroll.PayrollHistory"), l = Z(), L = (t) => {
32
+ const { t: e } = M("Payroll.PayrollHistory"), l = Z(), w = (t) => {
33
33
  const n = t.payrollDeadline;
34
34
  if (!n) return "";
35
- const i = new Date(n), m = "America/New_York", A = new Intl.DateTimeFormat("en-US", {
35
+ const i = new Date(n), p = "America/New_York", A = new Intl.DateTimeFormat("en-US", {
36
36
  weekday: "short",
37
37
  month: "short",
38
38
  day: "numeric",
39
- timeZone: m
39
+ timeZone: p
40
40
  }), v = new Intl.DateTimeFormat("en-US", {
41
41
  hour: "numeric",
42
42
  minute: "2-digit",
43
43
  timeZoneName: "short",
44
- timeZone: m
44
+ timeZone: p
45
45
  }), T = A.format(i);
46
46
  return `${v.format(i)} on ${T}`;
47
- }, x = (t) => {
47
+ }, L = (t) => {
48
48
  C(t);
49
- }, F = () => {
49
+ }, x = () => {
50
50
  a && P(a);
51
51
  }, k = (t) => {
52
52
  const n = t.payrollUuid || t.uuid, i = [
@@ -69,7 +69,7 @@ const se = ({
69
69
  label: e("menu.cancelPayroll"),
70
70
  icon: /* @__PURE__ */ r($, { "aria-hidden": !0 }),
71
71
  onClick: () => {
72
- x(t);
72
+ L(t);
73
73
  },
74
74
  "data-destructive": "true"
75
75
  }), i;
@@ -101,15 +101,16 @@ const se = ({
101
101
  W,
102
102
  {
103
103
  label: e("dataView.label"),
104
- pagination: D,
104
+ pagination: c,
105
+ isFetching: c.isFetching,
105
106
  emptyState: () => o.isModified ? /* @__PURE__ */ r(
106
- p,
107
+ y,
107
108
  {
108
109
  title: e("emptyState.filtered.title"),
109
110
  description: e("emptyState.filtered.description")
110
111
  }
111
112
  ) : /* @__PURE__ */ r(
112
- p,
113
+ y,
113
114
  {
114
115
  title: e("emptyState.default.title"),
115
116
  description: e("emptyState.default.description")
@@ -134,7 +135,7 @@ const se = ({
134
135
  {
135
136
  title: e("columns.status"),
136
137
  render: (t) => {
137
- const n = u.find(
138
+ const n = D.find(
138
139
  (i) => i.paymentUuid === t.payrollUuid
139
140
  );
140
141
  return /* @__PURE__ */ r(I, { payroll: t, wireInRequest: n });
@@ -145,16 +146,16 @@ const se = ({
145
146
  render: (t) => V(H(t))
146
147
  }
147
148
  ],
148
- data: y,
149
+ data: u,
149
150
  itemMenu: (t) => /* @__PURE__ */ r(j, { items: k(t) })
150
151
  }
151
152
  ),
152
153
  /* @__PURE__ */ r(
153
- w,
154
+ F,
154
155
  {
155
156
  isOpen: !!a,
156
157
  onClose: S,
157
- onPrimaryActionClick: F,
158
+ onPrimaryActionClick: x,
158
159
  isDestructive: !0,
159
160
  isPrimaryActionLoading: b,
160
161
  primaryActionLabel: e("cancelDialog.primaryAction"),
@@ -166,9 +167,9 @@ const se = ({
166
167
  )
167
168
  }) : "",
168
169
  children: a && /* @__PURE__ */ d(s, { flexDirection: "column", gap: 16, children: [
169
- /* @__PURE__ */ r(c, { children: e("cancelDialog.body") }),
170
- a.payrollDeadline && /* @__PURE__ */ r(c, { children: e("cancelDialog.deadline", {
171
- deadline: L(a)
170
+ /* @__PURE__ */ r(m, { children: e("cancelDialog.body") }),
171
+ a.payrollDeadline && /* @__PURE__ */ r(m, { children: e("cancelDialog.deadline", {
172
+ deadline: w(a)
172
173
  }) })
173
174
  ] })
174
175
  }