@servicetitan/dte-unlayer 0.157.0 → 0.159.0

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 (166) hide show
  1. package/dist/api-core.js +22 -29
  2. package/dist/api-core.js.map +1 -1
  3. package/dist/api-custom-tools.js +23 -29
  4. package/dist/api-custom-tools.js.map +1 -1
  5. package/dist/business-calendar/BusinessCalendarDrawer.d.ts +19 -0
  6. package/dist/business-calendar/BusinessCalendarDrawer.d.ts.map +1 -0
  7. package/dist/business-calendar/BusinessCalendarDrawer.js +41 -0
  8. package/dist/business-calendar/BusinessCalendarDrawer.js.map +1 -0
  9. package/dist/business-calendar/business-calendar-requests.d.ts +25 -0
  10. package/dist/business-calendar/business-calendar-requests.d.ts.map +1 -0
  11. package/dist/business-calendar/business-calendar-requests.js +46 -0
  12. package/dist/business-calendar/business-calendar-requests.js.map +1 -0
  13. package/dist/business-calendar/business-calendar-state.d.ts +22 -0
  14. package/dist/business-calendar/business-calendar-state.d.ts.map +1 -0
  15. package/dist/business-calendar/business-calendar-state.js +74 -0
  16. package/dist/business-calendar/business-calendar-state.js.map +1 -0
  17. package/dist/business-calendar/useBusinessCalendarRequests.d.ts +15 -0
  18. package/dist/business-calendar/useBusinessCalendarRequests.d.ts.map +1 -0
  19. package/dist/business-calendar/useBusinessCalendarRequests.js +30 -0
  20. package/dist/business-calendar/useBusinessCalendarRequests.js.map +1 -0
  21. package/dist/display-conditions/ConditionGroup.js +15 -89
  22. package/dist/display-conditions/ConditionGroup.js.map +1 -1
  23. package/dist/display-conditions/ConditionGroupsSection.js +2 -70
  24. package/dist/display-conditions/ConditionGroupsSection.js.map +1 -1
  25. package/dist/display-conditions/ConditionRow.d.ts.map +1 -1
  26. package/dist/display-conditions/ConditionRow.js +71 -296
  27. package/dist/display-conditions/ConditionRow.js.map +1 -1
  28. package/dist/display-conditions/DisplayConditionModal.js +40 -190
  29. package/dist/display-conditions/DisplayConditionModal.js.map +1 -1
  30. package/dist/display-conditions/LookupValueControl.d.ts.map +1 -1
  31. package/dist/display-conditions/LookupValueControl.js +42 -109
  32. package/dist/display-conditions/LookupValueControl.js.map +1 -1
  33. package/dist/display-conditions/SeparatorWithChip.js +1 -10
  34. package/dist/display-conditions/SeparatorWithChip.js.map +1 -1
  35. package/dist/display-conditions/constants.js +15 -20
  36. package/dist/display-conditions/constants.js.map +1 -1
  37. package/dist/display-conditions/displayConditionController.js +5 -8
  38. package/dist/display-conditions/displayConditionController.js.map +1 -1
  39. package/dist/display-conditions/lookupOptionsController.js +16 -16
  40. package/dist/display-conditions/lookupOptionsController.js.map +1 -1
  41. package/dist/display-conditions/nunjucks.js +98 -116
  42. package/dist/display-conditions/nunjucks.js.map +1 -1
  43. package/dist/display-conditions/schemaDataPoints.js +13 -11
  44. package/dist/display-conditions/schemaDataPoints.js.map +1 -1
  45. package/dist/display-conditions/types.js +23 -67
  46. package/dist/display-conditions/types.js.map +1 -1
  47. package/dist/display-conditions/useConditionForms.js +38 -56
  48. package/dist/display-conditions/useConditionForms.js.map +1 -1
  49. package/dist/display-conditions/useLookupOptions.js +24 -44
  50. package/dist/display-conditions/useLookupOptions.js.map +1 -1
  51. package/dist/e-sign-offset/ESignDateSignedOffsetModal.d.ts.map +1 -1
  52. package/dist/e-sign-offset/ESignDateSignedOffsetModal.js +48 -156
  53. package/dist/e-sign-offset/ESignDateSignedOffsetModal.js.map +1 -1
  54. package/dist/e-sign-offset/ESignOffsetRuleRow.d.ts +3 -1
  55. package/dist/e-sign-offset/ESignOffsetRuleRow.d.ts.map +1 -1
  56. package/dist/e-sign-offset/ESignOffsetRuleRow.js +12 -71
  57. package/dist/e-sign-offset/ESignOffsetRuleRow.js.map +1 -1
  58. package/dist/e-sign-offset/eSignOffsetController.js +5 -8
  59. package/dist/e-sign-offset/eSignOffsetController.js.map +1 -1
  60. package/dist/editor-core-source.d.ts +2 -2
  61. package/dist/editor-core-source.d.ts.map +1 -1
  62. package/dist/editor-core-source.js +3 -3
  63. package/dist/editor-core-source.js.map +1 -1
  64. package/dist/editor-core.js +2 -2
  65. package/dist/editor-core.js.map +1 -1
  66. package/dist/editor.d.ts.map +1 -1
  67. package/dist/editor.js +56 -118
  68. package/dist/editor.js.map +1 -1
  69. package/dist/image-upload-error.js +3 -3
  70. package/dist/image-upload-error.js.map +1 -1
  71. package/dist/index.d.ts +1 -0
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +0 -1
  74. package/dist/index.js.map +1 -1
  75. package/dist/loadScript.js +7 -8
  76. package/dist/loadScript.js.map +1 -1
  77. package/dist/log.js +2 -3
  78. package/dist/log.js.map +1 -1
  79. package/dist/merge-tags.js +18 -17
  80. package/dist/merge-tags.js.map +1 -1
  81. package/dist/shared/configs.js +1 -2
  82. package/dist/shared/configs.js.map +1 -1
  83. package/dist/shared/const.d.ts +72 -0
  84. package/dist/shared/const.d.ts.map +1 -1
  85. package/dist/shared/const.js +13 -4
  86. package/dist/shared/const.js.map +1 -1
  87. package/dist/shared/date-calc.d.ts +32 -13
  88. package/dist/shared/date-calc.d.ts.map +1 -1
  89. package/dist/shared/date-calc.js +130 -76
  90. package/dist/shared/date-calc.js.map +1 -1
  91. package/dist/shared/e-sign-offset.js +46 -63
  92. package/dist/shared/e-sign-offset.js.map +1 -1
  93. package/dist/shared/edit-icon.js +0 -1
  94. package/dist/shared/edit-icon.js.map +1 -1
  95. package/dist/shared/fonts.js +16 -17
  96. package/dist/shared/fonts.js.map +1 -1
  97. package/dist/shared/forms.js +16 -38
  98. package/dist/shared/forms.js.map +1 -1
  99. package/dist/shared/instance-id.d.ts +3 -0
  100. package/dist/shared/instance-id.d.ts.map +1 -1
  101. package/dist/shared/instance-id.js +10 -7
  102. package/dist/shared/instance-id.js.map +1 -1
  103. package/dist/shared/nunjucks-helpers.js +2 -5
  104. package/dist/shared/nunjucks-helpers.js.map +1 -1
  105. package/dist/shared/schema.js +52 -96
  106. package/dist/shared/schema.js.map +1 -1
  107. package/dist/shared/tools.js +6 -13
  108. package/dist/shared/tools.js.map +1 -1
  109. package/dist/store.d.ts +15 -1
  110. package/dist/store.d.ts.map +1 -1
  111. package/dist/store.js +851 -547
  112. package/dist/store.js.map +1 -1
  113. package/dist/tools.js +133 -143
  114. package/dist/tools.js.map +1 -1
  115. package/dist/unlayer-interface.d.ts +25 -1
  116. package/dist/unlayer-interface.d.ts.map +1 -1
  117. package/dist/unlayer-interface.js +1 -2
  118. package/dist/unlayer-interface.js.map +1 -1
  119. package/dist/unlayer.js +86 -113
  120. package/dist/unlayer.js.map +1 -1
  121. package/dist/vendor/dte-shared/business-calendar-validation.utils.d.ts +25 -0
  122. package/dist/vendor/dte-shared/business-calendar-validation.utils.js +80 -0
  123. package/dist/vendor/dte-shared/components/business-calendar-section.d.ts +15 -0
  124. package/dist/vendor/dte-shared/components/business-calendar-section.js +14 -0
  125. package/dist/vendor/dte-shared/components/schedule-drawer.d.ts +18 -0
  126. package/dist/vendor/dte-shared/components/schedule-drawer.js +119 -0
  127. package/dist/vendor/dte-shared/components/schedule-picker.d.ts +8 -0
  128. package/dist/vendor/dte-shared/components/schedule-picker.js +88 -0
  129. package/dist/vendor/dte-shared/constants.d.ts +31 -0
  130. package/dist/vendor/dte-shared/constants.js +34 -0
  131. package/dist/vendor/dte-shared/field-schedule-editor-context.d.ts +31 -0
  132. package/dist/vendor/dte-shared/field-schedule-editor-context.js +110 -0
  133. package/dist/vendor/dte-shared/index.d.ts +8 -0
  134. package/dist/vendor/dte-shared/index.js +7 -0
  135. package/dist/vendor/dte-shared/schedule-bindings.utils.d.ts +22 -0
  136. package/dist/vendor/dte-shared/schedule-bindings.utils.js +31 -0
  137. package/dist/vendor/dte-shared/styles/schedule.css +19 -0
  138. package/dist/vendor/dte-shared/types.d.ts +129 -0
  139. package/dist/vendor/dte-shared/types.js +1 -0
  140. package/package.json +7 -1
  141. package/src/__tests__/business-calendar-drawer.test.tsx +183 -0
  142. package/src/__tests__/business-calendar-requests.test.ts +166 -0
  143. package/src/__tests__/business-calendar-state.test.tsx +142 -0
  144. package/src/__tests__/condition-row.test.tsx +131 -0
  145. package/src/__tests__/date-calc.test.ts +145 -0
  146. package/src/__tests__/e-sign-offset-modal.test.tsx +124 -0
  147. package/src/__tests__/instance-id.test.ts +49 -0
  148. package/src/__tests__/store.business-calendar.test.ts +185 -0
  149. package/src/__tests__/unlayer.e-sign-types.test.ts +30 -0
  150. package/src/business-calendar/BusinessCalendarDrawer.tsx +76 -0
  151. package/src/business-calendar/business-calendar-requests.ts +80 -0
  152. package/src/business-calendar/business-calendar-state.ts +113 -0
  153. package/src/business-calendar/useBusinessCalendarRequests.ts +49 -0
  154. package/src/display-conditions/ConditionRow.tsx +102 -175
  155. package/src/display-conditions/LookupValueControl.tsx +1 -12
  156. package/src/e-sign-offset/ESignDateSignedOffsetModal.tsx +20 -12
  157. package/src/e-sign-offset/ESignOffsetRuleRow.tsx +7 -2
  158. package/src/editor-core-source.ts +2 -2
  159. package/src/editor.tsx +15 -0
  160. package/src/index.ts +10 -0
  161. package/src/shared/const.ts +61 -0
  162. package/src/shared/date-calc.ts +155 -78
  163. package/src/shared/instance-id.ts +6 -1
  164. package/src/store.ts +68 -5
  165. package/src/unlayer-interface.tsx +25 -1
  166. package/src/unlayer.tsx +5 -5
@@ -1,4 +1,6 @@
1
+ import type { BusinessDaySchedule, HolidayCatalog } from '../vendor/dte-shared/index';
1
2
  import type { DisplayConditionState } from '../display-conditions/types';
3
+ import type { BusinessCalendar } from './date-calc';
2
4
  import { SchemaObject } from './schema';
3
5
  export declare const constGenericsEditor: {
4
6
  infoDataProperty: string;
@@ -38,6 +40,73 @@ export interface UnlayerEventESignOffset {
38
40
  requestId: string;
39
41
  value: ESignDateSignedOffsetSettings;
40
42
  }
43
+ /**
44
+ * Names shown for e-sign field types whose title differs from the type list entry it is derived
45
+ * from (by type value). Only the label changes: the stored value stays, so saved designs and the
46
+ * `esign_<recipient>_<type>` placeholder are unaffected.
47
+ */
48
+ export declare const E_SIGN_FIELD_TYPE_LABELS: Readonly<Record<string, string | undefined>>;
49
+ /**
50
+ * Payload of `--business-calendar-request` (iframe to parent): what a date field's inline schedule
51
+ * settings (a calculated field's or an e-sign "Date Signed Offset" field's) ask the parent window
52
+ * to do. `fieldKey` is the tool's instance id (`values.id`), the key DTE binds the schedule to.
53
+ * - `toggle` / `select`: the exclusion toggle and the schedule picker.
54
+ * - `create` / `edit`: open the schedule drawer, for a new schedule or `scheduleId`.
55
+ * - `delete`: delete the selected schedule; the outcome comes back as `--business-calendar-result`.
56
+ */
57
+ export type UnlayerEventBusinessCalendarRequest = {
58
+ action: 'toggle';
59
+ fieldKey: string;
60
+ enabled: boolean;
61
+ } | {
62
+ action: 'select';
63
+ fieldKey: string;
64
+ scheduleId?: number;
65
+ } | {
66
+ action: 'create';
67
+ fieldKey: string;
68
+ } | {
69
+ action: 'edit';
70
+ fieldKey: string;
71
+ scheduleId: number;
72
+ } | {
73
+ action: 'delete';
74
+ fieldKey: string;
75
+ scheduleId: number;
76
+ requestId: string;
77
+ };
78
+ /** Payload of `--business-calendar-result` (parent to iframe): how a `delete` request ended. */
79
+ export interface UnlayerEventBusinessCalendarResult {
80
+ requestId: string;
81
+ /** Why it failed, shown under the schedule; absent on success. */
82
+ error?: string;
83
+ }
84
+ /**
85
+ * Payload of `--business-calendar-state` (parent to iframe), sent whenever the host's schedule
86
+ * props change: what the property editors show and the calendars the previews use.
87
+ */
88
+ export interface UnlayerEventBusinessCalendarState {
89
+ /** Whether the host edits schedules (it passes `onScheduleBindingsChange`). */
90
+ enabled: boolean;
91
+ /** The fields whose exclusion toggle is on, by field key, with their schedule (none: default). */
92
+ bindings: Record<string, {
93
+ scheduleId?: number;
94
+ }>;
95
+ /** The schedules a field can pick, default first, as the host passes them. */
96
+ schedules: BusinessDaySchedule[];
97
+ schedulesLoading?: boolean;
98
+ schedulesError?: string;
99
+ /** The tenant's known holidays, for the schedule preview's names. */
100
+ holidayCatalog?: HolidayCatalog;
101
+ holidayCatalogLoading?: boolean;
102
+ holidayCatalogError?: string;
103
+ /** Whether the host can delete schedules (it passes `onDeleteSchedule`). */
104
+ canDeleteSchedule: boolean;
105
+ /** Calendars of the bound fields, by field key. */
106
+ fieldCalendars: Record<string, BusinessCalendar>;
107
+ /** The default calendar's holidays. */
108
+ holidays?: string[];
109
+ }
41
110
  export interface UnlayerEditorUnit {
42
111
  id: string;
43
112
  generic: string;
@@ -57,12 +126,15 @@ export interface UnlayerEventConfig {
57
126
  isSnapshotMode?: boolean;
58
127
  units?: UnlayerEditorUnit[];
59
128
  holidays?: string[];
129
+ fieldCalendars?: Record<string, BusinessCalendar>;
60
130
  conditionalRulesEnabled?: boolean;
61
131
  }
62
132
  export interface UnlayerEventRegister {
63
133
  units?: UnlayerEditorUnit[];
64
134
  eSignRecipients?: UnlayerEditorESignRecipientInfo[];
65
135
  eSignFieldTypes?: string[];
136
+ /** {@link E_SIGN_FIELD_TYPE_LABELS}, for the e-sign tool's canvas label. */
137
+ eSignFieldTypeLabels?: Readonly<Record<string, string | undefined>>;
66
138
  customTools?: {
67
139
  key: string;
68
140
  title?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../src/shared/const.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,eAAO,MAAM,mBAAmB;;;;CAI/B,CAAC;AAEF,MAAM,WAAW,+BAA+B;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,WAAW,CAAC;AACzC,eAAO,MAAM,8BAA8B,qBAAqB,CAAC;AACjE,iGAAiG;AACjG,eAAO,MAAM,oCAAoC,0BAA0B,CAAC;AAC5E,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,WAAW,yBAAyB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,SAAS,EAAE,qBAAqB,CAAC;CACpC;AAED,MAAM,WAAW,8BAA8B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,KAAK,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC1C,KAAK,EACC,CAAC,8BAA8B,CAAC,GAChC,CAAC,GAAG,yBAAyB,EAAE,EAAE,8BAA8B,CAAC,CAAC;CAC1E;AAED,mGAAmG;AACnG,MAAM,WAAW,uBAAuB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,6BAA6B,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,GAAG,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,GAAG,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IAC/B,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,EAAE,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACjC,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,+BAA+B,EAAE,CAAC;IACpD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;IACJ,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../src/shared/const.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,21 @@
1
1
  export const constGenericsEditor = {
2
2
  infoDataProperty: '_info',
3
3
  adminConfigProperty: 'adminConfig',
4
- userConfigProperty: 'config'
4
+ userConfigProperty: 'config',
5
5
  };
6
6
  export const E_SIGN_TOOL_SLUG = 'e-sign';
7
7
  export const E_SIGN_DATE_SIGNED_OFFSET_TYPE = 'dateSignedOffset';
8
- /** Must match the backend `EsignFieldSubTypes` registry key read from the e-sign tool values. */ export const E_SIGN_DATE_SIGNED_OFFSET_VALUES_KEY = 'eSignDateSignedOffset';
8
+ /** Must match the backend `EsignFieldSubTypes` registry key read from the e-sign tool values. */
9
+ export const E_SIGN_DATE_SIGNED_OFFSET_VALUES_KEY = 'eSignDateSignedOffset';
9
10
  export const MAX_E_SIGN_OFFSET_DAYS = 365;
10
- /** Counts the trailing unconditional rule too. */ export const MAX_E_SIGN_OFFSET_RULES = 5;
11
-
11
+ /** Counts the trailing unconditional rule too. */
12
+ export const MAX_E_SIGN_OFFSET_RULES = 5;
13
+ /**
14
+ * Names shown for e-sign field types whose title differs from the type list entry it is derived
15
+ * from (by type value). Only the label changes: the stored value stays, so saved designs and the
16
+ * `esign_<recipient>_<type>` placeholder are unaffected.
17
+ */
18
+ export const E_SIGN_FIELD_TYPE_LABELS = {
19
+ [E_SIGN_DATE_SIGNED_OFFSET_TYPE]: 'Calculated Signing Date',
20
+ };
12
21
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shared/const.ts"],"sourcesContent":["import type { DisplayConditionState } from '../display-conditions/types';\nimport { SchemaObject } from './schema';\n\nexport const constGenericsEditor = {\n infoDataProperty: '_info',\n adminConfigProperty: 'adminConfig',\n userConfigProperty: 'config',\n};\n\nexport interface UnlayerEditorESignRecipientInfo {\n id: number;\n name: string;\n displayName: string;\n}\n\nexport const E_SIGN_TOOL_SLUG = 'e-sign';\nexport const E_SIGN_DATE_SIGNED_OFFSET_TYPE = 'dateSignedOffset';\n/** Must match the backend `EsignFieldSubTypes` registry key read from the e-sign tool values. */\nexport const E_SIGN_DATE_SIGNED_OFFSET_VALUES_KEY = 'eSignDateSignedOffset';\nexport const MAX_E_SIGN_OFFSET_DAYS = 365;\n/** Counts the trailing unconditional rule too. */\nexport const MAX_E_SIGN_OFFSET_RULES = 5;\n\nexport interface ESignDateSignedOffsetRule {\n days: number;\n /** Always `behavior: 'show'` with exactly one condition; the backend rejects anything else. */\n condition: DisplayConditionState;\n}\n\nexport interface ESignDateSignedOffsetFinalRule {\n days: number;\n condition?: never;\n}\n\n/**\n * Ordered if / else-if / else chain: the first rule whose condition matches supplies the offset,\n * and the last rule is always the unconditional fallback.\n */\nexport interface ESignDateSignedOffsetSettings {\n rules:\n | [ESignDateSignedOffsetFinalRule]\n | [...ESignDateSignedOffsetRule[], ESignDateSignedOffsetFinalRule];\n}\n\n/** Payload of both `--esign-offset-open` (iframe to parent) and `--esign-offset-result` (back). */\nexport interface UnlayerEventESignOffset {\n requestId: string;\n value: ESignDateSignedOffsetSettings;\n}\n\nexport interface UnlayerEditorUnit {\n id: string;\n generic: string;\n title: string;\n values: any;\n}\n\nexport interface UnlayerEditorTwin {\n tool: string;\n title: string;\n values: any;\n}\n\nexport interface UnlayerEventConfig {\n dummyData?: any;\n schema?: SchemaObject;\n generics?: true | string[];\n genericConfigMode?: boolean;\n isSnapshotMode?: boolean;\n units?: UnlayerEditorUnit[];\n holidays?: string[];\n conditionalRulesEnabled?: boolean;\n}\n\nexport interface UnlayerEventRegister {\n units?: UnlayerEditorUnit[];\n eSignRecipients?: UnlayerEditorESignRecipientInfo[];\n eSignFieldTypes?: string[];\n customTools?: {\n key: string;\n title?: string;\n }[];\n toolTwins?: UnlayerEditorTwin[];\n}\n\nexport interface UnlayerToolMetaData {\n key: string;\n description?: string;\n}\n"],"names":["constGenericsEditor","infoDataProperty","adminConfigProperty","userConfigProperty","E_SIGN_TOOL_SLUG","E_SIGN_DATE_SIGNED_OFFSET_TYPE","E_SIGN_DATE_SIGNED_OFFSET_VALUES_KEY","MAX_E_SIGN_OFFSET_DAYS","MAX_E_SIGN_OFFSET_RULES"],"mappings":"AAGA,OAAO,MAAMA,sBAAsB;IAC/BC,kBAAkB;IAClBC,qBAAqB;IACrBC,oBAAoB;AACxB,EAAE;AAQF,OAAO,MAAMC,mBAAmB,SAAS;AACzC,OAAO,MAAMC,iCAAiC,mBAAmB;AACjE,+FAA+F,GAC/F,OAAO,MAAMC,uCAAuC,wBAAwB;AAC5E,OAAO,MAAMC,yBAAyB,IAAI;AAC1C,gDAAgD,GAChD,OAAO,MAAMC,0BAA0B,EAAE"}
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/shared/const.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,gBAAgB,EAAE,OAAO;IACzB,mBAAmB,EAAE,aAAa;IAClC,kBAAkB,EAAE,QAAQ;CAC/B,CAAC;AAQF,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AACzC,MAAM,CAAC,MAAM,8BAA8B,GAAG,kBAAkB,CAAC;AACjE,iGAAiG;AACjG,MAAM,CAAC,MAAM,oCAAoC,GAAG,uBAAuB,CAAC;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAC1C,kDAAkD;AAClD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AA6BzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAiD;IAClF,CAAC,8BAA8B,CAAC,EAAE,yBAAyB;CAC9D,CAAC"}
@@ -1,31 +1,50 @@
1
1
  export declare const MAX_DATE_CALC_DAYS = 365;
2
2
  /**
3
- * Fallback US federal holidays used when the store config does not provide a
4
- * holidays list. Keep in sync with any similar inline arrays elsewhere (e.g.
5
- * components/scripts/comps/calculated-field.ts).
3
+ * The years DTE knows holidays for (`HolidayCheckService.HolidayYearsWindow`): outside them a
4
+ * default-calendar answer would skip weekends but miss holidays, so it is left blank, as in BYOD.
6
5
  */
7
- export declare const DEFAULT_HOLIDAYS: string[];
8
- export declare const DATE_RANGE_YEARS = 2;
6
+ export declare const DATE_RANGE_YEARS = 1;
9
7
  /**
10
8
  * Returns true if the date's year falls within [currentYear - DATE_RANGE_YEARS, currentYear + DATE_RANGE_YEARS].
11
9
  * Invalid or unparseable dates return false.
12
10
  */
13
11
  export declare function isDateWithinRange(dateInput: unknown): boolean;
12
+ /**
13
+ * Days a date calculation skips, as DTE resolves them (`POST api/holidays/calendar`, and the
14
+ * `calendars` noderenderer receives). Arithmetic outside `firstYear`–`lastYear` is blank; without
15
+ * years no year limit applies.
16
+ */
17
+ export interface BusinessCalendar {
18
+ /** Excluded weekend days, as `Date.getUTCDay()` numbers them: 0 = Sunday, 6 = Saturday. */
19
+ weekendDays: number[];
20
+ /** Holiday dates, already moved to their observed days, as `YYYY-MM-DD`. */
21
+ holidays: string[];
22
+ firstYear?: number | null;
23
+ lastYear?: number | null;
24
+ }
25
+ /** Saturday and Sunday: the default calendar's weekend. */
26
+ export declare const DEFAULT_WEEKEND_DAYS: number[];
27
+ /**
28
+ * Which calendar a calculation uses. With `calendar` (a field bound to a schedule) only that
29
+ * calendar applies. Without it, the default calendar applies: Saturday and Sunday plus `holidays`,
30
+ * with the start and the result limited to the current year ± DATE_RANGE_YEARS.
31
+ */
14
32
  export interface DateCalcOptions {
33
+ calendar?: BusinessCalendar;
15
34
  holidays?: string[];
16
35
  }
17
36
  /**
18
- * Add business days to a date, always skipping weekends and provided holidays.
19
- * Negative days subtracts.
37
+ * Adds business days to a date, as DTE's noderenderer `dateAddDays` does. Returns the result as
38
+ * `YYYY-MM-DD`, or null (a blank field, as in BYOD) for an invalid date, a fractional offset, or
39
+ * a start or result outside the calendar's years.
20
40
  */
21
- export declare function addDays(dateInput: string | Date, days: number, options?: DateCalcOptions): Date;
41
+ export declare function addDays(dateInput: unknown, daysInput: unknown, options?: DateCalcOptions): string | null;
22
42
  /**
23
- * Count the number of business days between two dates, always skipping weekends and provided holidays.
24
- * Returns a positive number when `to` is after `from`, negative otherwise.
43
+ * Counts the business days from `from` to `to` (positive when `to` is later), as DTE's
44
+ * noderenderer `dateDiffDays` does. A formula's `D1 - D2` counts from D2 to D1. Null (a blank
45
+ * field) for an invalid or missing date, or a span over MAX_DATE_CALC_DAYS.
25
46
  */
26
- export declare function dateDiffDays(from: string | Date, to: string | Date, options?: DateCalcOptions): number;
27
- /** Format a Date to ISO date string (YYYY-MM-DD). */
28
- export declare function formatDateResult(date: Date): string;
47
+ export declare function dateDiffDays(fromInput: unknown, toInput: unknown, options?: DateCalcOptions): number | null;
29
48
  export declare const DEFAULT_DATE_FORMAT = "MM/DD/YYYY";
30
49
  /**
31
50
  * Format a Date using a pattern string.
@@ -1 +1 @@
1
- {"version":3,"file":"date-calc.d.ts","sourceRoot":"","sources":["../../src/shared/date-calc.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAUpC,CAAC;AAEF,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAW7D;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AA4CD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CA0B/F;AAED;;;GAGG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,OAAO,CAAC,EAAE,eAAe,GAC1B,MAAM,CA0BR;AAED,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAKnD;AAED,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAgChD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB/D"}
1
+ {"version":3,"file":"date-calc.d.ts","sourceRoot":"","sources":["../../src/shared/date-calc.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAW7D;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC7B,2FAA2F;IAC3F,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,UAAS,CAAC;AAE3C;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAgJD;;;;GAIG;AACH,wBAAgB,OAAO,CACnB,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,eAAe,GAC1B,MAAM,GAAG,IAAI,CAaf;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CACxB,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,eAAe,GAC1B,MAAM,GAAG,IAAI,CAQf;AAED,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAgChD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB/D"}
@@ -1,24 +1,14 @@
1
1
  export const MAX_DATE_CALC_DAYS = 365;
2
2
  /**
3
- * Fallback US federal holidays used when the store config does not provide a
4
- * holidays list. Keep in sync with any similar inline arrays elsewhere (e.g.
5
- * components/scripts/comps/calculated-field.ts).
6
- */ export const DEFAULT_HOLIDAYS = [
7
- '2026-01-01T00:00:00.000Z',
8
- '2026-01-19T00:00:00.000Z',
9
- '2026-02-16T00:00:00.000Z',
10
- '2026-05-25T00:00:00.000Z',
11
- '2026-07-04T00:00:00.000Z',
12
- '2026-09-07T00:00:00.000Z',
13
- '2026-11-26T00:00:00.000Z',
14
- '2026-11-27T00:00:00.000Z',
15
- '2026-12-25T00:00:00.000Z'
16
- ];
17
- export const DATE_RANGE_YEARS = 2;
3
+ * The years DTE knows holidays for (`HolidayCheckService.HolidayYearsWindow`): outside them a
4
+ * default-calendar answer would skip weekends but miss holidays, so it is left blank, as in BYOD.
5
+ */
6
+ export const DATE_RANGE_YEARS = 1;
18
7
  /**
19
8
  * Returns true if the date's year falls within [currentYear - DATE_RANGE_YEARS, currentYear + DATE_RANGE_YEARS].
20
9
  * Invalid or unparseable dates return false.
21
- */ export function isDateWithinRange(dateInput) {
10
+ */
11
+ export function isDateWithinRange(dateInput) {
22
12
  if (typeof dateInput !== 'string' && !(dateInput instanceof Date)) {
23
13
  return false;
24
14
  }
@@ -30,6 +20,8 @@ export const DATE_RANGE_YEARS = 2;
30
20
  const year = d.getUTCFullYear();
31
21
  return year >= currentYear - DATE_RANGE_YEARS && year <= currentYear + DATE_RANGE_YEARS;
32
22
  }
23
+ /** Saturday and Sunday: the default calendar's weekend. */
24
+ export const DEFAULT_WEEKEND_DAYS = [0, 6];
33
25
  function toDateOnly(input) {
34
26
  const d = typeof input === 'string' ? new Date(input) : new Date(input.getTime());
35
27
  d.setUTCHours(0, 0, 0, 0);
@@ -41,88 +33,142 @@ function toDateKey(d) {
41
33
  const day = String(d.getUTCDate()).padStart(2, '0');
42
34
  return `${y}-${m}-${day}`;
43
35
  }
44
- function isWeekend(d) {
45
- const day = d.getUTCDay();
46
- return day === 0 || day === 6;
36
+ function parseDate(input) {
37
+ if (typeof input !== 'string' && !(input instanceof Date)) {
38
+ return null;
39
+ }
40
+ const d = toDateOnly(input);
41
+ return isFinite(d.getTime()) ? d : null;
47
42
  }
48
43
  function buildHolidaySet(holidays) {
49
- if (!(holidays === null || holidays === void 0 ? void 0 : holidays.length)) {
50
- return new Set();
51
- }
52
44
  const set = new Set();
53
- for (const h of holidays){
54
- const d = toDateOnly(h);
55
- if (!isNaN(d.getTime())) {
45
+ for (const h of holidays !== null && holidays !== void 0 ? holidays : []) {
46
+ const d = parseDate(h);
47
+ if (d) {
56
48
  set.add(toDateKey(d));
57
49
  }
58
50
  }
59
51
  return set;
60
52
  }
61
- function isNonBusinessDay(d, holidaySet) {
62
- if (isWeekend(d)) {
63
- return true;
53
+ // Calendars are passed once and reused by every calculation, so each is prepared once.
54
+ const preparedCalendars = new WeakMap();
55
+ function prepareCalendar(calendar) {
56
+ var _a, _b, _c;
57
+ const cached = preparedCalendars.get(calendar);
58
+ if (cached) {
59
+ return cached;
64
60
  }
65
- if (holidaySet.size > 0 && holidaySet.has(toDateKey(d))) {
66
- return true;
67
- }
68
- return false;
61
+ const prepared = {
62
+ weekendDays: new Set((_a = calendar.weekendDays) !== null && _a !== void 0 ? _a : DEFAULT_WEEKEND_DAYS),
63
+ holidays: buildHolidaySet(calendar.holidays),
64
+ firstYear: (_b = calendar.firstYear) !== null && _b !== void 0 ? _b : null,
65
+ lastYear: (_c = calendar.lastYear) !== null && _c !== void 0 ? _c : null,
66
+ };
67
+ preparedCalendars.set(calendar, prepared);
68
+ return prepared;
69
69
  }
70
- /**
71
- * Add business days to a date, always skipping weekends and provided holidays.
72
- * Negative days subtracts.
73
- */ export function addDays(dateInput, days, options) {
74
- const result = toDateOnly(dateInput);
75
- if (!isFinite(result.getTime())) {
76
- return result;
70
+ // One calendar per holidays array, so the default calendar is also prepared once.
71
+ const holidayCalendars = new WeakMap();
72
+ const NO_HOLIDAYS_CALENDAR = { weekendDays: DEFAULT_WEEKEND_DAYS, holidays: [] };
73
+ function defaultCalendar(holidays) {
74
+ if (!Array.isArray(holidays)) {
75
+ return NO_HOLIDAYS_CALENDAR;
77
76
  }
78
- const intDays = Math.trunc(days);
79
- if (intDays === 0) {
80
- return result;
77
+ let calendar = holidayCalendars.get(holidays);
78
+ if (!calendar) {
79
+ calendar = { weekendDays: DEFAULT_WEEKEND_DAYS, holidays };
80
+ holidayCalendars.set(holidays, calendar);
81
81
  }
82
- if (Math.abs(intDays) > MAX_DATE_CALC_DAYS) {
83
- return new Date(NaN);
82
+ return calendar;
83
+ }
84
+ function isBusinessDay(d, calendar) {
85
+ return !calendar.weekendDays.has(d.getUTCDay()) && !calendar.holidays.has(toDateKey(d));
86
+ }
87
+ function isWithinYears(d, calendar) {
88
+ const year = d.getUTCFullYear();
89
+ return ((calendar.firstYear === null || year >= calendar.firstYear) &&
90
+ (calendar.lastYear === null || year <= calendar.lastYear));
91
+ }
92
+ /**
93
+ * Walks `days` business days from `start` (negative walks back); the start is not counted.
94
+ * Mirrors `BusinessDayCalculator.AddBusinessDays` in DTE: null for more than MAX_DATE_CALC_DAYS,
95
+ * or when the start or the walk leaves the calendar's years.
96
+ */
97
+ function addBusinessDays(start, days, calendar) {
98
+ if (Math.abs(days) > MAX_DATE_CALC_DAYS || !isWithinYears(start, calendar)) {
99
+ return null;
84
100
  }
85
- const holidaySet = buildHolidaySet(options === null || options === void 0 ? void 0 : options.holidays);
86
- const direction = intDays > 0 ? 1 : -1;
87
- let remaining = Math.abs(intDays);
88
- while(remaining > 0){
89
- result.setUTCDate(result.getUTCDate() + direction);
90
- if (!isNonBusinessDay(result, holidaySet)) {
101
+ const direction = days >= 0 ? 1 : -1;
102
+ let remaining = Math.abs(days);
103
+ const current = new Date(start.getTime());
104
+ while (remaining > 0) {
105
+ current.setUTCDate(current.getUTCDate() + direction);
106
+ if (!isWithinYears(current, calendar)) {
107
+ return null;
108
+ }
109
+ if (isBusinessDay(current, calendar)) {
91
110
  remaining--;
92
111
  }
93
112
  }
94
- return result;
113
+ return current;
95
114
  }
96
115
  /**
97
- * Count the number of business days between two dates, always skipping weekends and provided holidays.
98
- * Returns a positive number when `to` is after `from`, negative otherwise.
99
- */ export function dateDiffDays(from, to, options) {
100
- const start = toDateOnly(from);
101
- const end = toDateOnly(to);
102
- if (!isFinite(start.getTime()) || !isFinite(end.getTime())) {
103
- return 0;
104
- }
105
- const calendarDiff = Math.abs(end.getTime() - start.getTime()) / (24 * 60 * 60 * 1000);
106
- if (calendarDiff > MAX_DATE_CALC_DAYS * 2) {
107
- return NaN;
116
+ * Counts the business days from `from` to `to`, negative when `to` is earlier; the start is not
117
+ * counted, the end is. Mirrors `BusinessDayCalculator.CountBusinessDays` in DTE: null for a span
118
+ * over MAX_DATE_CALC_DAYS, or a date outside the calendar's years.
119
+ */
120
+ function countBusinessDays(from, to, calendar) {
121
+ const span = Math.abs(to.getTime() - from.getTime()) / (24 * 60 * 60 * 1000);
122
+ if (span > MAX_DATE_CALC_DAYS ||
123
+ !isWithinYears(from, calendar) ||
124
+ !isWithinYears(to, calendar)) {
125
+ return null;
108
126
  }
109
- const holidaySet = buildHolidaySet(options === null || options === void 0 ? void 0 : options.holidays);
110
- const direction = end.getTime() >= start.getTime() ? 1 : -1;
111
- const cursor = new Date(start.getTime());
127
+ const direction = to.getTime() >= from.getTime() ? 1 : -1;
128
+ const cursor = new Date(from.getTime());
112
129
  let count = 0;
113
- while(toDateKey(cursor) !== toDateKey(end)){
130
+ while (toDateKey(cursor) !== toDateKey(to)) {
114
131
  cursor.setUTCDate(cursor.getUTCDate() + direction);
115
- if (!isNonBusinessDay(cursor, holidaySet)) {
132
+ if (isBusinessDay(cursor, calendar)) {
116
133
  count++;
117
134
  }
118
135
  }
119
136
  return count * direction;
120
137
  }
121
- /** Format a Date to ISO date string (YYYY-MM-DD). */ export function formatDateResult(date) {
122
- if (!isFinite(date.getTime())) {
123
- return '';
138
+ /**
139
+ * Adds business days to a date, as DTE's noderenderer `dateAddDays` does. Returns the result as
140
+ * `YYYY-MM-DD`, or null (a blank field, as in BYOD) for an invalid date, a fractional offset, or
141
+ * a start or result outside the calendar's years.
142
+ */
143
+ export function addDays(dateInput, daysInput, options) {
144
+ var _a;
145
+ const isDefault = !(options === null || options === void 0 ? void 0 : options.calendar);
146
+ const calendar = prepareCalendar((_a = options === null || options === void 0 ? void 0 : options.calendar) !== null && _a !== void 0 ? _a : defaultCalendar(options === null || options === void 0 ? void 0 : options.holidays));
147
+ const start = parseDate(dateInput);
148
+ const days = Number(daysInput);
149
+ if (!start || !Number.isInteger(days) || (isDefault && !isDateWithinRange(start))) {
150
+ return null;
151
+ }
152
+ const result = addBusinessDays(start, days, calendar);
153
+ if (!result || (isDefault && !isDateWithinRange(result))) {
154
+ return null;
155
+ }
156
+ return toDateKey(result);
157
+ }
158
+ /**
159
+ * Counts the business days from `from` to `to` (positive when `to` is later), as DTE's
160
+ * noderenderer `dateDiffDays` does. A formula's `D1 - D2` counts from D2 to D1. Null (a blank
161
+ * field) for an invalid or missing date, or a span over MAX_DATE_CALC_DAYS.
162
+ */
163
+ export function dateDiffDays(fromInput, toInput, options) {
164
+ var _a;
165
+ const calendar = prepareCalendar((_a = options === null || options === void 0 ? void 0 : options.calendar) !== null && _a !== void 0 ? _a : defaultCalendar(options === null || options === void 0 ? void 0 : options.holidays));
166
+ const from = parseDate(fromInput);
167
+ const to = parseDate(toInput);
168
+ if (!from || !to) {
169
+ return null;
124
170
  }
125
- return toDateKey(date);
171
+ return countBusinessDays(from, to, calendar);
126
172
  }
127
173
  export const DEFAULT_DATE_FORMAT = 'MM/DD/YYYY';
128
174
  const MONTH_NAMES_FULL = [
@@ -137,7 +183,7 @@ const MONTH_NAMES_FULL = [
137
183
  'September',
138
184
  'October',
139
185
  'November',
140
- 'December'
186
+ 'December',
141
187
  ];
142
188
  const MONTH_NAMES_SHORT = [
143
189
  'Jan',
@@ -151,13 +197,14 @@ const MONTH_NAMES_SHORT = [
151
197
  'Sep',
152
198
  'Oct',
153
199
  'Nov',
154
- 'Dec'
200
+ 'Dec',
155
201
  ];
156
202
  /**
157
203
  * Format a Date using a pattern string.
158
204
  * Supported tokens: YYYY, YY, MMMM, MMM, MM, M, DD, D.
159
205
  * All other characters are treated as literals.
160
- */ export function formatDate(date, pattern) {
206
+ */
207
+ export function formatDate(date, pattern) {
161
208
  if (!isFinite(date.getTime())) {
162
209
  return '';
163
210
  }
@@ -165,7 +212,14 @@ const MONTH_NAMES_SHORT = [
165
212
  const year = date.getUTCFullYear();
166
213
  const month = date.getUTCMonth();
167
214
  const day = date.getUTCDate();
168
- return fmt.replace(/YYYY/g, String(year)).replace(/YY/g, String(year).slice(-2)).replace(/MMMM/g, MONTH_NAMES_FULL[month]).replace(/MMM/g, MONTH_NAMES_SHORT[month]).replace(/MM/g, String(month + 1).padStart(2, '0')).replace(/\bM\b/g, String(month + 1)).replace(/DD/g, String(day).padStart(2, '0')).replace(/\bD\b/g, String(day));
215
+ return fmt
216
+ .replace(/YYYY/g, String(year))
217
+ .replace(/YY/g, String(year).slice(-2))
218
+ .replace(/MMMM/g, MONTH_NAMES_FULL[month])
219
+ .replace(/MMM/g, MONTH_NAMES_SHORT[month])
220
+ .replace(/MM/g, String(month + 1).padStart(2, '0'))
221
+ .replace(/\bM\b/g, String(month + 1))
222
+ .replace(/DD/g, String(day).padStart(2, '0'))
223
+ .replace(/\bD\b/g, String(day));
169
224
  }
170
-
171
225
  //# sourceMappingURL=date-calc.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shared/date-calc.ts"],"sourcesContent":["export const MAX_DATE_CALC_DAYS = 365;\n\n/**\n * Fallback US federal holidays used when the store config does not provide a\n * holidays list. Keep in sync with any similar inline arrays elsewhere (e.g.\n * components/scripts/comps/calculated-field.ts).\n */\nexport const DEFAULT_HOLIDAYS: string[] = [\n '2026-01-01T00:00:00.000Z',\n '2026-01-19T00:00:00.000Z',\n '2026-02-16T00:00:00.000Z',\n '2026-05-25T00:00:00.000Z',\n '2026-07-04T00:00:00.000Z',\n '2026-09-07T00:00:00.000Z',\n '2026-11-26T00:00:00.000Z',\n '2026-11-27T00:00:00.000Z',\n '2026-12-25T00:00:00.000Z',\n];\n\nexport const DATE_RANGE_YEARS = 2;\n\n/**\n * Returns true if the date's year falls within [currentYear - DATE_RANGE_YEARS, currentYear + DATE_RANGE_YEARS].\n * Invalid or unparseable dates return false.\n */\nexport function isDateWithinRange(dateInput: unknown): boolean {\n if (typeof dateInput !== 'string' && !(dateInput instanceof Date)) {\n return false;\n }\n const d = typeof dateInput === 'string' ? new Date(dateInput) : dateInput;\n if (!isFinite(d.getTime())) {\n return false;\n }\n const currentYear = new Date().getUTCFullYear();\n const year = d.getUTCFullYear();\n return year >= currentYear - DATE_RANGE_YEARS && year <= currentYear + DATE_RANGE_YEARS;\n}\n\nexport interface DateCalcOptions {\n holidays?: string[];\n}\n\nfunction toDateOnly(input: string | Date): Date {\n const d = typeof input === 'string' ? new Date(input) : new Date(input.getTime());\n d.setUTCHours(0, 0, 0, 0);\n return d;\n}\n\nfunction toDateKey(d: Date): string {\n const y = d.getUTCFullYear();\n const m = String(d.getUTCMonth() + 1).padStart(2, '0');\n const day = String(d.getUTCDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\nfunction isWeekend(d: Date): boolean {\n const day = d.getUTCDay();\n return day === 0 || day === 6;\n}\n\nfunction buildHolidaySet(holidays?: string[]): Set<string> {\n if (!holidays?.length) {\n return new Set();\n }\n const set = new Set<string>();\n for (const h of holidays) {\n const d = toDateOnly(h);\n if (!isNaN(d.getTime())) {\n set.add(toDateKey(d));\n }\n }\n return set;\n}\n\nfunction isNonBusinessDay(d: Date, holidaySet: Set<string>): boolean {\n if (isWeekend(d)) {\n return true;\n }\n if (holidaySet.size > 0 && holidaySet.has(toDateKey(d))) {\n return true;\n }\n return false;\n}\n\n/**\n * Add business days to a date, always skipping weekends and provided holidays.\n * Negative days subtracts.\n */\nexport function addDays(dateInput: string | Date, days: number, options?: DateCalcOptions): Date {\n const result = toDateOnly(dateInput);\n if (!isFinite(result.getTime())) {\n return result;\n }\n\n const intDays = Math.trunc(days);\n if (intDays === 0) {\n return result;\n }\n if (Math.abs(intDays) > MAX_DATE_CALC_DAYS) {\n return new Date(NaN);\n }\n\n const holidaySet = buildHolidaySet(options?.holidays);\n const direction = intDays > 0 ? 1 : -1;\n let remaining = Math.abs(intDays);\n\n while (remaining > 0) {\n result.setUTCDate(result.getUTCDate() + direction);\n if (!isNonBusinessDay(result, holidaySet)) {\n remaining--;\n }\n }\n\n return result;\n}\n\n/**\n * Count the number of business days between two dates, always skipping weekends and provided holidays.\n * Returns a positive number when `to` is after `from`, negative otherwise.\n */\nexport function dateDiffDays(\n from: string | Date,\n to: string | Date,\n options?: DateCalcOptions,\n): number {\n const start = toDateOnly(from);\n const end = toDateOnly(to);\n\n if (!isFinite(start.getTime()) || !isFinite(end.getTime())) {\n return 0;\n }\n\n const calendarDiff = Math.abs(end.getTime() - start.getTime()) / (24 * 60 * 60 * 1000);\n if (calendarDiff > MAX_DATE_CALC_DAYS * 2) {\n return NaN;\n }\n\n const holidaySet = buildHolidaySet(options?.holidays);\n const direction = end.getTime() >= start.getTime() ? 1 : -1;\n const cursor = new Date(start.getTime());\n let count = 0;\n\n while (toDateKey(cursor) !== toDateKey(end)) {\n cursor.setUTCDate(cursor.getUTCDate() + direction);\n if (!isNonBusinessDay(cursor, holidaySet)) {\n count++;\n }\n }\n\n return count * direction;\n}\n\n/** Format a Date to ISO date string (YYYY-MM-DD). */\nexport function formatDateResult(date: Date): string {\n if (!isFinite(date.getTime())) {\n return '';\n }\n return toDateKey(date);\n}\n\nexport const DEFAULT_DATE_FORMAT = 'MM/DD/YYYY';\n\nconst MONTH_NAMES_FULL = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nconst MONTH_NAMES_SHORT = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\n/**\n * Format a Date using a pattern string.\n * Supported tokens: YYYY, YY, MMMM, MMM, MM, M, DD, D.\n * All other characters are treated as literals.\n */\nexport function formatDate(date: Date, pattern?: string): string {\n if (!isFinite(date.getTime())) {\n return '';\n }\n const fmt = pattern ?? DEFAULT_DATE_FORMAT;\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth();\n const day = date.getUTCDate();\n\n return fmt\n .replace(/YYYY/g, String(year))\n .replace(/YY/g, String(year).slice(-2))\n .replace(/MMMM/g, MONTH_NAMES_FULL[month])\n .replace(/MMM/g, MONTH_NAMES_SHORT[month])\n .replace(/MM/g, String(month + 1).padStart(2, '0'))\n .replace(/\\bM\\b/g, String(month + 1))\n .replace(/DD/g, String(day).padStart(2, '0'))\n .replace(/\\bD\\b/g, String(day));\n}\n"],"names":["MAX_DATE_CALC_DAYS","DEFAULT_HOLIDAYS","DATE_RANGE_YEARS","isDateWithinRange","dateInput","Date","d","isFinite","getTime","currentYear","getUTCFullYear","year","toDateOnly","input","setUTCHours","toDateKey","y","m","String","getUTCMonth","padStart","day","getUTCDate","isWeekend","getUTCDay","buildHolidaySet","holidays","length","Set","set","h","isNaN","add","isNonBusinessDay","holidaySet","size","has","addDays","days","options","result","intDays","Math","trunc","abs","NaN","direction","remaining","setUTCDate","dateDiffDays","from","to","start","end","calendarDiff","cursor","count","formatDateResult","date","DEFAULT_DATE_FORMAT","MONTH_NAMES_FULL","MONTH_NAMES_SHORT","formatDate","pattern","fmt","month","replace","slice"],"mappings":"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"}
1
+ {"version":3,"file":"date-calc.js","sourceRoot":"","sources":["../../src/shared/date-calc.ts"],"names":[],"mappings":"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"}