@elliemae/loan-field-renderers 26.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/dist/cjs/ARCHITECTURE.md +434 -0
  2. package/dist/cjs/OVERVIEW.md +229 -0
  3. package/dist/cjs/bll/constants.js +86 -0
  4. package/dist/cjs/bll/formatters/booleanFormatter.js +51 -0
  5. package/dist/cjs/bll/formatters/dateFormatter.js +78 -0
  6. package/dist/cjs/bll/formatters/dropdownFormatter.js +34 -0
  7. package/dist/cjs/bll/formatters/factory/index.js +115 -0
  8. package/dist/cjs/bll/formatters/index.js +24 -0
  9. package/dist/cjs/bll/formatters/numberFormatter.js +70 -0
  10. package/dist/cjs/bll/formatters/phoneFormatter.js +57 -0
  11. package/dist/cjs/bll/formatters/regexFormatter.js +52 -0
  12. package/dist/cjs/bll/formatters/ssnFormatter.js +50 -0
  13. package/dist/cjs/bll/formatters/textFormatter.js +43 -0
  14. package/dist/cjs/bll/formatters/zipFormatter.js +48 -0
  15. package/dist/cjs/bll/index.js +62 -0
  16. package/dist/cjs/bll/ssf/index.js +48 -0
  17. package/dist/cjs/bll/ssf/loan.js +81 -0
  18. package/dist/cjs/bll/ssf/loconnect.js +70 -0
  19. package/dist/cjs/bll/ssf/ssfBase.js +97 -0
  20. package/dist/cjs/bll/ssf/types.js +16 -0
  21. package/dist/cjs/bll/types.js +16 -0
  22. package/dist/cjs/bll/validators/dateValidator.js +60 -0
  23. package/dist/cjs/bll/validators/emailValidator.js +47 -0
  24. package/dist/cjs/bll/validators/factory/index.js +81 -0
  25. package/dist/cjs/bll/validators/index.js +24 -0
  26. package/dist/cjs/bll/validators/maxCharValidator.js +49 -0
  27. package/dist/cjs/bll/validators/requiredValidator.js +44 -0
  28. package/dist/cjs/bll/validators/zipValidator.js +53 -0
  29. package/dist/cjs/core/index.js +52 -0
  30. package/dist/cjs/demo/config.js +391 -0
  31. package/dist/cjs/demo/index.js +31 -0
  32. package/dist/cjs/package.json +7 -0
  33. package/dist/cjs/renderer/FieldRenderer.js +45 -0
  34. package/dist/cjs/renderer/base/hooks/fieldDescription.js +39 -0
  35. package/dist/cjs/renderer/base/hooks/fieldDisabled.js +53 -0
  36. package/dist/cjs/renderer/base/hooks/fieldGoTo.js +50 -0
  37. package/dist/cjs/renderer/base/hooks/fieldLocked.js +42 -0
  38. package/dist/cjs/renderer/base/hooks/fieldMeta.js +150 -0
  39. package/dist/cjs/renderer/base/hooks/fieldSubscribers.js +66 -0
  40. package/dist/cjs/renderer/base/hooks/fieldValidation.js +45 -0
  41. package/dist/cjs/renderer/base/hooks/fieldValue.js +215 -0
  42. package/dist/cjs/renderer/base/hooks/hookBase.js +29 -0
  43. package/dist/cjs/renderer/base/hooks/index.js +139 -0
  44. package/dist/cjs/renderer/base/renderer.js +198 -0
  45. package/dist/cjs/renderer/base/rendererValidator.js +97 -0
  46. package/dist/cjs/renderer/factory/index.js +58 -0
  47. package/dist/cjs/renderer/field-renderers/AddonRenderer.js +75 -0
  48. package/dist/cjs/renderer/field-renderers/CheckboxRenderer.js +123 -0
  49. package/dist/cjs/renderer/field-renderers/DateRenderer.js +206 -0
  50. package/dist/cjs/renderer/field-renderers/DropdownRenderer/hook.js +99 -0
  51. package/dist/cjs/renderer/field-renderers/DropdownRenderer/index.js +216 -0
  52. package/dist/cjs/renderer/field-renderers/LargeTextRenderer.js +209 -0
  53. package/dist/cjs/renderer/field-renderers/NumberRenderer.js +216 -0
  54. package/dist/cjs/renderer/field-renderers/RadioGroupRenderer.js +128 -0
  55. package/dist/cjs/renderer/field-renderers/RadioRenderer.js +121 -0
  56. package/dist/cjs/renderer/field-renderers/TextRenderer.js +223 -0
  57. package/dist/cjs/renderer/field-renderers/ToggleRenderer.js +121 -0
  58. package/dist/cjs/renderer/field-renderers/ZipCodeRenderer/helper.js +132 -0
  59. package/dist/cjs/renderer/field-renderers/ZipCodeRenderer/hook.js +128 -0
  60. package/dist/cjs/renderer/field-renderers/ZipCodeRenderer/index.js +273 -0
  61. package/dist/cjs/renderer/index.js +24 -0
  62. package/dist/cjs/renderer/styles.js +51 -0
  63. package/dist/cjs/renderer/types.js +16 -0
  64. package/dist/cjs/tests/base/flowBase.js +125 -0
  65. package/dist/cjs/tests/base/index.js +52 -0
  66. package/dist/cjs/tests/flows/checkboxRendererFlows.js +85 -0
  67. package/dist/cjs/tests/flows/dateRendererFlows.js +870 -0
  68. package/dist/cjs/tests/flows/dropdownRendererFlows.js +591 -0
  69. package/dist/cjs/tests/flows/largeTextRendererFlows.js +99 -0
  70. package/dist/cjs/tests/flows/numberRendererFlows.js +175 -0
  71. package/dist/cjs/tests/flows/radioRendererFlows.js +115 -0
  72. package/dist/cjs/tests/flows/textRendererFlows.js +349 -0
  73. package/dist/cjs/tests/flows/toggleRendererFlows.js +106 -0
  74. package/dist/cjs/tests/flows/zipCodeRendererFlows.js +1163 -0
  75. package/dist/cjs/utils/dateHelper.js +65 -0
  76. package/dist/esm/ARCHITECTURE.md +434 -0
  77. package/dist/esm/OVERVIEW.md +229 -0
  78. package/dist/esm/bll/constants.js +66 -0
  79. package/dist/esm/bll/formatters/booleanFormatter.js +33 -0
  80. package/dist/esm/bll/formatters/dateFormatter.js +48 -0
  81. package/dist/esm/bll/formatters/dropdownFormatter.js +14 -0
  82. package/dist/esm/bll/formatters/factory/index.js +97 -0
  83. package/dist/esm/bll/formatters/index.js +4 -0
  84. package/dist/esm/bll/formatters/numberFormatter.js +54 -0
  85. package/dist/esm/bll/formatters/phoneFormatter.js +41 -0
  86. package/dist/esm/bll/formatters/regexFormatter.js +34 -0
  87. package/dist/esm/bll/formatters/ssnFormatter.js +32 -0
  88. package/dist/esm/bll/formatters/textFormatter.js +25 -0
  89. package/dist/esm/bll/formatters/zipFormatter.js +30 -0
  90. package/dist/esm/bll/index.js +44 -0
  91. package/dist/esm/bll/ssf/index.js +30 -0
  92. package/dist/esm/bll/ssf/loan.js +63 -0
  93. package/dist/esm/bll/ssf/loconnect.js +52 -0
  94. package/dist/esm/bll/ssf/ssfBase.js +67 -0
  95. package/dist/esm/bll/ssf/types.js +0 -0
  96. package/dist/esm/bll/types.js +0 -0
  97. package/dist/esm/bll/validators/dateValidator.js +30 -0
  98. package/dist/esm/bll/validators/emailValidator.js +29 -0
  99. package/dist/esm/bll/validators/factory/index.js +63 -0
  100. package/dist/esm/bll/validators/index.js +4 -0
  101. package/dist/esm/bll/validators/maxCharValidator.js +31 -0
  102. package/dist/esm/bll/validators/requiredValidator.js +26 -0
  103. package/dist/esm/bll/validators/zipValidator.js +35 -0
  104. package/dist/esm/core/index.js +34 -0
  105. package/dist/esm/demo/config.js +371 -0
  106. package/dist/esm/demo/index.js +11 -0
  107. package/dist/esm/package.json +7 -0
  108. package/dist/esm/renderer/FieldRenderer.js +15 -0
  109. package/dist/esm/renderer/base/hooks/fieldDescription.js +19 -0
  110. package/dist/esm/renderer/base/hooks/fieldDisabled.js +33 -0
  111. package/dist/esm/renderer/base/hooks/fieldGoTo.js +30 -0
  112. package/dist/esm/renderer/base/hooks/fieldLocked.js +22 -0
  113. package/dist/esm/renderer/base/hooks/fieldMeta.js +132 -0
  114. package/dist/esm/renderer/base/hooks/fieldSubscribers.js +36 -0
  115. package/dist/esm/renderer/base/hooks/fieldValidation.js +25 -0
  116. package/dist/esm/renderer/base/hooks/fieldValue.js +195 -0
  117. package/dist/esm/renderer/base/hooks/hookBase.js +9 -0
  118. package/dist/esm/renderer/base/hooks/index.js +121 -0
  119. package/dist/esm/renderer/base/renderer.js +178 -0
  120. package/dist/esm/renderer/base/rendererValidator.js +77 -0
  121. package/dist/esm/renderer/factory/index.js +38 -0
  122. package/dist/esm/renderer/field-renderers/AddonRenderer.js +55 -0
  123. package/dist/esm/renderer/field-renderers/CheckboxRenderer.js +93 -0
  124. package/dist/esm/renderer/field-renderers/DateRenderer.js +176 -0
  125. package/dist/esm/renderer/field-renderers/DropdownRenderer/hook.js +79 -0
  126. package/dist/esm/renderer/field-renderers/DropdownRenderer/index.js +186 -0
  127. package/dist/esm/renderer/field-renderers/LargeTextRenderer.js +179 -0
  128. package/dist/esm/renderer/field-renderers/NumberRenderer.js +188 -0
  129. package/dist/esm/renderer/field-renderers/RadioGroupRenderer.js +108 -0
  130. package/dist/esm/renderer/field-renderers/RadioRenderer.js +91 -0
  131. package/dist/esm/renderer/field-renderers/TextRenderer.js +197 -0
  132. package/dist/esm/renderer/field-renderers/ToggleRenderer.js +91 -0
  133. package/dist/esm/renderer/field-renderers/ZipCodeRenderer/helper.js +112 -0
  134. package/dist/esm/renderer/field-renderers/ZipCodeRenderer/hook.js +108 -0
  135. package/dist/esm/renderer/field-renderers/ZipCodeRenderer/index.js +247 -0
  136. package/dist/esm/renderer/index.js +4 -0
  137. package/dist/esm/renderer/styles.js +21 -0
  138. package/dist/esm/renderer/types.js +0 -0
  139. package/dist/esm/tests/base/flowBase.js +105 -0
  140. package/dist/esm/tests/base/index.js +22 -0
  141. package/dist/esm/tests/flows/checkboxRendererFlows.js +65 -0
  142. package/dist/esm/tests/flows/dateRendererFlows.js +850 -0
  143. package/dist/esm/tests/flows/dropdownRendererFlows.js +571 -0
  144. package/dist/esm/tests/flows/largeTextRendererFlows.js +79 -0
  145. package/dist/esm/tests/flows/numberRendererFlows.js +155 -0
  146. package/dist/esm/tests/flows/radioRendererFlows.js +95 -0
  147. package/dist/esm/tests/flows/textRendererFlows.js +329 -0
  148. package/dist/esm/tests/flows/toggleRendererFlows.js +86 -0
  149. package/dist/esm/tests/flows/zipCodeRendererFlows.js +1143 -0
  150. package/dist/esm/utils/dateHelper.js +35 -0
  151. package/dist/types/lib/bll/constants.d.ts +9 -0
  152. package/dist/types/lib/bll/formatters/booleanFormatter.d.ts +5 -0
  153. package/dist/types/lib/bll/formatters/dateFormatter.d.ts +28 -0
  154. package/dist/types/lib/bll/formatters/dropdownFormatter.d.ts +6 -0
  155. package/dist/types/lib/bll/formatters/factory/index.d.ts +71 -0
  156. package/dist/types/lib/bll/formatters/index.d.ts +2 -0
  157. package/dist/types/lib/bll/formatters/numberFormatter.d.ts +6 -0
  158. package/dist/types/lib/bll/formatters/phoneFormatter.d.ts +7 -0
  159. package/dist/types/lib/bll/formatters/regexFormatter.d.ts +5 -0
  160. package/dist/types/lib/bll/formatters/ssnFormatter.d.ts +5 -0
  161. package/dist/types/lib/bll/formatters/textFormatter.d.ts +6 -0
  162. package/dist/types/lib/bll/formatters/zipFormatter.d.ts +5 -0
  163. package/dist/types/lib/bll/index.d.ts +20 -0
  164. package/dist/types/lib/bll/ssf/index.d.ts +25 -0
  165. package/dist/types/lib/bll/ssf/loan.d.ts +16 -0
  166. package/dist/types/lib/bll/ssf/loconnect.d.ts +15 -0
  167. package/dist/types/lib/bll/ssf/ssfBase.d.ts +23 -0
  168. package/dist/types/lib/bll/ssf/types.d.ts +99 -0
  169. package/dist/types/lib/bll/types.d.ts +47 -0
  170. package/dist/types/lib/bll/validators/dateValidator.d.ts +16 -0
  171. package/dist/types/lib/bll/validators/emailValidator.d.ts +4 -0
  172. package/dist/types/lib/bll/validators/factory/index.d.ts +15 -0
  173. package/dist/types/lib/bll/validators/index.d.ts +2 -0
  174. package/dist/types/lib/bll/validators/maxCharValidator.d.ts +4 -0
  175. package/dist/types/lib/bll/validators/requiredValidator.d.ts +4 -0
  176. package/dist/types/lib/bll/validators/zipValidator.d.ts +5 -0
  177. package/dist/types/lib/core/index.d.ts +29 -0
  178. package/dist/types/lib/demo/config.d.ts +11 -0
  179. package/dist/types/lib/demo/index.d.ts +1 -0
  180. package/dist/types/lib/renderer/FieldRenderer.d.ts +5 -0
  181. package/dist/types/lib/renderer/base/hooks/fieldDescription.d.ts +5 -0
  182. package/dist/types/lib/renderer/base/hooks/fieldDisabled.d.ts +10 -0
  183. package/dist/types/lib/renderer/base/hooks/fieldGoTo.d.ts +4 -0
  184. package/dist/types/lib/renderer/base/hooks/fieldLocked.d.ts +4 -0
  185. package/dist/types/lib/renderer/base/hooks/fieldMeta.d.ts +10 -0
  186. package/dist/types/lib/renderer/base/hooks/fieldSubscribers.d.ts +6 -0
  187. package/dist/types/lib/renderer/base/hooks/fieldValidation.d.ts +9 -0
  188. package/dist/types/lib/renderer/base/hooks/fieldValue.d.ts +31 -0
  189. package/dist/types/lib/renderer/base/hooks/hookBase.d.ts +9 -0
  190. package/dist/types/lib/renderer/base/hooks/index.d.ts +19 -0
  191. package/dist/types/lib/renderer/base/renderer.d.ts +43 -0
  192. package/dist/types/lib/renderer/base/rendererValidator.d.ts +15 -0
  193. package/dist/types/lib/renderer/factory/index.d.ts +5 -0
  194. package/dist/types/lib/renderer/field-renderers/AddonRenderer.d.ts +12 -0
  195. package/dist/types/lib/renderer/field-renderers/CheckboxRenderer.d.ts +7 -0
  196. package/dist/types/lib/renderer/field-renderers/DateRenderer.d.ts +13 -0
  197. package/dist/types/lib/renderer/field-renderers/DropdownRenderer/hook.d.ts +23 -0
  198. package/dist/types/lib/renderer/field-renderers/DropdownRenderer/index.d.ts +12 -0
  199. package/dist/types/lib/renderer/field-renderers/LargeTextRenderer.d.ts +17 -0
  200. package/dist/types/lib/renderer/field-renderers/NumberRenderer.d.ts +12 -0
  201. package/dist/types/lib/renderer/field-renderers/RadioGroupRenderer.d.ts +8 -0
  202. package/dist/types/lib/renderer/field-renderers/RadioRenderer.d.ts +8 -0
  203. package/dist/types/lib/renderer/field-renderers/TextRenderer.d.ts +8 -0
  204. package/dist/types/lib/renderer/field-renderers/ToggleRenderer.d.ts +24 -0
  205. package/dist/types/lib/renderer/field-renderers/ZipCodeRenderer/helper.d.ts +48 -0
  206. package/dist/types/lib/renderer/field-renderers/ZipCodeRenderer/hook.d.ts +17 -0
  207. package/dist/types/lib/renderer/field-renderers/ZipCodeRenderer/index.d.ts +9 -0
  208. package/dist/types/lib/renderer/index.d.ts +2 -0
  209. package/dist/types/lib/renderer/styles.d.ts +7 -0
  210. package/dist/types/lib/renderer/types.d.ts +325 -0
  211. package/dist/types/lib/tests/base/flowBase.d.ts +13 -0
  212. package/dist/types/lib/tests/base/index.d.ts +6 -0
  213. package/dist/types/lib/tests/flows/checkboxRendererFlows.d.ts +9 -0
  214. package/dist/types/lib/tests/flows/dateRendererFlows.d.ts +120 -0
  215. package/dist/types/lib/tests/flows/dropdownRendererFlows.d.ts +92 -0
  216. package/dist/types/lib/tests/flows/largeTextRendererFlows.d.ts +9 -0
  217. package/dist/types/lib/tests/flows/numberRendererFlows.d.ts +11 -0
  218. package/dist/types/lib/tests/flows/radioRendererFlows.d.ts +10 -0
  219. package/dist/types/lib/tests/flows/textRendererFlows.d.ts +16 -0
  220. package/dist/types/lib/tests/flows/toggleRendererFlows.d.ts +10 -0
  221. package/dist/types/lib/tests/flows/zipCodeRendererFlows.d.ts +169 -0
  222. package/dist/types/lib/tests/loan-field-renderer-flows.test.d.ts +1 -0
  223. package/dist/types/lib/utils/dateHelper.d.ts +8 -0
  224. package/dist/types/tsconfig.tsbuildinfo +1 -0
  225. package/package.json +103 -0
@@ -0,0 +1,850 @@
1
+ import { TTriggerActions } from "@elliemae/flow-driven-testing";
2
+ import { FlowBase } from "../base/flowBase";
3
+ class DateRendererFlows extends FlowBase {
4
+ constructor(flowParams) {
5
+ super(flowParams);
6
+ this.flowParams = flowParams;
7
+ }
8
+ flowParams;
9
+ /**
10
+ * Test 1: Verify date field renders correctly
11
+ */
12
+ CheckDateRendering() {
13
+ return {
14
+ [`${this.flowParams.inboundFlow}`]: {
15
+ name: this.getFlowName(
16
+ "DateRenderer",
17
+ "check date field renders correctly"
18
+ ),
19
+ asserts: [
20
+ {
21
+ selector: '[data-testid="748"]',
22
+ isExists: true
23
+ }
24
+ ],
25
+ transitions: [
26
+ {
27
+ to: "checkDateInputValue"
28
+ }
29
+ ]
30
+ }
31
+ };
32
+ }
33
+ /**
34
+ * Test 2: Enter a date value and verify it persists
35
+ */
36
+ CheckDateInputValue() {
37
+ return {
38
+ checkDateInputValue: {
39
+ name: this.getFlowName(
40
+ "DateRenderer",
41
+ "check date input value persists"
42
+ ),
43
+ startFlow: [
44
+ {
45
+ selector: '[data-testid="748"] input',
46
+ value: "01/15/2026",
47
+ action: TTriggerActions.BLUR
48
+ }
49
+ ],
50
+ asserts: [
51
+ {
52
+ ssfFunctionsCalled: ["setFields"]
53
+ },
54
+ {
55
+ assertFn: () => {
56
+ const inputElement = document.querySelector(
57
+ '[data-testid="748"] input'
58
+ );
59
+ return inputElement && inputElement.value === "01/15/2026";
60
+ }
61
+ }
62
+ ],
63
+ transitions: [
64
+ {
65
+ to: "checkDateOnBlur"
66
+ }
67
+ ]
68
+ }
69
+ };
70
+ }
71
+ /**
72
+ * Test 3: Verify onBlur triggers SSF setFields
73
+ */
74
+ CheckDateOnBlur() {
75
+ return {
76
+ checkDateOnBlur: {
77
+ name: this.getFlowName(
78
+ "DateRenderer",
79
+ "check onBlur callback triggers"
80
+ ),
81
+ startFlow: [
82
+ {
83
+ selector: '[data-testid="748"] input',
84
+ value: "06/30/2025",
85
+ action: TTriggerActions.BLUR
86
+ }
87
+ ],
88
+ asserts: [
89
+ {
90
+ ssfFunctionsCalled: ["setFields"]
91
+ },
92
+ {
93
+ assertFn: () => {
94
+ const inputElement = document.querySelector(
95
+ '[data-testid="748"] input'
96
+ );
97
+ return inputElement && inputElement.value === "06/30/2025";
98
+ }
99
+ }
100
+ ],
101
+ transitions: [
102
+ {
103
+ to: "checkDateEmptyValue"
104
+ }
105
+ ]
106
+ }
107
+ };
108
+ }
109
+ /**
110
+ * Test 4: Verify empty date value handling
111
+ */
112
+ CheckDateEmptyValue() {
113
+ return {
114
+ checkDateEmptyValue: {
115
+ name: this.getFlowName("DateRenderer", "check empty date handling"),
116
+ startFlow: [
117
+ {
118
+ selector: '[data-testid="748"] input',
119
+ value: "",
120
+ action: TTriggerActions.BLUR
121
+ }
122
+ ],
123
+ asserts: [
124
+ {
125
+ ssfFunctionsCalled: ["setFields"]
126
+ },
127
+ {
128
+ assertFn: () => {
129
+ const inputElement = document.querySelector(
130
+ '[data-testid="748"] input'
131
+ );
132
+ return inputElement && inputElement.value === "";
133
+ }
134
+ }
135
+ ],
136
+ transitions: [
137
+ {
138
+ to: "checkSecondDateField"
139
+ }
140
+ ]
141
+ }
142
+ };
143
+ }
144
+ /**
145
+ * Test 5: Verify second date field exists and works
146
+ */
147
+ CheckSecondDateField() {
148
+ return {
149
+ checkSecondDateField: {
150
+ name: this.getFlowName("DateRenderer", "check second date field"),
151
+ asserts: [
152
+ {
153
+ selector: '[data-testid="763"]',
154
+ isExists: true
155
+ }
156
+ ],
157
+ transitions: [
158
+ {
159
+ to: "checkSecondDateValue"
160
+ }
161
+ ]
162
+ }
163
+ };
164
+ }
165
+ /**
166
+ * Test 6: Enter value in second date field
167
+ */
168
+ CheckSecondDateValue() {
169
+ return {
170
+ checkSecondDateValue: {
171
+ name: this.getFlowName(
172
+ "DateRenderer",
173
+ "check second date field value entry"
174
+ ),
175
+ startFlow: [
176
+ {
177
+ selector: '[data-testid="763"] input',
178
+ value: "11/15/2025",
179
+ action: TTriggerActions.BLUR
180
+ }
181
+ ],
182
+ asserts: [
183
+ {
184
+ ssfFunctionsCalled: ["setFields"]
185
+ },
186
+ {
187
+ assertFn: () => {
188
+ const inputElement = document.querySelector(
189
+ '[data-testid="763"] input'
190
+ );
191
+ return inputElement && inputElement.value === "11/15/2025";
192
+ }
193
+ }
194
+ ],
195
+ transitions: [
196
+ {
197
+ to: "checkDateClearValue"
198
+ }
199
+ ]
200
+ }
201
+ };
202
+ }
203
+ /**
204
+ * Test 7: Verify date field can be cleared
205
+ */
206
+ CheckDateClearValue() {
207
+ return {
208
+ checkDateClearValue: {
209
+ name: this.getFlowName("DateRenderer", "check date clear value"),
210
+ startFlow: [
211
+ {
212
+ selector: '[data-testid="763"] input',
213
+ value: "",
214
+ action: TTriggerActions.BLUR
215
+ }
216
+ ],
217
+ asserts: [
218
+ {
219
+ ssfFunctionsCalled: ["setFields"]
220
+ },
221
+ {
222
+ assertFn: () => {
223
+ const inputElement = document.querySelector(
224
+ '[data-testid="763"] input'
225
+ );
226
+ return inputElement && inputElement.value === "";
227
+ }
228
+ }
229
+ ],
230
+ transitions: [
231
+ {
232
+ to: "checkDateMultipleChanges"
233
+ }
234
+ ]
235
+ }
236
+ };
237
+ }
238
+ /**
239
+ * Test 8: Multiple date value changes - use individual inputs to trigger onDateChange
240
+ */
241
+ CheckDateMultipleChanges() {
242
+ return {
243
+ checkDateMultipleChanges: {
244
+ name: this.getFlowName(
245
+ "DateRenderer",
246
+ "check multiple date value changes"
247
+ ),
248
+ startFlow: [
249
+ {
250
+ selector: '[data-testid="748"] [data-testid="ds-controlled-date-time-picker-month-input"]',
251
+ value: "03",
252
+ action: TTriggerActions.CHANGE
253
+ },
254
+ {
255
+ selector: '[data-testid="748"] [data-testid="ds-controlled-date-time-picker-day-input"]',
256
+ value: "15",
257
+ action: TTriggerActions.CHANGE
258
+ },
259
+ {
260
+ selector: '[data-testid="748"] [data-testid="ds-controlled-date-time-picker-year-input"]',
261
+ value: "2025",
262
+ action: TTriggerActions.BLUR
263
+ }
264
+ ],
265
+ asserts: [
266
+ {
267
+ assertFn: () => {
268
+ const inputElement = document.querySelector(
269
+ '[data-testid="748"] input'
270
+ );
271
+ return inputElement !== null;
272
+ }
273
+ }
274
+ ],
275
+ transitions: [
276
+ {
277
+ to: "checkDateFinalState"
278
+ }
279
+ ]
280
+ }
281
+ };
282
+ }
283
+ /**
284
+ * Test 9: Final state verification
285
+ */
286
+ CheckDateFinalState() {
287
+ return {
288
+ checkDateFinalState: {
289
+ name: this.getFlowName(
290
+ "DateRenderer",
291
+ "check date fields final state is valid"
292
+ ),
293
+ asserts: [
294
+ {
295
+ assertFn: () => {
296
+ const date1 = document.querySelector('[data-testid="748"]');
297
+ const date2 = document.querySelector('[data-testid="763"]');
298
+ return date1 !== null && date2 !== null;
299
+ }
300
+ }
301
+ ],
302
+ transitions: [
303
+ {
304
+ to: "checkInvalidDateResetsField"
305
+ }
306
+ ]
307
+ }
308
+ };
309
+ }
310
+ /**
311
+ * Test 10: Invalid/partial date input resets field and sends null to SSF
312
+ */
313
+ CheckInvalidDateResetsField() {
314
+ return {
315
+ checkInvalidDateResetsField: {
316
+ name: this.getFlowName(
317
+ "DateRenderer",
318
+ "check invalid/partial date resets field and sends null"
319
+ ),
320
+ startFlow: [
321
+ {
322
+ selector: '[data-testid="748"] input',
323
+ value: "13/45/2026",
324
+ // Invalid date (month 13, day 45)
325
+ action: TTriggerActions.BLUR
326
+ }
327
+ ],
328
+ asserts: [
329
+ {
330
+ ssfFunctionsCalled: ["setFields"]
331
+ },
332
+ {
333
+ assertFn: () => {
334
+ const inputElement = document.querySelector(
335
+ '[data-testid="748"] input'
336
+ );
337
+ return inputElement && inputElement.value === "";
338
+ }
339
+ }
340
+ ],
341
+ transitions: [
342
+ {
343
+ to: "checkPartialDateResetsField"
344
+ }
345
+ ]
346
+ }
347
+ };
348
+ }
349
+ /**
350
+ * Test 11: Partial date input resets field
351
+ */
352
+ CheckPartialDateResetsField() {
353
+ return {
354
+ checkPartialDateResetsField: {
355
+ name: this.getFlowName(
356
+ "DateRenderer",
357
+ "check partial date input resets field"
358
+ ),
359
+ startFlow: [
360
+ {
361
+ selector: '[data-testid="748"] input',
362
+ value: "01/15",
363
+ // Partial date (missing year)
364
+ action: TTriggerActions.BLUR
365
+ }
366
+ ],
367
+ asserts: [
368
+ {
369
+ ssfFunctionsCalled: ["setFields"]
370
+ },
371
+ {
372
+ assertFn: () => {
373
+ const inputElement = document.querySelector(
374
+ '[data-testid="748"] input'
375
+ );
376
+ return inputElement && inputElement.value === "";
377
+ }
378
+ }
379
+ ],
380
+ transitions: [
381
+ {
382
+ to: "checkInvalidDateNoErrorMessage"
383
+ }
384
+ ]
385
+ }
386
+ };
387
+ }
388
+ /**
389
+ * Test 12: Invalid date input does not show validation error message
390
+ */
391
+ CheckInvalidDateNoErrorMessage() {
392
+ return {
393
+ checkInvalidDateNoErrorMessage: {
394
+ name: this.getFlowName(
395
+ "DateRenderer",
396
+ "check invalid date does not show error message"
397
+ ),
398
+ startFlow: [
399
+ {
400
+ selector: '[data-testid="763"] input',
401
+ value: "abc/de/fghi",
402
+ // Completely invalid date
403
+ action: TTriggerActions.BLUR
404
+ }
405
+ ],
406
+ asserts: [
407
+ {
408
+ ssfFunctionsCalled: ["setFields"]
409
+ },
410
+ {
411
+ assertFn: () => {
412
+ const inputElement = document.querySelector(
413
+ '[data-testid="763"] input'
414
+ );
415
+ if (!inputElement || inputElement.value !== "") {
416
+ return false;
417
+ }
418
+ const fieldWrapper = document.querySelector(
419
+ '[data-testid="763"]'
420
+ );
421
+ const hasErrorState = fieldWrapper?.querySelector('[class*="error"]') || inputElement.getAttribute("aria-invalid") === "true";
422
+ return !hasErrorState;
423
+ }
424
+ }
425
+ ],
426
+ transitions: [
427
+ {
428
+ to: "checkDateFormatOptionDefault"
429
+ }
430
+ ]
431
+ }
432
+ };
433
+ }
434
+ /**
435
+ * Test 13: Date format option - default MM/DD/YYYY format
436
+ */
437
+ CheckDateFormatOptionDefault() {
438
+ return {
439
+ checkDateFormatOptionDefault: {
440
+ name: this.getFlowName(
441
+ "DateRenderer",
442
+ "check default date format MM/DD/YYYY"
443
+ ),
444
+ startFlow: [
445
+ {
446
+ selector: '[data-testid="748"] input',
447
+ value: "12/25/2025",
448
+ action: TTriggerActions.BLUR
449
+ }
450
+ ],
451
+ asserts: [
452
+ {
453
+ ssfFunctionsCalled: ["setFields"]
454
+ },
455
+ {
456
+ assertFn: () => {
457
+ const inputElement = document.querySelector(
458
+ '[data-testid="748"] input'
459
+ );
460
+ const value = inputElement?.value || "";
461
+ const mmddyyyyPattern = /^\d{2}\/\d{2}\/\d{4}$/;
462
+ return mmddyyyyPattern.test(value);
463
+ }
464
+ }
465
+ ],
466
+ transitions: [
467
+ {
468
+ to: "checkValidDateAfterInvalid"
469
+ }
470
+ ]
471
+ }
472
+ };
473
+ }
474
+ /**
475
+ * Test 14: Valid date entry after invalid - ensures field recovers correctly
476
+ */
477
+ CheckValidDateAfterInvalid() {
478
+ return {
479
+ checkValidDateAfterInvalid: {
480
+ name: this.getFlowName(
481
+ "DateRenderer",
482
+ "check valid date entry after invalid recovers field"
483
+ ),
484
+ startFlow: [
485
+ {
486
+ selector: '[data-testid="763"] input',
487
+ value: "invalid",
488
+ action: TTriggerActions.BLUR
489
+ },
490
+ {
491
+ selector: '[data-testid="763"] input',
492
+ value: "07/04/2025",
493
+ action: TTriggerActions.BLUR
494
+ }
495
+ ],
496
+ asserts: [
497
+ {
498
+ ssfFunctionsCalled: ["setFields"]
499
+ },
500
+ {
501
+ assertFn: () => {
502
+ const inputElement = document.querySelector(
503
+ '[data-testid="763"] input'
504
+ );
505
+ return inputElement && inputElement.value === "07/04/2025";
506
+ }
507
+ }
508
+ ],
509
+ transitions: [
510
+ {
511
+ to: "checkDateFinalStateComplete"
512
+ }
513
+ ]
514
+ }
515
+ };
516
+ }
517
+ /**
518
+ * Test 15: Final complete state verification
519
+ */
520
+ CheckDateFinalStateComplete() {
521
+ return {
522
+ checkDateFinalStateComplete: {
523
+ name: this.getFlowName(
524
+ "DateRenderer",
525
+ "check all date scenarios completed successfully"
526
+ ),
527
+ asserts: [
528
+ {
529
+ assertFn: () => {
530
+ const date1 = document.querySelector('[data-testid="748"]');
531
+ const date2 = document.querySelector('[data-testid="763"]');
532
+ return date1 !== null && date2 !== null;
533
+ }
534
+ }
535
+ ],
536
+ transitions: [
537
+ {
538
+ to: "checkDisabledDateField"
539
+ }
540
+ ]
541
+ }
542
+ };
543
+ }
544
+ /**
545
+ * Test 16: Disabled date field - input should be blocked
546
+ */
547
+ CheckDisabledDateField() {
548
+ return {
549
+ checkDisabledDateField: {
550
+ name: this.getFlowName(
551
+ "DateRenderer",
552
+ "check disabled date field blocks input"
553
+ ),
554
+ asserts: [
555
+ {
556
+ selector: '[data-testid="762"]',
557
+ isExists: true
558
+ },
559
+ {
560
+ assertFn: () => {
561
+ const inputElement = document.querySelector(
562
+ '[data-testid="762"] input'
563
+ );
564
+ return inputElement && inputElement.disabled === true;
565
+ }
566
+ }
567
+ ],
568
+ transitions: [
569
+ {
570
+ to: "checkDisabledDateNoUpdate"
571
+ }
572
+ ]
573
+ }
574
+ };
575
+ }
576
+ /**
577
+ * Test 17: Disabled date field - blur should not trigger update
578
+ */
579
+ CheckDisabledDateNoUpdate() {
580
+ return {
581
+ checkDisabledDateNoUpdate: {
582
+ name: this.getFlowName(
583
+ "DateRenderer",
584
+ "check disabled date field blur does not update"
585
+ ),
586
+ startFlow: [
587
+ {
588
+ selector: '[data-testid="762"] input',
589
+ value: "05/05/2025",
590
+ action: TTriggerActions.BLUR
591
+ }
592
+ ],
593
+ asserts: [
594
+ {
595
+ assertFn: () => {
596
+ const inputElement = document.querySelector(
597
+ '[data-testid="762"] input'
598
+ );
599
+ return inputElement && inputElement.value === "";
600
+ }
601
+ }
602
+ ],
603
+ transitions: [
604
+ {
605
+ to: "checkAutoFieldSetFalse"
606
+ }
607
+ ]
608
+ }
609
+ };
610
+ }
611
+ /**
612
+ * Test 18: autoFieldSet=false - onBlur fires but SSF setFields skipped
613
+ */
614
+ CheckAutoFieldSetFalse() {
615
+ return {
616
+ checkAutoFieldSetFalse: {
617
+ name: this.getFlowName(
618
+ "DateRenderer",
619
+ "check autoFieldSet=false skips SSF call"
620
+ ),
621
+ asserts: [
622
+ {
623
+ selector: '[data-testid="761"]',
624
+ isExists: true
625
+ }
626
+ ],
627
+ transitions: [
628
+ {
629
+ to: "checkAutoFieldSetFalseBlur"
630
+ }
631
+ ]
632
+ }
633
+ };
634
+ }
635
+ /**
636
+ * Test 19: autoFieldSet=false - valid date entry with manual handling
637
+ */
638
+ CheckAutoFieldSetFalseBlur() {
639
+ return {
640
+ checkAutoFieldSetFalseBlur: {
641
+ name: this.getFlowName(
642
+ "DateRenderer",
643
+ "check autoFieldSet=false blur with valid date"
644
+ ),
645
+ startFlow: [
646
+ {
647
+ selector: '[data-testid="761"] input',
648
+ value: "09/15/2025",
649
+ action: TTriggerActions.BLUR
650
+ }
651
+ ],
652
+ asserts: [
653
+ {
654
+ assertFn: () => {
655
+ const inputElement = document.querySelector(
656
+ '[data-testid="761"] input'
657
+ );
658
+ return inputElement && inputElement.value === "09/15/2025";
659
+ }
660
+ }
661
+ ],
662
+ transitions: [
663
+ {
664
+ to: "checkOnDateChangeEvent"
665
+ }
666
+ ]
667
+ }
668
+ };
669
+ }
670
+ /**
671
+ * Test 20: onDateChange event - value changes via individual date inputs
672
+ */
673
+ CheckOnDateChangeEvent() {
674
+ return {
675
+ checkOnDateChangeEvent: {
676
+ name: this.getFlowName(
677
+ "DateRenderer",
678
+ "check onDateChange event fires on input change"
679
+ ),
680
+ startFlow: [
681
+ {
682
+ selector: '[data-testid="763"] [data-testid="ds-controlled-date-time-picker-month-input"]',
683
+ value: "08",
684
+ action: TTriggerActions.CHANGE
685
+ },
686
+ {
687
+ selector: '[data-testid="763"] [data-testid="ds-controlled-date-time-picker-day-input"]',
688
+ value: "20",
689
+ action: TTriggerActions.CHANGE
690
+ },
691
+ {
692
+ selector: '[data-testid="763"] [data-testid="ds-controlled-date-time-picker-year-input"]',
693
+ value: "2026",
694
+ action: TTriggerActions.CHANGE
695
+ }
696
+ ],
697
+ asserts: [
698
+ {
699
+ assertFn: () => {
700
+ const field = document.querySelector('[data-testid="763"]');
701
+ return field !== null;
702
+ }
703
+ }
704
+ ],
705
+ transitions: [
706
+ {
707
+ to: "checkDateChangeWithoutOnChange"
708
+ }
709
+ ]
710
+ }
711
+ };
712
+ }
713
+ /**
714
+ * Test 21: Date change without onChange callback (field 763 has no onChange)
715
+ */
716
+ CheckDateChangeWithoutOnChange() {
717
+ return {
718
+ checkDateChangeWithoutOnChange: {
719
+ name: this.getFlowName(
720
+ "DateRenderer",
721
+ "check date change without onChange callback"
722
+ ),
723
+ startFlow: [
724
+ {
725
+ selector: '[data-testid="763"] input',
726
+ value: "10/31/2025",
727
+ action: TTriggerActions.BLUR
728
+ }
729
+ ],
730
+ asserts: [
731
+ {
732
+ ssfFunctionsCalled: ["setFields"]
733
+ },
734
+ {
735
+ assertFn: () => {
736
+ const inputElement = document.querySelector(
737
+ '[data-testid="763"] input'
738
+ );
739
+ return inputElement && inputElement.value === "10/31/2025";
740
+ }
741
+ }
742
+ ],
743
+ transitions: [
744
+ {
745
+ to: "checkDateWithOnChangeCallback"
746
+ }
747
+ ]
748
+ }
749
+ };
750
+ }
751
+ /**
752
+ * Test 22: Date change with onChange callback (field 748 has onChange)
753
+ */
754
+ CheckDateWithOnChangeCallback() {
755
+ return {
756
+ checkDateWithOnChangeCallback: {
757
+ name: this.getFlowName(
758
+ "DateRenderer",
759
+ "check date change with onChange callback fires"
760
+ ),
761
+ startFlow: [
762
+ {
763
+ selector: '[data-testid="748"] [data-testid="ds-controlled-date-time-picker-month-input"]',
764
+ value: "04",
765
+ action: TTriggerActions.CHANGE
766
+ },
767
+ {
768
+ selector: '[data-testid="748"] [data-testid="ds-controlled-date-time-picker-day-input"]',
769
+ value: "01",
770
+ action: TTriggerActions.CHANGE
771
+ },
772
+ {
773
+ selector: '[data-testid="748"] [data-testid="ds-controlled-date-time-picker-year-input"]',
774
+ value: "2025",
775
+ action: TTriggerActions.CHANGE
776
+ }
777
+ ],
778
+ asserts: [
779
+ {
780
+ assertFn: () => {
781
+ const field = document.querySelector('[data-testid="748"]');
782
+ return field !== null;
783
+ }
784
+ }
785
+ ],
786
+ transitions: [
787
+ {
788
+ to: "checkAllDateFieldsFinalState"
789
+ }
790
+ ]
791
+ }
792
+ };
793
+ }
794
+ /**
795
+ * Test 23: All date fields final state verification
796
+ */
797
+ CheckAllDateFieldsFinalState() {
798
+ const transitions = this.flowParams.outboundFlow ? [{ to: this.flowParams.outboundFlow }] : [];
799
+ return {
800
+ checkAllDateFieldsFinalState: {
801
+ name: this.getFlowName(
802
+ "DateRenderer",
803
+ "check all date fields exist in final state"
804
+ ),
805
+ asserts: [
806
+ {
807
+ assertFn: () => {
808
+ const date748 = document.querySelector('[data-testid="748"]');
809
+ const date763 = document.querySelector('[data-testid="763"]');
810
+ const date762 = document.querySelector('[data-testid="762"]');
811
+ const date761 = document.querySelector('[data-testid="761"]');
812
+ return date748 !== null && date763 !== null && date762 !== null && date761 !== null;
813
+ }
814
+ }
815
+ ],
816
+ ...transitions.length > 0 && { transitions }
817
+ }
818
+ };
819
+ }
820
+ get Flows() {
821
+ return {
822
+ ...this.CheckDateRendering(),
823
+ ...this.CheckDateInputValue(),
824
+ ...this.CheckDateOnBlur(),
825
+ ...this.CheckDateEmptyValue(),
826
+ ...this.CheckSecondDateField(),
827
+ ...this.CheckSecondDateValue(),
828
+ ...this.CheckDateClearValue(),
829
+ ...this.CheckDateMultipleChanges(),
830
+ ...this.CheckDateFinalState(),
831
+ ...this.CheckInvalidDateResetsField(),
832
+ ...this.CheckPartialDateResetsField(),
833
+ ...this.CheckInvalidDateNoErrorMessage(),
834
+ ...this.CheckDateFormatOptionDefault(),
835
+ ...this.CheckValidDateAfterInvalid(),
836
+ ...this.CheckDateFinalStateComplete(),
837
+ ...this.CheckDisabledDateField(),
838
+ ...this.CheckDisabledDateNoUpdate(),
839
+ ...this.CheckAutoFieldSetFalse(),
840
+ ...this.CheckAutoFieldSetFalseBlur(),
841
+ ...this.CheckOnDateChangeEvent(),
842
+ ...this.CheckDateChangeWithoutOnChange(),
843
+ ...this.CheckDateWithOnChangeCallback(),
844
+ ...this.CheckAllDateFieldsFinalState()
845
+ };
846
+ }
847
+ }
848
+ export {
849
+ DateRendererFlows
850
+ };