@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,195 @@
1
+ import { useEffect, useState } from "react";
2
+ import { HookBase } from "./hookBase";
3
+ class FieldValue extends HookBase {
4
+ async getFieldValue(fieldId) {
5
+ try {
6
+ const value = await this.BLL.SSF.getFieldValue(fieldId);
7
+ return value;
8
+ } catch (error) {
9
+ this.BLL.Core.Log("error", `error fetching field value for ${fieldId}`, {
10
+ fieldId,
11
+ error
12
+ });
13
+ return void 0;
14
+ }
15
+ }
16
+ formatValue(params) {
17
+ const { fieldValue, fieldFormat, options } = params;
18
+ if (fieldValue === null || fieldValue === void 0 || fieldValue === "") {
19
+ return fieldValue;
20
+ }
21
+ return this.formatByRendererType(fieldValue, fieldFormat, options);
22
+ }
23
+ formatByRendererType(fieldValue, fieldFormat, options) {
24
+ const { rendererType, maskType, numberMaskOptions } = options;
25
+ switch (rendererType) {
26
+ case "text":
27
+ case "email":
28
+ case "radiogroup":
29
+ case "radio":
30
+ return this.formatTextValue({
31
+ value: fieldValue,
32
+ fieldFormat,
33
+ maskType,
34
+ rendererType
35
+ });
36
+ case "number":
37
+ return this.formatNumberValue(
38
+ fieldValue,
39
+ fieldFormat,
40
+ numberMaskOptions
41
+ );
42
+ case "checkbox":
43
+ return this.formatBooleanValue(fieldValue);
44
+ case "date":
45
+ return this.formatDateValue(fieldValue, options.dateFormat);
46
+ case "dropdown":
47
+ return this.formatDropdownValue(fieldValue);
48
+ case "zipcode":
49
+ return this.formatZipValue(String(fieldValue));
50
+ default:
51
+ return fieldValue;
52
+ }
53
+ }
54
+ formatTextValue({
55
+ value,
56
+ fieldFormat,
57
+ maskType,
58
+ rendererType
59
+ }) {
60
+ if ((rendererType === "radio" || rendererType === "radiogroup") && fieldFormat === "Y") {
61
+ return this.formatBooleanValue(value);
62
+ }
63
+ if (maskType === "SSN" || fieldFormat === "SS") {
64
+ return this.BLL.Formatter.createFormatter("SS").format(value);
65
+ }
66
+ if (maskType === "Phone" || fieldFormat === "P") {
67
+ return this.BLL.Formatter.createFormatter("P").format(value, {
68
+ isInternational: false
69
+ });
70
+ }
71
+ return String(value);
72
+ }
73
+ formatNumberValue(value, fieldFormat, numberMaskOptions) {
74
+ return this.BLL.Formatter.createFormatter("D2").format(value, {
75
+ fieldFormat,
76
+ numberOptions: {
77
+ includeThousandsSeparator: true,
78
+ ...numberMaskOptions
79
+ }
80
+ });
81
+ }
82
+ formatBooleanValue(value) {
83
+ return this.BLL.Formatter.createFormatter("Y").format(value);
84
+ }
85
+ formatDateValue(value, dateFormat) {
86
+ return this.BLL.Formatter.createFormatter("DT").format(value, {
87
+ dateFormat
88
+ });
89
+ }
90
+ formatDropdownValue(value) {
91
+ const formatter = this.BLL.Formatter.createFormatter("DD");
92
+ return formatter.format(value);
93
+ }
94
+ formatZipValue(value) {
95
+ const formatter = this.BLL.Formatter.createFormatter("Z");
96
+ return formatter.format(value);
97
+ }
98
+ useFieldValue(params) {
99
+ const { fieldId, fieldFormat, options } = params;
100
+ const [fieldValue, setFieldValue] = useState(void 0);
101
+ useEffect(() => {
102
+ (async () => {
103
+ if (fieldFormat) {
104
+ const value = await this.getFieldValue(fieldId);
105
+ setFieldValue(
106
+ this.formatValue({
107
+ fieldValue: value,
108
+ fieldFormat,
109
+ options
110
+ })
111
+ );
112
+ }
113
+ })();
114
+ }, [fieldId, fieldFormat]);
115
+ return {
116
+ fieldValue,
117
+ setFieldValue
118
+ };
119
+ }
120
+ // eslint-disable-next-line complexity
121
+ parseValue(params) {
122
+ const { fieldValue, fieldFormat, options } = params;
123
+ if (fieldValue === null || fieldValue === void 0 || fieldValue === "") {
124
+ return fieldValue;
125
+ }
126
+ const { rendererType, maskType, unmaskPattern } = options;
127
+ switch (rendererType) {
128
+ case "text":
129
+ case "email":
130
+ case "radio":
131
+ case "radiogroup":
132
+ return this.parseTextValue({
133
+ rendererType,
134
+ value: fieldValue,
135
+ fieldFormat,
136
+ maskType,
137
+ unmaskPattern
138
+ });
139
+ case "number":
140
+ return this.parseNumberValue({
141
+ value: fieldValue,
142
+ fieldFormat,
143
+ unmaskPattern
144
+ });
145
+ case "checkbox":
146
+ return this.parseBooleanValue(fieldValue);
147
+ case "date":
148
+ return this.parseDateValue({
149
+ value: fieldValue,
150
+ dateFormat: options.dateFormat
151
+ });
152
+ case "zipcode":
153
+ return this.parseZipValue(String(fieldValue));
154
+ default:
155
+ return fieldValue;
156
+ }
157
+ }
158
+ parseTextValue(params) {
159
+ const { rendererType, value, fieldFormat, maskType, unmaskPattern } = params;
160
+ if ((rendererType === "radio" || rendererType === "radiogroup") && fieldFormat === "Y") {
161
+ return this.parseBooleanValue(value);
162
+ }
163
+ if (maskType === "SSN" || fieldFormat === "SS") {
164
+ return this.BLL.Formatter.createFormatter("SS").parse(String(value));
165
+ }
166
+ if (maskType === "Phone" || fieldFormat === "P") {
167
+ return this.BLL.Formatter.createFormatter("P").parse(String(value), {
168
+ unmaskPattern
169
+ });
170
+ }
171
+ return value;
172
+ }
173
+ parseNumberValue(params) {
174
+ const { value, fieldFormat, unmaskPattern } = params;
175
+ return this.BLL.Formatter.createFormatter("D2").parse(String(value), {
176
+ fieldFormat,
177
+ unmaskPattern
178
+ });
179
+ }
180
+ parseBooleanValue(value) {
181
+ return this.BLL.Formatter.createFormatter("Y").parse(Boolean(value));
182
+ }
183
+ parseDateValue(params) {
184
+ const { value, dateFormat } = params;
185
+ return this.BLL.Formatter.createFormatter("DT").parse(String(value), {
186
+ dateFormat
187
+ });
188
+ }
189
+ parseZipValue(value) {
190
+ return this.BLL.Formatter.createFormatter("Z").parse(value);
191
+ }
192
+ }
193
+ export {
194
+ FieldValue
195
+ };
@@ -0,0 +1,9 @@
1
+ class HookBase {
2
+ BLL;
3
+ constructor(bll) {
4
+ this.BLL = bll;
5
+ }
6
+ }
7
+ export {
8
+ HookBase
9
+ };
@@ -0,0 +1,121 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators2, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators2.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators2[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ import { decorators } from "@elliemae/pui-app-sdk";
12
+ import { useState, useEffect } from "react";
13
+ import { FieldMeta } from "./fieldMeta";
14
+ import { FieldValue } from "./fieldValue";
15
+ import { FieldDisabled } from "./fieldDisabled";
16
+ import { FieldLocked } from "./fieldLocked";
17
+ import { FieldValidation } from "./fieldValidation";
18
+ import { FieldSubscribers } from "./fieldSubscribers";
19
+ import { FieldGoTo } from "./fieldGoTo";
20
+ import { HookBase } from "./hookBase";
21
+ import { FieldDescription } from "./fieldDescription";
22
+ let Hooks = class extends HookBase {
23
+ useFieldInit(params) {
24
+ const {
25
+ fieldId,
26
+ label = "",
27
+ rendererType,
28
+ maskType,
29
+ numberMaskOptions,
30
+ dateFormat,
31
+ forceRefresh
32
+ } = params;
33
+ const [fieldMetadata, setFieldMetadata] = useState(
34
+ {}
35
+ );
36
+ const [fieldValue, setFieldValue] = useState(void 0);
37
+ const [isLockedState, setIsLockedState] = useState(false);
38
+ const [isSearchedField, setIsSearchedField] = useState(false);
39
+ const [isReadonlyLoan, setIsReadonlyLoan] = useState(false);
40
+ const [validationResult, setValidationResult] = useState(null);
41
+ const [ariaDescProps, setAriaDescProps] = useState({ "aria-label": label || "" });
42
+ useEffect(() => {
43
+ if (!fieldId) return;
44
+ (async () => {
45
+ const [metadata, isLoanReadonly, lockStatus, fldValue, isGoToField] = await Promise.all([
46
+ this.getMetadata(fieldId),
47
+ this.isLoanReadonly(),
48
+ this.getFieldLockStatus(fieldId),
49
+ this.getFieldValue(fieldId),
50
+ this.isGoToField(fieldId)
51
+ ]);
52
+ setFieldMetadata(metadata);
53
+ setFieldValue(
54
+ this.formatValue({
55
+ fieldValue: fldValue,
56
+ fieldFormat: metadata.fieldFormat,
57
+ options: {
58
+ rendererType,
59
+ maskType,
60
+ numberMaskOptions,
61
+ dateFormat
62
+ }
63
+ })
64
+ );
65
+ if (metadata.isLockField) {
66
+ setIsLockedState(lockStatus);
67
+ } else {
68
+ setIsLockedState(false);
69
+ }
70
+ setIsReadonlyLoan(isLoanReadonly);
71
+ setIsSearchedField(isGoToField);
72
+ setAriaDescProps(
73
+ this.getFieldAriaDescProps(label || "", metadata.description || "")
74
+ );
75
+ })();
76
+ }, [fieldId, forceRefresh]);
77
+ const isFieldDisabled = isReadonlyLoan || fieldMetadata.isLockField && !isLockedState || fieldMetadata.isReadOnly;
78
+ return {
79
+ fieldMetadata,
80
+ fieldValue,
81
+ setFieldValue,
82
+ isLockedState,
83
+ setIsLockedState,
84
+ isSearchedField,
85
+ setIsSearchedField,
86
+ isFieldDisabled,
87
+ validationResult,
88
+ setValidationResult,
89
+ ariaDescProps
90
+ };
91
+ }
92
+ useFieldGoTo(fieldId) {
93
+ const [isGoToField, setIsGoToField] = useState(false);
94
+ useEffect(() => {
95
+ if (!fieldId) return;
96
+ (async () => {
97
+ const goToStatus = await this.isGoToField(fieldId);
98
+ setIsGoToField(goToStatus);
99
+ })();
100
+ }, [fieldId]);
101
+ return {
102
+ isGoToField,
103
+ setIsGoToField
104
+ };
105
+ }
106
+ };
107
+ Hooks = __decorateClass([
108
+ decorators.class.Mixins(
109
+ FieldMeta,
110
+ FieldValue,
111
+ FieldDisabled,
112
+ FieldLocked,
113
+ FieldValidation,
114
+ FieldSubscribers,
115
+ FieldGoTo,
116
+ FieldDescription
117
+ )
118
+ ], Hooks);
119
+ export {
120
+ Hooks
121
+ };
@@ -0,0 +1,178 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { BrComponent } from "@elliemae/business-rules";
3
+ import { BLL } from "../../bll";
4
+ import { RENDERER_CONTROLLED_PROPS } from "../../bll/constants";
5
+ import { Hooks } from "./hooks";
6
+ class Renderer {
7
+ BrComponent = BrComponent;
8
+ fieldFormat = "";
9
+ BLL;
10
+ Hooks;
11
+ BRWrapper;
12
+ VM;
13
+ Props;
14
+ constructor() {
15
+ this.VM = {};
16
+ this.BLL = new BLL();
17
+ this.Hooks = new Hooks(this.BLL);
18
+ this.BRWrapper = this.renderBR();
19
+ this.Props = {};
20
+ }
21
+ async refreshFieldFromLoan() {
22
+ if (this.BLL.SSF.fieldValueResolver) return;
23
+ const { fieldId } = this.Props;
24
+ const fieldVal = await this.BLL.SSF.getFieldValue(fieldId);
25
+ const formattedValue = this.getFormattedValue(fieldVal);
26
+ this.VM.setFieldValue(formattedValue);
27
+ const valResult = this.Hooks.runValidationsOnValue(formattedValue, []);
28
+ if (!valResult.isValid) {
29
+ return;
30
+ }
31
+ this.VM.setValidationResult(valResult);
32
+ }
33
+ initCallbacks = () => {
34
+ (async () => {
35
+ await this.refreshFieldFromLoan();
36
+ })();
37
+ };
38
+ renderBR() {
39
+ const { BrComponent: BRWrapper } = this;
40
+ const BrComponentWrapper = (props) => /* @__PURE__ */ jsx(BRWrapper, { ...props, init: this.initCallbacks });
41
+ return BrComponentWrapper;
42
+ }
43
+ syncVM(vm) {
44
+ Object.keys(vm).forEach(
45
+ (key) => {
46
+ this.VM[key] = vm[key];
47
+ }
48
+ );
49
+ return this.VM;
50
+ }
51
+ buildFormatOptions(props) {
52
+ const { rendererType } = props;
53
+ const rendererOptionMap = {
54
+ text: "maskType",
55
+ number: "numberMaskOptions",
56
+ date: "dateFormat"
57
+ };
58
+ const formatOptions = {};
59
+ const optionKey = rendererOptionMap[rendererType];
60
+ if (optionKey && optionKey in props && props[optionKey]) {
61
+ formatOptions[optionKey] = props[optionKey];
62
+ }
63
+ return formatOptions;
64
+ }
65
+ initVM(props) {
66
+ const { fieldId, label = "", forceRefresh } = props;
67
+ Object.assign(this.Props, props);
68
+ const formatOptions = this.buildFormatOptions(props);
69
+ const {
70
+ fieldMetadata,
71
+ fieldValue,
72
+ setFieldValue,
73
+ isLockedState,
74
+ setIsLockedState,
75
+ isSearchedField,
76
+ setIsSearchedField,
77
+ isFieldDisabled,
78
+ validationResult,
79
+ setValidationResult,
80
+ ariaDescProps
81
+ } = this.Hooks.useFieldInit({
82
+ fieldId,
83
+ label,
84
+ rendererType: props.rendererType,
85
+ maskType: formatOptions.maskType,
86
+ numberMaskOptions: formatOptions.numberMaskOptions,
87
+ dateFormat: formatOptions.dateFormat,
88
+ forceRefresh
89
+ });
90
+ return this.syncVM({
91
+ fieldMetadata,
92
+ fieldValue,
93
+ setFieldValue,
94
+ isLockedState,
95
+ setIsLockedState,
96
+ isSearchedField,
97
+ setIsSearchedField,
98
+ isFieldDisabled,
99
+ validationResult,
100
+ setValidationResult,
101
+ ariaDescProps
102
+ });
103
+ }
104
+ toggleLockStatus(fieldId, isLockedState) {
105
+ (async () => {
106
+ await this.BLL.SSF.callCalcForLock(fieldId, isLockedState);
107
+ })();
108
+ this.VM.setIsLockedState(!isLockedState);
109
+ }
110
+ buildValidationProps(validationResult) {
111
+ return {
112
+ validationMessage: validationResult && !validationResult.isValid ? validationResult.message || "" : "",
113
+ hasError: validationResult ? !validationResult.isValid : false
114
+ };
115
+ }
116
+ getFormattedValue(fieldValue) {
117
+ const props = this.Props;
118
+ const { rendererType, maskType, numberMaskOptions, dateFormat } = props;
119
+ const fieldFormat = this.VM.fieldMetadata?.fieldFormat || "";
120
+ return this.Hooks.formatValue({
121
+ fieldValue,
122
+ fieldFormat,
123
+ options: {
124
+ rendererType,
125
+ maskType: rendererType === "text" ? maskType : void 0,
126
+ numberMaskOptions: rendererType === "number" ? numberMaskOptions : void 0,
127
+ dateFormat: rendererType === "date" ? dateFormat : void 0
128
+ }
129
+ });
130
+ }
131
+ getParsedValue(fieldValue) {
132
+ const props = this.Props;
133
+ const { rendererType, maskType, dateFormat } = props;
134
+ const fieldFormat = this.VM.fieldMetadata?.fieldFormat || "";
135
+ return this.Hooks.parseValue({
136
+ fieldValue,
137
+ fieldFormat,
138
+ options: {
139
+ rendererType,
140
+ maskType: rendererType === "text" ? maskType : void 0,
141
+ dateFormat: rendererType === "date" ? dateFormat : void 0
142
+ }
143
+ });
144
+ }
145
+ /**
146
+ * Sanitizes extra props by filtering out renderer-controlled properties.
147
+ * Prevents consumers from accidentally overriding internal state management.
148
+ * @template TExtra - Type of the extra props object
149
+ * @param {TExtra | undefined} extra - Additional props passed by the consumer
150
+ * @returns {Omit<TExtra, string>} Sanitized props object with controlled keys removed
151
+ * @example
152
+ * const sanitized = this.sanitize({ className: 'custom', onChange: () => {} });
153
+ * // Returns: { className: 'custom' } (onChange is filtered out)
154
+ */
155
+ sanitize(extra) {
156
+ if (!extra) return {};
157
+ const controlledKeys = RENDERER_CONTROLLED_PROPS[this.Props.rendererType];
158
+ if (!controlledKeys || controlledKeys.length === 0) {
159
+ return extra;
160
+ }
161
+ const controlledSet = new Set(controlledKeys);
162
+ const sanitized = Object.keys(extra).reduce((acc, key) => {
163
+ if (controlledSet.has(key)) {
164
+ this.BLL.Core.Log(
165
+ "warn",
166
+ `[${this.Props.rendererType}Renderer] Filtered controlled prop '${key}' from extra props. This prop is managed internally.`
167
+ );
168
+ } else {
169
+ acc[key] = extra[key];
170
+ }
171
+ return acc;
172
+ }, {});
173
+ return sanitized;
174
+ }
175
+ }
176
+ export {
177
+ Renderer
178
+ };
@@ -0,0 +1,77 @@
1
+ import { bllInstance } from "../../bll";
2
+ class RendererValidator {
3
+ static NUMERIC_FORMATS = ["DECIMAL", "INTEGER"];
4
+ static BOOLEAN_FORMATS = ["YN", "BOOLEAN"];
5
+ static DATE_FORMATS = ["DATE", "DATETIME"];
6
+ static validateRendererType({
7
+ rendererType,
8
+ fieldFormat
9
+ }) {
10
+ const format = fieldFormat?.toUpperCase();
11
+ if (rendererType === "number") {
12
+ return {
13
+ isValid: this.isNumericFormat(format),
14
+ expectedType: "number"
15
+ };
16
+ }
17
+ if (rendererType === "checkbox") {
18
+ return {
19
+ isValid: this.isBooleanFormat(format),
20
+ expectedType: "checkbox"
21
+ };
22
+ }
23
+ if (rendererType === "text" || rendererType === "email") {
24
+ return {
25
+ isValid: this.isTextCompatibleFormat(format),
26
+ expectedType: "text/email"
27
+ };
28
+ }
29
+ if (rendererType === "date" || rendererType === "datetime") {
30
+ return {
31
+ isValid: this.isDateFormat(format),
32
+ expectedType: "date/datetime"
33
+ };
34
+ }
35
+ return { isValid: true, expectedType: "unknown" };
36
+ }
37
+ static isNumericFormat(format) {
38
+ return this.NUMERIC_FORMATS.some((f) => format?.includes(f)) || false;
39
+ }
40
+ static isBooleanFormat(format) {
41
+ return this.BOOLEAN_FORMATS.includes(format || "");
42
+ }
43
+ static isDateFormat(format) {
44
+ return this.DATE_FORMATS.includes(format || "");
45
+ }
46
+ static isTextCompatibleFormat(format) {
47
+ return !(this.isNumericFormat(format) || this.isBooleanFormat(format) || this.isDateFormat(format));
48
+ }
49
+ static logMismatch({
50
+ fieldId,
51
+ rendererType,
52
+ fieldFormat,
53
+ metadata
54
+ }) {
55
+ const { isValid, expectedType } = this.validateRendererType({
56
+ rendererType,
57
+ fieldFormat
58
+ });
59
+ if (isValid) {
60
+ return;
61
+ }
62
+ bllInstance.Core.Log(
63
+ "error",
64
+ `[RendererValidator] Mismatch for field ${fieldId}: using rendererType="${rendererType}" but fieldFormat="${fieldFormat}" suggests "${expectedType}"`,
65
+ {
66
+ rendererType,
67
+ fieldFormat,
68
+ expectedType,
69
+ metadata
70
+ }
71
+ );
72
+ throw new Error("Renderer type mismatch");
73
+ }
74
+ }
75
+ export {
76
+ RendererValidator
77
+ };
@@ -0,0 +1,38 @@
1
+ import { TextRenderer } from "../field-renderers/TextRenderer";
2
+ import { NumberRenderer } from "../field-renderers/NumberRenderer";
3
+ import { CheckboxRenderer } from "../field-renderers/CheckboxRenderer";
4
+ import { RadioRenderer } from "../field-renderers/RadioRenderer";
5
+ import { RadioGroupRenderer } from "../field-renderers/RadioGroupRenderer";
6
+ import { DropdownRenderer } from "../field-renderers/DropdownRenderer";
7
+ import { DateRenderer } from "../field-renderers/DateRenderer";
8
+ import { LargeTextRenderer } from "../field-renderers/LargeTextRenderer";
9
+ import { ZipCodeRenderer } from "../field-renderers/ZipCodeRenderer/index";
10
+ import { ToggleRenderer } from "../field-renderers/ToggleRenderer";
11
+ const rendererMap = {
12
+ text: () => new TextRenderer().render(),
13
+ email: () => new TextRenderer().render(),
14
+ number: () => new NumberRenderer().render(),
15
+ checkbox: () => new CheckboxRenderer().render(),
16
+ radio: () => new RadioRenderer().render(),
17
+ radiogroup: () => new RadioGroupRenderer().render(),
18
+ dropdown: () => new DropdownRenderer().render(),
19
+ date: () => new DateRenderer().render(),
20
+ zipcode: () => new ZipCodeRenderer().render(),
21
+ largetext: () => new LargeTextRenderer().render(),
22
+ toggle: () => new ToggleRenderer().render()
23
+ };
24
+ class RendererFactory {
25
+ static create(type) {
26
+ const factory = rendererMap[type];
27
+ if (!factory) {
28
+ throw new Error(`Renderer type ${type} is not supported.`);
29
+ }
30
+ return factory();
31
+ }
32
+ render() {
33
+ return (props) => RendererFactory.create(props.rendererType)(props);
34
+ }
35
+ }
36
+ export {
37
+ RendererFactory
38
+ };
@@ -0,0 +1,55 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { DSInputGroup } from "@elliemae/ds-form-layout-input-group";
3
+ import { LockUnlocked, LockLocked } from "@elliemae/ds-icons";
4
+ import { BUTTON_SIZES, DSButtonV3, BUTTON_TYPES } from "@elliemae/ds-button-v2";
5
+ import { Renderer } from "../base/renderer";
6
+ class AddonRenderer extends Renderer {
7
+ renderPadLock({
8
+ fieldId,
9
+ isLocked,
10
+ isDisabled = false,
11
+ onToggle
12
+ }) {
13
+ return /* @__PURE__ */ jsx(
14
+ DSButtonV3,
15
+ {
16
+ buttonType: BUTTON_TYPES.ICON,
17
+ "aria-label": isLocked ? "Lock" : "UnLock",
18
+ "data-testid": isLocked ? `lock-${fieldId}` : `unlock-${fieldId}`,
19
+ disabled: isDisabled,
20
+ size: BUTTON_SIZES.M,
21
+ onClick: onToggle,
22
+ children: isLocked ? /* @__PURE__ */ jsx(LockLocked, {}) : /* @__PURE__ */ jsx(LockUnlocked, {})
23
+ }
24
+ );
25
+ }
26
+ render() {
27
+ const Addon = (props) => {
28
+ const {
29
+ fieldId,
30
+ isPadLock,
31
+ isLocked,
32
+ isDisable,
33
+ rightAddon,
34
+ onPadLockToggle
35
+ } = props;
36
+ return isPadLock || rightAddon ? /* @__PURE__ */ jsx(
37
+ DSInputGroup,
38
+ {
39
+ leftAddon: isPadLock ? this.renderPadLock({
40
+ fieldId,
41
+ isLocked: isLocked || false,
42
+ isDisabled: isDisable,
43
+ onToggle: onPadLockToggle
44
+ }) : void 0,
45
+ rightAddon,
46
+ children: props.children
47
+ }
48
+ ) : props.children;
49
+ };
50
+ return Addon;
51
+ }
52
+ }
53
+ export {
54
+ AddonRenderer
55
+ };