@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,325 @@
1
+ import { DSButtonV3T } from '@elliemae/ds-button-v2';
2
+ import { DSFormLayoutBlockItemT } from '@elliemae/ds-form-layout-blocks';
3
+ import { DSAutocompleteT, DSComboboxT, DSControlledRadioT, DSInputTextT } from '@elliemae/ds-controlled-form';
4
+ import { DSControlledCheckboxT } from '@elliemae/ds-form-checkbox';
5
+ import { DSControlledToggleT } from '@elliemae/ds-form-toggle';
6
+ import { UseNumberMaskT } from '@elliemae/ds-form-helpers-mask-hooks';
7
+ import { DSControlledDateTimePickerT } from '@elliemae/ds-form-date-time-picker';
8
+ import { DSControlledLargeTextInput } from '@elliemae/ds-form-input-textarea';
9
+ import { IValidationResult, IValidationRule } from '../bll/types';
10
+ import { FormatterAcronymMap } from '../bll/formatters/factory';
11
+ type DSControlledLargeTextInputPropsT = React.ComponentProps<typeof DSControlledLargeTextInput>;
12
+ export type FormatterAcronym = keyof FormatterAcronymMap;
13
+ export type FormatterType = 'integer' | 'decimal2' | 'decimal3' | 'decimal4' | 'phone' | 'regex' | 'ssn' | 'zip' | 'date' | 'datetime' | 'boolean' | 'text';
14
+ export type FieldOptionsT = {
15
+ dsId?: string;
16
+ type: string;
17
+ label: string;
18
+ value: string;
19
+ };
20
+ export type FieldMetadataT = {
21
+ contractPath: string;
22
+ isNullable: boolean;
23
+ fieldFormat: string;
24
+ description: string;
25
+ isReadOnly: boolean;
26
+ maxLength?: number;
27
+ isLockField?: boolean;
28
+ fieldOptions?: FieldOptionsT[];
29
+ };
30
+ export type RendererType = 'text' | 'number';
31
+ export type AddonPropsT = {
32
+ Icon?: React.ReactNode;
33
+ } & Omit<DSButtonV3T.Props, 'onClick'>;
34
+ export interface ICoreRendererProps {
35
+ fieldId: string;
36
+ label?: string;
37
+ id?: string;
38
+ onBlur?: (fieldId: string, value: unknown) => void;
39
+ onChange?: (fieldId: string, value: unknown) => void;
40
+ autoFieldSet?: boolean;
41
+ isDisable?: boolean;
42
+ isHidden?: boolean;
43
+ brCompProps?: Omit<DSFormLayoutBlockItemT.Props, 'children' | 'label' | 'value'>;
44
+ forceRefresh?: boolean;
45
+ validationRules?: Array<IValidationRule>;
46
+ rightAddon?: React.ReactNode;
47
+ }
48
+ export type RendererTypesT = 'text' | 'number' | 'email' | 'checkbox' | 'toggle' | 'radio' | 'radiogroup' | 'addon' | 'dropdown' | 'date' | 'zipcode' | 'largetext';
49
+ export type TextRendererPropsT = {
50
+ rendererType: 'text';
51
+ maskType?: 'Phone' | 'SSN';
52
+ formatFn?: (value: unknown, metadata?: FieldMetadataT) => string;
53
+ parseFn?: (displayValue: string, metadata?: FieldMetadataT) => unknown;
54
+ } & ICoreRendererProps & {
55
+ extra?: Omit<DSInputTextT.Props, 'onChange' | 'onBlur' | 'value'>;
56
+ };
57
+ export type NumberRendererPropsT = {
58
+ rendererType: 'number';
59
+ } & ICoreRendererProps & {
60
+ numberMaskOptions?: Omit<UseNumberMaskT.Props, 'valueSetter' | 'decimalPlaces' | 'decimalRequired'>;
61
+ } & {
62
+ extra?: Omit<DSInputTextT.Props, 'onChange' | 'onBlur' | 'value'>;
63
+ };
64
+ export type EmailRendererPropsT = {
65
+ rendererType: 'email';
66
+ formatFn?: (value: unknown, metadata?: FieldMetadataT) => string;
67
+ parseFn?: (displayValue: string, metadata?: FieldMetadataT) => unknown;
68
+ } & ICoreRendererProps & {
69
+ extra?: Omit<DSInputTextT.Props, 'onChange' | 'onBlur' | 'value'>;
70
+ };
71
+ /**
72
+ * LargeTextRenderer props - Multi-line textarea for comments and large text fields.
73
+ * Migrated from CommentComponent with full feature parity.
74
+ */
75
+ export type LargeTextRendererPropsT = Omit<ICoreRendererProps, 'brCompProps'> & {
76
+ rendererType: 'largetext';
77
+ /** Number of visible text rows (default: '3') */
78
+ rows?: string;
79
+ /**
80
+ * External value to sync with the field.
81
+ * When changed, the field value will update to match.
82
+ * Mirrors CommentComponent's txtFieldValue behavior.
83
+ */
84
+ externalValue?: string;
85
+ brCompProps?: Omit<DSFormLayoutBlockItemT.Props, 'children' | 'label' | 'value' | 'maxCharCounter'>;
86
+ /** Additional props to pass to DSControlledLargeTextInput */
87
+ extra?: Omit<DSControlledLargeTextInputPropsT, 'onChange' | 'onBlur' | 'value'>;
88
+ } & ({
89
+ maxCharactersDisplay: true;
90
+ maxCharCounter: number;
91
+ maxCharExceededMessage?: string;
92
+ } | {
93
+ maxCharactersDisplay?: false;
94
+ maxCharCounter?: never;
95
+ maxCharExceededMessage?: never;
96
+ });
97
+ export type CheckboxRendererPropsT = {
98
+ rendererType: 'checkbox';
99
+ } & Omit<ICoreRendererProps, 'isPadLock' | 'onChange'> & {
100
+ extra?: Omit<DSControlledCheckboxT.Props, 'value'>;
101
+ };
102
+ /**
103
+ * ToggleRenderer props - Boolean toggle switch for on/off states.
104
+ * Follows the same pattern as CheckboxRenderer for boolean field handling.
105
+ * Migrated from toggle-button.tsx with full feature parity.
106
+ */
107
+ export type ToggleRendererPropsT = {
108
+ rendererType: 'toggle';
109
+ size?: DSControlledToggleT.Props['size'];
110
+ } & Pick<ICoreRendererProps, 'fieldId' | 'id' | 'label' | 'isDisable' | 'onChange' | 'brCompProps' | 'forceRefresh'> & {
111
+ extra?: Omit<DSControlledToggleT.Props, 'onChange'>;
112
+ };
113
+ export type DropdownRendererPropsT = {
114
+ rendererType: 'dropdown';
115
+ } & ICoreRendererProps & {
116
+ options?: FieldOptionsT[];
117
+ /**
118
+ * When true, allows user to create new option values that are not present in existing list.
119
+ */
120
+ isEditable?: boolean;
121
+ /**
122
+ * Callback fired after a new option is created via editable dropdown. Provides fieldId and new value.
123
+ */
124
+ onCreate?: (fieldId: string, value: string) => void;
125
+ extra?: Omit<DSComboboxT.Props, 'onChange' | 'onBlur' | 'value' | 'selectedValues' | 'allOptions' | 'onCreate'>;
126
+ };
127
+ export type DateRendererPropsT = {
128
+ rendererType: 'date';
129
+ /** Optional display date format (default MM/DD/YYYY). */
130
+ dateFormat?: string;
131
+ } & ICoreRendererProps & {
132
+ extra?: Omit<DSControlledDateTimePickerT.Props, 'onDateChange' | 'onBlur' | 'date' | 'type'>;
133
+ };
134
+ /**
135
+ * City data returned from zip code lookup APIs.
136
+ * Supports two formats:
137
+ * - Standard format (City/State/County) from getZipCodeOptions
138
+ * - Lat/long format (city/state/county + latitude/longitude) from getZipCodeOptionsWithLatLong
139
+ */
140
+ export type ZipCodeCityDataT = {
141
+ city?: string;
142
+ county?: string;
143
+ state?: string;
144
+ latitude?: string;
145
+ longitude?: string;
146
+ City?: string;
147
+ County?: string;
148
+ State?: string;
149
+ };
150
+ export type ZipCodeOptionT = DSAutocompleteT.ItemOption & {
151
+ zipNumber: string;
152
+ cityData: ZipCodeCityDataT | null;
153
+ };
154
+ export type ZipCodeSectionOptionT = DSAutocompleteT.ItemSectionOptions & {
155
+ zipNumber: string;
156
+ cityData: ZipCodeCityDataT | null;
157
+ };
158
+ export type ZipCodeAutocompleteOptionT = ZipCodeOptionT | ZipCodeSectionOptionT;
159
+ /**
160
+ * Address-related field IDs for auto-updating related address fields.
161
+ * When zip code lookup completes, these fields will be automatically updated.
162
+ */
163
+ export type GeoFields = {
164
+ /** Optional: Field ID for city */
165
+ city?: string;
166
+ /** Optional: Field ID for state */
167
+ state?: string;
168
+ /** Optional: Field ID for county */
169
+ county?: string;
170
+ /** Optional: Field ID for zip/postal code */
171
+ zip?: string;
172
+ /** Optional: Field ID for country (auto-set to 'US' for non-foreign addresses) */
173
+ country?: string;
174
+ };
175
+ export type ZipCodeRendererPropsT = {
176
+ rendererType: 'zipcode';
177
+ /** If true, renders as plain text input without autocomplete */
178
+ isForeignAddress?: boolean;
179
+ /**
180
+ * Optional callback when address is updated.
181
+ * Called after zip code lookup completes (single match) or user selects from dropdown.
182
+ * @param zipCode - The selected zip code
183
+ * @param cityData - City data including city, state, county, and optionally latitude/longitude
184
+ * Format depends on useLatLong flag:
185
+ * - useLatLong=false: {City, State, County} (capitalized)
186
+ * - useLatLong=true: {city, state, county, latitude, longitude} (lowercase + coords)
187
+ * @example
188
+ * // Access latitude/longitude
189
+ * onGeoLookupComplete={(zip, cityData) => {
190
+ * console.log(cityData.latitude, cityData.longitude);
191
+ * setFormState({ ...formState, lat: cityData.latitude, lng: cityData.longitude });
192
+ * }}
193
+ */
194
+ onGeoLookupComplete?: (zipCode: string, cityData: ZipCodeCityDataT) => void;
195
+ /**
196
+ * If true, fetches zip data with latitude/longitude coordinates.
197
+ * When enabled, cityData will include latitude and longitude fields.
198
+ * Use this for features like home counseling that need geographic coordinates.
199
+ */
200
+ useLatLong?: boolean;
201
+ /**
202
+ * Optional: Cohesive object containing field IDs for auto-updating related address fields.
203
+ * When provided, city/state/county fields will be automatically updated via SSF after zip lookup.
204
+ * This provides a cleaner, more maintainable API than individual field ID props.
205
+ * @example
206
+ * geoFields={{ city: '11', state: '14', county: '13' }}
207
+ */
208
+ geoFields?: GeoFields;
209
+ } & ICoreRendererProps & {
210
+ extra?: Omit<DSInputTextT.Props, 'onChange' | 'onBlur' | 'value'>;
211
+ };
212
+ export type DebounceOptionsT = {
213
+ leading?: boolean;
214
+ };
215
+ export type RadioRendererPropsT = {
216
+ rendererType: 'radio';
217
+ } & Omit<ICoreRendererProps, 'isPadLock' | 'onChange' | 'onBlur'> & {
218
+ name?: string;
219
+ value: unknown;
220
+ onSelect?: (fieldId: string, value: unknown) => void;
221
+ } & {
222
+ extra?: Omit<DSControlledRadioT.Props, 'onChange' | 'value' | 'onSelect' | 'name'>;
223
+ };
224
+ export type FormatOptions<T extends string> = T extends 'number' ? {
225
+ numberMaskOptions?: Omit<UseNumberMaskT.Props, 'valueSetter' | 'decimalPlaces' | 'decimalRequired'>;
226
+ } : T extends 'phone' ? {
227
+ isInternational?: boolean;
228
+ } : Record<string, never>;
229
+ export type RadioGroupRendererPropsT = {
230
+ rendererType: 'radiogroup';
231
+ } & Omit<ICoreRendererProps, 'isPadLock' | 'onChange' | 'onBlur'> & {
232
+ groupName?: string;
233
+ direction?: 'vertical' | 'horizontal';
234
+ wrapLabel?: boolean;
235
+ options?: RadioOptionsT[];
236
+ ariaGroupLabel?: string;
237
+ onSelect?: (fieldId: string, value: string) => void;
238
+ };
239
+ export type RadioOptionsT = {
240
+ id: string;
241
+ label: string;
242
+ value: string;
243
+ } & {
244
+ extra?: Omit<DSControlledRadioT.Props, 'onChange' | 'value' | 'onSelect'>;
245
+ };
246
+ export type AddonRendererPropsT = {
247
+ rendererType: 'addon';
248
+ } & {
249
+ fieldId: string;
250
+ label?: never;
251
+ isPadLock?: boolean;
252
+ isLocked?: boolean;
253
+ isDisable?: boolean;
254
+ rightAddon?: React.ReactNode;
255
+ validationRules?: Array<IValidationRule>;
256
+ children: React.ReactNode;
257
+ forceRefresh?: boolean;
258
+ onPadLockToggle?: () => void;
259
+ };
260
+ export type RendererPropsT = TextRendererPropsT | NumberRendererPropsT | EmailRendererPropsT | LargeTextRendererPropsT | CheckboxRendererPropsT | ToggleRendererPropsT | RadioRendererPropsT | AddonRendererPropsT | RadioGroupRendererPropsT | DropdownRendererPropsT | DateRendererPropsT | ZipCodeRendererPropsT;
261
+ export interface LoanChangeEventParams {
262
+ fieldID: string;
263
+ oldVal: string | number | null;
264
+ newVal: string | number | null;
265
+ }
266
+ export type FieldMetaResultT = {
267
+ fieldMetadata: FieldMetadataT;
268
+ };
269
+ export type FieldSearchResultT = {
270
+ isSearchedField: boolean;
271
+ setIsSearchedField: React.Dispatch<React.SetStateAction<boolean>>;
272
+ };
273
+ export type FieldValueResultT = {
274
+ fieldValue: unknown;
275
+ setFieldValue: React.Dispatch<React.SetStateAction<unknown>>;
276
+ };
277
+ export type FieldValidationResultT = {
278
+ validationResult: IValidationResult | null;
279
+ setValidationResult: React.Dispatch<React.SetStateAction<IValidationResult | null>>;
280
+ };
281
+ export type ViewModelT = FieldMetaResultT & FieldValueResultT & FieldValidationResultT & FieldSearchResultT & {
282
+ isLockedState: boolean;
283
+ setIsLockedState: React.Dispatch<React.SetStateAction<boolean>>;
284
+ isFieldDisabled: boolean;
285
+ ariaDescProps: AriaDescT;
286
+ };
287
+ export interface IRendererValidateParams {
288
+ rendererType: string;
289
+ fieldFormat: string;
290
+ fieldId: string;
291
+ metadata: FieldMetadataT;
292
+ }
293
+ export type FormattingOptionsT = {
294
+ rendererType: RendererTypesT;
295
+ maskType?: 'Phone' | 'SSN';
296
+ numberMaskOptions?: Omit<UseNumberMaskT.Props, 'valueSetter'>;
297
+ dateFormat?: string;
298
+ };
299
+ export type FieldValueParamsT = {
300
+ fieldId: string;
301
+ fieldFormat: string;
302
+ options: FormattingOptionsT;
303
+ };
304
+ export type ParsingOptionsT = {
305
+ rendererType: RendererTypesT;
306
+ maskType?: 'Phone' | 'SSN';
307
+ unmaskPattern?: RegExp;
308
+ dateFormat?: string;
309
+ };
310
+ export type AriaDescT = {
311
+ 'aria-label': string;
312
+ } | {
313
+ 'aria-description': string;
314
+ };
315
+ export type VMConfigT = {
316
+ fieldId: string;
317
+ label?: string;
318
+ rendererType: RendererTypesT;
319
+ maskType?: 'Phone' | 'SSN';
320
+ numberMaskOptions?: Omit<UseNumberMaskT.Props, 'valueSetter'>;
321
+ dateFormat?: string;
322
+ validationRules?: Array<IValidationRule>;
323
+ forceRefresh?: boolean;
324
+ };
325
+ export {};
@@ -0,0 +1,13 @@
1
+ import { IFlowMock, TFlow } from '@elliemae/flow-driven-testing';
2
+ export type FlowParams = {
3
+ inboundFlow: string;
4
+ outboundFlow?: string;
5
+ };
6
+ export declare abstract class FlowBase {
7
+ flowParams: FlowParams;
8
+ protected constructor(flowParams: FlowParams);
9
+ protected setTimeoutAwaitable(timeout?: number): Promise<void>;
10
+ abstract get Flows(): TFlow;
11
+ protected getFlowName(rendererName: string, description: string): string;
12
+ static get Mocks(): IFlowMock;
13
+ }
@@ -0,0 +1,6 @@
1
+ import { RenderResult } from '@testing-library/react';
2
+ import { FlowRunner } from '@elliemae/flow-driven-testing';
3
+ export declare abstract class TestBase extends FlowRunner {
4
+ mountApp(): RenderResult;
5
+ init(): void;
6
+ }
@@ -0,0 +1,9 @@
1
+ import { TFlow } from '@elliemae/flow-driven-testing';
2
+ import { FlowBase, FlowParams } from '../base/flowBase';
3
+ export declare class CheckboxRendererFlows extends FlowBase {
4
+ flowParams: FlowParams;
5
+ constructor(flowParams: FlowParams);
6
+ private UpdateCheckboxStatus;
7
+ private CheckCheckboxDisabled;
8
+ get Flows(): TFlow;
9
+ }
@@ -0,0 +1,120 @@
1
+ import { TFlow } from '@elliemae/flow-driven-testing';
2
+ import { FlowBase, FlowParams } from '../base/flowBase';
3
+ /**
4
+ * DateRendererFlows - Comprehensive end-to-end test flows for DateRenderer.
5
+ *
6
+ * Test Coverage:
7
+ * 1. Basic date field rendering verification
8
+ * 2. Date input and blur event handling
9
+ * 3. Value persistence after date change (SSF setFields called)
10
+ * 4. Date format display (MM/DD/YYYY)
11
+ * 5. onBlur validation execution
12
+ * 6. Empty/null value handling
13
+ * 7. Second date field rendering and value entry
14
+ * 8. Date field can be cleared
15
+ * 9. Multiple date value changes
16
+ * 10. Invalid/partial date input resets field and sends null to SSF
17
+ * 11. Invalid date input does not show validation error message
18
+ * 12. Date format option handling (configurable dateFormat prop)
19
+ * 13. Disabled date field - input should be blocked
20
+ * 14. autoFieldSet=false - SSF setFields not called, onBlur still fires
21
+ * 15. Field without onChange callback
22
+ * 16. onDateChange event handler coverage
23
+ */
24
+ export declare class DateRendererFlows extends FlowBase {
25
+ flowParams: FlowParams;
26
+ constructor(flowParams: FlowParams);
27
+ /**
28
+ * Test 1: Verify date field renders correctly
29
+ */
30
+ private CheckDateRendering;
31
+ /**
32
+ * Test 2: Enter a date value and verify it persists
33
+ */
34
+ private CheckDateInputValue;
35
+ /**
36
+ * Test 3: Verify onBlur triggers SSF setFields
37
+ */
38
+ private CheckDateOnBlur;
39
+ /**
40
+ * Test 4: Verify empty date value handling
41
+ */
42
+ private CheckDateEmptyValue;
43
+ /**
44
+ * Test 5: Verify second date field exists and works
45
+ */
46
+ private CheckSecondDateField;
47
+ /**
48
+ * Test 6: Enter value in second date field
49
+ */
50
+ private CheckSecondDateValue;
51
+ /**
52
+ * Test 7: Verify date field can be cleared
53
+ */
54
+ private CheckDateClearValue;
55
+ /**
56
+ * Test 8: Multiple date value changes - use individual inputs to trigger onDateChange
57
+ */
58
+ private CheckDateMultipleChanges;
59
+ /**
60
+ * Test 9: Final state verification
61
+ */
62
+ private CheckDateFinalState;
63
+ /**
64
+ * Test 10: Invalid/partial date input resets field and sends null to SSF
65
+ */
66
+ private CheckInvalidDateResetsField;
67
+ /**
68
+ * Test 11: Partial date input resets field
69
+ */
70
+ private CheckPartialDateResetsField;
71
+ /**
72
+ * Test 12: Invalid date input does not show validation error message
73
+ */
74
+ private CheckInvalidDateNoErrorMessage;
75
+ /**
76
+ * Test 13: Date format option - default MM/DD/YYYY format
77
+ */
78
+ private CheckDateFormatOptionDefault;
79
+ /**
80
+ * Test 14: Valid date entry after invalid - ensures field recovers correctly
81
+ */
82
+ private CheckValidDateAfterInvalid;
83
+ /**
84
+ * Test 15: Final complete state verification
85
+ */
86
+ private CheckDateFinalStateComplete;
87
+ /**
88
+ * Test 16: Disabled date field - input should be blocked
89
+ */
90
+ private CheckDisabledDateField;
91
+ /**
92
+ * Test 17: Disabled date field - blur should not trigger update
93
+ */
94
+ private CheckDisabledDateNoUpdate;
95
+ /**
96
+ * Test 18: autoFieldSet=false - onBlur fires but SSF setFields skipped
97
+ */
98
+ private CheckAutoFieldSetFalse;
99
+ /**
100
+ * Test 19: autoFieldSet=false - valid date entry with manual handling
101
+ */
102
+ private CheckAutoFieldSetFalseBlur;
103
+ /**
104
+ * Test 20: onDateChange event - value changes via individual date inputs
105
+ */
106
+ private CheckOnDateChangeEvent;
107
+ /**
108
+ * Test 21: Date change without onChange callback (field 763 has no onChange)
109
+ */
110
+ private CheckDateChangeWithoutOnChange;
111
+ /**
112
+ * Test 22: Date change with onChange callback (field 748 has onChange)
113
+ */
114
+ private CheckDateWithOnChangeCallback;
115
+ /**
116
+ * Test 23: All date fields final state verification
117
+ */
118
+ private CheckAllDateFieldsFinalState;
119
+ get Flows(): TFlow;
120
+ }
@@ -0,0 +1,92 @@
1
+ import { TFlow } from '@elliemae/flow-driven-testing';
2
+ import { FlowBase, FlowParams } from '../base/flowBase';
3
+ /**
4
+ * DropdownRendererFlows - Comprehensive end-to-end test flows for DropdownRenderer.
5
+ *
6
+ * Test Coverage:
7
+ * 1. Basic dropdown rendering verification
8
+ * 2. Dropdown click to open and select option
9
+ * 3. Value persistence after selection (SSF setFields called)
10
+ * 4. Second dropdown rendering
11
+ * 5. Editable dropdown rendering
12
+ * 6. Padlock unlock and interaction
13
+ * 7. onChange callback verification
14
+ * 8. onBlur validation execution
15
+ * 9. Null/undefined value handling
16
+ * 10. Search highlight state clears on change
17
+ */
18
+ export declare class DropdownRendererFlows extends FlowBase {
19
+ flowParams: FlowParams;
20
+ constructor(flowParams: FlowParams);
21
+ /**
22
+ * Test 1: Verify state dropdown renders correctly
23
+ */
24
+ private CheckDropdownRendering;
25
+ /**
26
+ * Test 2: Open dropdown and select an option
27
+ */
28
+ private CheckDropdownOpenAndSelect;
29
+ /**
30
+ * Test 3: Verify selected value is displayed
31
+ */
32
+ private CheckDropdownValueDisplay;
33
+ /**
34
+ * Test 4: Verify second state dropdown exists
35
+ */
36
+ private CheckSecondDropdownExists;
37
+ /**
38
+ * Test 5: Select option in second dropdown
39
+ */
40
+ private CheckSecondDropdownSelect;
41
+ /**
42
+ * Test 6: Verify editable dropdown exists
43
+ */
44
+ private CheckEditableDropdownExists;
45
+ /**
46
+ * Test 7: Verify editable dropdown can be typed into
47
+ * Note: Padlock tests require specific lock data in mock.
48
+ * This tests the isEditable functionality of field 33.
49
+ */
50
+ private CheckDropdownPadlockUnlock;
51
+ /**
52
+ * Test 8: Interact with editable dropdown after unlock
53
+ */
54
+ private CheckEditableDropdownInteraction;
55
+ /**
56
+ * Test 9: Verify blur event triggers validation
57
+ */
58
+ private CheckDropdownBlurEvent;
59
+ /**
60
+ * Test 10: Verify dropdown doesn't display null/undefined
61
+ */
62
+ private CheckDropdownNoNullDisplay;
63
+ /**
64
+ * Test 11: Re-select different option from second dropdown (1259) to verify onChange fires
65
+ */
66
+ private CheckDropdownReselection;
67
+ /**
68
+ * Test 12: Trigger blur on dropdown input to cover onBlurEvent callback
69
+ */
70
+ private CheckDropdownInputBlur;
71
+ /**
72
+ * Test 13: Type a new value in editable dropdown and select creatable option
73
+ */
74
+ private CheckEditableDropdownCreate;
75
+ /**
76
+ * Test 14: Blur on editable dropdown to trigger commit
77
+ */
78
+ private CheckEditableDropdownBlur;
79
+ /**
80
+ * Test 15: Select option and blur to cover full onChange + onBlur path
81
+ */
82
+ private CheckDropdownSelectThenBlur;
83
+ /**
84
+ * Test 16: Focus and blur without selection to cover edge case
85
+ */
86
+ private CheckDropdownFocusBlurCycle;
87
+ /**
88
+ * Test 17: Final state verification
89
+ */
90
+ private CheckDropdownFinalState;
91
+ get Flows(): TFlow;
92
+ }
@@ -0,0 +1,9 @@
1
+ import { TFlow } from '@elliemae/flow-driven-testing';
2
+ import { FlowBase, FlowParams } from '../base/flowBase';
3
+ export declare class LargeTextRendererFlows extends FlowBase {
4
+ flowParams: FlowParams;
5
+ constructor(flowParams: FlowParams);
6
+ private CheckLargeTextValue;
7
+ private CheckWithMaxCharLimit;
8
+ get Flows(): TFlow;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { TFlow } from '@elliemae/flow-driven-testing';
2
+ import { FlowBase, FlowParams } from '../base/flowBase';
3
+ export declare class NumberRendererFlows extends FlowBase {
4
+ flowParams: FlowParams;
5
+ constructor(flowParams: FlowParams);
6
+ private CheckIntegerValue;
7
+ private CheckD2FormatValue;
8
+ private CheckLockNumberField;
9
+ private CheckMaxLength;
10
+ get Flows(): TFlow;
11
+ }
@@ -0,0 +1,10 @@
1
+ import { TFlow } from '@elliemae/flow-driven-testing';
2
+ import { FlowBase, FlowParams } from '../base/flowBase';
3
+ export declare class RadioRendererFlows extends FlowBase {
4
+ flowParams: FlowParams;
5
+ constructor(flowParams: FlowParams);
6
+ private SelectRadioOption;
7
+ private CheckRadioGroupOptions;
8
+ private CheckDisabledRadioGroupOptions;
9
+ get Flows(): TFlow;
10
+ }
@@ -0,0 +1,16 @@
1
+ import { TFlow } from '@elliemae/flow-driven-testing';
2
+ import { FlowBase, FlowParams } from '../base/flowBase';
3
+ export declare class TextRendererFlows extends FlowBase {
4
+ flowParams: FlowParams;
5
+ constructor(flowParams: FlowParams);
6
+ private CheckTextValue;
7
+ private CheckCorrectEmailValue;
8
+ private CheckIncorrectEmailValue;
9
+ private CheckTextPadLock;
10
+ private CheckPhoneValue;
11
+ private CheckTextMaxLength;
12
+ private CheckSSNValue;
13
+ private CheckFormatFnUppercase;
14
+ private CheckParseFnLowercase;
15
+ get Flows(): TFlow;
16
+ }
@@ -0,0 +1,10 @@
1
+ import { TFlow } from '@elliemae/flow-driven-testing';
2
+ import { FlowBase, FlowParams } from '../base/flowBase';
3
+ export declare class ToggleRendererFlows extends FlowBase {
4
+ flowParams: FlowParams;
5
+ constructor(flowParams: FlowParams);
6
+ private ToggleOnState;
7
+ private ToggleOffState;
8
+ private CheckToggleDisabled;
9
+ get Flows(): TFlow;
10
+ }