@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,223 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var TextRenderer_exports = {};
30
+ __export(TextRenderer_exports, {
31
+ TextRenderer: () => TextRenderer
32
+ });
33
+ module.exports = __toCommonJS(TextRenderer_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
35
+ var import_react = __toESM(require("react"));
36
+ var import_ds_controlled_form = require("@elliemae/ds-controlled-form");
37
+ var import_renderer = require("../base/renderer");
38
+ var import_AddonRenderer = require("./AddonRenderer");
39
+ var import_styles = require("../styles");
40
+ class TextRenderer extends import_renderer.Renderer {
41
+ AddOnRenderer;
42
+ constructor() {
43
+ super();
44
+ this.AddOnRenderer = new import_AddonRenderer.AddonRenderer().render();
45
+ this.BRWrapper = this.renderBR();
46
+ }
47
+ render() {
48
+ const TextComponent = (props) => {
49
+ const {
50
+ id,
51
+ fieldId,
52
+ isDisable,
53
+ validationRules = [],
54
+ formatFn,
55
+ parseFn,
56
+ onChange,
57
+ onBlur,
58
+ autoFieldSet = true,
59
+ label,
60
+ rightAddon,
61
+ rendererType,
62
+ extra,
63
+ ...rest
64
+ } = props;
65
+ const { BRWrapper, AddOnRenderer } = this;
66
+ const {
67
+ fieldMetadata,
68
+ fieldValue,
69
+ setFieldValue,
70
+ isLockedState,
71
+ isSearchedField,
72
+ isFieldDisabled,
73
+ validationResult,
74
+ setIsSearchedField,
75
+ ariaDescProps
76
+ } = this.initVM(props);
77
+ const {
78
+ isLockField = false,
79
+ maxLength = 0,
80
+ fieldFormat = ""
81
+ } = fieldMetadata || {};
82
+ this.fieldFormat = fieldFormat;
83
+ const { maskType } = rendererType === "text" ? props : {};
84
+ const displayValue = import_react.default.useMemo(() => {
85
+ const rawValue = fieldValue || "";
86
+ if (formatFn && typeof formatFn === "function") {
87
+ return formatFn(rawValue, fieldMetadata);
88
+ }
89
+ return this.getFormattedValue(rawValue);
90
+ }, [fieldValue, fieldMetadata, formatFn]);
91
+ const phoneMaskProps = (0, import_ds_controlled_form.usePhoneMask)({
92
+ valueSetter: (data) => {
93
+ if (!props.isDisable && !isFieldDisabled) {
94
+ setFieldValue(data);
95
+ }
96
+ }
97
+ });
98
+ const ssnMaskProps = (0, import_ds_controlled_form.useSSNMask)({
99
+ valueSetter: (data) => {
100
+ if (!props.isDisable && !isFieldDisabled) {
101
+ setFieldValue(data);
102
+ }
103
+ }
104
+ });
105
+ const onBlurEvent = (0, import_react.useCallback)(
106
+ (e) => {
107
+ const { value } = e.target;
108
+ if (!isDisable && !isFieldDisabled) {
109
+ const formattedValue = formatFn && typeof formatFn === "function" ? formatFn(value, fieldMetadata) : this.getFormattedValue(value);
110
+ setFieldValue(formattedValue);
111
+ const rulesToCheck = [...validationRules];
112
+ if (rendererType === "email") {
113
+ rulesToCheck.push({
114
+ type: "email",
115
+ message: "Please enter a valid email address."
116
+ });
117
+ }
118
+ const tempValResult = this.Hooks.runValidationsOnValue(
119
+ formattedValue,
120
+ rulesToCheck
121
+ );
122
+ this.VM.setValidationResult(tempValResult);
123
+ if (!tempValResult.isValid) {
124
+ return;
125
+ }
126
+ const parsedValue = parseFn && typeof parseFn === "function" ? parseFn(formattedValue, fieldMetadata) : this.getParsedValue(formattedValue);
127
+ if (autoFieldSet) {
128
+ (async () => {
129
+ await this.BLL.SSF.setFieldValue(fieldId, parsedValue);
130
+ })();
131
+ }
132
+ if (onBlur) {
133
+ onBlur(fieldId, parsedValue);
134
+ }
135
+ }
136
+ },
137
+ // eslint-disable-next-line react-hooks/exhaustive-deps
138
+ [
139
+ autoFieldSet,
140
+ fieldId,
141
+ fieldMetadata,
142
+ formatFn,
143
+ isDisable,
144
+ isFieldDisabled,
145
+ onBlur,
146
+ parseFn,
147
+ rendererType,
148
+ setFieldValue,
149
+ validationRules
150
+ ]
151
+ );
152
+ const onChangeEvent = (0, import_react.useCallback)(
153
+ (e) => {
154
+ setIsSearchedField(false);
155
+ const { value } = e.target;
156
+ if (!isDisable && !isFieldDisabled) {
157
+ setFieldValue(value);
158
+ if (onChange) {
159
+ onChange(fieldId, value);
160
+ }
161
+ }
162
+ },
163
+ [
164
+ fieldId,
165
+ isDisable,
166
+ isFieldDisabled,
167
+ onChange,
168
+ setFieldValue,
169
+ setIsSearchedField
170
+ ]
171
+ );
172
+ const maskProps = {
173
+ ...maskType === "Phone" && phoneMaskProps ? phoneMaskProps : {},
174
+ ...maskType === "SSN" && ssnMaskProps ? ssnMaskProps : {}
175
+ };
176
+ const validationProps = this.buildValidationProps(validationResult);
177
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
178
+ BRWrapper,
179
+ {
180
+ fieldId,
181
+ inputID: id || fieldId,
182
+ label,
183
+ value: displayValue,
184
+ ...validationProps,
185
+ ...props.brCompProps || {},
186
+ withHighlight: isSearchedField,
187
+ children: [
188
+ !label && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_styles.EmptyLabel, { htmlFor: id || fieldId }),
189
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
190
+ AddOnRenderer,
191
+ {
192
+ rendererType: "addon",
193
+ fieldId,
194
+ isLocked: isLockedState,
195
+ isPadLock: isLockField,
196
+ isDisable: props.isDisable,
197
+ onPadLockToggle: () => this.toggleLockStatus(fieldId, isLockedState || false),
198
+ rightAddon,
199
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
200
+ import_ds_controlled_form.DSInputText,
201
+ {
202
+ id: id || fieldId,
203
+ "data-testid": fieldId,
204
+ value: displayValue,
205
+ applyAriaDisabled: isFieldDisabled || isDisable,
206
+ ...maxLength && maxLength > 0 && { maxLength },
207
+ onChange: onChangeEvent,
208
+ onBlur: onBlurEvent,
209
+ ...extra,
210
+ ...maskProps,
211
+ ...ariaDescProps,
212
+ ...this.sanitize(rest)
213
+ }
214
+ )
215
+ }
216
+ )
217
+ ]
218
+ }
219
+ );
220
+ };
221
+ return import_react.default.memo(TextComponent);
222
+ }
223
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var ToggleRenderer_exports = {};
30
+ __export(ToggleRenderer_exports, {
31
+ ToggleRenderer: () => ToggleRenderer
32
+ });
33
+ module.exports = __toCommonJS(ToggleRenderer_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
35
+ var import_react = __toESM(require("react"));
36
+ var import_ds_form_toggle = require("@elliemae/ds-form-toggle");
37
+ var import_ds_form_layout_label = require("@elliemae/ds-form-layout-label");
38
+ var import_renderer = require("../base/renderer");
39
+ var import_styles = require("../styles");
40
+ class ToggleRenderer extends import_renderer.Renderer {
41
+ constructor() {
42
+ super();
43
+ this.BRWrapper = this.renderBR();
44
+ }
45
+ render() {
46
+ const { BRWrapper } = this;
47
+ const ToggleComponent = (props) => {
48
+ const { fieldId, onChange, isDisable, label, extra, ...rest } = props;
49
+ const {
50
+ fieldValue,
51
+ isFieldDisabled,
52
+ setFieldValue,
53
+ validationResult,
54
+ isSearchedField,
55
+ setIsSearchedField
56
+ } = this.initVM(props);
57
+ const validationProps = this.buildValidationProps(validationResult);
58
+ const onChangeEvent = (0, import_react.useCallback)(() => {
59
+ setIsSearchedField(false);
60
+ if (!isDisable && !isFieldDisabled) {
61
+ const updatedValue = !fieldValue;
62
+ const formattedValue = this.getFormattedValue(updatedValue);
63
+ setFieldValue(formattedValue);
64
+ const parsedValue = this.getParsedValue(formattedValue);
65
+ (async () => {
66
+ await this.BLL.SSF.setFieldValue(fieldId, parsedValue);
67
+ if (onChange) {
68
+ onChange(fieldId, parsedValue);
69
+ }
70
+ })();
71
+ }
72
+ }, [
73
+ isDisable,
74
+ isFieldDisabled,
75
+ fieldValue,
76
+ onChange,
77
+ setFieldValue,
78
+ setIsSearchedField,
79
+ fieldId
80
+ ]);
81
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
83
+ import_ds_form_layout_label.DSFormLayoutLabel,
84
+ {
85
+ fontWeight: import_styles.theme.fontWeights.semibold,
86
+ htmlFor: fieldId,
87
+ "data-public": true,
88
+ children: label
89
+ }
90
+ ),
91
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
92
+ BRWrapper,
93
+ {
94
+ fieldId,
95
+ inputID: fieldId,
96
+ value: !!fieldValue,
97
+ ...props.brCompProps || {},
98
+ withHighlight: isSearchedField,
99
+ ...validationProps,
100
+ children: [
101
+ !label && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_styles.EmptyLabel, { htmlFor: fieldId }),
102
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
103
+ import_ds_form_toggle.DSControlledToggle,
104
+ {
105
+ containerProps: { "data-testid": fieldId },
106
+ id: fieldId,
107
+ checked: !!fieldValue,
108
+ applyAriaDisabled: isFieldDisabled || isDisable,
109
+ onChange: onChangeEvent,
110
+ ...extra,
111
+ ...this.sanitize(rest)
112
+ }
113
+ )
114
+ ]
115
+ }
116
+ )
117
+ ] });
118
+ };
119
+ return import_react.default.memo(ToggleComponent);
120
+ }
121
+ }
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var helper_exports = {};
20
+ __export(helper_exports, {
21
+ ZipCodeHelper: () => ZipCodeHelper,
22
+ useDebouncedCallback: () => useDebouncedCallback
23
+ });
24
+ module.exports = __toCommonJS(helper_exports);
25
+ var import_react = require("react");
26
+ const useDebouncedCallback = (callback, waitTimeout = 150, options = { leading: false }) => {
27
+ const timeoutRef = (0, import_react.useRef)(null);
28
+ const leadingRef = (0, import_react.useRef)(options.leading ?? false);
29
+ const callbackRef = (0, import_react.useRef)(callback);
30
+ (0, import_react.useEffect)(() => {
31
+ callbackRef.current = callback;
32
+ }, [callback]);
33
+ const clearTimeoutFn = (0, import_react.useCallback)(() => {
34
+ if (timeoutRef.current !== null) {
35
+ window.clearTimeout(timeoutRef.current);
36
+ timeoutRef.current = null;
37
+ }
38
+ }, []);
39
+ (0, import_react.useEffect)(() => clearTimeoutFn, [clearTimeoutFn]);
40
+ const debouncedCallback = (0, import_react.useCallback)(
41
+ (...args) => {
42
+ clearTimeoutFn();
43
+ if (leadingRef.current) {
44
+ callbackRef.current(...args);
45
+ leadingRef.current = false;
46
+ } else {
47
+ timeoutRef.current = window.setTimeout(() => {
48
+ callbackRef.current(...args);
49
+ leadingRef.current = options.leading ?? false;
50
+ }, waitTimeout);
51
+ }
52
+ },
53
+ [waitTimeout, clearTimeoutFn, options.leading]
54
+ );
55
+ return debouncedCallback;
56
+ };
57
+ class ZipCodeHelper {
58
+ // Prevent instantiation - this is a static utility class
59
+ constructor() {
60
+ }
61
+ static SECTION_OPTION = {
62
+ dsId: "section",
63
+ type: "section",
64
+ label: "Please select the appropriate city",
65
+ options: [],
66
+ zipNumber: "",
67
+ cityData: null
68
+ };
69
+ static DEFAULT_COUNTRY_CODE = "US";
70
+ /**
71
+ * Normalizes city data from various API response formats
72
+ * Handles both uppercase and lowercase property names
73
+ * @param cityData - The city data object to normalize
74
+ * @returns Normalized object with lowercase property names
75
+ */
76
+ static normalizeCityData(cityData) {
77
+ return {
78
+ city: cityData?.City ?? cityData?.city ?? "",
79
+ state: cityData?.State ?? cityData?.state ?? "",
80
+ county: cityData?.County ?? cityData?.county ?? ""
81
+ };
82
+ }
83
+ /**
84
+ * Formats a city data option into a readable label
85
+ * Format: "City - County - State"
86
+ * @param option - The city data to format
87
+ * @returns Formatted string label
88
+ */
89
+ static formatOptionLabel(option) {
90
+ return [
91
+ option.City ?? option.city ?? "",
92
+ option.County ?? option.county ?? "",
93
+ option.State ?? option.state ?? ""
94
+ ].filter(Boolean).join(" - ");
95
+ }
96
+ /**
97
+ * Builds autocomplete options from zip code lookup data
98
+ * When multiple cities exist for a zip code, adds a section header
99
+ * @param zip - The zip code string
100
+ * @param data - Array of city data for the zip code
101
+ * @returns Array of autocomplete options
102
+ */
103
+ static buildOptions(zip, data) {
104
+ const optionEntries = data.map((option, index) => ({
105
+ dsId: `${index}`,
106
+ type: "option",
107
+ label: this.formatOptionLabel(option),
108
+ value: zip,
109
+ zipNumber: zip,
110
+ cityData: option
111
+ }));
112
+ if (optionEntries.length <= 1) {
113
+ return optionEntries;
114
+ }
115
+ return [
116
+ { ...this.SECTION_OPTION, zipNumber: zip, options: optionEntries },
117
+ ...optionEntries
118
+ ];
119
+ }
120
+ /**
121
+ * Validates whether any geo fields contain non-empty address data
122
+ * @param geoFields - Optional geo fields object to validate
123
+ * @returns True if any geo field has non-empty string value
124
+ */
125
+ static hasAddressTargets(geoFields) {
126
+ return Boolean(
127
+ geoFields && Object.values(geoFields).some(
128
+ (value) => typeof value === "string" && value.length
129
+ )
130
+ );
131
+ }
132
+ }
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var hook_exports = {};
20
+ __export(hook_exports, {
21
+ useZipCodeLookup: () => useZipCodeLookup
22
+ });
23
+ module.exports = __toCommonJS(hook_exports);
24
+ var import_react = require("react");
25
+ var import_helper = require("./helper");
26
+ const useZipCodeLookup = ({
27
+ ssf,
28
+ onGeoLookupComplete,
29
+ useLatLong,
30
+ isForeignAddress,
31
+ geoFields
32
+ }) => {
33
+ const [options, setOptions] = (0, import_react.useState)([]);
34
+ const shouldAutoFill = (0, import_react.useMemo)(
35
+ () => import_helper.ZipCodeHelper.hasAddressTargets(geoFields),
36
+ [geoFields]
37
+ );
38
+ const applyAddressData = (0, import_react.useCallback)(
39
+ async (zipNumber, cityData) => {
40
+ if (!cityData) return;
41
+ onGeoLookupComplete?.(zipNumber, cityData);
42
+ if (!shouldAutoFill || !geoFields) return;
43
+ const { city, state, county, country, zip } = geoFields;
44
+ const normalized = import_helper.ZipCodeHelper.normalizeCityData(cityData);
45
+ const payload = {};
46
+ const fieldMappings = [
47
+ [zip, zipNumber],
48
+ [city, normalized.city],
49
+ [state, normalized.state],
50
+ [county, normalized.county]
51
+ ];
52
+ fieldMappings.forEach(([fieldKey, value]) => {
53
+ if (fieldKey && value) {
54
+ payload[fieldKey] = value;
55
+ }
56
+ });
57
+ if (country && !isForeignAddress) {
58
+ payload[country] = import_helper.ZipCodeHelper.DEFAULT_COUNTRY_CODE;
59
+ }
60
+ if (Object.keys(payload).length) {
61
+ try {
62
+ await ssf.setFieldsValues(payload, true);
63
+ } catch (error) {
64
+ }
65
+ }
66
+ },
67
+ [geoFields, isForeignAddress, shouldAutoFill, ssf, onGeoLookupComplete]
68
+ );
69
+ const fetchZipResults = (0, import_react.useCallback)(
70
+ async (zip) => {
71
+ const rawResults = useLatLong ? await ssf.getZipCodeOptionsWithLatLong(zip) : await ssf.getZipCodeOptions(zip);
72
+ return Array.isArray(rawResults) ? rawResults : [];
73
+ },
74
+ [ssf, useLatLong]
75
+ );
76
+ const handleLookupResults = (0, import_react.useCallback)(
77
+ async (zip, results) => {
78
+ if (results.length === 1) {
79
+ setOptions([]);
80
+ await applyAddressData(zip, results[0]);
81
+ } else if (results.length > 1) {
82
+ setOptions(import_helper.ZipCodeHelper.buildOptions(zip, results));
83
+ } else {
84
+ setOptions([]);
85
+ }
86
+ },
87
+ [applyAddressData]
88
+ );
89
+ const runLookup = (0, import_react.useCallback)(
90
+ async (zip) => {
91
+ if (!zip || isForeignAddress) {
92
+ setOptions([]);
93
+ return;
94
+ }
95
+ try {
96
+ const results = await fetchZipResults(zip);
97
+ await handleLookupResults(zip, results);
98
+ } catch (error) {
99
+ setOptions([]);
100
+ }
101
+ },
102
+ [fetchZipResults, handleLookupResults, isForeignAddress]
103
+ );
104
+ const clearOptions = (0, import_react.useCallback)(() => setOptions([]), []);
105
+ const debouncedLookup = (0, import_helper.useDebouncedCallback)((zip) => {
106
+ runLookup(zip);
107
+ });
108
+ const handleOptionSelect = (0, import_react.useCallback)(
109
+ (label) => {
110
+ if (!label) return null;
111
+ const match = options.find(
112
+ (item) => item.type === "option" && item.label === label
113
+ );
114
+ if (!match) return null;
115
+ clearOptions();
116
+ applyAddressData(match.zipNumber, match.cityData).catch(() => {
117
+ });
118
+ return match;
119
+ },
120
+ [applyAddressData, clearOptions, options]
121
+ );
122
+ return {
123
+ options,
124
+ searchZipCode: debouncedLookup,
125
+ handleOptionSelect,
126
+ clearOptions
127
+ };
128
+ };