@gusto/embedded-react-sdk 0.57.0 → 0.57.2
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.
- package/CHANGELOG.md +36 -0
- package/dist/components/Common/DataView/DataCards/DataCards.js +44 -42
- package/dist/components/Common/DataView/DataCards/DataCards.js.map +1 -1
- package/dist/components/Common/DataView/DataCards/DataCards.module.scss.js +17 -15
- package/dist/components/Common/DataView/DataCards/DataCards.module.scss.js.map +1 -1
- package/dist/components/Common/UI/Input/Input.js +35 -32
- package/dist/components/Common/UI/Input/Input.js.map +1 -1
- package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js +4 -5
- package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js.map +1 -1
- package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js +4 -5
- package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js.map +1 -1
- package/dist/components/Company/AssignSignatory/useAssignSignatory.js +6 -7
- package/dist/components/Company/AssignSignatory/useAssignSignatory.js.map +1 -1
- package/dist/components/Company/BankAccount/BankAccountForm/context.js +4 -5
- package/dist/components/Company/BankAccount/BankAccountForm/context.js.map +1 -1
- package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js +4 -5
- package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
- package/dist/components/Company/FederalTaxes/useFederalTaxes.js +9 -10
- package/dist/components/Company/FederalTaxes/useFederalTaxes.js.map +1 -1
- package/dist/components/Company/Industry/Context.js +7 -8
- package/dist/components/Company/Industry/Context.js.map +1 -1
- package/dist/components/Company/Locations/LocationForm/useLocationForm.js +4 -5
- package/dist/components/Company/Locations/LocationForm/useLocationForm.js.map +1 -1
- package/dist/components/Company/Locations/LocationsList/useLocationsList.js +4 -5
- package/dist/components/Company/Locations/LocationsList/useLocationsList.js.map +1 -1
- package/dist/components/Company/OnboardingOverview/context.js +4 -5
- package/dist/components/Company/OnboardingOverview/context.js.map +1 -1
- package/dist/components/Company/PaySchedule/PayScheduleForm.js +66 -62
- package/dist/components/Company/PaySchedule/PayScheduleForm.js.map +1 -1
- package/dist/components/Company/PaySchedule/PayScheduleForm.module.scss.js +2 -2
- package/dist/components/Company/PaySchedule/management/PayScheduleAssignment/PayScheduleAssignmentComponents.js +80 -68
- package/dist/components/Company/PaySchedule/management/PayScheduleAssignment/PayScheduleAssignmentComponents.js.map +1 -1
- package/dist/components/Company/PaySchedule/management/PayScheduleManagementComponents.js +49 -44
- package/dist/components/Company/PaySchedule/management/PayScheduleManagementComponents.js.map +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesForm/StateTaxesForm.js +96 -69
- package/dist/components/Company/StateTaxes/StateTaxesForm/StateTaxesForm.js.map +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesForm/context.js +4 -5
- package/dist/components/Company/StateTaxes/StateTaxesForm/context.js.map +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesList/context.js +4 -5
- package/dist/components/Company/StateTaxes/StateTaxesList/context.js.map +1 -1
- package/dist/components/Company/StateTaxes/TaxRateManagement/context.js +4 -5
- package/dist/components/Company/StateTaxes/TaxRateManagement/context.js.map +1 -1
- package/dist/components/Company/StateTaxes/shared/requirementSetError.js +27 -10
- package/dist/components/Company/StateTaxes/shared/requirementSetError.js.map +1 -1
- package/dist/components/Company/TaxPayments/TaxPaymentDetail/TaxPaymentDetail.js +77 -0
- package/dist/components/Company/TaxPayments/TaxPaymentDetail/TaxPaymentDetail.js.map +1 -0
- package/dist/components/Company/TaxPayments/TaxPaymentDetail/TaxPaymentDetailPresentation.js +94 -0
- package/dist/components/Company/TaxPayments/TaxPaymentDetail/TaxPaymentDetailPresentation.js.map +1 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsFlow/TaxPaymentsFlow.js +26 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsFlow/TaxPaymentsFlow.js.map +1 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsFlow/TaxPaymentsFlowComponents.js +25 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsFlow/TaxPaymentsFlowComponents.js.map +1 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsFlow/taxPaymentsStateMachine.js +33 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsFlow/taxPaymentsStateMachine.js.map +1 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsList.js +55 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsList.js.map +1 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsListPresentation.js +153 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsListPresentation.js.map +1 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsListPresentation.module.scss.js +14 -0
- package/dist/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsListPresentation.module.scss.js.map +1 -0
- package/dist/components/Company/TaxPayments/shared/payrollLookupWindow.js +16 -0
- package/dist/components/Company/TaxPayments/shared/payrollLookupWindow.js.map +1 -0
- package/dist/components/Company/TaxPayments/shared/taxPaymentStatus.js +34 -0
- package/dist/components/Company/TaxPayments/shared/taxPaymentStatus.js.map +1 -0
- package/dist/components/Company/TaxPayments/shared/useAllTaxPayments.js +30 -0
- package/dist/components/Company/TaxPayments/shared/useAllTaxPayments.js.map +1 -0
- package/dist/components/Company/exports/companyManagement.js +10 -4
- package/dist/components/Company/exports/companyManagement.js.map +1 -1
- package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js +4 -5
- package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
- package/dist/components/Employee/EmployeeListFlow/employeeListStateMachine.js +24 -23
- package/dist/components/Employee/EmployeeListFlow/employeeListStateMachine.js.map +1 -1
- package/dist/components/Employee/Terminations/TerminationFlow/terminationStateMachine.js +42 -34
- package/dist/components/Employee/Terminations/TerminationFlow/terminationStateMachine.js.map +1 -1
- package/dist/components/Payroll/GrossUpModal/GrossUpModal.js +3 -2
- package/dist/components/Payroll/GrossUpModal/GrossUpModal.js.map +1 -1
- package/dist/components/Payroll/OffCycleCreation/OffCycleCreation.js +56 -54
- package/dist/components/Payroll/OffCycleCreation/OffCycleCreation.js.map +1 -1
- package/dist/components/Payroll/PayrollFlow/PayrollFlow.js.map +1 -1
- package/dist/components/Payroll/PayrollFlow/payrollStateMachine.js +60 -52
- package/dist/components/Payroll/PayrollFlow/payrollStateMachine.js.map +1 -1
- package/dist/components/Payroll/PayrollHistory/PayrollHistoryPresentation.js +74 -88
- package/dist/components/Payroll/PayrollHistory/PayrollHistoryPresentation.js.map +1 -1
- package/dist/components/Payroll/PayrollLanding/PayrollLanding.js.map +1 -1
- package/dist/components/Payroll/PayrollLanding/payrollLandingStateMachine.js +23 -18
- package/dist/components/Payroll/PayrollLanding/payrollLandingStateMachine.js.map +1 -1
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.js +204 -179
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.js.map +1 -1
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.module.scss.js +8 -0
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.module.scss.js.map +1 -0
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js +44 -46
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js.map +1 -1
- package/dist/components/Payroll/PrintChecks/PrintChecksForm/PrintChecksForm.js +4 -4
- package/dist/components/Payroll/PrintChecks/PrintChecksForm/PrintChecksForm.js.map +1 -1
- package/dist/components/Payroll/PrintChecks/PrintChecksForm/useGenerationPoll.js +50 -41
- package/dist/components/Payroll/PrintChecks/PrintChecksForm/useGenerationPoll.js.map +1 -1
- package/dist/components/Payroll/TransitionCreation/TransitionCreation.js +63 -61
- package/dist/components/Payroll/TransitionCreation/TransitionCreation.js.map +1 -1
- package/dist/components/Payroll/TransitionPayroll/useResolveTransitionPayroll.js +14 -13
- package/dist/components/Payroll/TransitionPayroll/useResolveTransitionPayroll.js.map +1 -1
- package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.js +164 -154
- package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.js.map +1 -1
- package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.module.scss.js +9 -5
- package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.module.scss.js.map +1 -1
- package/dist/components/Payroll/helpers.js +103 -92
- package/dist/components/Payroll/helpers.js.map +1 -1
- package/dist/components/Payroll/usePreparedPayrollData.js +3 -4
- package/dist/components/Payroll/usePreparedPayrollData.js.map +1 -1
- package/dist/components/Payroll/useUnprocessedTransitionPayPeriods.js +2 -2
- package/dist/components/Payroll/useUnprocessedTransitionPayPeriods.js.map +1 -1
- package/dist/contexts/ApiProvider/ApiProvider.js +19 -18
- package/dist/contexts/ApiProvider/ApiProvider.js.map +1 -1
- package/dist/contexts/ApiProvider/payrollOffCycleReasonEnumHook.js +36 -0
- package/dist/contexts/ApiProvider/payrollOffCycleReasonEnumHook.js.map +1 -0
- package/dist/contexts/UnstableFeaturesProvider/useUnstableFeature.js.map +1 -1
- package/dist/helpers/dateFormatting.js +47 -40
- package/dist/helpers/dateFormatting.js.map +1 -1
- package/dist/i18n/I18n.js +2 -0
- package/dist/i18n/I18n.js.map +1 -1
- package/dist/i18n/en/Company.Management.PaySchedule.json.js +20 -18
- package/dist/i18n/en/Company.Management.PaySchedule.json.js.map +1 -1
- package/dist/i18n/en/Company.Management.PayScheduleAssignment.json.js +6 -4
- package/dist/i18n/en/Company.Management.PayScheduleAssignment.json.js.map +1 -1
- package/dist/i18n/en/Company.Management.TaxPaymentDetail.json.js +26 -0
- package/dist/i18n/en/Company.Management.TaxPaymentDetail.json.js.map +1 -0
- package/dist/i18n/en/Company.Management.TaxPaymentsList.json.js +48 -0
- package/dist/i18n/en/Company.Management.TaxPaymentsList.json.js.map +1 -0
- package/dist/i18n/en/Company.StateTaxes.json.js +1 -1
- package/dist/i18n/en/Payroll.PayrollHistory.json.js +5 -5
- package/dist/i18n/en/Payroll.PayrollOverview.json.js +42 -36
- package/dist/i18n/en/Payroll.PayrollOverview.json.js.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/shared/constants.js +62 -56
- package/dist/shared/constants.js.map +1 -1
- package/dist/src/components/Company/PaySchedule/PayScheduleForm.d.ts +6 -0
- package/dist/src/components/Company/StateTaxes/shared/requirementSetError.d.ts +18 -5
- package/dist/src/components/Company/TaxPayments/TaxPaymentDetail/TaxPaymentDetail.d.ts +31 -0
- package/dist/src/components/Company/TaxPayments/TaxPaymentDetail/TaxPaymentDetailPresentation.d.ts +19 -0
- package/dist/src/components/Company/TaxPayments/TaxPaymentsFlow/TaxPaymentsFlow.d.ts +42 -0
- package/dist/src/components/Company/TaxPayments/TaxPaymentsFlow/TaxPaymentsFlowComponents.d.ts +20 -0
- package/dist/src/components/Company/TaxPayments/TaxPaymentsFlow/taxPaymentsStateMachine.d.ts +10 -0
- package/dist/src/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsList.d.ts +28 -0
- package/dist/src/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsListPresentation.d.ts +33 -0
- package/dist/src/components/Company/TaxPayments/index.d.ts +6 -0
- package/dist/src/components/Company/TaxPayments/shared/payrollLookupWindow.d.ts +29 -0
- package/dist/src/components/Company/TaxPayments/shared/payrollLookupWindow.test.d.ts +1 -0
- package/dist/src/components/Company/TaxPayments/shared/taxPaymentStatus.d.ts +62 -0
- package/dist/src/components/Company/TaxPayments/shared/taxPaymentStatus.test.d.ts +1 -0
- package/dist/src/components/Company/TaxPayments/shared/useAllTaxPayments.d.ts +30 -0
- package/dist/src/components/Company/exports/companyManagement.d.ts +2 -0
- package/dist/src/components/Payroll/PayrollConfiguration/__fixtures__/payrollConfigurationMocks.d.ts +6 -1
- package/dist/src/components/Payroll/PayrollFlow/PayrollFlow.d.ts +1 -0
- package/dist/src/components/Payroll/PayrollLanding/PayrollLanding.d.ts +1 -0
- package/dist/src/components/Payroll/PayrollOverview/PayrollOverview.d.ts +9 -3
- package/dist/src/components/Payroll/helpers.d.ts +34 -18
- package/dist/src/contexts/ApiProvider/payrollOffCycleReasonEnumHook.d.ts +14 -0
- package/dist/src/contexts/ApiProvider/payrollOffCycleReasonEnumHook.test.d.ts +1 -0
- package/dist/src/contexts/UnstableFeaturesProvider/useUnstableFeature.d.ts +2 -0
- package/dist/src/helpers/dateFormatting.d.ts +13 -0
- package/dist/src/i18n/types.d.ts +168 -4
- package/dist/src/models/external.d.ts +2 -0
- package/dist/src/shared/constants.d.ts +18 -0
- package/dist/style.css +1 -1
- package/docs/guides/endpoint-inventory.json +33 -0
- package/package.json +30 -27
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsxs as a, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { useTranslation as j } from "react-i18next";
|
|
3
|
+
import { getJurisdictionLabel as k, TAX_PAYMENT_STATUS_BADGES as B } from "../shared/taxPaymentStatus.js";
|
|
4
|
+
import { Flex as n } from "../../../Common/Flex/Flex.js";
|
|
5
|
+
import { EmptyData as I } from "../../../Common/EmptyData/EmptyData.js";
|
|
6
|
+
import { useComponentContext as N } from "../../../../contexts/ComponentAdapter/useComponentContext.js";
|
|
7
|
+
import { useI18n as L } from "../../../../i18n/I18n.js";
|
|
8
|
+
import V from "../../../../hooks/useNumberFormatter.js";
|
|
9
|
+
import { useDateFormatter as E } from "../../../../hooks/useDateFormatter.js";
|
|
10
|
+
import { useDataView as F } from "../../../Common/DataView/useDataView.js";
|
|
11
|
+
import { DataView as M } from "../../../Common/DataView/DataView.js";
|
|
12
|
+
function R({
|
|
13
|
+
className: f,
|
|
14
|
+
payment: i,
|
|
15
|
+
status: o,
|
|
16
|
+
payPeriodsByPayrollId: g,
|
|
17
|
+
onBack: h
|
|
18
|
+
}) {
|
|
19
|
+
const { Alert: D, Badge: x, Box: d, BoxHeader: m, Button: S, DescriptionList: y, Heading: A, Text: u } = N();
|
|
20
|
+
L("Company.Management.TaxPaymentDetail");
|
|
21
|
+
const { t } = j("Company.Management.TaxPaymentDetail"), l = V("currency"), { formatLongWithYear: s, formatPayPeriodRange: c } = E(), { key: v, values: T } = k(i), p = t(v, T), P = (r, b) => r && b ? c(r, b) : t("notAvailable"), C = (r) => r?.startDate && r.endDate ? c(r.startDate, r.endDate, { useShortMonth: !0 }) : t("notAvailable"), w = F({
|
|
22
|
+
data: i.lineItems ?? [],
|
|
23
|
+
columns: [
|
|
24
|
+
{
|
|
25
|
+
key: "uniqueTaxId",
|
|
26
|
+
title: t("liabilities.taxIdColumn")
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
key: "payrollUuid",
|
|
30
|
+
title: t("liabilities.payrollColumn"),
|
|
31
|
+
render: ({ payrollUuid: r }) => C(g[r])
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
key: "amount",
|
|
35
|
+
title: t("liabilities.amountColumn"),
|
|
36
|
+
justify: "end",
|
|
37
|
+
render: ({ amount: r }) => l(Number(r))
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
emptyState: () => /* @__PURE__ */ e(I, { title: t("liabilities.emptyState") })
|
|
41
|
+
});
|
|
42
|
+
return /* @__PURE__ */ a(n, { className: f, flexDirection: "column", gap: 24, children: [
|
|
43
|
+
/* @__PURE__ */ e("div", { children: /* @__PURE__ */ e(S, { variant: "secondary", onClick: h, children: t("backCta") }) }),
|
|
44
|
+
/* @__PURE__ */ a(n, { flexDirection: "column", gap: 4, children: [
|
|
45
|
+
/* @__PURE__ */ a(n, { alignItems: "center", flexWrap: "wrap", gap: 12, children: [
|
|
46
|
+
/* @__PURE__ */ e(A, { as: "h2", children: i.agencyName ?? t("unknownAgency") }),
|
|
47
|
+
/* @__PURE__ */ e(x, { status: B[o], children: t(`status.${o}`) })
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ e(u, { variant: "supporting", children: p })
|
|
50
|
+
] }),
|
|
51
|
+
o === "overdue" && /* @__PURE__ */ e(D, { status: "warning", label: t("overdueAlert.label"), disableScrollIntoView: !0, children: /* @__PURE__ */ e(u, { size: "sm", children: t("overdueAlert.description", {
|
|
52
|
+
dueDate: s(i.dueDate?.toString())
|
|
53
|
+
}) }) }),
|
|
54
|
+
/* @__PURE__ */ a(n, { flexDirection: "column", gap: 32, children: [
|
|
55
|
+
/* @__PURE__ */ e(d, { header: /* @__PURE__ */ e(m, { title: t("details.title") }), children: /* @__PURE__ */ e(
|
|
56
|
+
y,
|
|
57
|
+
{
|
|
58
|
+
layout: "horizontal",
|
|
59
|
+
items: [
|
|
60
|
+
{ term: t("details.jurisdiction"), description: p },
|
|
61
|
+
{
|
|
62
|
+
term: t("details.period"),
|
|
63
|
+
description: P(
|
|
64
|
+
i.periodStart?.toString(),
|
|
65
|
+
i.periodEnd.toString()
|
|
66
|
+
)
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
term: t("details.dueDate"),
|
|
70
|
+
description: i.dueDate ? s(i.dueDate.toString()) : t("notAvailable")
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
term: t("details.paymentSentOn"),
|
|
74
|
+
description: i.paymentSentOn ? s(i.paymentSentOn.toString()) : t("notAvailable")
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
term: t("details.amount"),
|
|
78
|
+
description: l(Number(i.amount))
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
term: t("details.amountPaid"),
|
|
82
|
+
description: l(Number(i.amountPaid))
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
) }),
|
|
87
|
+
/* @__PURE__ */ e(d, { header: /* @__PURE__ */ e(m, { title: t("liabilities.title") }), withPadding: !1, children: /* @__PURE__ */ e(M, { label: t("liabilities.tableLabel"), isWithinBox: !0, ...w }) })
|
|
88
|
+
] })
|
|
89
|
+
] });
|
|
90
|
+
}
|
|
91
|
+
export {
|
|
92
|
+
R as TaxPaymentDetailPresentation
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=TaxPaymentDetailPresentation.js.map
|
package/dist/components/Company/TaxPayments/TaxPaymentDetail/TaxPaymentDetailPresentation.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaxPaymentDetailPresentation.js","sources":["../../../../../src/components/Company/TaxPayments/TaxPaymentDetail/TaxPaymentDetailPresentation.tsx"],"sourcesContent":["import { useTranslation } from 'react-i18next'\nimport type { TaxPayment } from '@gusto/embedded-api/models/components/taxpayment'\nimport type { TaxPaymentLineItem } from '@gusto/embedded-api/models/components/taxpaymentlineitem'\nimport {\n TAX_PAYMENT_STATUS_BADGES,\n getJurisdictionLabel,\n type TaxPaymentStatus,\n} from '../shared/taxPaymentStatus'\nimport { DataView, EmptyData, Flex, useDataView } from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\nimport useNumberFormatter from '@/hooks/useNumberFormatter'\nimport { useDateFormatter } from '@/hooks/useDateFormatter'\n\n/** @internal */\nexport interface PayPeriodRange {\n startDate?: string | null\n endDate?: string | null\n}\n\n/** @internal */\nexport interface TaxPaymentDetailPresentationProps {\n /** CSS class name applied to the root element. */\n className?: string\n payment: TaxPayment\n status: TaxPaymentStatus\n /** Pay period of each payroll referenced by the payment's line items, keyed by payroll UUID. */\n payPeriodsByPayrollId: Record<string, PayPeriodRange | undefined>\n onBack: () => void\n}\n\n/** @internal */\nexport function TaxPaymentDetailPresentation({\n className,\n payment,\n status,\n payPeriodsByPayrollId,\n onBack,\n}: TaxPaymentDetailPresentationProps) {\n const { Alert, Badge, Box, BoxHeader, Button, DescriptionList, Heading, Text } =\n useComponentContext()\n useI18n('Company.Management.TaxPaymentDetail')\n const { t } = useTranslation('Company.Management.TaxPaymentDetail')\n const currencyFormatter = useNumberFormatter('currency')\n const { formatLongWithYear, formatPayPeriodRange } = useDateFormatter()\n\n const { key: jurisdictionKey, values: jurisdictionValues } = getJurisdictionLabel(payment)\n const jurisdictionLabel = t(jurisdictionKey, jurisdictionValues)\n\n const formatTaxPeriod = (start?: string | null, end?: string | null) =>\n start && end ? formatPayPeriodRange(start, end) : t('notAvailable')\n\n const formatPayPeriod = (payPeriod?: PayPeriodRange) =>\n payPeriod?.startDate && payPeriod.endDate\n ? formatPayPeriodRange(payPeriod.startDate, payPeriod.endDate, { useShortMonth: true })\n : t('notAvailable')\n\n const liabilitiesDataView = useDataView<TaxPaymentLineItem>({\n data: payment.lineItems ?? [],\n columns: [\n {\n key: 'uniqueTaxId',\n title: t('liabilities.taxIdColumn'),\n },\n {\n key: 'payrollUuid',\n title: t('liabilities.payrollColumn'),\n render: ({ payrollUuid }) => formatPayPeriod(payPeriodsByPayrollId[payrollUuid]),\n },\n {\n key: 'amount',\n title: t('liabilities.amountColumn'),\n justify: 'end',\n render: ({ amount }) => currencyFormatter(Number(amount)),\n },\n ],\n emptyState: () => <EmptyData title={t('liabilities.emptyState')} />,\n })\n\n return (\n <Flex className={className} flexDirection=\"column\" gap={24}>\n <div>\n <Button variant=\"secondary\" onClick={onBack}>\n {t('backCta')}\n </Button>\n </div>\n\n <Flex flexDirection=\"column\" gap={4}>\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={12}>\n <Heading as=\"h2\">{payment.agencyName ?? t('unknownAgency')}</Heading>\n <Badge status={TAX_PAYMENT_STATUS_BADGES[status]}>{t(`status.${status}`)}</Badge>\n </Flex>\n <Text variant=\"supporting\">{jurisdictionLabel}</Text>\n </Flex>\n\n {status === 'overdue' && (\n <Alert status=\"warning\" label={t('overdueAlert.label')} disableScrollIntoView>\n <Text size=\"sm\">\n {t('overdueAlert.description', {\n dueDate: formatLongWithYear(payment.dueDate?.toString()),\n })}\n </Text>\n </Alert>\n )}\n\n <Flex flexDirection=\"column\" gap={32}>\n <Box header={<BoxHeader title={t('details.title')} />}>\n <DescriptionList\n layout=\"horizontal\"\n items={[\n { term: t('details.jurisdiction'), description: jurisdictionLabel },\n {\n term: t('details.period'),\n description: formatTaxPeriod(\n payment.periodStart?.toString(),\n payment.periodEnd.toString(),\n ),\n },\n {\n term: t('details.dueDate'),\n description: payment.dueDate\n ? formatLongWithYear(payment.dueDate.toString())\n : t('notAvailable'),\n },\n {\n term: t('details.paymentSentOn'),\n description: payment.paymentSentOn\n ? formatLongWithYear(payment.paymentSentOn.toString())\n : t('notAvailable'),\n },\n {\n term: t('details.amount'),\n description: currencyFormatter(Number(payment.amount)),\n },\n {\n term: t('details.amountPaid'),\n description: currencyFormatter(Number(payment.amountPaid)),\n },\n ]}\n />\n </Box>\n\n <Box header={<BoxHeader title={t('liabilities.title')} />} withPadding={false}>\n <DataView label={t('liabilities.tableLabel')} isWithinBox {...liabilitiesDataView} />\n </Box>\n </Flex>\n </Flex>\n )\n}\n"],"names":["TaxPaymentDetailPresentation","className","payment","status","payPeriodsByPayrollId","onBack","Alert","Badge","Box","BoxHeader","Button","DescriptionList","Heading","Text","useComponentContext","useI18n","useTranslation","currencyFormatter","useNumberFormatter","formatLongWithYear","formatPayPeriodRange","useDateFormatter","jurisdictionKey","jurisdictionValues","getJurisdictionLabel","jurisdictionLabel","formatTaxPeriod","start","end","formatPayPeriod","payPeriod","liabilitiesDataView","useDataView","payrollUuid","amount","jsx","EmptyData","Flex","jsxs","TAX_PAYMENT_STATUS_BADGES","DataView"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
2
|
+
import { createMachine as m } from "robot3";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { taxPaymentsMachine as i } from "./taxPaymentsStateMachine.js";
|
|
5
|
+
import { TaxPaymentsListContextual as s } from "./TaxPaymentsFlowComponents.js";
|
|
6
|
+
import { Flow as f } from "../../../Flow/Flow.js";
|
|
7
|
+
import { useUnstableFeature as x } from "../../../../contexts/UnstableFeaturesProvider/useUnstableFeature.js";
|
|
8
|
+
const F = ({ companyId: t, onEvent: e }) => (x("taxPayments", { throwIfDisabled: !0 }), /* @__PURE__ */ o(c, { companyId: t, onEvent: e }, t));
|
|
9
|
+
function c({ companyId: t, onEvent: e }) {
|
|
10
|
+
const [r] = n(
|
|
11
|
+
() => m(
|
|
12
|
+
"list",
|
|
13
|
+
i,
|
|
14
|
+
(a) => ({
|
|
15
|
+
...a,
|
|
16
|
+
component: s,
|
|
17
|
+
companyId: t
|
|
18
|
+
})
|
|
19
|
+
)
|
|
20
|
+
);
|
|
21
|
+
return /* @__PURE__ */ o(f, { machine: r, onEvent: e });
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
F as TaxPaymentsFlow
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=TaxPaymentsFlow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaxPaymentsFlow.js","sources":["../../../../../src/components/Company/TaxPayments/TaxPaymentsFlow/TaxPaymentsFlow.tsx"],"sourcesContent":["import { createMachine } from 'robot3'\nimport { useState } from 'react'\nimport { taxPaymentsMachine } from './taxPaymentsStateMachine'\nimport {\n TaxPaymentsListContextual,\n type TaxPaymentsFlowContextInterface,\n type TaxPaymentsFlowProps,\n} from './TaxPaymentsFlowComponents'\nimport { Flow } from '@/components/Flow/Flow'\nimport { useUnstableFeature } from '@/contexts/UnstableFeaturesProvider/useUnstableFeature'\n\n/**\n * Hub for reviewing a company's tax payments and the payroll tax liabilities behind each one.\n *\n * @remarks\n * Requires the `taxPayments` flag in {@link UnstableFeatures}. Starts on the tax payments list,\n * where the user can search, filter by jurisdiction or status, and jump to overdue payments.\n * Selecting a payment opens its detail view; the back button returns to the list.\n *\n * Events emitted by the blocks bubble up through the single `onEvent` handler.\n *\n * @events\n * | Event | Description | Data |\n * | ----- | ----------- | ---- |\n * | `company/taxPayments/view` | Fired when the user selects a tax payment to view | `{ taxPaymentId: string }` |\n * | `company/taxPayments/back` | Fired when the user returns from a tax payment to the list | — |\n *\n * @components\n * - {@link TaxPaymentsList}\n * - {@link TaxPaymentDetail}\n *\n * @param props - See {@link TaxPaymentsFlowProps}.\n * @returns The tax payments hub.\n * @alpha\n *\n * @example\n * ```tsx title=\"App.tsx\"\n * import { CompanyManagement, GustoProvider } from '@gusto/embedded-react-sdk'\n *\n * function MyApp() {\n * return (\n * <GustoProvider config={{ baseUrl: '/api/gusto/' }} unstableFeatures={{ taxPayments: true }}>\n * <CompanyManagement.TaxPaymentsFlow\n * companyId=\"a007e1ab-3595-43c2-ab4b-af7a5af2e365\"\n * onEvent={() => {}}\n * />\n * </GustoProvider>\n * )\n * }\n * ```\n */\nexport const TaxPaymentsFlow = ({ companyId, onEvent }: TaxPaymentsFlowProps) => {\n useUnstableFeature('taxPayments', { throwIfDisabled: true })\n\n // Remount and reset all state if companyId ever changes.\n return <TaxPaymentsFlowMachine key={companyId} companyId={companyId} onEvent={onEvent} />\n}\n\nfunction TaxPaymentsFlowMachine({ companyId, onEvent }: TaxPaymentsFlowProps) {\n // Built once via a lazy useState initializer. `useMemo` is a performance hint React is free to\n // discard, and a new machine reference makes `useMachine` tear down the interpreter and restart\n // from the initial state, which would silently drop the user back to the list.\n const [taxPaymentsFlow] = useState(() =>\n createMachine(\n 'list',\n taxPaymentsMachine,\n (initialContext: TaxPaymentsFlowContextInterface) => ({\n ...initialContext,\n component: TaxPaymentsListContextual,\n companyId,\n }),\n ),\n )\n\n return <Flow machine={taxPaymentsFlow} onEvent={onEvent} />\n}\n"],"names":["TaxPaymentsFlow","companyId","onEvent","useUnstableFeature","jsx","TaxPaymentsFlowMachine","taxPaymentsFlow","useState","createMachine","taxPaymentsMachine","initialContext","TaxPaymentsListContextual","Flow"],"mappings":";;;;;;;AAmDO,MAAMA,IAAkB,CAAC,EAAE,WAAAC,GAAW,SAAAC,SAC3CC,EAAmB,eAAe,EAAE,iBAAiB,GAAA,CAAM,GAGpD,gBAAAC,EAACC,GAAA,EAAuC,WAAAJ,GAAsB,SAAAC,EAAA,GAAjCD,CAAmD;AAGzF,SAASI,EAAuB,EAAE,WAAAJ,GAAW,SAAAC,KAAiC;AAI5E,QAAM,CAACI,CAAe,IAAIC;AAAA,IAAS,MACjCC;AAAA,MACE;AAAA,MACAC;AAAA,MACA,CAACC,OAAqD;AAAA,QACpD,GAAGA;AAAA,QACH,WAAWC;AAAA,QACX,WAAAV;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAGF,SAAO,gBAAAG,EAACQ,GAAA,EAAK,SAASN,GAAiB,SAAAJ,EAAA,CAAkB;AAC3D;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { TaxPaymentsList as r } from "../TaxPaymentsList/TaxPaymentsList.js";
|
|
3
|
+
import { TaxPaymentDetail as i } from "../TaxPaymentDetail/TaxPaymentDetail.js";
|
|
4
|
+
import { useFlow as a } from "../../../Flow/useFlow.js";
|
|
5
|
+
import { ensureRequired as o } from "../../../../helpers/ensureRequired.js";
|
|
6
|
+
function s() {
|
|
7
|
+
const { companyId: t, onEvent: n } = a();
|
|
8
|
+
return /* @__PURE__ */ e(r, { companyId: o(t), onEvent: n });
|
|
9
|
+
}
|
|
10
|
+
function d() {
|
|
11
|
+
const { companyId: t, currentTaxPaymentId: n, onEvent: m } = a();
|
|
12
|
+
return /* @__PURE__ */ e(
|
|
13
|
+
i,
|
|
14
|
+
{
|
|
15
|
+
companyId: o(t),
|
|
16
|
+
taxPaymentId: o(n),
|
|
17
|
+
onEvent: m
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
d as TaxPaymentDetailContextual,
|
|
23
|
+
s as TaxPaymentsListContextual
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=TaxPaymentsFlowComponents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaxPaymentsFlowComponents.js","sources":["../../../../../src/components/Company/TaxPayments/TaxPaymentsFlow/TaxPaymentsFlowComponents.tsx"],"sourcesContent":["import { TaxPaymentsList } from '../TaxPaymentsList/TaxPaymentsList'\nimport { TaxPaymentDetail } from '../TaxPaymentDetail/TaxPaymentDetail'\nimport { useFlow, type FlowContextInterface } from '@/components/Flow/useFlow'\nimport type { BaseComponentInterface } from '@/components/Base'\nimport { ensureRequired } from '@/helpers/ensureRequired'\n\n/**\n * Props for {@link TaxPaymentsFlow}.\n *\n * @alpha\n */\nexport interface TaxPaymentsFlowProps extends BaseComponentInterface<never> {\n /** Identifier of the company whose tax payments are shown. */\n companyId: string\n}\n\n/** @internal */\nexport interface TaxPaymentsFlowContextInterface extends FlowContextInterface {\n companyId: string\n currentTaxPaymentId?: string\n}\n\n/** @internal */\nexport function TaxPaymentsListContextual() {\n const { companyId, onEvent } = useFlow<TaxPaymentsFlowContextInterface>()\n return <TaxPaymentsList companyId={ensureRequired(companyId)} onEvent={onEvent} />\n}\n\n/** @internal */\nexport function TaxPaymentDetailContextual() {\n const { companyId, currentTaxPaymentId, onEvent } = useFlow<TaxPaymentsFlowContextInterface>()\n return (\n <TaxPaymentDetail\n companyId={ensureRequired(companyId)}\n taxPaymentId={ensureRequired(currentTaxPaymentId)}\n onEvent={onEvent}\n />\n )\n}\n"],"names":["TaxPaymentsListContextual","companyId","onEvent","useFlow","TaxPaymentsList","ensureRequired","TaxPaymentDetailContextual","currentTaxPaymentId","jsx","TaxPaymentDetail"],"mappings":";;;;;AAuBO,SAASA,IAA4B;AAC1C,QAAM,EAAE,WAAAC,GAAW,SAAAC,EAAA,IAAYC,EAAA;AAC/B,2BAAQC,GAAA,EAAgB,WAAWC,EAAeJ,CAAS,GAAG,SAAAC,GAAkB;AAClF;AAGO,SAASI,IAA6B;AAC3C,QAAM,EAAE,WAAAL,GAAW,qBAAAM,GAAqB,SAAAL,EAAA,IAAYC,EAAA;AACpD,SACE,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWJ,EAAeJ,CAAS;AAAA,MACnC,cAAcI,EAAeE,CAAmB;AAAA,MAChD,SAAAL;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { state as a, transition as e, reduce as n } from "robot3";
|
|
2
|
+
import { TaxPaymentsListContextual as i, TaxPaymentDetailContextual as r } from "./TaxPaymentsFlowComponents.js";
|
|
3
|
+
import { componentEvents as o } from "../../../../shared/constants.js";
|
|
4
|
+
const d = {
|
|
5
|
+
list: a(
|
|
6
|
+
e(
|
|
7
|
+
o.TAX_PAYMENT_VIEW,
|
|
8
|
+
"detail",
|
|
9
|
+
n(
|
|
10
|
+
(t, m) => ({
|
|
11
|
+
...t,
|
|
12
|
+
component: r,
|
|
13
|
+
currentTaxPaymentId: m.payload.taxPaymentId
|
|
14
|
+
})
|
|
15
|
+
)
|
|
16
|
+
)
|
|
17
|
+
),
|
|
18
|
+
detail: a(
|
|
19
|
+
e(
|
|
20
|
+
o.TAX_PAYMENT_BACK,
|
|
21
|
+
"list",
|
|
22
|
+
n((t) => ({
|
|
23
|
+
...t,
|
|
24
|
+
component: i,
|
|
25
|
+
currentTaxPaymentId: void 0
|
|
26
|
+
}))
|
|
27
|
+
)
|
|
28
|
+
)
|
|
29
|
+
};
|
|
30
|
+
export {
|
|
31
|
+
d as taxPaymentsMachine
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=taxPaymentsStateMachine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxPaymentsStateMachine.js","sources":["../../../../../src/components/Company/TaxPayments/TaxPaymentsFlow/taxPaymentsStateMachine.ts"],"sourcesContent":["import { reduce, state, transition } from 'robot3'\nimport {\n TaxPaymentDetailContextual,\n TaxPaymentsListContextual,\n type TaxPaymentsFlowContextInterface,\n} from './TaxPaymentsFlowComponents'\nimport { componentEvents } from '@/shared/constants'\nimport type { MachineEventType, MachineTransition } from '@/types/Helpers'\n\ntype EventPayloads = {\n [componentEvents.TAX_PAYMENT_VIEW]: { taxPaymentId: string }\n [componentEvents.TAX_PAYMENT_BACK]: undefined\n}\n\n/**\n * Hub machine for {@link TaxPaymentsFlow}: the list is the hub and each tax payment detail is a\n * spoke. There is no final state, since the user can move between them freely.\n *\n * @internal\n */\nexport const taxPaymentsMachine = {\n list: state<MachineTransition>(\n transition(\n componentEvents.TAX_PAYMENT_VIEW,\n 'detail',\n reduce(\n (\n ctx: TaxPaymentsFlowContextInterface,\n ev: MachineEventType<EventPayloads, typeof componentEvents.TAX_PAYMENT_VIEW>,\n ): TaxPaymentsFlowContextInterface => ({\n ...ctx,\n component: TaxPaymentDetailContextual,\n currentTaxPaymentId: ev.payload.taxPaymentId,\n }),\n ),\n ),\n ),\n detail: state<MachineTransition>(\n transition(\n componentEvents.TAX_PAYMENT_BACK,\n 'list',\n reduce((ctx: TaxPaymentsFlowContextInterface): TaxPaymentsFlowContextInterface => ({\n ...ctx,\n component: TaxPaymentsListContextual,\n currentTaxPaymentId: undefined,\n })),\n ),\n ),\n}\n"],"names":["taxPaymentsMachine","state","transition","componentEvents","reduce","ctx","ev","TaxPaymentDetailContextual","TaxPaymentsListContextual"],"mappings":";;;AAoBO,MAAMA,IAAqB;AAAA,EAChC,MAAMC;AAAA,IACJC;AAAA,MACEC,EAAgB;AAAA,MAChB;AAAA,MACAC;AAAA,QACE,CACEC,GACAC,OACqC;AAAA,UACrC,GAAGD;AAAA,UACH,WAAWE;AAAA,UACX,qBAAqBD,EAAG,QAAQ;AAAA,QAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEF,QAAQL;AAAA,IACNC;AAAA,MACEC,EAAgB;AAAA,MAChB;AAAA,MACAC,EAAO,CAACC,OAA2E;AAAA,QACjF,GAAGA;AAAA,QACH,WAAWG;AAAA,QACX,qBAAqB;AAAA,MAAA,EACrB;AAAA,IAAA;AAAA,EACJ;AAEJ;"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { useState as c } from "react";
|
|
3
|
+
import { useAllTaxPayments as S } from "../shared/useAllTaxPayments.js";
|
|
4
|
+
import { ALL_FILTER_VALUE as n, deriveTaxPaymentStatus as F } from "../shared/taxPaymentStatus.js";
|
|
5
|
+
import { TaxPaymentsListPresentation as A } from "./TaxPaymentsListPresentation.js";
|
|
6
|
+
import { BaseComponent as j } from "../../../Base/Base.js";
|
|
7
|
+
import "../../../Base/useBase.js";
|
|
8
|
+
import { componentEvents as D } from "../../../../shared/constants.js";
|
|
9
|
+
import { useComponentDictionary as E, useI18n as I } from "../../../../i18n/I18n.js";
|
|
10
|
+
import { useClientPagination as v } from "../../../../hooks/useClientPagination/useClientPagination.js";
|
|
11
|
+
import { useUnstableFeature as M } from "../../../../contexts/UnstableFeaturesProvider/useUnstableFeature.js";
|
|
12
|
+
import { formatDateToStringDate as R } from "../../../../helpers/dateFormatting.js";
|
|
13
|
+
function H(e) {
|
|
14
|
+
return M("taxPayments", { throwIfDisabled: !0 }), /* @__PURE__ */ i(j, { ...e, children: /* @__PURE__ */ i(_, { ...e }) });
|
|
15
|
+
}
|
|
16
|
+
function V({ payment: e }, o) {
|
|
17
|
+
return (e.agencyName ?? "").toLowerCase().includes(o.toLowerCase());
|
|
18
|
+
}
|
|
19
|
+
const _ = ({ companyId: e, className: o, dictionary: u, onEvent: l }) => {
|
|
20
|
+
E("Company.Management.TaxPaymentsList", u), I("Company.Management.TaxPaymentsList");
|
|
21
|
+
const { taxPayments: a, isTruncated: f } = S(e), [r, p] = c(n), [s, d] = c(n), y = R(/* @__PURE__ */ new Date()) ?? "", m = a.map((t) => ({
|
|
22
|
+
payment: t,
|
|
23
|
+
status: F(t, y)
|
|
24
|
+
})), P = [...new Set(a.flatMap((t) => t.jurisdiction ?? []))], h = m.filter(({ status: t }) => t === "overdue").length, g = m.filter(
|
|
25
|
+
({ payment: t, status: w }) => (r === n || t.jurisdiction === r) && (s === n || w === s)
|
|
26
|
+
), { data: C, pagination: T, searchValue: x, actions: L } = v(g, {
|
|
27
|
+
searchPredicate: V,
|
|
28
|
+
defaultItemsPerPage: 10
|
|
29
|
+
});
|
|
30
|
+
return /* @__PURE__ */ i(
|
|
31
|
+
A,
|
|
32
|
+
{
|
|
33
|
+
className: o,
|
|
34
|
+
rows: C,
|
|
35
|
+
overdueCount: h,
|
|
36
|
+
jurisdictions: P,
|
|
37
|
+
hasPayments: a.length > 0,
|
|
38
|
+
isTruncated: f,
|
|
39
|
+
searchValue: x,
|
|
40
|
+
onSearchChange: L.onSearchChange,
|
|
41
|
+
jurisdictionFilter: r,
|
|
42
|
+
onJurisdictionFilterChange: p,
|
|
43
|
+
statusFilter: s,
|
|
44
|
+
onStatusFilterChange: d,
|
|
45
|
+
pagination: T,
|
|
46
|
+
onViewPayment: (t) => {
|
|
47
|
+
l(D.TAX_PAYMENT_VIEW, { taxPaymentId: t });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
};
|
|
52
|
+
export {
|
|
53
|
+
H as TaxPaymentsList
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=TaxPaymentsList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaxPaymentsList.js","sources":["../../../../../src/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsList.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { useAllTaxPayments } from '../shared/useAllTaxPayments'\nimport { ALL_FILTER_VALUE, deriveTaxPaymentStatus } from '../shared/taxPaymentStatus'\nimport { TaxPaymentsListPresentation, type TaxPaymentRow } from './TaxPaymentsListPresentation'\nimport { BaseComponent, type BaseComponentInterface } from '@/components/Base'\nimport { componentEvents } from '@/shared/constants'\nimport { useComponentDictionary, useI18n } from '@/i18n'\nimport { useClientPagination } from '@/hooks/useClientPagination/useClientPagination'\nimport { useUnstableFeature } from '@/contexts/UnstableFeaturesProvider/useUnstableFeature'\nimport { formatDateToStringDate } from '@/helpers/dateFormatting'\n\n/**\n * Props for {@link TaxPaymentsList}.\n *\n * @alpha\n */\nexport interface TaxPaymentsListProps extends BaseComponentInterface<'Company.Management.TaxPaymentsList'> {\n /** Identifier of the company whose tax payments are listed. */\n companyId: string\n}\n\n/**\n * Lists a company's tax payments with search, jurisdiction and status filters, and an alert for\n * overdue payments.\n *\n * @remarks\n * Requires the `taxPayments` flag in {@link UnstableFeatures}. Status is derived from each\n * payment's amounts and dates: `Paid`, `Scheduled`, `Overdue`, or `Refund / Credit`.\n *\n * @events\n * | Event | Description | Data |\n * | ----- | ----------- | ---- |\n * | `company/taxPayments/view` | Fired when the user selects a tax payment to view | `{ taxPaymentId: string }` |\n *\n * @param props - See {@link TaxPaymentsListProps}.\n * @returns The rendered tax payments list.\n * @alpha\n */\nexport function TaxPaymentsList(props: TaxPaymentsListProps) {\n useUnstableFeature('taxPayments', { throwIfDisabled: true })\n\n return (\n <BaseComponent {...props}>\n <Root {...props} />\n </BaseComponent>\n )\n}\n\nfunction matchesAgencySearch({ payment }: TaxPaymentRow, query: string): boolean {\n return (payment.agencyName ?? '').toLowerCase().includes(query.toLowerCase())\n}\n\nconst Root = ({ companyId, className, dictionary, onEvent }: TaxPaymentsListProps) => {\n useComponentDictionary('Company.Management.TaxPaymentsList', dictionary)\n useI18n('Company.Management.TaxPaymentsList')\n\n const { taxPayments: payments, isTruncated } = useAllTaxPayments(companyId)\n const [jurisdictionFilter, setJurisdictionFilter] = useState<string>(ALL_FILTER_VALUE)\n const [statusFilter, setStatusFilter] = useState<string>(ALL_FILTER_VALUE)\n\n // Already ordered newest due date first by the server, so no client-side sort is needed. None of\n // these derivations are memoized: `payments` is a fresh array every render, so a memo keyed on it\n // could never hit, and these are cheap passes over a short list.\n const today = formatDateToStringDate(new Date()) ?? ''\n const allRows: TaxPaymentRow[] = payments.map(payment => ({\n payment,\n status: deriveTaxPaymentStatus(payment, today),\n }))\n\n const jurisdictions = [...new Set(payments.flatMap(payment => payment.jurisdiction ?? []))]\n\n const overdueCount = allRows.filter(({ status }) => status === 'overdue').length\n\n const filteredRows = allRows.filter(\n ({ payment, status }) =>\n (jurisdictionFilter === ALL_FILTER_VALUE || payment.jurisdiction === jurisdictionFilter) &&\n (statusFilter === ALL_FILTER_VALUE || status === statusFilter),\n )\n\n const { data, pagination, searchValue, actions } = useClientPagination(filteredRows, {\n searchPredicate: matchesAgencySearch,\n defaultItemsPerPage: 10,\n })\n\n return (\n <TaxPaymentsListPresentation\n className={className}\n rows={data}\n overdueCount={overdueCount}\n jurisdictions={jurisdictions}\n hasPayments={payments.length > 0}\n isTruncated={isTruncated}\n searchValue={searchValue}\n onSearchChange={actions.onSearchChange}\n jurisdictionFilter={jurisdictionFilter}\n onJurisdictionFilterChange={setJurisdictionFilter}\n statusFilter={statusFilter}\n onStatusFilterChange={setStatusFilter}\n pagination={pagination}\n onViewPayment={taxPaymentId => {\n onEvent(componentEvents.TAX_PAYMENT_VIEW, { taxPaymentId })\n }}\n />\n )\n}\n"],"names":["TaxPaymentsList","props","useUnstableFeature","jsx","BaseComponent","Root","matchesAgencySearch","payment","query","companyId","className","dictionary","onEvent","useComponentDictionary","useI18n","payments","isTruncated","useAllTaxPayments","jurisdictionFilter","setJurisdictionFilter","useState","ALL_FILTER_VALUE","statusFilter","setStatusFilter","today","formatDateToStringDate","allRows","deriveTaxPaymentStatus","jurisdictions","overdueCount","status","filteredRows","data","pagination","searchValue","actions","useClientPagination","TaxPaymentsListPresentation","taxPaymentId","componentEvents"],"mappings":";;;;;;;;;;;;AAsCO,SAASA,EAAgBC,GAA6B;AAC3D,SAAAC,EAAmB,eAAe,EAAE,iBAAiB,GAAA,CAAM,GAGzD,gBAAAC,EAACC,KAAe,GAAGH,GACjB,4BAACI,GAAA,EAAM,GAAGJ,GAAO,EAAA,CACnB;AAEJ;AAEA,SAASK,EAAoB,EAAE,SAAAC,EAAA,GAA0BC,GAAwB;AAC/E,UAAQD,EAAQ,cAAc,IAAI,YAAA,EAAc,SAASC,EAAM,aAAa;AAC9E;AAEA,MAAMH,IAAO,CAAC,EAAE,WAAAI,GAAW,WAAAC,GAAW,YAAAC,GAAY,SAAAC,QAAoC;AACpF,EAAAC,EAAuB,sCAAsCF,CAAU,GACvEG,EAAQ,oCAAoC;AAE5C,QAAM,EAAE,aAAaC,GAAU,aAAAC,EAAA,IAAgBC,EAAkBR,CAAS,GACpE,CAACS,GAAoBC,CAAqB,IAAIC,EAAiBC,CAAgB,GAC/E,CAACC,GAAcC,CAAe,IAAIH,EAAiBC,CAAgB,GAKnEG,IAAQC,EAAuB,oBAAI,KAAA,CAAM,KAAK,IAC9CC,IAA2BX,EAAS,IAAI,CAAAR,OAAY;AAAA,IACxD,SAAAA;AAAA,IACA,QAAQoB,EAAuBpB,GAASiB,CAAK;AAAA,EAAA,EAC7C,GAEII,IAAgB,CAAC,GAAG,IAAI,IAAIb,EAAS,QAAQ,CAAAR,MAAWA,EAAQ,gBAAgB,CAAA,CAAE,CAAC,CAAC,GAEpFsB,IAAeH,EAAQ,OAAO,CAAC,EAAE,QAAAI,QAAaA,MAAW,SAAS,EAAE,QAEpEC,IAAeL,EAAQ;AAAA,IAC3B,CAAC,EAAE,SAAAnB,GAAS,QAAAuB,SACTZ,MAAuBG,KAAoBd,EAAQ,iBAAiBW,OACpEI,MAAiBD,KAAoBS,MAAWR;AAAA,EAAA,GAG/C,EAAE,MAAAU,GAAM,YAAAC,GAAY,aAAAC,GAAa,SAAAC,EAAA,IAAYC,EAAoBL,GAAc;AAAA,IACnF,iBAAiBzB;AAAA,IACjB,qBAAqB;AAAA,EAAA,CACtB;AAED,SACE,gBAAAH;AAAA,IAACkC;AAAA,IAAA;AAAA,MACC,WAAA3B;AAAA,MACA,MAAMsB;AAAA,MACN,cAAAH;AAAA,MACA,eAAAD;AAAA,MACA,aAAab,EAAS,SAAS;AAAA,MAC/B,aAAAC;AAAA,MACA,aAAAkB;AAAA,MACA,gBAAgBC,EAAQ;AAAA,MACxB,oBAAAjB;AAAA,MACA,4BAA4BC;AAAA,MAC5B,cAAAG;AAAA,MACA,sBAAsBC;AAAA,MACtB,YAAAU;AAAA,MACA,eAAe,CAAAK,MAAgB;AAC7B,QAAA1B,EAAQ2B,EAAgB,kBAAkB,EAAE,cAAAD,EAAA,CAAc;AAAA,MAC5D;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { jsx as a, jsxs as r } from "react/jsx-runtime";
|
|
2
|
+
import { useTranslation as R } from "react-i18next";
|
|
3
|
+
import { ALL_FILTER_VALUE as c, FEDERAL_JURISDICTION as J, TAX_PAYMENT_STATUSES as H, TAX_PAYMENT_STATUS_BADGES as O, getJurisdictionLabel as U } from "../shared/taxPaymentStatus.js";
|
|
4
|
+
import l from "./TaxPaymentsListPresentation.module.scss.js";
|
|
5
|
+
import { Flex as B } from "../../../Common/Flex/Flex.js";
|
|
6
|
+
import { EmptyData as m } from "../../../Common/EmptyData/EmptyData.js";
|
|
7
|
+
import { useComponentContext as Y } from "../../../../contexts/ComponentAdapter/useComponentContext.js";
|
|
8
|
+
import { useI18n as X } from "../../../../i18n/I18n.js";
|
|
9
|
+
import $ from "../../../../hooks/useNumberFormatter.js";
|
|
10
|
+
import { useDateFormatter as G } from "../../../../hooks/useDateFormatter.js";
|
|
11
|
+
import W from "../../../../assets/icons/search-lg.svg.js";
|
|
12
|
+
import { useDataView as q } from "../../../Common/DataView/useDataView.js";
|
|
13
|
+
import { DataView as z } from "../../../Common/DataView/DataView.js";
|
|
14
|
+
function ce({
|
|
15
|
+
className: d,
|
|
16
|
+
rows: p,
|
|
17
|
+
overdueCount: i,
|
|
18
|
+
jurisdictions: b,
|
|
19
|
+
hasPayments: o,
|
|
20
|
+
isTruncated: h,
|
|
21
|
+
searchValue: y,
|
|
22
|
+
onSearchChange: S,
|
|
23
|
+
jurisdictionFilter: f,
|
|
24
|
+
onJurisdictionFilterChange: g,
|
|
25
|
+
statusFilter: L,
|
|
26
|
+
onStatusFilterChange: v,
|
|
27
|
+
pagination: A,
|
|
28
|
+
onViewPayment: T
|
|
29
|
+
}) {
|
|
30
|
+
const { Alert: n, Badge: x, Button: D, Heading: N, Select: s, Text: w, TextInput: E } = Y();
|
|
31
|
+
X("Company.Management.TaxPaymentsList");
|
|
32
|
+
const { t: e } = R("Company.Management.TaxPaymentsList"), P = $("currency"), { formatShortWithYear: k, formatPayPeriodRange: C } = G(), u = (t) => t.agencyName ?? e("unknownAgency"), V = (t) => {
|
|
33
|
+
const { key: j, values: M } = U(t);
|
|
34
|
+
return e(j, M);
|
|
35
|
+
}, F = [
|
|
36
|
+
{ value: c, label: e("allJurisdictions") },
|
|
37
|
+
...b.map((t) => ({
|
|
38
|
+
value: t,
|
|
39
|
+
label: t === J ? e("federalJurisdictionOption") : t
|
|
40
|
+
}))
|
|
41
|
+
], I = [
|
|
42
|
+
{ value: c, label: e("allStatuses") },
|
|
43
|
+
...H.map((t) => ({ value: t, label: e(`status.${t}`) }))
|
|
44
|
+
], _ = q({
|
|
45
|
+
data: p,
|
|
46
|
+
columns: [
|
|
47
|
+
{
|
|
48
|
+
key: "agency",
|
|
49
|
+
title: e("columns.agency"),
|
|
50
|
+
render: ({ payment: t }) => /* @__PURE__ */ a(w, { as: "span", weight: "semibold", children: u(t) })
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
key: "jurisdiction",
|
|
54
|
+
title: e("columns.jurisdiction"),
|
|
55
|
+
render: ({ payment: t }) => V(t)
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: "period",
|
|
59
|
+
title: e("columns.period"),
|
|
60
|
+
render: ({ payment: t }) => t.periodStart ? C(t.periodStart.toString(), t.periodEnd.toString(), {
|
|
61
|
+
useShortMonth: !0
|
|
62
|
+
}) : e("notAvailable")
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
key: "dueDate",
|
|
66
|
+
title: e("columns.dueDate"),
|
|
67
|
+
render: ({ payment: t }) => t.dueDate ? k(t.dueDate.toString()) : e("notAvailable")
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
key: "amount",
|
|
71
|
+
title: e("columns.amount"),
|
|
72
|
+
justify: "end",
|
|
73
|
+
render: ({ payment: t }) => P(Number(t.amount))
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
key: "status",
|
|
77
|
+
title: e("columns.status"),
|
|
78
|
+
render: ({ status: t }) => /* @__PURE__ */ a(x, { status: O[t], children: e(`status.${t}`) })
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
itemMenu: ({ payment: t }) => /* @__PURE__ */ a(
|
|
82
|
+
D,
|
|
83
|
+
{
|
|
84
|
+
variant: "secondary",
|
|
85
|
+
"aria-label": e("viewPaymentLabel", { agency: u(t) }),
|
|
86
|
+
onClick: () => {
|
|
87
|
+
T(t.uuid);
|
|
88
|
+
},
|
|
89
|
+
children: e("viewCta")
|
|
90
|
+
}
|
|
91
|
+
),
|
|
92
|
+
emptyState: () => o ? /* @__PURE__ */ a(m, { title: e("noResults.title"), description: e("noResults.description") }) : /* @__PURE__ */ a(m, { title: e("emptyState.title"), description: e("emptyState.description") }),
|
|
93
|
+
pagination: A
|
|
94
|
+
});
|
|
95
|
+
return /* @__PURE__ */ r(B, { className: d, flexDirection: "column", gap: 24, children: [
|
|
96
|
+
/* @__PURE__ */ a(N, { as: "h2", children: e("title") }),
|
|
97
|
+
i > 0 && /* @__PURE__ */ a(
|
|
98
|
+
n,
|
|
99
|
+
{
|
|
100
|
+
status: "warning",
|
|
101
|
+
label: e("overdueAlert.label", { count: i }),
|
|
102
|
+
disableScrollIntoView: !0
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
h && /* @__PURE__ */ a(n, { status: "info", label: e("truncatedAlert.label"), disableScrollIntoView: !0 }),
|
|
106
|
+
o && /* @__PURE__ */ r("div", { className: l.toolbar, children: [
|
|
107
|
+
/* @__PURE__ */ a("div", { className: l.search, children: /* @__PURE__ */ a(
|
|
108
|
+
E,
|
|
109
|
+
{
|
|
110
|
+
name: "tax-payments-search",
|
|
111
|
+
type: "search",
|
|
112
|
+
label: e("searchLabel"),
|
|
113
|
+
shouldVisuallyHideLabel: !0,
|
|
114
|
+
placeholder: e("searchPlaceholder"),
|
|
115
|
+
value: y,
|
|
116
|
+
onChange: S,
|
|
117
|
+
adornmentStart: /* @__PURE__ */ a(W, { "aria-hidden": !0 })
|
|
118
|
+
}
|
|
119
|
+
) }),
|
|
120
|
+
/* @__PURE__ */ r("div", { className: l.filters, children: [
|
|
121
|
+
/* @__PURE__ */ a(
|
|
122
|
+
s,
|
|
123
|
+
{
|
|
124
|
+
className: l.filter,
|
|
125
|
+
label: e("jurisdictionFilterLabel"),
|
|
126
|
+
shouldVisuallyHideLabel: !0,
|
|
127
|
+
placeholder: e("allJurisdictions"),
|
|
128
|
+
options: F,
|
|
129
|
+
value: f,
|
|
130
|
+
onChange: g
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
/* @__PURE__ */ a(
|
|
134
|
+
s,
|
|
135
|
+
{
|
|
136
|
+
className: l.filter,
|
|
137
|
+
label: e("statusFilterLabel"),
|
|
138
|
+
shouldVisuallyHideLabel: !0,
|
|
139
|
+
placeholder: e("allStatuses"),
|
|
140
|
+
options: I,
|
|
141
|
+
value: L,
|
|
142
|
+
onChange: v
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
] })
|
|
146
|
+
] }),
|
|
147
|
+
/* @__PURE__ */ a(z, { label: e("tableLabel"), ..._ })
|
|
148
|
+
] });
|
|
149
|
+
}
|
|
150
|
+
export {
|
|
151
|
+
ce as TaxPaymentsListPresentation
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=TaxPaymentsListPresentation.js.map
|
package/dist/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsListPresentation.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaxPaymentsListPresentation.js","sources":["../../../../../src/components/Company/TaxPayments/TaxPaymentsList/TaxPaymentsListPresentation.tsx"],"sourcesContent":["import { useTranslation } from 'react-i18next'\nimport type { TaxPayment } from '@gusto/embedded-api/models/components/taxpayment'\nimport {\n ALL_FILTER_VALUE,\n FEDERAL_JURISDICTION,\n TAX_PAYMENT_STATUS_BADGES,\n TAX_PAYMENT_STATUSES,\n getJurisdictionLabel,\n type TaxPaymentStatus,\n} from '../shared/taxPaymentStatus'\nimport styles from './TaxPaymentsListPresentation.module.scss'\nimport { DataView, EmptyData, Flex, useDataView } from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\nimport useNumberFormatter from '@/hooks/useNumberFormatter'\nimport { useDateFormatter } from '@/hooks/useDateFormatter'\nimport type { PaginationControlProps } from '@/components/Common/PaginationControl/PaginationControlTypes'\nimport SearchIcon from '@/assets/icons/search-lg.svg?react'\n\n/** @internal */\nexport interface TaxPaymentRow {\n payment: TaxPayment\n status: TaxPaymentStatus\n}\n\n/** @internal */\nexport interface TaxPaymentsListPresentationProps {\n /** CSS class name applied to the root element. */\n className?: string\n /** Rows for the current page, already filtered and searched. */\n rows: TaxPaymentRow[]\n /** Number of overdue payments, regardless of the active filters. */\n overdueCount: number\n /** Distinct jurisdictions across all payments, used to build the jurisdiction filter. */\n jurisdictions: string[]\n /** Whether the company has any tax payments at all, before filtering. */\n hasPayments: boolean\n /** Whether the fetched list hit the page cap and omits older payments. */\n isTruncated: boolean\n searchValue: string\n onSearchChange: (value: string) => void\n jurisdictionFilter: string\n onJurisdictionFilterChange: (value: string) => void\n statusFilter: string\n onStatusFilterChange: (value: string) => void\n pagination: PaginationControlProps\n onViewPayment: (taxPaymentId: string) => void\n}\n\n/** @internal */\nexport function TaxPaymentsListPresentation({\n className,\n rows,\n overdueCount,\n jurisdictions,\n hasPayments,\n isTruncated,\n searchValue,\n onSearchChange,\n jurisdictionFilter,\n onJurisdictionFilterChange,\n statusFilter,\n onStatusFilterChange,\n pagination,\n onViewPayment,\n}: TaxPaymentsListPresentationProps) {\n const { Alert, Badge, Button, Heading, Select, Text, TextInput } = useComponentContext()\n useI18n('Company.Management.TaxPaymentsList')\n const { t } = useTranslation('Company.Management.TaxPaymentsList')\n const currencyFormatter = useNumberFormatter('currency')\n const { formatShortWithYear, formatPayPeriodRange } = useDateFormatter()\n\n const agencyLabel = (payment: TaxPayment) => payment.agencyName ?? t('unknownAgency')\n\n const jurisdictionLabel = (payment: TaxPayment) => {\n const { key, values } = getJurisdictionLabel(payment)\n return t(key, values)\n }\n\n const jurisdictionOptions = [\n { value: ALL_FILTER_VALUE, label: t('allJurisdictions') },\n ...jurisdictions.map(jurisdiction => ({\n value: jurisdiction,\n label: jurisdiction === FEDERAL_JURISDICTION ? t('federalJurisdictionOption') : jurisdiction,\n })),\n ]\n\n const statusOptions = [\n { value: ALL_FILTER_VALUE, label: t('allStatuses') },\n ...TAX_PAYMENT_STATUSES.map(status => ({ value: status, label: t(`status.${status}`) })),\n ]\n\n const dataViewProps = useDataView<TaxPaymentRow>({\n data: rows,\n columns: [\n {\n key: 'agency',\n title: t('columns.agency'),\n render: ({ payment }) => (\n <Text as=\"span\" weight=\"semibold\">\n {agencyLabel(payment)}\n </Text>\n ),\n },\n {\n key: 'jurisdiction',\n title: t('columns.jurisdiction'),\n render: ({ payment }) => jurisdictionLabel(payment),\n },\n {\n key: 'period',\n title: t('columns.period'),\n render: ({ payment }) =>\n payment.periodStart\n ? formatPayPeriodRange(payment.periodStart.toString(), payment.periodEnd.toString(), {\n useShortMonth: true,\n })\n : t('notAvailable'),\n },\n {\n key: 'dueDate',\n title: t('columns.dueDate'),\n render: ({ payment }) =>\n payment.dueDate ? formatShortWithYear(payment.dueDate.toString()) : t('notAvailable'),\n },\n {\n key: 'amount',\n title: t('columns.amount'),\n justify: 'end',\n render: ({ payment }) => currencyFormatter(Number(payment.amount)),\n },\n {\n key: 'status',\n title: t('columns.status'),\n render: ({ status }) => (\n <Badge status={TAX_PAYMENT_STATUS_BADGES[status]}>{t(`status.${status}`)}</Badge>\n ),\n },\n ],\n itemMenu: ({ payment }) => (\n <Button\n variant=\"secondary\"\n aria-label={t('viewPaymentLabel', { agency: agencyLabel(payment) })}\n onClick={() => {\n onViewPayment(payment.uuid)\n }}\n >\n {t('viewCta')}\n </Button>\n ),\n emptyState: () =>\n hasPayments ? (\n <EmptyData title={t('noResults.title')} description={t('noResults.description')} />\n ) : (\n <EmptyData title={t('emptyState.title')} description={t('emptyState.description')} />\n ),\n pagination,\n })\n\n return (\n <Flex className={className} flexDirection=\"column\" gap={24}>\n <Heading as=\"h2\">{t('title')}</Heading>\n\n {overdueCount > 0 && (\n <Alert\n status=\"warning\"\n label={t('overdueAlert.label', { count: overdueCount })}\n disableScrollIntoView\n />\n )}\n\n {isTruncated && (\n <Alert status=\"info\" label={t('truncatedAlert.label')} disableScrollIntoView />\n )}\n\n {hasPayments && (\n <div className={styles.toolbar}>\n <div className={styles.search}>\n <TextInput\n name=\"tax-payments-search\"\n type=\"search\"\n label={t('searchLabel')}\n shouldVisuallyHideLabel\n placeholder={t('searchPlaceholder')}\n value={searchValue}\n onChange={onSearchChange}\n adornmentStart={<SearchIcon aria-hidden />}\n />\n </div>\n <div className={styles.filters}>\n <Select\n className={styles.filter}\n label={t('jurisdictionFilterLabel')}\n shouldVisuallyHideLabel\n placeholder={t('allJurisdictions')}\n options={jurisdictionOptions}\n value={jurisdictionFilter}\n onChange={onJurisdictionFilterChange}\n />\n <Select\n className={styles.filter}\n label={t('statusFilterLabel')}\n shouldVisuallyHideLabel\n placeholder={t('allStatuses')}\n options={statusOptions}\n value={statusFilter}\n onChange={onStatusFilterChange}\n />\n </div>\n </div>\n )}\n\n <DataView label={t('tableLabel')} {...dataViewProps} />\n </Flex>\n )\n}\n"],"names":["TaxPaymentsListPresentation","className","rows","overdueCount","jurisdictions","hasPayments","isTruncated","searchValue","onSearchChange","jurisdictionFilter","onJurisdictionFilterChange","statusFilter","onStatusFilterChange","pagination","onViewPayment","Alert","Badge","Button","Heading","Select","Text","TextInput","useComponentContext","useI18n","t","useTranslation","currencyFormatter","useNumberFormatter","formatShortWithYear","formatPayPeriodRange","useDateFormatter","agencyLabel","payment","jurisdictionLabel","key","values","getJurisdictionLabel","jurisdictionOptions","ALL_FILTER_VALUE","jurisdiction","FEDERAL_JURISDICTION","statusOptions","TAX_PAYMENT_STATUSES","status","dataViewProps","useDataView","jsx","TAX_PAYMENT_STATUS_BADGES","EmptyData","Flex","jsxs","styles","SearchIcon","DataView"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const t = "_toolbar_1qf56_1", s = "_search_1qf56_17", r = "_filters_1qf56_22", e = "_filter_1qf56_22", o = {
|
|
2
|
+
toolbar: t,
|
|
3
|
+
search: s,
|
|
4
|
+
filters: r,
|
|
5
|
+
filter: e
|
|
6
|
+
};
|
|
7
|
+
export {
|
|
8
|
+
o as default,
|
|
9
|
+
e as filter,
|
|
10
|
+
r as filters,
|
|
11
|
+
s as search,
|
|
12
|
+
t as toolbar
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=TaxPaymentsListPresentation.module.scss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaxPaymentsListPresentation.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { normalizeToDate as a, addDays as o, formatDateToStringDate as p } from "../../../../helpers/dateFormatting.js";
|
|
2
|
+
const u = 45, E = 90;
|
|
3
|
+
function w(A, e, S) {
|
|
4
|
+
const d = a(A ?? e), r = a(e), s = a(S);
|
|
5
|
+
if (!d || !r || !s) return;
|
|
6
|
+
const c = o(s, E), l = o(r, u), t = l < c ? l : c, D = o(d, -u), i = o(t, -365);
|
|
7
|
+
let n = D > i ? D : i;
|
|
8
|
+
n > t && (n = t);
|
|
9
|
+
const f = p(n), m = p(t);
|
|
10
|
+
if (!(!f || !m))
|
|
11
|
+
return { startDate: f, endDate: m };
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
w as buildPayrollLookupWindow
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=payrollLookupWindow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payrollLookupWindow.js","sources":["../../../../../src/components/Company/TaxPayments/shared/payrollLookupWindow.ts"],"sourcesContent":["import { addDays, formatDateToStringDate, normalizeToDate } from '@/helpers/dateFormatting'\n\n/**\n * Slack added to each end of the tax period. A liability's pay period can fall outside the deposit\n * period it was remitted in, so the window is padded rather than matched exactly.\n */\nconst PERIOD_PADDING_DAYS = 45\n\n/**\n * `GET /v1/companies/{id}/payrolls` rejects a range wider than 367 days. Clamp below that rather\n * than at it, so a boundary rounding difference can't produce a 422.\n */\nconst MAX_SPAN_DAYS = 365\n\n/**\n * The same endpoint rejects an `end_date` more than 93 days past today. Clamp below that too.\n */\nconst MAX_FUTURE_DAYS = 90\n\n/**\n * A `start_date`/`end_date` pair for the payrolls list endpoint.\n *\n * @internal\n */\nexport interface PayrollLookupWindow {\n /** Inclusive lower bound, as `YYYY-MM-DD`. */\n startDate: string\n /** Inclusive upper bound, as `YYYY-MM-DD`. */\n endDate: string\n}\n\n/**\n * Builds the payroll-lookup window used to resolve a tax payment's liability pay periods.\n *\n * @remarks\n * Pads the tax period on both ends, then clamps to the payrolls endpoint's two documented limits —\n * a maximum 367-day span and an `end_date` no more than 93 days ahead of today. Annual tax periods\n * (FUTA, for example) exceed both once padded, so clamping is what keeps the request valid.\n *\n * Clamping can leave liabilities outside the window; the caller resolves those individually, so a\n * narrowed window costs extra requests rather than correctness.\n *\n * @param periodStart - Tax period start as `YYYY-MM-DD`. Falls back to `periodEnd` when absent.\n * @param periodEnd - Tax period end as `YYYY-MM-DD`.\n * @param today - Today's date as `YYYY-MM-DD`, used for the future-end-date clamp.\n * @returns The window, or `undefined` when the dates cannot be parsed.\n * @internal\n */\nexport function buildPayrollLookupWindow(\n periodStart: string | undefined,\n periodEnd: string | undefined,\n today: string,\n): PayrollLookupWindow | undefined {\n const start = normalizeToDate(periodStart ?? periodEnd)\n const end = normalizeToDate(periodEnd)\n const todayDate = normalizeToDate(today)\n if (!start || !end || !todayDate) return undefined\n\n const latestAllowedEnd = addDays(todayDate, MAX_FUTURE_DAYS)\n const paddedEnd = addDays(end, PERIOD_PADDING_DAYS)\n const clampedEnd = paddedEnd < latestAllowedEnd ? paddedEnd : latestAllowedEnd\n\n const paddedStart = addDays(start, -PERIOD_PADDING_DAYS)\n const earliestAllowedStart = addDays(clampedEnd, -MAX_SPAN_DAYS)\n let clampedStart = paddedStart > earliestAllowedStart ? paddedStart : earliestAllowedStart\n // A period far enough in the future can push the start past the clamped end; collapse rather than\n // emit an inverted range the API would reject.\n if (clampedStart > clampedEnd) clampedStart = clampedEnd\n\n const startDate = formatDateToStringDate(clampedStart)\n const endDate = formatDateToStringDate(clampedEnd)\n if (!startDate || !endDate) return undefined\n\n return { startDate, endDate }\n}\n"],"names":["PERIOD_PADDING_DAYS","MAX_FUTURE_DAYS","buildPayrollLookupWindow","periodStart","periodEnd","today","start","normalizeToDate","end","todayDate","latestAllowedEnd","addDays","paddedEnd","clampedEnd","paddedStart","earliestAllowedStart","clampedStart","startDate","formatDateToStringDate","endDate"],"mappings":";AAMA,MAAMA,IAAsB,IAWtBC,IAAkB;AA+BjB,SAASC,EACdC,GACAC,GACAC,GACiC;AACjC,QAAMC,IAAQC,EAAgBJ,KAAeC,CAAS,GAChDI,IAAMD,EAAgBH,CAAS,GAC/BK,IAAYF,EAAgBF,CAAK;AACvC,MAAI,CAACC,KAAS,CAACE,KAAO,CAACC,EAAW;AAElC,QAAMC,IAAmBC,EAAQF,GAAWR,CAAe,GACrDW,IAAYD,EAAQH,GAAKR,CAAmB,GAC5Ca,IAAaD,IAAYF,IAAmBE,IAAYF,GAExDI,IAAcH,EAAQL,GAAO,CAACN,CAAmB,GACjDe,IAAuBJ,EAAQE,GAAY,IAAc;AAC/D,MAAIG,IAAeF,IAAcC,IAAuBD,IAAcC;AAGtE,EAAIC,IAAeH,MAAYG,IAAeH;AAE9C,QAAMI,IAAYC,EAAuBF,CAAY,GAC/CG,IAAUD,EAAuBL,CAAU;AACjD,MAAI,GAACI,KAAa,CAACE;AAEnB,WAAO,EAAE,WAAAF,GAAW,SAAAE,EAAA;AACtB;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const d = [
|
|
2
|
+
"paid",
|
|
3
|
+
"scheduled",
|
|
4
|
+
"overdue",
|
|
5
|
+
"refund"
|
|
6
|
+
], o = "all", a = "US", s = {
|
|
7
|
+
paid: "success",
|
|
8
|
+
scheduled: "info",
|
|
9
|
+
overdue: "error",
|
|
10
|
+
refund: "info"
|
|
11
|
+
};
|
|
12
|
+
function u(e) {
|
|
13
|
+
return e.jurisdiction === "US";
|
|
14
|
+
}
|
|
15
|
+
function c(e) {
|
|
16
|
+
return u(e) ? { key: "federal", values: { jurisdiction: "US" } } : { key: "state", values: { jurisdiction: e.jurisdiction ?? "" } };
|
|
17
|
+
}
|
|
18
|
+
function f(e, i) {
|
|
19
|
+
const t = parseFloat(e.amount), r = parseFloat(e.amountPaid);
|
|
20
|
+
if (e.paymentSentOn || t === 0 || t > 0 && r >= t || t < 0 && r <= t) return "paid";
|
|
21
|
+
if (t < 0) return "refund";
|
|
22
|
+
const n = e.dueDate?.toString();
|
|
23
|
+
return n && n < i ? "overdue" : "scheduled";
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
o as ALL_FILTER_VALUE,
|
|
27
|
+
a as FEDERAL_JURISDICTION,
|
|
28
|
+
d as TAX_PAYMENT_STATUSES,
|
|
29
|
+
s as TAX_PAYMENT_STATUS_BADGES,
|
|
30
|
+
f as deriveTaxPaymentStatus,
|
|
31
|
+
c as getJurisdictionLabel,
|
|
32
|
+
u as isFederalTaxPayment
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=taxPaymentStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxPaymentStatus.js","sources":["../../../../../src/components/Company/TaxPayments/shared/taxPaymentStatus.ts"],"sourcesContent":["import type { TaxPayment } from '@gusto/embedded-api/models/components/taxpayment'\n\n/** @internal */\nexport type TaxPaymentStatus = 'paid' | 'scheduled' | 'overdue' | 'refund'\n\n/** @internal */\nexport const TAX_PAYMENT_STATUSES: readonly TaxPaymentStatus[] = [\n 'paid',\n 'scheduled',\n 'overdue',\n 'refund',\n]\n\n/**\n * Value of the \"show everything\" entry in the jurisdiction and status filters.\n *\n * @remarks\n * A non-empty sentinel rather than `''` so the filter has a real selected key — an empty key reads\n * as \"no selection\" to the underlying select, which renders the placeholder instead of the option\n * and cannot be distinguished from being cleared.\n *\n * @internal\n */\nexport const ALL_FILTER_VALUE = 'all'\n\n/** @internal */\nexport const FEDERAL_JURISDICTION = 'US'\n\n/** @internal */\nexport const TAX_PAYMENT_STATUS_BADGES: Record<\n TaxPaymentStatus,\n 'info' | 'success' | 'warning' | 'error'\n> = {\n paid: 'success',\n scheduled: 'info',\n overdue: 'error',\n refund: 'info',\n}\n\n/** @internal */\nexport function isFederalTaxPayment(payment: Pick<TaxPayment, 'jurisdiction'>): boolean {\n return payment.jurisdiction === FEDERAL_JURISDICTION\n}\n\n/**\n * Resolves the translation key and interpolation values for a tax payment's jurisdiction label.\n *\n * @remarks\n * Returns a key rather than a string because `Company.Management.TaxPaymentsList` and\n * `Company.Management.TaxPaymentDetail` each own their own i18n namespace and must translate from it. This\n * keeps the federal/state branching in one place while leaving the lookup to the caller.\n *\n * @param payment - The tax payment to label.\n * @returns The translation key and its interpolation values.\n * @internal\n */\nexport function getJurisdictionLabel(payment: Pick<TaxPayment, 'jurisdiction'>): {\n key: 'federal' | 'state'\n values: { jurisdiction: string }\n} {\n return isFederalTaxPayment(payment)\n ? { key: 'federal', values: { jurisdiction: FEDERAL_JURISDICTION } }\n : { key: 'state', values: { jurisdiction: payment.jurisdiction ?? '' } }\n}\n\n/**\n * Derives a display status for a tax payment.\n *\n * @remarks\n * The API has no status field, so status is derived from the amounts and dates. The API sends\n * `payment_sent_on: null` for both never-sent and returned/cancelled payments, so a\n * returned/cancelled state cannot be distinguished here.\n *\n * Settlement is checked before the amount's sign, so a refund that has already been sent or\n * reimbursed reads as `paid` rather than staying `refund` forever.\n *\n * A zero-amount payment owes nothing and will never be sent, so it reads as `paid` rather than\n * sitting in `scheduled` indefinitely. The list endpoint does return zero-amount payments — it\n * applies `.for_taxes.non_penalty` but not `.with_amounts` — so this is a real case, not a\n * theoretical one.\n *\n * @param payment - The tax payment to classify.\n * @param today - Today's date as a `YYYY-MM-DD` string in the user's local timezone.\n * @returns The derived status.\n * @internal\n */\nexport function deriveTaxPaymentStatus(\n payment: Pick<TaxPayment, 'amount' | 'amountPaid' | 'dueDate' | 'paymentSentOn'>,\n today: string,\n): TaxPaymentStatus {\n const amount = parseFloat(payment.amount)\n const amountPaid = parseFloat(payment.amountPaid)\n\n if (payment.paymentSentOn) return 'paid'\n if (amount === 0) return 'paid'\n if (amount > 0 && amountPaid >= amount) return 'paid'\n if (amount < 0 && amountPaid <= amount) return 'paid'\n\n if (amount < 0) return 'refund'\n\n const dueDate = payment.dueDate?.toString()\n if (dueDate && dueDate < today) return 'overdue'\n\n return 'scheduled'\n}\n"],"names":["TAX_PAYMENT_STATUSES","ALL_FILTER_VALUE","FEDERAL_JURISDICTION","TAX_PAYMENT_STATUS_BADGES","isFederalTaxPayment","payment","getJurisdictionLabel","deriveTaxPaymentStatus","today","amount","amountPaid","dueDate"],"mappings":"AAMO,MAAMA,IAAoD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYaC,IAAmB,OAGnBC,IAAuB,MAGvBC,IAGT;AAAA,EACF,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AACV;AAGO,SAASC,EAAoBC,GAAoD;AACtF,SAAOA,EAAQ,iBAAiB;AAClC;AAcO,SAASC,EAAqBD,GAGnC;AACA,SAAOD,EAAoBC,CAAO,IAC9B,EAAE,KAAK,WAAW,QAAQ,EAAE,cAAc,KAAA,MAC1C,EAAE,KAAK,SAAS,QAAQ,EAAE,cAAcA,EAAQ,gBAAgB,KAAG;AACzE;AAuBO,SAASE,EACdF,GACAG,GACkB;AAClB,QAAMC,IAAS,WAAWJ,EAAQ,MAAM,GAClCK,IAAa,WAAWL,EAAQ,UAAU;AAKhD,MAHIA,EAAQ,iBACRI,MAAW,KACXA,IAAS,KAAKC,KAAcD,KAC5BA,IAAS,KAAKC,KAAcD,EAAQ,QAAO;AAE/C,MAAIA,IAAS,EAAG,QAAO;AAEvB,QAAME,IAAUN,EAAQ,SAAS,SAAA;AACjC,SAAIM,KAAWA,IAAUH,IAAc,YAEhC;AACT;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useSuspenseQueries as P } from "@tanstack/react-query";
|
|
2
|
+
import { useGustoEmbeddedContext as c } from "@gusto/embedded-api/react-query/_context";
|
|
3
|
+
import { useTaxPaymentsGetTaxPaymentsSuspense as y, buildTaxPaymentsGetTaxPaymentsQuery as x } from "@gusto/embedded-api/react-query/taxPaymentsGetTaxPayments";
|
|
4
|
+
const n = 100, o = 5, r = "due_date:desc";
|
|
5
|
+
function f(t) {
|
|
6
|
+
const m = c(), { data: e } = y({
|
|
7
|
+
companyUuid: t,
|
|
8
|
+
page: 1,
|
|
9
|
+
per: n,
|
|
10
|
+
sortBy: r
|
|
11
|
+
}), s = Number(e.httpMeta.response.headers.get("x-total-pages") ?? 1), u = Math.min(s, o), p = P({
|
|
12
|
+
queries: Array.from(
|
|
13
|
+
{ length: Math.max(0, u - 1) },
|
|
14
|
+
(a, i) => x(m, {
|
|
15
|
+
companyUuid: t,
|
|
16
|
+
page: i + 2,
|
|
17
|
+
per: n,
|
|
18
|
+
sortBy: r
|
|
19
|
+
})
|
|
20
|
+
)
|
|
21
|
+
});
|
|
22
|
+
return { taxPayments: [
|
|
23
|
+
...e.taxPaymentList ?? [],
|
|
24
|
+
...p.flatMap((a) => a.data.taxPaymentList ?? [])
|
|
25
|
+
], isTruncated: s > o };
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
f as useAllTaxPayments
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=useAllTaxPayments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAllTaxPayments.js","sources":["../../../../../src/components/Company/TaxPayments/shared/useAllTaxPayments.ts"],"sourcesContent":["import { useSuspenseQueries } from '@tanstack/react-query'\nimport { useGustoEmbeddedContext } from '@gusto/embedded-api/react-query/_context'\nimport {\n buildTaxPaymentsGetTaxPaymentsQuery,\n useTaxPaymentsGetTaxPaymentsSuspense,\n} from '@gusto/embedded-api/react-query/taxPaymentsGetTaxPayments'\nimport type { TaxPayment } from '@gusto/embedded-api/models/components/taxpayment'\n\nconst SERVER_MAX_PER_PAGE = 100\n\n/**\n * Hard ceiling on the number of pages fetched, so a company with an unexpectedly long history\n * degrades to a truncated list rather than an unbounded request fan-out.\n *\n * @internal\n */\nconst MAX_PAGES = 5\n\n/**\n * Sort sent to the server. Matches the endpoint's own default, so page boundaries stay stable\n * across the requests that make up one list.\n *\n * @remarks\n * A single field only: the endpoint's OpenAPI schema advertises comma-separated multi-field sort,\n * but its validator splits on the first `:` and rejects anything else with a 422.\n *\n * @internal\n */\nconst SORT_BY = 'due_date:desc'\n\n/**\n * Result of {@link useAllTaxPayments}.\n *\n * @internal\n */\nexport interface AllTaxPaymentsResult {\n /** Every tax payment fetched, newest due date first. */\n taxPayments: TaxPayment[]\n /** Whether the server reported more pages than {@link MAX_PAGES} and the list was truncated. */\n isTruncated: boolean\n}\n\n/**\n * Fetches a company's tax payments so filtering, search, and pagination can be applied client-side.\n *\n * @remarks\n * Suspends until every fetched page resolves. Filtering and search stay client-side deliberately:\n * the derived `Overdue` and `Scheduled` statuses depend on \"not yet sent\", which the API exposes no\n * filter for, the `jurisdiction` filter would silently drop local/city agencies that still report a\n * state code, and there is no text-search parameter at all.\n *\n * Fetching is capped at {@link MAX_PAGES} pages because the endpoint paginates an in-memory array —\n * each page request reloads the company's full payment history server-side, so an uncapped fan-out\n * multiplies that cost rather than amortizing it.\n *\n * @param companyId - The company whose tax payments are fetched.\n * @returns The fetched tax payments and whether the list was truncated.\n * @internal\n */\nexport function useAllTaxPayments(companyId: string): AllTaxPaymentsResult {\n const gustoClient = useGustoEmbeddedContext()\n\n const { data: firstPage } = useTaxPaymentsGetTaxPaymentsSuspense({\n companyUuid: companyId,\n page: 1,\n per: SERVER_MAX_PER_PAGE,\n sortBy: SORT_BY,\n })\n\n const totalServerPages = Number(firstPage.httpMeta.response.headers.get('x-total-pages') ?? 1)\n const pagesToFetch = Math.min(totalServerPages, MAX_PAGES)\n\n const restPageResults = useSuspenseQueries({\n queries: Array.from({ length: Math.max(0, pagesToFetch - 1) }, (_, index) =>\n buildTaxPaymentsGetTaxPaymentsQuery(gustoClient, {\n companyUuid: companyId,\n page: index + 2,\n per: SERVER_MAX_PER_PAGE,\n sortBy: SORT_BY,\n }),\n ),\n })\n\n // Not memoized: `useSuspenseQueries` hands back a fresh array every render, so a memo keyed on it\n // could never hit -- it would just add a dependency list that lies about caching anything.\n const taxPayments = [\n ...(firstPage.taxPaymentList ?? []),\n ...restPageResults.flatMap(result => result.data.taxPaymentList ?? []),\n ]\n\n return { taxPayments, isTruncated: totalServerPages > MAX_PAGES }\n}\n"],"names":["SERVER_MAX_PER_PAGE","MAX_PAGES","SORT_BY","useAllTaxPayments","companyId","gustoClient","useGustoEmbeddedContext","firstPage","useTaxPaymentsGetTaxPaymentsSuspense","totalServerPages","pagesToFetch","restPageResults","useSuspenseQueries","_","index","buildTaxPaymentsGetTaxPaymentsQuery","result"],"mappings":";;;AAQA,MAAMA,IAAsB,KAQtBC,IAAY,GAYZC,IAAU;AA+BT,SAASC,EAAkBC,GAAyC;AACzE,QAAMC,IAAcC,EAAA,GAEd,EAAE,MAAMC,EAAA,IAAcC,EAAqC;AAAA,IAC/D,aAAaJ;AAAA,IACb,MAAM;AAAA,IACN,KAAKJ;AAAA,IACL,QAAQE;AAAA,EAAA,CACT,GAEKO,IAAmB,OAAOF,EAAU,SAAS,SAAS,QAAQ,IAAI,eAAe,KAAK,CAAC,GACvFG,IAAe,KAAK,IAAID,GAAkBR,CAAS,GAEnDU,IAAkBC,EAAmB;AAAA,IACzC,SAAS,MAAM;AAAA,MAAK,EAAE,QAAQ,KAAK,IAAI,GAAGF,IAAe,CAAC,EAAA;AAAA,MAAK,CAACG,GAAGC,MACjEC,EAAoCV,GAAa;AAAA,QAC/C,aAAaD;AAAA,QACb,MAAMU,IAAQ;AAAA,QACd,KAAKd;AAAA,QACL,QAAQE;AAAA,MAAA,CACT;AAAA,IAAA;AAAA,EACH,CACD;AASD,SAAO,EAAE,aALW;AAAA,IAClB,GAAIK,EAAU,kBAAkB,CAAA;AAAA,IAChC,GAAGI,EAAgB,QAAQ,CAAAK,MAAUA,EAAO,KAAK,kBAAkB,CAAA,CAAE;AAAA,EAAA,GAGjD,aAAaP,IAAmBR,EAAA;AACxD;"}
|