@gusto/embedded-react-sdk 0.46.2 → 0.46.3

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 (172) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/components/Common/DataView/DataTable/DataTable.js +76 -72
  3. package/dist/components/Common/DataView/DataTable/DataTable.js.map +1 -1
  4. package/dist/components/Common/DataView/DataTable/DataTable.module.scss.js +8 -0
  5. package/dist/components/Common/DataView/DataTable/DataTable.module.scss.js.map +1 -0
  6. package/dist/components/Common/DataView/useDataView.d.ts +2 -0
  7. package/dist/components/Common/DataView/useDataView.js.map +1 -1
  8. package/dist/components/Common/DocumentViewer/DocumentViewer.js +10 -10
  9. package/dist/components/Common/DocumentViewer/DocumentViewer.js.map +1 -1
  10. package/dist/components/Common/DocumentViewer/DocumentViewer.module.scss.js +9 -9
  11. package/dist/components/Common/PaginationControl/PaginationControl.js +11 -10
  12. package/dist/components/Common/PaginationControl/PaginationControl.js.map +1 -1
  13. package/dist/components/Common/PaginationControl/PaginationControlTypes.d.ts +1 -1
  14. package/dist/components/Common/UI/DescriptionList/DescriptionList.js +11 -10
  15. package/dist/components/Common/UI/DescriptionList/DescriptionList.js.map +1 -1
  16. package/dist/components/Common/UI/DescriptionList/DescriptionList.module.scss.js +4 -4
  17. package/dist/components/Common/UI/Input/InputTypes.d.ts +1 -1
  18. package/dist/components/Common/UI/Input/InputTypes.js.map +1 -1
  19. package/dist/components/Common/UI/NumberInput/NumberInput.js +51 -48
  20. package/dist/components/Common/UI/NumberInput/NumberInput.js.map +1 -1
  21. package/dist/components/Common/VisuallyHidden/VisuallyHidden.d.ts +1 -1
  22. package/dist/components/Common/VisuallyHidden/VisuallyHidden.js.map +1 -1
  23. package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js +3 -4
  24. package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js.map +1 -1
  25. package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js +3 -4
  26. package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js.map +1 -1
  27. package/dist/components/Company/AssignSignatory/useAssignSignatory.js +5 -6
  28. package/dist/components/Company/AssignSignatory/useAssignSignatory.js.map +1 -1
  29. package/dist/components/Company/BankAccount/BankAccountForm/context.js +3 -4
  30. package/dist/components/Company/BankAccount/BankAccountForm/context.js.map +1 -1
  31. package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js +3 -4
  32. package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
  33. package/dist/components/Company/DocumentSigner/shared/useSignCompanyForm/fields.js +4 -4
  34. package/dist/components/Company/FederalTaxes/useFederalTaxes.js +5 -6
  35. package/dist/components/Company/FederalTaxes/useFederalTaxes.js.map +1 -1
  36. package/dist/components/Company/Industry/Context.js +6 -7
  37. package/dist/components/Company/Industry/Context.js.map +1 -1
  38. package/dist/components/Company/Locations/LocationForm/useLocationForm.js +3 -4
  39. package/dist/components/Company/Locations/LocationForm/useLocationForm.js.map +1 -1
  40. package/dist/components/Company/Locations/LocationsList/useLocationsList.js +3 -4
  41. package/dist/components/Company/Locations/LocationsList/useLocationsList.js.map +1 -1
  42. package/dist/components/Company/OnboardingOverview/context.js +3 -4
  43. package/dist/components/Company/OnboardingOverview/context.js.map +1 -1
  44. package/dist/components/Company/PaySchedule/shared/usePayScheduleForm/fields.js +5 -5
  45. package/dist/components/Company/StateTaxes/StateTaxesForm/context.js +3 -4
  46. package/dist/components/Company/StateTaxes/StateTaxesForm/context.js.map +1 -1
  47. package/dist/components/Company/StateTaxes/StateTaxesList/context.js +3 -4
  48. package/dist/components/Company/StateTaxes/StateTaxesList/context.js.map +1 -1
  49. package/dist/components/Contractor/Address/useAddress.js +5 -6
  50. package/dist/components/Contractor/Address/useAddress.js.map +1 -1
  51. package/dist/components/Contractor/Profile/useContractorProfile.js +33 -34
  52. package/dist/components/Contractor/Profile/useContractorProfile.js.map +1 -1
  53. package/dist/components/Employee/Compensation/management/EditCompensation/EditCompensation.js +14 -11
  54. package/dist/components/Employee/Compensation/management/EditCompensation/EditCompensation.js.map +1 -1
  55. package/dist/components/Employee/Compensation/management/EditPendingCompensation/EditPendingCompensation.js +0 -2
  56. package/dist/components/Employee/Compensation/management/EditPendingCompensation/EditPendingCompensation.js.map +1 -1
  57. package/dist/components/Employee/Compensation/management/ManagementCompensationFormBody.js +18 -18
  58. package/dist/components/Employee/Compensation/management/ManagementCompensationFormBody.js.map +1 -1
  59. package/dist/components/Employee/Compensation/onboarding/JobsList/JobsListPresentation.js +36 -36
  60. package/dist/components/Employee/Compensation/onboarding/JobsList/JobsListPresentation.js.map +1 -1
  61. package/dist/components/Employee/Compensation/shared/useCompensationForm/fields.js +4 -4
  62. package/dist/components/Employee/Compensation/shared/useCompensationForm/useCompensationForm.js +140 -140
  63. package/dist/components/Employee/Compensation/shared/useCompensationForm/useCompensationForm.js.map +1 -1
  64. package/dist/components/Employee/Compensation/shared/useJobForm/fields.js +6 -6
  65. package/dist/components/Employee/Compensation/shared/useJobForm/useJobForm.d.ts +6 -5
  66. package/dist/components/Employee/Compensation/shared/useJobForm/useJobForm.js +162 -131
  67. package/dist/components/Employee/Compensation/shared/useJobForm/useJobForm.js.map +1 -1
  68. package/dist/components/Employee/Dashboard/BasicDetailsView.js +74 -88
  69. package/dist/components/Employee/Dashboard/BasicDetailsView.js.map +1 -1
  70. package/dist/components/Employee/Dashboard/Dashboard.js +53 -51
  71. package/dist/components/Employee/Dashboard/Dashboard.js.map +1 -1
  72. package/dist/components/Employee/Dashboard/DocumentsView.js +17 -10
  73. package/dist/components/Employee/Dashboard/DocumentsView.js.map +1 -1
  74. package/dist/components/Employee/Dashboard/JobAndPayView.js +383 -357
  75. package/dist/components/Employee/Dashboard/JobAndPayView.js.map +1 -1
  76. package/dist/components/Employee/Dashboard/TaxesView.js +114 -101
  77. package/dist/components/Employee/Dashboard/TaxesView.js.map +1 -1
  78. package/dist/components/Employee/Dashboard/getPendingCompensationChanges.js +36 -36
  79. package/dist/components/Employee/Dashboard/getPendingCompensationChanges.js.map +1 -1
  80. package/dist/components/Employee/Deductions/DeductionsForm/StandardDeductionForm.js +57 -57
  81. package/dist/components/Employee/Deductions/DeductionsForm/StandardDeductionForm.js.map +1 -1
  82. package/dist/components/Employee/Deductions/shared/useChildSupportGarnishmentForm/childSupportGarnishmentFormSchema.d.ts +14 -5
  83. package/dist/components/Employee/Deductions/shared/useChildSupportGarnishmentForm/childSupportGarnishmentFormSchema.js +55 -36
  84. package/dist/components/Employee/Deductions/shared/useChildSupportGarnishmentForm/childSupportGarnishmentFormSchema.js.map +1 -1
  85. package/dist/components/Employee/Deductions/shared/useChildSupportGarnishmentForm/fields.js +8 -8
  86. package/dist/components/Employee/Deductions/shared/useChildSupportGarnishmentForm/useChildSupportGarnishmentForm.js +18 -18
  87. package/dist/components/Employee/Deductions/shared/useChildSupportGarnishmentForm/useChildSupportGarnishmentForm.js.map +1 -1
  88. package/dist/components/Employee/Deductions/shared/useDeductionForm/fields.js +4 -4
  89. package/dist/components/Employee/Deductions/shared/useDeductionForm/useDeductionForm.d.ts +3 -3
  90. package/dist/components/Employee/Deductions/shared/useDeductionForm/useDeductionForm.js.map +1 -1
  91. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js +3 -4
  92. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
  93. package/dist/components/Employee/Documents/shared/useSignEmployeeForm/fields.js +1 -1
  94. package/dist/components/Employee/FederalTaxes/shared/useFederalTaxesForm/fields.js +4 -4
  95. package/dist/components/Employee/HomeAddress/management/HomeAddressView.js +157 -147
  96. package/dist/components/Employee/HomeAddress/management/HomeAddressView.js.map +1 -1
  97. package/dist/components/Employee/HomeAddress/management/useHomeAddressManagement.js +56 -55
  98. package/dist/components/Employee/HomeAddress/management/useHomeAddressManagement.js.map +1 -1
  99. package/dist/components/Employee/PaymentMethod/onboarding/BankForm.js +20 -20
  100. package/dist/components/Employee/PaymentMethod/onboarding/BankForm.js.map +1 -1
  101. package/dist/components/Employee/PaymentMethod/shared/useBankForm/fields.js +1 -1
  102. package/dist/components/Employee/PaymentMethod/shared/useSplitPaymentsForm/splitFieldFactory.d.ts +1 -1
  103. package/dist/components/Employee/PaymentMethod/shared/useSplitPaymentsForm/splitFieldFactory.js +4 -4
  104. package/dist/components/Employee/PaymentMethod/shared/useSplitPaymentsForm/splitFieldFactory.js.map +1 -1
  105. package/dist/components/Employee/Profile/shared/useEmployeeDetailsForm/fields.js +8 -8
  106. package/dist/components/Employee/Profile/shared/useHomeAddressForm/fields.js +5 -5
  107. package/dist/components/Employee/Profile/shared/useHomeAddressForm/homeAddressSchema.d.ts +0 -1
  108. package/dist/components/Employee/Profile/shared/useHomeAddressForm/homeAddressSchema.js +11 -12
  109. package/dist/components/Employee/Profile/shared/useHomeAddressForm/homeAddressSchema.js.map +1 -1
  110. package/dist/components/Employee/Profile/shared/useHomeAddressForm/homeAddressSchema.test.d.ts +1 -0
  111. package/dist/components/Employee/Profile/shared/useHomeAddressForm/useHomeAddressForm.d.ts +6 -1
  112. package/dist/components/Employee/Profile/shared/useHomeAddressForm/useHomeAddressForm.js +95 -94
  113. package/dist/components/Employee/Profile/shared/useHomeAddressForm/useHomeAddressForm.js.map +1 -1
  114. package/dist/components/Employee/Profile/shared/useWorkAddressForm/fields.js +4 -4
  115. package/dist/components/Employee/Profile/shared/useWorkAddressForm/useWorkAddressForm.d.ts +6 -1
  116. package/dist/components/Employee/Profile/shared/useWorkAddressForm/useWorkAddressForm.js +87 -86
  117. package/dist/components/Employee/Profile/shared/useWorkAddressForm/useWorkAddressForm.js.map +1 -1
  118. package/dist/components/Employee/StateTaxes/shared/EmployeeStateTaxesView.js +18 -18
  119. package/dist/components/Employee/StateTaxes/shared/EmployeeStateTaxesView.js.map +1 -1
  120. package/dist/components/Employee/StateTaxes/shared/useEmployeeStateTaxesForm/fieldComponents.js +8 -8
  121. package/dist/components/Employee/Taxes/useTaxes.js +3 -4
  122. package/dist/components/Employee/Taxes/useTaxes.js.map +1 -1
  123. package/dist/components/Employee/WorkAddress/management/WorkAddressView.js +5 -1
  124. package/dist/components/Employee/WorkAddress/management/WorkAddressView.js.map +1 -1
  125. package/dist/components/Employee/WorkAddress/management/useWorkAddressManagement.js +61 -60
  126. package/dist/components/Employee/WorkAddress/management/useWorkAddressManagement.js.map +1 -1
  127. package/dist/components/Payroll/GrossUpModal/GrossUpModal.js +2 -3
  128. package/dist/components/Payroll/GrossUpModal/GrossUpModal.js.map +1 -1
  129. package/dist/components/Payroll/usePreparedPayrollData.js +2 -3
  130. package/dist/components/Payroll/usePreparedPayrollData.js.map +1 -1
  131. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesHoliday.js +6 -7
  132. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesHoliday.js.map +1 -1
  133. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesPresentation.d.ts +1 -1
  134. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesPresentation.js +52 -68
  135. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesPresentation.js.map +1 -1
  136. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesPresentation.module.scss.js +4 -4
  137. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesPresentationTypes.d.ts +0 -11
  138. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesTimeOff.js +137 -163
  139. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesTimeOff.js.map +1 -1
  140. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/useSelectEmployeesData.js +36 -35
  141. package/dist/components/TimeOff/TimeOffManagement/SelectEmployees/useSelectEmployeesData.js.map +1 -1
  142. package/dist/components/TimeOff/TimeOffPolicyDetail/TimeOffPolicyDetailPresentation.js +34 -34
  143. package/dist/components/TimeOff/TimeOffPolicyDetail/TimeOffPolicyDetailPresentation.js.map +1 -1
  144. package/dist/helpers/breadcrumbHelpers.d.ts +1 -1
  145. package/dist/helpers/breadcrumbHelpers.js.map +1 -1
  146. package/dist/helpers/federalEin.d.ts +1 -0
  147. package/dist/helpers/federalEin.js.map +1 -1
  148. package/dist/helpers/mask.d.ts +8 -4
  149. package/dist/helpers/mask.js.map +1 -1
  150. package/dist/helpers/rem.d.ts +2 -1
  151. package/dist/helpers/rem.js.map +1 -1
  152. package/dist/hooks/useAsyncError.d.ts +1 -0
  153. package/dist/hooks/useAsyncError.js.map +1 -1
  154. package/dist/hooks/useForkRef/useForkRef.d.ts +1 -0
  155. package/dist/hooks/useForkRef/useForkRef.js.map +1 -1
  156. package/dist/i18n/I18n.d.ts +9 -1
  157. package/dist/i18n/I18n.js.map +1 -1
  158. package/dist/i18n/en/Company.TimeOff.EmployeeTable.json.js +14 -14
  159. package/dist/i18n/en/Company.TimeOff.SelectEmployees.json.js +12 -18
  160. package/dist/i18n/en/Company.TimeOff.SelectEmployees.json.js.map +1 -1
  161. package/dist/i18n/en/Employee.Compensation.json.js +24 -24
  162. package/dist/i18n/en/Employee.Dashboard.json.js +22 -20
  163. package/dist/i18n/en/Employee.Dashboard.json.js.map +1 -1
  164. package/dist/i18n/en/Employee.PaymentMethod.json.js +25 -25
  165. package/dist/i18n/en/Employee.StateTaxes.json.js +12 -10
  166. package/dist/i18n/en/Employee.StateTaxes.json.js.map +1 -1
  167. package/dist/style.css +1 -1
  168. package/dist/types/hooks.d.ts +1 -1
  169. package/dist/types/i18next.d.ts +4 -17
  170. package/dist/types/observability.d.ts +1 -1
  171. package/package.json +30 -27
  172. package/dist/components/Employee/Dashboard/CompensationCard.d.ts +0 -13
@@ -1,211 +1,185 @@
1
- import { jsx as P } from "react/jsx-runtime";
2
- import { useRef as ee, useCallback as f, useMemo as O, useState as U } from "react";
3
- import { useTimeOffPoliciesAddEmployeesMutation as ne } from "@gusto/embedded-api/react-query/timeOffPoliciesAddEmployees";
4
- import { useTimeOffPoliciesGetSuspense as te } from "@gusto/embedded-api/react-query/timeOffPoliciesGet";
5
- import { useTimeOffPoliciesUpdateMutation as oe } from "@gusto/embedded-api/react-query/timeOffPoliciesUpdate";
6
- import { UnprocessableEntityError as se } from "@gusto/embedded-api/models/errors/unprocessableentityerror";
7
- import { useQueryClient as ie } from "@tanstack/react-query";
8
- import { useTranslation as ae } from "react-i18next";
9
- import { SelectEmployeesPresentation as re } from "./SelectEmployeesPresentation.js";
10
- import { useSelectEmployeesData as ce, matchesEmployeeSearch as le } from "./useSelectEmployeesData.js";
11
- import { useBase as fe } from "../../../Base/useBase.js";
12
- import { SDKInternalError as me } from "../../../../types/sdkError.js";
13
- import { componentEvents as b } from "../../../../shared/constants.js";
14
- import { useI18n as ue } from "../../../../i18n/I18n.js";
15
- const I = {
1
+ import { jsx as g } from "react/jsx-runtime";
2
+ import { useRef as W, useCallback as l, useMemo as P, useState as G } from "react";
3
+ import { useTimeOffPoliciesAddEmployeesMutation as J } from "@gusto/embedded-api/react-query/timeOffPoliciesAddEmployees";
4
+ import { useTimeOffPoliciesGetSuspense as X } from "@gusto/embedded-api/react-query/timeOffPoliciesGet";
5
+ import { useTimeOffPoliciesUpdateMutation as Z } from "@gusto/embedded-api/react-query/timeOffPoliciesUpdate";
6
+ import { UnprocessableEntityError as $ } from "@gusto/embedded-api/models/errors/unprocessableentityerror";
7
+ import { useQueryClient as ee } from "@tanstack/react-query";
8
+ import { useTranslation as te } from "react-i18next";
9
+ import { SelectEmployeesPresentation as ne } from "./SelectEmployeesPresentation.js";
10
+ import { useSelectEmployeesData as oe, matchesEmployeeSearch as ie } from "./useSelectEmployeesData.js";
11
+ import { useBase as se } from "../../../Base/useBase.js";
12
+ import { SDKInternalError as re } from "../../../../types/sdkError.js";
13
+ import { componentEvents as S } from "../../../../shared/constants.js";
14
+ import { useI18n as ae } from "../../../../i18n/I18n.js";
15
+ const ce = {
16
16
  vacation: "Vacation Hours",
17
17
  sick: "Sick Hours"
18
18
  };
19
- function L(s, r) {
20
- if (!s) return;
21
- const t = I[r], a = s.eligiblePaidTimeOff?.find((c) => c.name === t)?.accrualBalance;
22
- return a && a.length > 0 ? a : void 0;
19
+ function T(i, a) {
20
+ if (!i) return;
21
+ const n = ce[a], r = i.eligiblePaidTimeOff?.find((c) => c.name === n)?.accrualBalance;
22
+ return r && r.length > 0 ? r : void 0;
23
23
  }
24
- function de(s, r) {
25
- const t = {};
26
- for (const i of s) {
27
- const a = L(i, r);
28
- a && (t[i.uuid] = a);
24
+ function le(i, a) {
25
+ const n = {};
26
+ for (const s of i) {
27
+ const r = T(s, a);
28
+ r && (n[s.uuid] = r);
29
29
  }
30
- return t;
30
+ return n;
31
31
  }
32
- function Be(s) {
33
- return s.mode === "wizard" ? /* @__PURE__ */ P(q, { ...s, mode: "wizard" }) : /* @__PURE__ */ P(pe, { ...s });
32
+ function be(i) {
33
+ return i.mode === "wizard" ? /* @__PURE__ */ g(F, { ...i, mode: "wizard" }) : /* @__PURE__ */ g(me, { ...i });
34
34
  }
35
- function pe(s) {
36
- const { data: r } = te({
37
- timeOffPolicyUuid: s.policyId
38
- }), t = r.timeOffPolicy;
39
- if (!t) throw new Error("Unexpected response: missing timeOffPolicy");
40
- const i = t.accrualMethod === "unlimited", a = O(() => {
35
+ function me(i) {
36
+ const { data: a } = X({
37
+ timeOffPolicyUuid: i.policyId
38
+ }), n = a.timeOffPolicy;
39
+ if (!n) throw new Error("Unexpected response: missing timeOffPolicy");
40
+ const s = n.accrualMethod === "unlimited", r = P(() => {
41
41
  const c = /* @__PURE__ */ new Set();
42
- for (const u of t.employees)
42
+ for (const u of n.employees)
43
43
  u.uuid && c.add(u.uuid);
44
44
  return c;
45
- }, [t.employees]);
46
- return /* @__PURE__ */ P(
47
- q,
45
+ }, [n.employees]);
46
+ return /* @__PURE__ */ g(
47
+ F,
48
48
  {
49
- ...s,
49
+ ...i,
50
50
  mode: "standalone",
51
- existingAssigneeUuids: a,
52
- hideBalances: i
51
+ existingAssigneeUuids: r,
52
+ hideBalances: s
53
53
  }
54
54
  );
55
55
  }
56
- function q({
57
- companyId: s,
58
- policyId: r,
59
- policyType: t,
60
- mode: i = "standalone",
61
- existingAssigneeUuids: a,
56
+ function F({
57
+ companyId: i,
58
+ policyId: a,
59
+ policyType: n,
60
+ mode: s = "standalone",
61
+ existingAssigneeUuids: r,
62
62
  hideBalances: c = !1
63
63
  }) {
64
- ue("Company.TimeOff.SelectEmployees");
65
- const { t: u } = ae("Company.TimeOff.SelectEmployees"), { onEvent: d, baseSubmitHandler: v } = fe(), A = ie(), {
66
- filteredEmployees: Y,
67
- eligibleEmployees: y,
68
- selectedUuids: l,
69
- searchValue: g,
70
- pagination: x,
71
- isFetching: N,
72
- handleSelect: _,
73
- handleSelectAll: w,
74
- handleSearchChange: R,
75
- handleSearchClear: z
76
- } = ce(s, a), p = ee(/* @__PURE__ */ new Map()), k = f(
77
- (e, n) => {
78
- n ? p.current.set(e.uuid, e) : p.current.delete(e.uuid), _(e, n);
64
+ ae("Company.TimeOff.SelectEmployees");
65
+ const { t: u } = te("Company.TimeOff.SelectEmployees"), { onEvent: m, baseSubmitHandler: C } = se(), _ = ee(), {
66
+ filteredEmployees: U,
67
+ eligibleEmployees: f,
68
+ selectedUuids: h,
69
+ searchValue: y,
70
+ pagination: I,
71
+ isFetching: q,
72
+ handleSelect: v,
73
+ handleSelectAll: b,
74
+ handleSearchChange: Y,
75
+ handleSearchClear: x
76
+ } = oe(i, r), d = W(/* @__PURE__ */ new Map()), L = l(
77
+ (t, e) => {
78
+ e ? d.current.set(t.uuid, t) : d.current.delete(t.uuid), v(t, e);
79
79
  },
80
- [_]
81
- ), H = f(
82
- (e) => {
83
- const n = g ? y.filter((o) => le(o, g)) : y;
84
- for (const o of n)
85
- e ? p.current.set(o.uuid, o) : p.current.delete(o.uuid);
86
- w(e);
80
+ [v]
81
+ ), N = l(
82
+ (t) => {
83
+ const e = y ? f.filter((o) => ie(o, y)) : f;
84
+ for (const o of e)
85
+ t ? d.current.set(o.uuid, o) : d.current.delete(o.uuid);
86
+ b(t);
87
87
  },
88
- [y, g, w]
89
- ), M = O(
90
- () => de(y, t),
91
- [y, t]
92
- ), [E, K] = U({}), V = O(
93
- () => ({ ...M, ...E }),
94
- [M, E]
95
- ), { mutateAsync: B, isPending: D } = ne(), { mutateAsync: T, isPending: W } = oe(), j = D || W, [Q, S] = U(!1), G = f((e, n) => {
96
- K((o) => ({ ...o, [e]: n }));
97
- }, []), F = f(
98
- (e) => e.map((n) => {
99
- if (c) return { uuid: n, balance: "0" };
100
- const o = E[n], m = L(
101
- p.current.get(n),
102
- t
103
- ), C = o && o.length > 0 ? o : m ?? "0";
104
- return { uuid: n, balance: C };
88
+ [f, y, b]
89
+ ), A = P(
90
+ () => le(f, n),
91
+ [f, n]
92
+ ), [E, R] = G({}), k = P(
93
+ () => ({ ...A, ...E }),
94
+ [A, E]
95
+ ), { mutateAsync: w, isPending: z } = J(), { mutateAsync: M, isPending: H } = Z(), K = z || H, V = l((t, e) => {
96
+ R((o) => ({ ...o, [t]: e }));
97
+ }, []), B = l(
98
+ (t) => t.map((e) => {
99
+ if (c) return { uuid: e, balance: "0" };
100
+ const o = E[e], p = T(
101
+ d.current.get(e),
102
+ n
103
+ ), O = o && o.length > 0 ? o : p ?? "0";
104
+ return { uuid: e, balance: O };
105
105
  }),
106
- [c, E, t]
107
- ), h = f(
108
- async (e) => {
109
- await v({}, async () => {
110
- let n;
111
- if (e.length > 0 && (n = (await B({
106
+ [c, E, n]
107
+ ), D = l(
108
+ async (t) => {
109
+ await C({}, async () => {
110
+ let e;
111
+ if (t.length > 0 && (e = (await w({
112
112
  request: {
113
- timeOffPolicyUuid: r,
114
- requestBody: { employees: F(e) }
113
+ timeOffPolicyUuid: a,
114
+ requestBody: { employees: B(t) }
115
115
  }
116
- })).timeOffPolicy), i === "wizard" && n) {
117
- const o = typeof n == "object" && "version" in n ? String(n.version) : "";
116
+ })).timeOffPolicy), s === "wizard" && e) {
117
+ const o = typeof e == "object" && "version" in e ? String(e.version) : "";
118
118
  try {
119
- await T({
119
+ await M({
120
120
  request: {
121
- timeOffPolicyUuid: r,
121
+ timeOffPolicyUuid: a,
122
122
  requestBody: { complete: !0, version: o }
123
123
  }
124
124
  });
125
- } catch (m) {
126
- if (m instanceof se) {
127
- const C = m.errors[0]?.message ?? "";
128
- throw new me(
129
- u("errors.completePolicyFailed", { details: C }),
125
+ } catch (p) {
126
+ if (p instanceof $) {
127
+ const O = p.errors[0]?.message ?? "";
128
+ throw new re(
129
+ u("errors.completePolicyFailed", { details: O }),
130
130
  "api_error"
131
131
  );
132
132
  }
133
- throw m;
133
+ throw p;
134
134
  }
135
135
  }
136
- A.invalidateQueries({
136
+ _.invalidateQueries({
137
137
  queryKey: ["@gusto/embedded-api", "timeOffPolicies", "get"]
138
- }), d(b.TIME_OFF_ADD_EMPLOYEES_DONE, n);
138
+ }), m(S.TIME_OFF_ADD_EMPLOYEES_DONE, e);
139
139
  });
140
140
  },
141
141
  [
142
- i,
143
- v,
142
+ s,
143
+ C,
144
+ w,
144
145
  B,
145
- F,
146
- T,
147
- r,
148
- A,
149
- d,
146
+ M,
147
+ a,
148
+ _,
149
+ m,
150
150
  u
151
151
  ]
152
- ), $ = f(async () => {
153
- const e = [...l];
154
- if (e.length === 0 && i === "standalone") {
155
- d(b.TIME_OFF_ADD_EMPLOYEES_DONE);
152
+ ), j = l(async () => {
153
+ const t = [...h];
154
+ if (t.length === 0 && s === "standalone") {
155
+ m(S.TIME_OFF_ADD_EMPLOYEES_DONE);
156
156
  return;
157
157
  }
158
- if (i === "standalone" && e.length > 0) {
159
- S(!0);
160
- return;
161
- }
162
- await h(e);
163
- }, [i, l, d, h]), J = f(async () => {
164
- const e = [...l];
165
- S(!1), await h(e);
166
- }, [l, h]), X = O(() => {
167
- const e = I[t];
168
- for (const n of l)
169
- if (p.current.get(n)?.eligiblePaidTimeOff?.some((m) => m.name === e))
170
- return !0;
171
- return !1;
172
- }, [l, t]), Z = f(() => {
173
- d(b.TIME_OFF_ADD_EMPLOYEES_BACK);
174
- }, [d]);
175
- return /* @__PURE__ */ P(
176
- re,
158
+ await D(t);
159
+ }, [s, h, m, D]), Q = l(() => {
160
+ m(S.TIME_OFF_ADD_EMPLOYEES_BACK);
161
+ }, [m]);
162
+ return /* @__PURE__ */ g(
163
+ ne,
177
164
  {
178
- employees: Y,
179
- selectedUuids: l,
180
- searchValue: g,
181
- onSelect: k,
182
- onSelectAll: H,
183
- onSearchChange: R,
184
- onSearchClear: z,
185
- onBack: Z,
186
- onContinue: $,
187
- showReassignmentWarning: X,
188
- policyTypeLabel: u(`policyTypeLabel_${t}`),
189
- balances: c ? void 0 : V,
190
- onBalanceChange: c ? void 0 : G,
191
- pagination: x,
192
- isFetching: N,
193
- isPending: j,
194
- addConfirmDialog: i === "standalone" ? {
195
- isOpen: Q,
196
- count: l.size,
197
- onConfirm: () => {
198
- J();
199
- },
200
- onClose: () => {
201
- S(!1);
202
- },
203
- isPending: D
204
- } : void 0
165
+ employees: U,
166
+ selectedUuids: h,
167
+ searchValue: y,
168
+ onSelect: L,
169
+ onSelectAll: N,
170
+ onSearchChange: Y,
171
+ onSearchClear: x,
172
+ onBack: Q,
173
+ onContinue: j,
174
+ balances: c ? void 0 : k,
175
+ onBalanceChange: c ? void 0 : V,
176
+ pagination: I,
177
+ isFetching: q,
178
+ isPending: K
205
179
  }
206
180
  );
207
181
  }
208
182
  export {
209
- Be as SelectEmployeesTimeOff
183
+ be as SelectEmployeesTimeOff
210
184
  };
211
185
  //# sourceMappingURL=SelectEmployeesTimeOff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectEmployeesTimeOff.js","sources":["../../../../../src/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesTimeOff.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react'\nimport { useTimeOffPoliciesAddEmployeesMutation } from '@gusto/embedded-api/react-query/timeOffPoliciesAddEmployees'\nimport { useTimeOffPoliciesGetSuspense } from '@gusto/embedded-api/react-query/timeOffPoliciesGet'\nimport { useTimeOffPoliciesUpdateMutation } from '@gusto/embedded-api/react-query/timeOffPoliciesUpdate'\nimport { UnprocessableEntityError } from '@gusto/embedded-api/models/errors/unprocessableentityerror'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useTranslation } from 'react-i18next'\nimport type { CreatableTimeOffPolicyType } from '../../TimeOffFlow/timeOffPolicyTypes'\nimport { SelectEmployeesPresentation } from './SelectEmployeesPresentation'\nimport { matchesEmployeeSearch, useSelectEmployeesData } from './useSelectEmployeesData'\nimport type { EmployeeItem } from './SelectEmployeesPresentationTypes'\nimport { useBase } from '@/components/Base/useBase'\nimport { SDKInternalError } from '@/types/sdkError'\nimport { componentEvents } from '@/shared/constants'\nimport { useI18n } from '@/i18n'\n\ninterface SelectEmployeesTimeOffProps {\n companyId: string\n policyId: string\n policyType: CreatableTimeOffPolicyType\n mode?: 'standalone' | 'wizard'\n}\n\nconst PAID_TIME_OFF_NAME_BY_POLICY_TYPE: Record<CreatableTimeOffPolicyType, string> = {\n vacation: 'Vacation Hours',\n sick: 'Sick Hours',\n}\n\nfunction extractCarryOverBalance(\n employee: EmployeeItem | undefined,\n policyType: CreatableTimeOffPolicyType,\n): string | undefined {\n if (!employee) return undefined\n const targetName = PAID_TIME_OFF_NAME_BY_POLICY_TYPE[policyType]\n const matching = employee.eligiblePaidTimeOff?.find(pto => pto.name === targetName)\n const balance = matching?.accrualBalance\n return balance && balance.length > 0 ? balance : undefined\n}\n\nfunction deriveCarryOverBalances(\n employees: EmployeeItem[],\n policyType: CreatableTimeOffPolicyType,\n): Record<string, string> {\n const map: Record<string, string> = {}\n for (const employee of employees) {\n const balance = extractCarryOverBalance(employee, policyType)\n if (balance) {\n map[employee.uuid] = balance\n }\n }\n return map\n}\n\nexport function SelectEmployeesTimeOff(props: SelectEmployeesTimeOffProps) {\n if (props.mode === 'wizard') {\n return <SelectEmployeesTimeOffInner {...props} mode=\"wizard\" />\n }\n return <StandaloneLoader {...props} />\n}\n\nfunction StandaloneLoader(props: SelectEmployeesTimeOffProps) {\n const { data: policyResponse } = useTimeOffPoliciesGetSuspense({\n timeOffPolicyUuid: props.policyId,\n })\n const policy = policyResponse.timeOffPolicy\n if (!policy) throw new Error('Unexpected response: missing timeOffPolicy')\n\n const isUnlimited = policy.accrualMethod === 'unlimited'\n\n const existingAssigneeUuids = useMemo(() => {\n const set = new Set<string>()\n for (const e of policy.employees) {\n if (e.uuid) set.add(e.uuid)\n }\n return set\n }, [policy.employees])\n\n return (\n <SelectEmployeesTimeOffInner\n {...props}\n mode=\"standalone\"\n existingAssigneeUuids={existingAssigneeUuids}\n hideBalances={isUnlimited}\n />\n )\n}\n\ninterface InnerProps extends SelectEmployeesTimeOffProps {\n existingAssigneeUuids?: Set<string>\n hideBalances?: boolean\n}\n\nfunction SelectEmployeesTimeOffInner({\n companyId,\n policyId,\n policyType,\n mode = 'standalone',\n existingAssigneeUuids,\n hideBalances = false,\n}: InnerProps) {\n useI18n('Company.TimeOff.SelectEmployees')\n const { t } = useTranslation('Company.TimeOff.SelectEmployees')\n const { onEvent, baseSubmitHandler } = useBase()\n const queryClient = useQueryClient()\n const {\n filteredEmployees,\n eligibleEmployees,\n selectedUuids,\n searchValue,\n pagination,\n isFetching,\n handleSelect,\n handleSelectAll,\n handleSearchChange,\n handleSearchClear,\n } = useSelectEmployeesData(companyId, existingAssigneeUuids)\n\n // Captures the full Employee record at the moment a row is selected so\n // their record is still available for the reassignment-warning check at\n // submit time even if the user has since searched/paginated the row out of\n // view. Without this, `selectedUuids` would point at UUIDs we no longer\n // have data for.\n const selectedEmployeesRef = useRef(new Map<string, EmployeeItem>())\n\n const handleSelectWithCapture = useCallback(\n (item: EmployeeItem, checked: boolean) => {\n if (checked) {\n selectedEmployeesRef.current.set(item.uuid, item)\n } else {\n selectedEmployeesRef.current.delete(item.uuid)\n }\n handleSelect(item, checked)\n },\n [handleSelect],\n )\n\n const handleSelectAllWithCapture = useCallback(\n (checked: boolean) => {\n // Mirror the hook's scope: full search-filtered list across pages, not\n // just the visible page slice. Keeps `selectedEmployeesRef` in sync so\n // off-page selections survive a submit (carry-over balances, etc.).\n const scope = searchValue\n ? eligibleEmployees.filter(employee => matchesEmployeeSearch(employee, searchValue))\n : eligibleEmployees\n for (const item of scope) {\n if (checked) {\n selectedEmployeesRef.current.set(item.uuid, item)\n } else {\n selectedEmployeesRef.current.delete(item.uuid)\n }\n }\n handleSelectAll(checked)\n },\n [eligibleEmployees, searchValue, handleSelectAll],\n )\n\n const carryOverBalances = useMemo(\n () => deriveCarryOverBalances(eligibleEmployees, policyType),\n [eligibleEmployees, policyType],\n )\n\n const [balances, setBalances] = useState<Record<string, string>>({})\n\n const effectiveBalances = useMemo<Record<string, string>>(\n () => ({ ...carryOverBalances, ...balances }),\n [carryOverBalances, balances],\n )\n\n const { mutateAsync: addEmployees, isPending: isAddPending } =\n useTimeOffPoliciesAddEmployeesMutation()\n const { mutateAsync: updatePolicy, isPending: isUpdatePending } =\n useTimeOffPoliciesUpdateMutation()\n const isSubmitPending = isAddPending || isUpdatePending\n\n const [confirmAddOpen, setConfirmAddOpen] = useState(false)\n\n const handleBalanceChange = useCallback((uuid: string, value: string) => {\n setBalances(prev => ({ ...prev, [uuid]: value }))\n }, [])\n\n const buildAddPayload = useCallback(\n (uuids: string[]) =>\n uuids.map(uuid => {\n if (hideBalances) return { uuid, balance: '0' }\n const userValue = balances[uuid]\n const carryOver = extractCarryOverBalance(\n selectedEmployeesRef.current.get(uuid),\n policyType,\n )\n const balance = userValue && userValue.length > 0 ? userValue : (carryOver ?? '0')\n return { uuid, balance }\n }),\n [hideBalances, balances, policyType],\n )\n\n const submitAdd = useCallback(\n async (toAdd: string[]) => {\n await baseSubmitHandler({}, async () => {\n let policyResult: unknown\n if (toAdd.length > 0) {\n const response = await addEmployees({\n request: {\n timeOffPolicyUuid: policyId,\n requestBody: { employees: buildAddPayload(toAdd) },\n },\n })\n policyResult = response.timeOffPolicy\n }\n if (mode === 'wizard' && policyResult) {\n const version =\n typeof policyResult === 'object' && 'version' in policyResult\n ? String((policyResult as { version: unknown }).version)\n : ''\n try {\n await updatePolicy({\n request: {\n timeOffPolicyUuid: policyId,\n requestBody: { complete: true, version },\n },\n })\n } catch (err) {\n if (err instanceof UnprocessableEntityError) {\n const apiMessage = err.errors[0]?.message ?? ''\n throw new SDKInternalError(\n t('errors.completePolicyFailed', { details: apiMessage }),\n 'api_error',\n )\n }\n throw err\n }\n }\n void queryClient.invalidateQueries({\n queryKey: ['@gusto/embedded-api', 'timeOffPolicies', 'get'],\n })\n onEvent(componentEvents.TIME_OFF_ADD_EMPLOYEES_DONE, policyResult)\n })\n },\n [\n mode,\n baseSubmitHandler,\n addEmployees,\n buildAddPayload,\n updatePolicy,\n policyId,\n queryClient,\n onEvent,\n t,\n ],\n )\n\n const handleContinue = useCallback(async () => {\n const toAdd = [...selectedUuids]\n\n if (toAdd.length === 0 && mode === 'standalone') {\n onEvent(componentEvents.TIME_OFF_ADD_EMPLOYEES_DONE)\n return\n }\n\n if (mode === 'standalone' && toAdd.length > 0) {\n setConfirmAddOpen(true)\n return\n }\n\n await submitAdd(toAdd)\n }, [mode, selectedUuids, onEvent, submitAdd])\n\n const handleConfirmAdd = useCallback(async () => {\n const toAdd = [...selectedUuids]\n setConfirmAddOpen(false)\n await submitAdd(toAdd)\n }, [selectedUuids, submitAdd])\n\n const showReassignmentWarning = useMemo(() => {\n const targetPtoName = PAID_TIME_OFF_NAME_BY_POLICY_TYPE[policyType]\n for (const uuid of selectedUuids) {\n const employee = selectedEmployeesRef.current.get(uuid)\n if (employee?.eligiblePaidTimeOff?.some(pto => pto.name === targetPtoName)) {\n return true\n }\n }\n return false\n }, [selectedUuids, policyType])\n\n const handleBack = useCallback(() => {\n onEvent(componentEvents.TIME_OFF_ADD_EMPLOYEES_BACK)\n }, [onEvent])\n\n return (\n <SelectEmployeesPresentation\n employees={filteredEmployees}\n selectedUuids={selectedUuids}\n searchValue={searchValue}\n onSelect={handleSelectWithCapture}\n onSelectAll={handleSelectAllWithCapture}\n onSearchChange={handleSearchChange}\n onSearchClear={handleSearchClear}\n onBack={handleBack}\n onContinue={handleContinue}\n showReassignmentWarning={showReassignmentWarning}\n policyTypeLabel={t(`policyTypeLabel_${policyType}`)}\n balances={hideBalances ? undefined : effectiveBalances}\n onBalanceChange={hideBalances ? undefined : handleBalanceChange}\n pagination={pagination}\n isFetching={isFetching}\n isPending={isSubmitPending}\n addConfirmDialog={\n mode === 'standalone'\n ? {\n isOpen: confirmAddOpen,\n count: selectedUuids.size,\n onConfirm: () => {\n void handleConfirmAdd()\n },\n onClose: () => {\n setConfirmAddOpen(false)\n },\n isPending: isAddPending,\n }\n : undefined\n }\n />\n )\n}\n"],"names":["PAID_TIME_OFF_NAME_BY_POLICY_TYPE","extractCarryOverBalance","employee","policyType","targetName","balance","pto","deriveCarryOverBalances","employees","map","SelectEmployeesTimeOff","props","jsx","SelectEmployeesTimeOffInner","StandaloneLoader","policyResponse","useTimeOffPoliciesGetSuspense","policy","isUnlimited","existingAssigneeUuids","useMemo","set","e","companyId","policyId","mode","hideBalances","useI18n","t","useTranslation","onEvent","baseSubmitHandler","useBase","queryClient","useQueryClient","filteredEmployees","eligibleEmployees","selectedUuids","searchValue","pagination","isFetching","handleSelect","handleSelectAll","handleSearchChange","handleSearchClear","useSelectEmployeesData","selectedEmployeesRef","useRef","handleSelectWithCapture","useCallback","item","checked","handleSelectAllWithCapture","scope","matchesEmployeeSearch","carryOverBalances","balances","setBalances","useState","effectiveBalances","addEmployees","isAddPending","useTimeOffPoliciesAddEmployeesMutation","updatePolicy","isUpdatePending","useTimeOffPoliciesUpdateMutation","isSubmitPending","confirmAddOpen","setConfirmAddOpen","handleBalanceChange","uuid","value","prev","buildAddPayload","uuids","userValue","carryOver","submitAdd","toAdd","policyResult","version","err","UnprocessableEntityError","apiMessage","SDKInternalError","componentEvents","handleContinue","handleConfirmAdd","showReassignmentWarning","targetPtoName","handleBack","SelectEmployeesPresentation"],"mappings":"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"}
1
+ {"version":3,"file":"SelectEmployeesTimeOff.js","sources":["../../../../../src/components/TimeOff/TimeOffManagement/SelectEmployees/SelectEmployeesTimeOff.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react'\nimport { useTimeOffPoliciesAddEmployeesMutation } from '@gusto/embedded-api/react-query/timeOffPoliciesAddEmployees'\nimport { useTimeOffPoliciesGetSuspense } from '@gusto/embedded-api/react-query/timeOffPoliciesGet'\nimport { useTimeOffPoliciesUpdateMutation } from '@gusto/embedded-api/react-query/timeOffPoliciesUpdate'\nimport { UnprocessableEntityError } from '@gusto/embedded-api/models/errors/unprocessableentityerror'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useTranslation } from 'react-i18next'\nimport type { CreatableTimeOffPolicyType } from '../../TimeOffFlow/timeOffPolicyTypes'\nimport { SelectEmployeesPresentation } from './SelectEmployeesPresentation'\nimport { matchesEmployeeSearch, useSelectEmployeesData } from './useSelectEmployeesData'\nimport type { EmployeeItem } from './SelectEmployeesPresentationTypes'\nimport { useBase } from '@/components/Base/useBase'\nimport { SDKInternalError } from '@/types/sdkError'\nimport { componentEvents } from '@/shared/constants'\nimport { useI18n } from '@/i18n'\n\ninterface SelectEmployeesTimeOffProps {\n companyId: string\n policyId: string\n policyType: CreatableTimeOffPolicyType\n mode?: 'standalone' | 'wizard'\n}\n\nconst PAID_TIME_OFF_NAME_BY_POLICY_TYPE: Record<CreatableTimeOffPolicyType, string> = {\n vacation: 'Vacation Hours',\n sick: 'Sick Hours',\n}\n\nfunction extractCarryOverBalance(\n employee: EmployeeItem | undefined,\n policyType: CreatableTimeOffPolicyType,\n): string | undefined {\n if (!employee) return undefined\n const targetName = PAID_TIME_OFF_NAME_BY_POLICY_TYPE[policyType]\n const matching = employee.eligiblePaidTimeOff?.find(pto => pto.name === targetName)\n const balance = matching?.accrualBalance\n return balance && balance.length > 0 ? balance : undefined\n}\n\nfunction deriveCarryOverBalances(\n employees: EmployeeItem[],\n policyType: CreatableTimeOffPolicyType,\n): Record<string, string> {\n const map: Record<string, string> = {}\n for (const employee of employees) {\n const balance = extractCarryOverBalance(employee, policyType)\n if (balance) {\n map[employee.uuid] = balance\n }\n }\n return map\n}\n\nexport function SelectEmployeesTimeOff(props: SelectEmployeesTimeOffProps) {\n if (props.mode === 'wizard') {\n return <SelectEmployeesTimeOffInner {...props} mode=\"wizard\" />\n }\n return <StandaloneLoader {...props} />\n}\n\nfunction StandaloneLoader(props: SelectEmployeesTimeOffProps) {\n const { data: policyResponse } = useTimeOffPoliciesGetSuspense({\n timeOffPolicyUuid: props.policyId,\n })\n const policy = policyResponse.timeOffPolicy\n if (!policy) throw new Error('Unexpected response: missing timeOffPolicy')\n\n const isUnlimited = policy.accrualMethod === 'unlimited'\n\n const existingAssigneeUuids = useMemo(() => {\n const set = new Set<string>()\n for (const e of policy.employees) {\n if (e.uuid) set.add(e.uuid)\n }\n return set\n }, [policy.employees])\n\n return (\n <SelectEmployeesTimeOffInner\n {...props}\n mode=\"standalone\"\n existingAssigneeUuids={existingAssigneeUuids}\n hideBalances={isUnlimited}\n />\n )\n}\n\ninterface InnerProps extends SelectEmployeesTimeOffProps {\n existingAssigneeUuids?: Set<string>\n hideBalances?: boolean\n}\n\nfunction SelectEmployeesTimeOffInner({\n companyId,\n policyId,\n policyType,\n mode = 'standalone',\n existingAssigneeUuids,\n hideBalances = false,\n}: InnerProps) {\n useI18n('Company.TimeOff.SelectEmployees')\n const { t } = useTranslation('Company.TimeOff.SelectEmployees')\n const { onEvent, baseSubmitHandler } = useBase()\n const queryClient = useQueryClient()\n const {\n filteredEmployees,\n eligibleEmployees,\n selectedUuids,\n searchValue,\n pagination,\n isFetching,\n handleSelect,\n handleSelectAll,\n handleSearchChange,\n handleSearchClear,\n } = useSelectEmployeesData(companyId, existingAssigneeUuids)\n\n // Captures the full Employee record at the moment a row is selected so\n // their record is still available for the reassignment-warning check at\n // submit time even if the user has since searched/paginated the row out of\n // view. Without this, `selectedUuids` would point at UUIDs we no longer\n // have data for.\n const selectedEmployeesRef = useRef(new Map<string, EmployeeItem>())\n\n const handleSelectWithCapture = useCallback(\n (item: EmployeeItem, checked: boolean) => {\n if (checked) {\n selectedEmployeesRef.current.set(item.uuid, item)\n } else {\n selectedEmployeesRef.current.delete(item.uuid)\n }\n handleSelect(item, checked)\n },\n [handleSelect],\n )\n\n const handleSelectAllWithCapture = useCallback(\n (checked: boolean) => {\n // Mirror the hook's scope: full search-filtered list across pages, not\n // just the visible page slice. Keeps `selectedEmployeesRef` in sync so\n // off-page selections survive a submit (carry-over balances, etc.).\n const scope = searchValue\n ? eligibleEmployees.filter(employee => matchesEmployeeSearch(employee, searchValue))\n : eligibleEmployees\n for (const item of scope) {\n if (checked) {\n selectedEmployeesRef.current.set(item.uuid, item)\n } else {\n selectedEmployeesRef.current.delete(item.uuid)\n }\n }\n handleSelectAll(checked)\n },\n [eligibleEmployees, searchValue, handleSelectAll],\n )\n\n const carryOverBalances = useMemo(\n () => deriveCarryOverBalances(eligibleEmployees, policyType),\n [eligibleEmployees, policyType],\n )\n\n const [balances, setBalances] = useState<Record<string, string>>({})\n\n const effectiveBalances = useMemo<Record<string, string>>(\n () => ({ ...carryOverBalances, ...balances }),\n [carryOverBalances, balances],\n )\n\n const { mutateAsync: addEmployees, isPending: isAddPending } =\n useTimeOffPoliciesAddEmployeesMutation()\n const { mutateAsync: updatePolicy, isPending: isUpdatePending } =\n useTimeOffPoliciesUpdateMutation()\n const isSubmitPending = isAddPending || isUpdatePending\n\n const handleBalanceChange = useCallback((uuid: string, value: string) => {\n setBalances(prev => ({ ...prev, [uuid]: value }))\n }, [])\n\n const buildAddPayload = useCallback(\n (uuids: string[]) =>\n uuids.map(uuid => {\n if (hideBalances) return { uuid, balance: '0' }\n const userValue = balances[uuid]\n const carryOver = extractCarryOverBalance(\n selectedEmployeesRef.current.get(uuid),\n policyType,\n )\n const balance = userValue && userValue.length > 0 ? userValue : (carryOver ?? '0')\n return { uuid, balance }\n }),\n [hideBalances, balances, policyType],\n )\n\n const submitAdd = useCallback(\n async (toAdd: string[]) => {\n await baseSubmitHandler({}, async () => {\n let policyResult: unknown\n if (toAdd.length > 0) {\n const response = await addEmployees({\n request: {\n timeOffPolicyUuid: policyId,\n requestBody: { employees: buildAddPayload(toAdd) },\n },\n })\n policyResult = response.timeOffPolicy\n }\n if (mode === 'wizard' && policyResult) {\n const version =\n typeof policyResult === 'object' && 'version' in policyResult\n ? String((policyResult as { version: unknown }).version)\n : ''\n try {\n await updatePolicy({\n request: {\n timeOffPolicyUuid: policyId,\n requestBody: { complete: true, version },\n },\n })\n } catch (err) {\n if (err instanceof UnprocessableEntityError) {\n const apiMessage = err.errors[0]?.message ?? ''\n throw new SDKInternalError(\n t('errors.completePolicyFailed', { details: apiMessage }),\n 'api_error',\n )\n }\n throw err\n }\n }\n void queryClient.invalidateQueries({\n queryKey: ['@gusto/embedded-api', 'timeOffPolicies', 'get'],\n })\n onEvent(componentEvents.TIME_OFF_ADD_EMPLOYEES_DONE, policyResult)\n })\n },\n [\n mode,\n baseSubmitHandler,\n addEmployees,\n buildAddPayload,\n updatePolicy,\n policyId,\n queryClient,\n onEvent,\n t,\n ],\n )\n\n const handleContinue = useCallback(async () => {\n const toAdd = [...selectedUuids]\n\n if (toAdd.length === 0 && mode === 'standalone') {\n onEvent(componentEvents.TIME_OFF_ADD_EMPLOYEES_DONE)\n return\n }\n\n await submitAdd(toAdd)\n }, [mode, selectedUuids, onEvent, submitAdd])\n\n const handleBack = useCallback(() => {\n onEvent(componentEvents.TIME_OFF_ADD_EMPLOYEES_BACK)\n }, [onEvent])\n\n return (\n <SelectEmployeesPresentation\n employees={filteredEmployees}\n selectedUuids={selectedUuids}\n searchValue={searchValue}\n onSelect={handleSelectWithCapture}\n onSelectAll={handleSelectAllWithCapture}\n onSearchChange={handleSearchChange}\n onSearchClear={handleSearchClear}\n onBack={handleBack}\n onContinue={handleContinue}\n balances={hideBalances ? undefined : effectiveBalances}\n onBalanceChange={hideBalances ? undefined : handleBalanceChange}\n pagination={pagination}\n isFetching={isFetching}\n isPending={isSubmitPending}\n />\n )\n}\n"],"names":["PAID_TIME_OFF_NAME_BY_POLICY_TYPE","extractCarryOverBalance","employee","policyType","targetName","balance","pto","deriveCarryOverBalances","employees","map","SelectEmployeesTimeOff","props","jsx","SelectEmployeesTimeOffInner","StandaloneLoader","policyResponse","useTimeOffPoliciesGetSuspense","policy","isUnlimited","existingAssigneeUuids","useMemo","set","e","companyId","policyId","mode","hideBalances","useI18n","t","useTranslation","onEvent","baseSubmitHandler","useBase","queryClient","useQueryClient","filteredEmployees","eligibleEmployees","selectedUuids","searchValue","pagination","isFetching","handleSelect","handleSelectAll","handleSearchChange","handleSearchClear","useSelectEmployeesData","selectedEmployeesRef","useRef","handleSelectWithCapture","useCallback","item","checked","handleSelectAllWithCapture","scope","matchesEmployeeSearch","carryOverBalances","balances","setBalances","useState","effectiveBalances","addEmployees","isAddPending","useTimeOffPoliciesAddEmployeesMutation","updatePolicy","isUpdatePending","useTimeOffPoliciesUpdateMutation","isSubmitPending","handleBalanceChange","uuid","value","prev","buildAddPayload","uuids","userValue","carryOver","submitAdd","toAdd","policyResult","version","err","UnprocessableEntityError","apiMessage","SDKInternalError","componentEvents","handleContinue","handleBack","SelectEmployeesPresentation"],"mappings":";;;;;;;;;;;;;;AAuBA,MAAMA,KAAgF;AAAA,EACpF,UAAU;AAAA,EACV,MAAM;AACR;AAEA,SAASC,EACPC,GACAC,GACoB;AACpB,MAAI,CAACD,EAAU;AACf,QAAME,IAAaJ,GAAkCG,CAAU,GAEzDE,IADWH,EAAS,qBAAqB,KAAK,CAAAI,MAAOA,EAAI,SAASF,CAAU,GACxD;AAC1B,SAAOC,KAAWA,EAAQ,SAAS,IAAIA,IAAU;AACnD;AAEA,SAASE,GACPC,GACAL,GACwB;AACxB,QAAMM,IAA8B,CAAA;AACpC,aAAWP,KAAYM,GAAW;AAChC,UAAMH,IAAUJ,EAAwBC,GAAUC,CAAU;AAC5D,IAAIE,MACFI,EAAIP,EAAS,IAAI,IAAIG;AAAA,EAEzB;AACA,SAAOI;AACT;AAEO,SAASC,GAAuBC,GAAoC;AACzE,SAAIA,EAAM,SAAS,WACV,gBAAAC,EAACC,GAAA,EAA6B,GAAGF,GAAO,MAAK,UAAS,IAExD,gBAAAC,EAACE,IAAA,EAAkB,GAAGH,EAAA,CAAO;AACtC;AAEA,SAASG,GAAiBH,GAAoC;AAC5D,QAAM,EAAE,MAAMI,EAAA,IAAmBC,EAA8B;AAAA,IAC7D,mBAAmBL,EAAM;AAAA,EAAA,CAC1B,GACKM,IAASF,EAAe;AAC9B,MAAI,CAACE,EAAQ,OAAM,IAAI,MAAM,4CAA4C;AAEzE,QAAMC,IAAcD,EAAO,kBAAkB,aAEvCE,IAAwBC,EAAQ,MAAM;AAC1C,UAAMC,wBAAU,IAAA;AAChB,eAAWC,KAAKL,EAAO;AACrB,MAAIK,EAAE,QAAMD,EAAI,IAAIC,EAAE,IAAI;AAE5B,WAAOD;AAAA,EACT,GAAG,CAACJ,EAAO,SAAS,CAAC;AAErB,SACE,gBAAAL;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGF;AAAA,MACJ,MAAK;AAAA,MACL,uBAAAQ;AAAA,MACA,cAAcD;AAAA,IAAA;AAAA,EAAA;AAGpB;AAOA,SAASL,EAA4B;AAAA,EACnC,WAAAU;AAAA,EACA,UAAAC;AAAA,EACA,YAAArB;AAAA,EACA,MAAAsB,IAAO;AAAA,EACP,uBAAAN;AAAA,EACA,cAAAO,IAAe;AACjB,GAAe;AACb,EAAAC,GAAQ,iCAAiC;AACzC,QAAM,EAAE,GAAAC,EAAA,IAAMC,GAAe,iCAAiC,GACxD,EAAE,SAAAC,GAAS,mBAAAC,EAAA,IAAsBC,GAAA,GACjCC,IAAcC,GAAA,GACd;AAAA,IACJ,mBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,aAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,mBAAAC;AAAA,EAAA,IACEC,GAAuBtB,GAAWJ,CAAqB,GAOrD2B,IAAuBC,EAAO,oBAAI,KAA2B,GAE7DC,IAA0BC;AAAA,IAC9B,CAACC,GAAoBC,MAAqB;AACxC,MAAIA,IACFL,EAAqB,QAAQ,IAAII,EAAK,MAAMA,CAAI,IAEhDJ,EAAqB,QAAQ,OAAOI,EAAK,IAAI,GAE/CT,EAAaS,GAAMC,CAAO;AAAA,IAC5B;AAAA,IACA,CAACV,CAAY;AAAA,EAAA,GAGTW,IAA6BH;AAAA,IACjC,CAACE,MAAqB;AAIpB,YAAME,IAAQf,IACVF,EAAkB,OAAO,OAAYkB,GAAsBpD,GAAUoC,CAAW,CAAC,IACjFF;AACJ,iBAAWc,KAAQG;AACjB,QAAIF,IACFL,EAAqB,QAAQ,IAAII,EAAK,MAAMA,CAAI,IAEhDJ,EAAqB,QAAQ,OAAOI,EAAK,IAAI;AAGjD,MAAAR,EAAgBS,CAAO;AAAA,IACzB;AAAA,IACA,CAACf,GAAmBE,GAAaI,CAAe;AAAA,EAAA,GAG5Ca,IAAoBnC;AAAA,IACxB,MAAMb,GAAwB6B,GAAmBjC,CAAU;AAAA,IAC3D,CAACiC,GAAmBjC,CAAU;AAAA,EAAA,GAG1B,CAACqD,GAAUC,CAAW,IAAIC,EAAiC,CAAA,CAAE,GAE7DC,IAAoBvC;AAAA,IACxB,OAAO,EAAE,GAAGmC,GAAmB,GAAGC;IAClC,CAACD,GAAmBC,CAAQ;AAAA,EAAA,GAGxB,EAAE,aAAaI,GAAc,WAAWC,EAAA,IAC5CC,EAAA,GACI,EAAE,aAAaC,GAAc,WAAWC,EAAA,IAC5CC,EAAA,GACIC,IAAkBL,KAAgBG,GAElCG,IAAsBlB,EAAY,CAACmB,GAAcC,MAAkB;AACvE,IAAAZ,EAAY,CAAAa,OAAS,EAAE,GAAGA,GAAM,CAACF,CAAI,GAAGC,IAAQ;AAAA,EAClD,GAAG,CAAA,CAAE,GAECE,IAAkBtB;AAAA,IACtB,CAACuB,MACCA,EAAM,IAAI,CAAAJ,MAAQ;AAChB,UAAI1C,EAAc,QAAO,EAAE,MAAA0C,GAAM,SAAS,IAAA;AAC1C,YAAMK,IAAYjB,EAASY,CAAI,GACzBM,IAAYzE;AAAA,QAChB6C,EAAqB,QAAQ,IAAIsB,CAAI;AAAA,QACrCjE;AAAA,MAAA,GAEIE,IAAUoE,KAAaA,EAAU,SAAS,IAAIA,IAAaC,KAAa;AAC9E,aAAO,EAAE,MAAAN,GAAM,SAAA/D,EAAA;AAAA,IACjB,CAAC;AAAA,IACH,CAACqB,GAAc8B,GAAUrD,CAAU;AAAA,EAAA,GAG/BwE,IAAY1B;AAAA,IAChB,OAAO2B,MAAoB;AACzB,YAAM7C,EAAkB,CAAA,GAAI,YAAY;AACtC,YAAI8C;AAUJ,YATID,EAAM,SAAS,MAOjBC,KANiB,MAAMjB,EAAa;AAAA,UAClC,SAAS;AAAA,YACP,mBAAmBpC;AAAA,YACnB,aAAa,EAAE,WAAW+C,EAAgBK,CAAK,EAAA;AAAA,UAAE;AAAA,QACnD,CACD,GACuB,gBAEtBnD,MAAS,YAAYoD,GAAc;AACrC,gBAAMC,IACJ,OAAOD,KAAiB,YAAY,aAAaA,IAC7C,OAAQA,EAAsC,OAAO,IACrD;AACN,cAAI;AACF,kBAAMd,EAAa;AAAA,cACjB,SAAS;AAAA,gBACP,mBAAmBvC;AAAA,gBACnB,aAAa,EAAE,UAAU,IAAM,SAAAsD,EAAA;AAAA,cAAQ;AAAA,YACzC,CACD;AAAA,UACH,SAASC,GAAK;AACZ,gBAAIA,aAAeC,GAA0B;AAC3C,oBAAMC,IAAaF,EAAI,OAAO,CAAC,GAAG,WAAW;AAC7C,oBAAM,IAAIG;AAAA,gBACRtD,EAAE,+BAA+B,EAAE,SAASqD,GAAY;AAAA,gBACxD;AAAA,cAAA;AAAA,YAEJ;AACA,kBAAMF;AAAA,UACR;AAAA,QACF;AACA,QAAK9C,EAAY,kBAAkB;AAAA,UACjC,UAAU,CAAC,uBAAuB,mBAAmB,KAAK;AAAA,QAAA,CAC3D,GACDH,EAAQqD,EAAgB,6BAA6BN,CAAY;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACEpD;AAAA,MACAM;AAAA,MACA6B;AAAA,MACAW;AAAA,MACAR;AAAA,MACAvC;AAAA,MACAS;AAAA,MACAH;AAAA,MACAF;AAAA,IAAA;AAAA,EACF,GAGIwD,IAAiBnC,EAAY,YAAY;AAC7C,UAAM2B,IAAQ,CAAC,GAAGvC,CAAa;AAE/B,QAAIuC,EAAM,WAAW,KAAKnD,MAAS,cAAc;AAC/C,MAAAK,EAAQqD,EAAgB,2BAA2B;AACnD;AAAA,IACF;AAEA,UAAMR,EAAUC,CAAK;AAAA,EACvB,GAAG,CAACnD,GAAMY,GAAeP,GAAS6C,CAAS,CAAC,GAEtCU,IAAapC,EAAY,MAAM;AACnC,IAAAnB,EAAQqD,EAAgB,2BAA2B;AAAA,EACrD,GAAG,CAACrD,CAAO,CAAC;AAEZ,SACE,gBAAAlB;AAAA,IAAC0E;AAAA,IAAA;AAAA,MACC,WAAWnD;AAAA,MACX,eAAAE;AAAA,MACA,aAAAC;AAAA,MACA,UAAUU;AAAA,MACV,aAAaI;AAAA,MACb,gBAAgBT;AAAA,MAChB,eAAeC;AAAA,MACf,QAAQyC;AAAA,MACR,YAAYD;AAAA,MACZ,UAAU1D,IAAe,SAAYiC;AAAA,MACrC,iBAAiBjC,IAAe,SAAYyC;AAAA,MAC5C,YAAA5B;AAAA,MACA,YAAAC;AAAA,MACA,WAAW0B;AAAA,IAAA;AAAA,EAAA;AAGjB;"}
@@ -3,27 +3,27 @@ import { useEmployeesListSuspense as R, buildEmployeesListQuery as _ } from "@gu
3
3
  import { useGustoEmbeddedContext as L } from "@gusto/embedded-api/react-query/_context";
4
4
  import { useSuspenseQueries as T } from "@tanstack/react-query";
5
5
  import { Include as h } from "@gusto/embedded-api/models/operations/getv1companiescompanyidemployees";
6
- import { useClientPagination as O } from "../../../../hooks/useClientPagination/useClientPagination.js";
6
+ import { useClientPagination as I } from "../../../../hooks/useClientPagination/useClientPagination.js";
7
7
  const g = 100;
8
- function v(t) {
8
+ function O(t) {
9
9
  if (!t) return !1;
10
- const a = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
11
- return t <= a;
10
+ const n = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
11
+ return t <= n;
12
12
  }
13
- function S(t, a) {
14
- return `${t.firstName ?? ""} ${t.lastName ?? ""}`.toLowerCase().includes(a.toLowerCase());
13
+ function S(t, n) {
14
+ return `${t.firstName ?? ""} ${t.lastName ?? ""} ${t.department ?? ""}`.toLowerCase().includes(n.toLowerCase());
15
15
  }
16
- function k(t, a) {
17
- const y = L(), [E, m] = x(() => /* @__PURE__ */ new Set()), { data: r, isFetching: b } = R({
16
+ function k(t, n) {
17
+ const E = L(), [y, m] = x(() => /* @__PURE__ */ new Set()), { data: l, isFetching: b } = R({
18
18
  companyId: t,
19
19
  terminated: !1,
20
20
  page: 1,
21
21
  per: g,
22
22
  include: [h.AllCompensations]
23
- }), C = Number(r.httpMeta.response.headers.get("x-total-pages") ?? 1), u = T({
23
+ }), C = Number(l.httpMeta.response.headers.get("x-total-pages") ?? 1), u = T({
24
24
  queries: Array.from(
25
25
  { length: Math.max(0, C - 1) },
26
- (s, e) => _(y, {
26
+ (s, e) => _(E, {
27
27
  companyId: t,
28
28
  terminated: !1,
29
29
  page: e + 2,
@@ -31,47 +31,48 @@ function k(t, a) {
31
31
  include: [h.AllCompensations]
32
32
  })
33
33
  )
34
- }), n = M(() => [
35
- ...r.showEmployees ?? [],
34
+ }), o = M(() => [
35
+ ...l.showEmployees ?? [],
36
36
  ...u.flatMap((e) => e.data.showEmployees ?? [])
37
- ].filter((e) => v((e.jobs?.find((i) => i.primary) ?? e.jobs?.[0])?.hireDate)).filter((e) => !a?.has(e.uuid)).map((e) => ({
37
+ ].filter((e) => O((e.jobs?.find((a) => a.primary) ?? e.jobs?.[0])?.hireDate)).filter((e) => !n?.has(e.uuid)).map((e) => ({
38
38
  uuid: e.uuid,
39
39
  firstName: e.firstName,
40
40
  lastName: e.lastName,
41
- jobTitle: e.jobs?.find((i) => i.primary)?.title ?? e.jobs?.[0]?.title ?? null,
41
+ jobTitle: e.jobs?.find((a) => a.primary)?.title ?? e.jobs?.[0]?.title ?? null,
42
42
  department: e.department ?? null,
43
43
  eligiblePaidTimeOff: e.eligiblePaidTimeOff
44
- })), [r.showEmployees, u, a]), {
45
- data: w,
46
- pagination: P,
47
- searchValue: l,
44
+ })), [l.showEmployees, u, n]), {
45
+ data: P,
46
+ pagination: w,
47
+ searchValue: r,
48
48
  actions: d
49
- } = O(n, {
50
- searchPredicate: S
49
+ } = I(o, {
50
+ searchPredicate: S,
51
+ defaultItemsPerPage: 25
51
52
  }), A = u.some((s) => s.isFetching), N = b || A, F = f((s, e) => {
52
- m((i) => {
53
- const o = new Set(i);
54
- return e ? o.add(s.uuid) : o.delete(s.uuid), o;
53
+ m((a) => {
54
+ const i = new Set(a);
55
+ return e ? i.add(s.uuid) : i.delete(s.uuid), i;
55
56
  });
56
57
  }, []), j = f(
57
58
  (s, e) => {
58
- const i = l ? n.filter((o) => S(o, l)) : n;
59
- m((o) => {
60
- const c = new Set(o);
61
- for (const p of i)
59
+ const a = r ? o.filter((i) => S(i, r)) : o;
60
+ m((i) => {
61
+ const c = new Set(i);
62
+ for (const p of a)
62
63
  s ? c.add(p.uuid) : c.delete(p.uuid);
63
64
  return c;
64
65
  });
65
66
  },
66
- [n, l]
67
+ [o, r]
67
68
  );
68
69
  return {
69
- filteredEmployees: w,
70
- eligibleEmployees: n,
71
- eligibleCount: n.length,
72
- selectedUuids: E,
73
- searchValue: l,
74
- pagination: P,
70
+ filteredEmployees: P,
71
+ eligibleEmployees: o,
72
+ eligibleCount: o.length,
73
+ selectedUuids: y,
74
+ searchValue: r,
75
+ pagination: w,
75
76
  isFetching: N,
76
77
  handleSelect: F,
77
78
  handleSelectAll: j,
@@ -80,7 +81,7 @@ function k(t, a) {
80
81
  };
81
82
  }
82
83
  export {
83
- v as isStartedByToday,
84
+ O as isStartedByToday,
84
85
  S as matchesEmployeeSearch,
85
86
  k as useSelectEmployeesData
86
87
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useSelectEmployeesData.js","sources":["../../../../../src/components/TimeOff/TimeOffManagement/SelectEmployees/useSelectEmployeesData.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react'\nimport {\n buildEmployeesListQuery,\n useEmployeesListSuspense,\n} from '@gusto/embedded-api/react-query/employeesList'\nimport { useGustoEmbeddedContext } from '@gusto/embedded-api/react-query/_context'\nimport { useSuspenseQueries } from '@tanstack/react-query'\nimport { Include } from '@gusto/embedded-api/models/operations/getv1companiescompanyidemployees'\nimport type { PaidTimeOff } from '@gusto/embedded-api/models/components/paidtimeoff'\nimport type { EmployeeItem } from './SelectEmployeesPresentationTypes'\nimport { useClientPagination } from '@/hooks/useClientPagination/useClientPagination'\n\nconst SERVER_MAX_PER_PAGE = 100\n\n// Employees whose primary job's hire_date is in the future are rejected by\n// `POST /time_off_policies/:uuid/add_employees` as \"ineligible\" with no\n// per-uuid reason in the response. We can detect this from the employees\n// list response, so we drop them client-side to prevent the error.\nexport function isStartedByToday(hireDate: string | undefined): boolean {\n if (!hireDate) return false\n const today = new Date().toISOString().slice(0, 10)\n return hireDate <= today\n}\n\n// Single source of truth for the search predicate so the client-pagination\n// hook and the select-all handler agree on what's \"in scope\" for a query.\nexport function matchesEmployeeSearch(employee: EmployeeItem, query: string): boolean {\n return `${employee.firstName ?? ''} ${employee.lastName ?? ''}`\n .toLowerCase()\n .includes(query.toLowerCase())\n}\n\nexport function useSelectEmployeesData(companyId: string, excludeUuids?: Set<string>) {\n const gustoClient = useGustoEmbeddedContext()\n const [selectedUuids, setSelectedUuids] = useState<Set<string>>(() => new Set())\n\n // Fetch the full employees list up front so filter, search, and pagination\n // can all be applied client-side. include: all_compensations is required to\n // populate eligiblePaidTimeOff, which carries each employee's current\n // balance on their existing time-off policies — used to pre-fill carry-over\n // balances for selection.\n const { data: firstPage, isFetching: isFirstPageFetching } = useEmployeesListSuspense({\n companyId,\n terminated: false,\n page: 1,\n per: SERVER_MAX_PER_PAGE,\n include: [Include.AllCompensations],\n })\n\n const totalServerPages = Number(firstPage.httpMeta.response.headers.get('x-total-pages') ?? 1)\n\n // For each additional server page we fire a suspense query in parallel.\n // No explicit concurrency cap: typical embedded customers are <100\n // employees (one server page, zero extra requests). For larger companies\n // the browser's per-origin connection limit (~6) acts as the natural\n // ceiling. If this flow ever needs to support thousands of employees,\n // reconsider — either a server-side eligibility filter or a paginated\n // fetch-as-you-scroll strategy would be the right escape hatches.\n const restPageResults = useSuspenseQueries({\n queries: Array.from({ length: Math.max(0, totalServerPages - 1) }, (_, i) =>\n buildEmployeesListQuery(gustoClient, {\n companyId,\n terminated: false,\n page: i + 2,\n per: SERVER_MAX_PER_PAGE,\n include: [Include.AllCompensations],\n }),\n ),\n })\n\n const eligibleEmployees = useMemo<EmployeeItem[]>(() => {\n const showEmployees = [\n ...(firstPage.showEmployees ?? []),\n ...restPageResults.flatMap(r => r.data.showEmployees ?? []),\n ]\n return showEmployees\n .filter(e => isStartedByToday((e.jobs?.find(job => job.primary) ?? e.jobs?.[0])?.hireDate))\n .filter(e => !excludeUuids?.has(e.uuid))\n .map(e => ({\n uuid: e.uuid,\n firstName: e.firstName,\n lastName: e.lastName,\n jobTitle: e.jobs?.find(job => job.primary)?.title ?? e.jobs?.[0]?.title ?? null,\n department: e.department ?? null,\n eligiblePaidTimeOff: e.eligiblePaidTimeOff as PaidTimeOff[] | undefined,\n }))\n }, [firstPage.showEmployees, restPageResults, excludeUuids])\n\n const {\n data: filteredEmployees,\n pagination,\n searchValue,\n actions: paginationActions,\n } = useClientPagination(eligibleEmployees, {\n searchPredicate: matchesEmployeeSearch,\n })\n\n const isRestFetching = restPageResults.some(r => r.isFetching)\n const isFetching = isFirstPageFetching || isRestFetching\n\n const handleSelect = useCallback((item: EmployeeItem, checked: boolean) => {\n setSelectedUuids(prev => {\n const next = new Set(prev)\n if (checked) next.add(item.uuid)\n else next.delete(item.uuid)\n return next\n })\n }, [])\n\n // Select-all scopes to the full search-filtered list (every page), not just\n // the rendered page slice that DataView passes in. This matches the user\n // expectation that \"select all\" actually means \"all\" — including any\n // employees the current pagination has scrolled off-screen. The second\n // argument from DataView (the visible page slice) is intentionally ignored.\n const handleSelectAll = useCallback(\n (checked: boolean, _visibleItems?: EmployeeItem[]) => {\n const scope = searchValue\n ? eligibleEmployees.filter(employee => matchesEmployeeSearch(employee, searchValue))\n : eligibleEmployees\n setSelectedUuids(prev => {\n const next = new Set(prev)\n for (const item of scope) {\n if (checked) next.add(item.uuid)\n else next.delete(item.uuid)\n }\n return next\n })\n },\n [eligibleEmployees, searchValue],\n )\n\n return {\n filteredEmployees,\n eligibleEmployees,\n eligibleCount: eligibleEmployees.length,\n selectedUuids,\n searchValue,\n pagination,\n isFetching,\n handleSelect,\n handleSelectAll,\n handleSearchChange: paginationActions.onSearchChange,\n handleSearchClear: paginationActions.onSearchClear,\n }\n}\n"],"names":["SERVER_MAX_PER_PAGE","isStartedByToday","hireDate","today","matchesEmployeeSearch","employee","query","useSelectEmployeesData","companyId","excludeUuids","gustoClient","useGustoEmbeddedContext","selectedUuids","setSelectedUuids","useState","firstPage","isFirstPageFetching","useEmployeesListSuspense","Include","totalServerPages","restPageResults","useSuspenseQueries","_","i","buildEmployeesListQuery","eligibleEmployees","useMemo","r","job","filteredEmployees","pagination","searchValue","paginationActions","useClientPagination","isRestFetching","isFetching","handleSelect","useCallback","item","checked","prev","next","handleSelectAll","_visibleItems","scope"],"mappings":"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"}
1
+ {"version":3,"file":"useSelectEmployeesData.js","sources":["../../../../../src/components/TimeOff/TimeOffManagement/SelectEmployees/useSelectEmployeesData.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react'\nimport {\n buildEmployeesListQuery,\n useEmployeesListSuspense,\n} from '@gusto/embedded-api/react-query/employeesList'\nimport { useGustoEmbeddedContext } from '@gusto/embedded-api/react-query/_context'\nimport { useSuspenseQueries } from '@tanstack/react-query'\nimport { Include } from '@gusto/embedded-api/models/operations/getv1companiescompanyidemployees'\nimport type { PaidTimeOff } from '@gusto/embedded-api/models/components/paidtimeoff'\nimport type { EmployeeItem } from './SelectEmployeesPresentationTypes'\nimport { useClientPagination } from '@/hooks/useClientPagination/useClientPagination'\n\nconst SERVER_MAX_PER_PAGE = 100\n\n// Employees whose primary job's hire_date is in the future are rejected by\n// `POST /time_off_policies/:uuid/add_employees` as \"ineligible\" with no\n// per-uuid reason in the response. We can detect this from the employees\n// list response, so we drop them client-side to prevent the error.\nexport function isStartedByToday(hireDate: string | undefined): boolean {\n if (!hireDate) return false\n const today = new Date().toISOString().slice(0, 10)\n return hireDate <= today\n}\n\n// Single source of truth for the search predicate so the client-pagination\n// hook and the select-all handler agree on what's \"in scope\" for a query.\nexport function matchesEmployeeSearch(employee: EmployeeItem, query: string): boolean {\n return `${employee.firstName ?? ''} ${employee.lastName ?? ''} ${employee.department ?? ''}`\n .toLowerCase()\n .includes(query.toLowerCase())\n}\n\nexport function useSelectEmployeesData(companyId: string, excludeUuids?: Set<string>) {\n const gustoClient = useGustoEmbeddedContext()\n const [selectedUuids, setSelectedUuids] = useState<Set<string>>(() => new Set())\n\n // Fetch the full employees list up front so filter, search, and pagination\n // can all be applied client-side. include: all_compensations is required to\n // populate eligiblePaidTimeOff, which carries each employee's current\n // balance on their existing time-off policies — used to pre-fill carry-over\n // balances for selection.\n const { data: firstPage, isFetching: isFirstPageFetching } = useEmployeesListSuspense({\n companyId,\n terminated: false,\n page: 1,\n per: SERVER_MAX_PER_PAGE,\n include: [Include.AllCompensations],\n })\n\n const totalServerPages = Number(firstPage.httpMeta.response.headers.get('x-total-pages') ?? 1)\n\n // For each additional server page we fire a suspense query in parallel.\n // No explicit concurrency cap: typical embedded customers are <100\n // employees (one server page, zero extra requests). For larger companies\n // the browser's per-origin connection limit (~6) acts as the natural\n // ceiling. If this flow ever needs to support thousands of employees,\n // reconsider — either a server-side eligibility filter or a paginated\n // fetch-as-you-scroll strategy would be the right escape hatches.\n const restPageResults = useSuspenseQueries({\n queries: Array.from({ length: Math.max(0, totalServerPages - 1) }, (_, i) =>\n buildEmployeesListQuery(gustoClient, {\n companyId,\n terminated: false,\n page: i + 2,\n per: SERVER_MAX_PER_PAGE,\n include: [Include.AllCompensations],\n }),\n ),\n })\n\n const eligibleEmployees = useMemo<EmployeeItem[]>(() => {\n const showEmployees = [\n ...(firstPage.showEmployees ?? []),\n ...restPageResults.flatMap(r => r.data.showEmployees ?? []),\n ]\n return showEmployees\n .filter(e => isStartedByToday((e.jobs?.find(job => job.primary) ?? e.jobs?.[0])?.hireDate))\n .filter(e => !excludeUuids?.has(e.uuid))\n .map(e => ({\n uuid: e.uuid,\n firstName: e.firstName,\n lastName: e.lastName,\n jobTitle: e.jobs?.find(job => job.primary)?.title ?? e.jobs?.[0]?.title ?? null,\n department: e.department ?? null,\n eligiblePaidTimeOff: e.eligiblePaidTimeOff as PaidTimeOff[] | undefined,\n }))\n }, [firstPage.showEmployees, restPageResults, excludeUuids])\n\n const {\n data: filteredEmployees,\n pagination,\n searchValue,\n actions: paginationActions,\n } = useClientPagination(eligibleEmployees, {\n searchPredicate: matchesEmployeeSearch,\n defaultItemsPerPage: 25,\n })\n\n const isRestFetching = restPageResults.some(r => r.isFetching)\n const isFetching = isFirstPageFetching || isRestFetching\n\n const handleSelect = useCallback((item: EmployeeItem, checked: boolean) => {\n setSelectedUuids(prev => {\n const next = new Set(prev)\n if (checked) next.add(item.uuid)\n else next.delete(item.uuid)\n return next\n })\n }, [])\n\n // Select-all scopes to the full search-filtered list (every page), not just\n // the rendered page slice that DataView passes in. This matches the user\n // expectation that \"select all\" actually means \"all\" — including any\n // employees the current pagination has scrolled off-screen. The second\n // argument from DataView (the visible page slice) is intentionally ignored.\n const handleSelectAll = useCallback(\n (checked: boolean, _visibleItems?: EmployeeItem[]) => {\n const scope = searchValue\n ? eligibleEmployees.filter(employee => matchesEmployeeSearch(employee, searchValue))\n : eligibleEmployees\n setSelectedUuids(prev => {\n const next = new Set(prev)\n for (const item of scope) {\n if (checked) next.add(item.uuid)\n else next.delete(item.uuid)\n }\n return next\n })\n },\n [eligibleEmployees, searchValue],\n )\n\n return {\n filteredEmployees,\n eligibleEmployees,\n eligibleCount: eligibleEmployees.length,\n selectedUuids,\n searchValue,\n pagination,\n isFetching,\n handleSelect,\n handleSelectAll,\n handleSearchChange: paginationActions.onSearchChange,\n handleSearchClear: paginationActions.onSearchClear,\n }\n}\n"],"names":["SERVER_MAX_PER_PAGE","isStartedByToday","hireDate","today","matchesEmployeeSearch","employee","query","useSelectEmployeesData","companyId","excludeUuids","gustoClient","useGustoEmbeddedContext","selectedUuids","setSelectedUuids","useState","firstPage","isFirstPageFetching","useEmployeesListSuspense","Include","totalServerPages","restPageResults","useSuspenseQueries","_","i","buildEmployeesListQuery","eligibleEmployees","useMemo","r","job","filteredEmployees","pagination","searchValue","paginationActions","useClientPagination","isRestFetching","isFetching","handleSelect","useCallback","item","checked","prev","next","handleSelectAll","_visibleItems","scope"],"mappings":"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"}