@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,93 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import React, { useCallback } from "react";
3
+ import { DSControlledCheckbox } from "@elliemae/ds-form-checkbox";
4
+ import { Renderer } from "../base/renderer";
5
+ import { EmptyLabel } from "../styles";
6
+ class CheckboxRenderer extends Renderer {
7
+ constructor() {
8
+ super();
9
+ this.BRWrapper = this.renderBR();
10
+ }
11
+ render() {
12
+ const { BRWrapper } = this;
13
+ const CheckboxComponent = (props) => {
14
+ const {
15
+ fieldId,
16
+ onBlur,
17
+ autoFieldSet = true,
18
+ validationRules,
19
+ isDisable,
20
+ label,
21
+ extra,
22
+ ...rest
23
+ } = props;
24
+ const {
25
+ fieldValue,
26
+ isFieldDisabled,
27
+ setFieldValue,
28
+ validationResult,
29
+ isSearchedField,
30
+ setIsSearchedField
31
+ } = this.initVM(props);
32
+ const validationProps = this.buildValidationProps(validationResult);
33
+ const onChangeEvent = useCallback(
34
+ (newVal) => {
35
+ setIsSearchedField(false);
36
+ if (!isDisable && !isFieldDisabled) {
37
+ const formattedValue = this.getFormattedValue(newVal);
38
+ setFieldValue(formattedValue);
39
+ const parsedValue = this.getParsedValue(formattedValue);
40
+ if (autoFieldSet) {
41
+ (async () => {
42
+ await this.BLL.SSF.setFieldValue(fieldId, parsedValue);
43
+ })();
44
+ }
45
+ if (onBlur) {
46
+ onBlur(fieldId, parsedValue);
47
+ }
48
+ }
49
+ },
50
+ [
51
+ isDisable,
52
+ isFieldDisabled,
53
+ setFieldValue,
54
+ setIsSearchedField,
55
+ onBlur,
56
+ autoFieldSet,
57
+ fieldId
58
+ ]
59
+ );
60
+ return /* @__PURE__ */ jsxs(
61
+ BRWrapper,
62
+ {
63
+ fieldId,
64
+ inputID: fieldId,
65
+ value: !!fieldValue,
66
+ ...props.brCompProps || {},
67
+ withHighlight: isSearchedField,
68
+ ...validationProps,
69
+ children: [
70
+ !label && /* @__PURE__ */ jsx(EmptyLabel, { htmlFor: fieldId }),
71
+ /* @__PURE__ */ jsx(
72
+ DSControlledCheckbox,
73
+ {
74
+ id: fieldId,
75
+ label,
76
+ "data-testid": fieldId,
77
+ checked: !!fieldValue,
78
+ applyAriaDisabled: isFieldDisabled || isDisable,
79
+ onChange: onChangeEvent,
80
+ ...extra,
81
+ ...this.sanitize(rest)
82
+ }
83
+ )
84
+ ]
85
+ }
86
+ );
87
+ };
88
+ return React.memo(CheckboxComponent);
89
+ }
90
+ }
91
+ export {
92
+ CheckboxRenderer
93
+ };
@@ -0,0 +1,176 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import React, { useCallback, useMemo, useRef } from "react";
3
+ import { CONTROLLED_DATE_TIME_PICKER_TYPES } from "@elliemae/ds-form-date-time-picker";
4
+ import { useOnBlurOut } from "@elliemae/ds-utilities";
5
+ import { DSFormLayoutBlockItem } from "@elliemae/ds-form-layout-blocks";
6
+ import { Renderer } from "../base/renderer";
7
+ import { AddonRenderer } from "./AddonRenderer";
8
+ import { formatDateForBr } from "../../utils/dateHelper";
9
+ import { StyledDateTimePicker } from "../styles";
10
+ class DateRenderer extends Renderer {
11
+ AddOnRenderer;
12
+ constructor() {
13
+ super();
14
+ this.AddOnRenderer = new AddonRenderer().render();
15
+ this.BRWrapper = this.renderBR();
16
+ }
17
+ render() {
18
+ const DateComponent = (props) => {
19
+ const {
20
+ id,
21
+ fieldId,
22
+ isDisable,
23
+ validationRules = [],
24
+ onChange,
25
+ onBlur,
26
+ autoFieldSet = true,
27
+ label,
28
+ rightAddon,
29
+ dateFormat = "MM/DD/YYYY",
30
+ brCompProps,
31
+ extra,
32
+ ...rest
33
+ } = props;
34
+ const { BRWrapper, AddOnRenderer } = this;
35
+ const {
36
+ fieldMetadata: {
37
+ isLockField = false,
38
+ maxLength = 0,
39
+ fieldFormat = ""
40
+ } = {},
41
+ fieldValue,
42
+ setFieldValue,
43
+ isLockedState,
44
+ isSearchedField,
45
+ isFieldDisabled,
46
+ validationResult,
47
+ setIsSearchedField
48
+ } = this.initVM(props);
49
+ this.fieldFormat = fieldFormat;
50
+ const isCalendarOpenRef = useRef(false);
51
+ const setCalendarOpen = useCallback((isOpen) => {
52
+ isCalendarOpenRef.current = isOpen;
53
+ }, []);
54
+ const blurConfig = useMemo(
55
+ () => ({
56
+ onBlur: () => {
57
+ if (isDisable || isFieldDisabled || isCalendarOpenRef.current) {
58
+ return;
59
+ }
60
+ const formattedValue = this.getFormattedValue(fieldValue);
61
+ const rulesToCheck = [
62
+ ...validationRules,
63
+ { type: "date", options: { dateFormat } }
64
+ ];
65
+ const tempValResult = this.Hooks.runValidationsOnValue(
66
+ formattedValue,
67
+ rulesToCheck
68
+ );
69
+ if (!tempValResult.isValid) {
70
+ this.VM.setValidationResult({ isValid: true, message: "" });
71
+ setFieldValue("");
72
+ (async () => {
73
+ await this.BLL.SSF.setFieldValue(fieldId, null);
74
+ })();
75
+ return;
76
+ }
77
+ this.VM.setValidationResult(tempValResult);
78
+ setFieldValue(formattedValue);
79
+ const parsedValue = this.getParsedValue(formattedValue);
80
+ if (autoFieldSet) {
81
+ (async () => {
82
+ await this.BLL.SSF.setFieldValue(fieldId, parsedValue);
83
+ })();
84
+ }
85
+ if (onBlur) {
86
+ onBlur(fieldId, parsedValue);
87
+ }
88
+ }
89
+ }),
90
+ // eslint-disable-next-line react-hooks/exhaustive-deps
91
+ [
92
+ autoFieldSet,
93
+ dateFormat,
94
+ fieldId,
95
+ fieldValue,
96
+ isDisable,
97
+ isFieldDisabled,
98
+ onBlur,
99
+ validationRules
100
+ ]
101
+ );
102
+ const handleBlurOut = useOnBlurOut(blurConfig);
103
+ const onDateChangeEvent = useCallback(
104
+ (selectedDate) => {
105
+ setIsSearchedField(false);
106
+ if (!isDisable && !isFieldDisabled) {
107
+ setFieldValue(selectedDate);
108
+ if (onChange) {
109
+ onChange(fieldId, selectedDate);
110
+ }
111
+ }
112
+ },
113
+ [
114
+ fieldId,
115
+ isDisable,
116
+ isFieldDisabled,
117
+ onChange,
118
+ setFieldValue,
119
+ setIsSearchedField
120
+ ]
121
+ );
122
+ const validationProps = this.buildValidationProps(validationResult);
123
+ const handlePadLockToggle = useCallback(
124
+ () => this.toggleLockStatus(fieldId, isLockedState || false),
125
+ // eslint-disable-next-line react-hooks/exhaustive-deps
126
+ [fieldId, isLockedState]
127
+ );
128
+ return /* @__PURE__ */ jsx(
129
+ BRWrapper,
130
+ {
131
+ fieldId,
132
+ inputID: fieldId,
133
+ label,
134
+ value: String(
135
+ formatDateForBr(fieldValue, dateFormat) || ""
136
+ ),
137
+ ...validationProps,
138
+ ...brCompProps || {},
139
+ withHighlight: isSearchedField,
140
+ children: /* @__PURE__ */ jsx(
141
+ AddOnRenderer,
142
+ {
143
+ rendererType: "addon",
144
+ fieldId,
145
+ isLocked: isLockedState,
146
+ isPadLock: isLockField,
147
+ isDisable,
148
+ onPadLockToggle: handlePadLockToggle,
149
+ rightAddon,
150
+ children: /* @__PURE__ */ jsx(DSFormLayoutBlockItem, { onBlur: handleBlurOut, label: "", children: /* @__PURE__ */ jsx(
151
+ StyledDateTimePicker,
152
+ {
153
+ "data-testid": fieldId,
154
+ id,
155
+ date: fieldValue || "",
156
+ onDateChange: onDateChangeEvent,
157
+ onPickerOpen: () => setCalendarOpen(true),
158
+ onPickerClose: () => setCalendarOpen(false),
159
+ applyAriaDisabled: isFieldDisabled || isDisable,
160
+ ...maxLength && maxLength > 0 && { maxLength },
161
+ ...extra,
162
+ ...this.sanitize(rest),
163
+ type: CONTROLLED_DATE_TIME_PICKER_TYPES.DATE.FULL
164
+ }
165
+ ) })
166
+ }
167
+ )
168
+ }
169
+ );
170
+ };
171
+ return React.memo(DateComponent);
172
+ }
173
+ }
174
+ export {
175
+ DateRenderer
176
+ };
@@ -0,0 +1,79 @@
1
+ import { useCallback, useEffect, useMemo, useState } from "react";
2
+ function useDropdownCreateSupport({
3
+ isEditable = false,
4
+ fieldValue,
5
+ baseOptions,
6
+ isLockField,
7
+ handlePersist,
8
+ isLocked,
9
+ setIsSearchedField,
10
+ fieldId,
11
+ onCreateCB
12
+ }) {
13
+ const [dynamicOptions, setDynamicOptions] = useState(
14
+ isEditable ? baseOptions : []
15
+ );
16
+ useEffect(() => {
17
+ if (isEditable) setDynamicOptions(baseOptions);
18
+ }, [isEditable, baseOptions]);
19
+ const effectiveOptions = isEditable ? dynamicOptions : baseOptions;
20
+ const selectedOption = useMemo(() => {
21
+ if (fieldValue == null) return null;
22
+ const match = effectiveOptions.find(
23
+ (o) => o.value.toLowerCase() === String(fieldValue).toLowerCase()
24
+ );
25
+ if (!match) return null;
26
+ return {
27
+ type: "option",
28
+ label: match.label,
29
+ value: match.value
30
+ };
31
+ }, [fieldValue, effectiveOptions]);
32
+ const addNewOption = useCallback(
33
+ (optionLabel, persist) => {
34
+ if (!isEditable) return;
35
+ const newItem = {
36
+ dsId: "0",
37
+ type: "option",
38
+ label: optionLabel,
39
+ value: optionLabel
40
+ };
41
+ setDynamicOptions((prev) => [newItem, ...prev]);
42
+ if (persist) handlePersist(optionLabel);
43
+ },
44
+ [isEditable, handlePersist]
45
+ );
46
+ useEffect(() => {
47
+ if (!isEditable || fieldValue === null || fieldValue === void 0 || fieldValue === "") {
48
+ return;
49
+ }
50
+ const valueStr = String(fieldValue);
51
+ const exists = dynamicOptions.some(
52
+ (o) => o.value.toLowerCase() === valueStr.toLowerCase()
53
+ );
54
+ if (!exists) addNewOption(valueStr, false);
55
+ }, [isEditable, fieldValue, dynamicOptions, addNewOption]);
56
+ const onCreateEvent = useCallback(
57
+ (createdLabel) => {
58
+ if (!isEditable) return;
59
+ if (isLockField && !isLocked) return;
60
+ setIsSearchedField(false);
61
+ addNewOption(createdLabel, true);
62
+ onCreateCB?.(fieldId, createdLabel);
63
+ },
64
+ [
65
+ isEditable,
66
+ isLockField,
67
+ isLocked,
68
+ setIsSearchedField,
69
+ addNewOption,
70
+ fieldId,
71
+ onCreateCB
72
+ ]
73
+ );
74
+ const createProps = isEditable ? { onCreate: onCreateEvent } : {};
75
+ return { effectiveOptions, selectedOption, createProps };
76
+ }
77
+ export {
78
+ useDropdownCreateSupport
79
+ };
@@ -0,0 +1,186 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { useCallback, useMemo } from "react";
4
+ import { DSComboBox } from "@elliemae/ds-controlled-form";
5
+ import { Renderer } from "../../base/renderer";
6
+ import { AddonRenderer } from "../AddonRenderer";
7
+ import { EmptyLabel } from "../../styles";
8
+ import { useDropdownCreateSupport } from "./hook";
9
+ class DropdownRenderer extends Renderer {
10
+ AddOnRenderer;
11
+ constructor() {
12
+ super();
13
+ this.AddOnRenderer = new AddonRenderer().render();
14
+ this.BRWrapper = this.renderBR();
15
+ }
16
+ render() {
17
+ const DropdownComponent = (props) => {
18
+ const { BRWrapper, AddOnRenderer } = this;
19
+ const {
20
+ fieldId,
21
+ options = [],
22
+ label,
23
+ isDisable,
24
+ isEditable,
25
+ autoFieldSet = true,
26
+ brCompProps,
27
+ onChange,
28
+ onBlur,
29
+ onCreate,
30
+ validationRules = [],
31
+ ...rest
32
+ } = props;
33
+ const {
34
+ fieldMetadata: {
35
+ fieldFormat = "",
36
+ isLockField = false,
37
+ fieldOptions = []
38
+ } = {},
39
+ fieldValue,
40
+ setFieldValue,
41
+ isLockedState,
42
+ isSearchedField,
43
+ setIsSearchedField,
44
+ isFieldDisabled,
45
+ validationResult
46
+ } = this.initVM(props);
47
+ this.fieldFormat = fieldFormat;
48
+ const disabledByState = isFieldDisabled || isDisable || isLockField && !isLockedState;
49
+ const baseOptions = useMemo(
50
+ () => options.length ? options : fieldOptions,
51
+ [options, fieldOptions]
52
+ );
53
+ const commitValue = useCallback(
54
+ (raw) => {
55
+ if (!isDisable && !isFieldDisabled) {
56
+ const formattedValue = this.getFormattedValue(raw);
57
+ setFieldValue(formattedValue);
58
+ const parsedValue = this.getParsedValue(formattedValue);
59
+ if (autoFieldSet) {
60
+ (async () => {
61
+ await this.BLL.SSF.setFieldValue(fieldId, parsedValue);
62
+ })();
63
+ }
64
+ }
65
+ },
66
+ [autoFieldSet, fieldId, isDisable, isFieldDisabled, setFieldValue]
67
+ );
68
+ const { effectiveOptions, selectedOption, createProps } = useDropdownCreateSupport({
69
+ isEditable,
70
+ fieldValue,
71
+ baseOptions,
72
+ isLockField,
73
+ handlePersist: commitValue,
74
+ isLocked: isLockedState,
75
+ setIsSearchedField,
76
+ fieldId,
77
+ onCreateCB: onCreate
78
+ });
79
+ const onChangeEvent = useCallback(
80
+ (newSelected) => {
81
+ setIsSearchedField(false);
82
+ const dsItem = newSelected;
83
+ const newValue = dsItem?.value ?? null;
84
+ if (!isDisable && !isFieldDisabled) {
85
+ const formattedValue = this.getFormattedValue(newValue);
86
+ setFieldValue(formattedValue);
87
+ const parsedValue = this.getParsedValue(formattedValue);
88
+ if (autoFieldSet) {
89
+ (async () => {
90
+ await this.BLL.SSF.setFieldValue(fieldId, parsedValue);
91
+ })();
92
+ }
93
+ if (onChange) {
94
+ onChange(fieldId, parsedValue);
95
+ }
96
+ }
97
+ },
98
+ [
99
+ autoFieldSet,
100
+ fieldId,
101
+ isDisable,
102
+ isFieldDisabled,
103
+ onChange,
104
+ setFieldValue,
105
+ setIsSearchedField
106
+ ]
107
+ );
108
+ const onBlurEvent = useCallback(() => {
109
+ if (!isDisable && !isFieldDisabled) {
110
+ const currentValue = selectedOption?.value || "";
111
+ const formattedValue = this.getFormattedValue(currentValue);
112
+ setFieldValue(formattedValue);
113
+ const rulesToCheck = [...validationRules];
114
+ const tempValResult = this.Hooks.runValidationsOnValue(
115
+ formattedValue,
116
+ rulesToCheck
117
+ );
118
+ this.VM.setValidationResult(tempValResult);
119
+ if (!tempValResult.isValid) {
120
+ return;
121
+ }
122
+ const parsedValue = this.getParsedValue(formattedValue);
123
+ if (onBlur) {
124
+ onBlur(fieldId, parsedValue);
125
+ }
126
+ }
127
+ }, [
128
+ fieldId,
129
+ selectedOption,
130
+ onBlur,
131
+ isDisable,
132
+ isFieldDisabled,
133
+ validationRules,
134
+ setFieldValue
135
+ ]);
136
+ const validationProps = this.buildValidationProps(validationResult);
137
+ return /* @__PURE__ */ jsxs(
138
+ BRWrapper,
139
+ {
140
+ fieldId,
141
+ inputID: fieldId,
142
+ label,
143
+ value: fieldValue,
144
+ ...validationProps,
145
+ ...brCompProps || {},
146
+ withHighlight: isSearchedField,
147
+ children: [
148
+ !label && /* @__PURE__ */ jsx(EmptyLabel, { htmlFor: fieldId }),
149
+ /* @__PURE__ */ jsx(
150
+ AddOnRenderer,
151
+ {
152
+ rendererType: "addon",
153
+ fieldId,
154
+ isLocked: isLockedState,
155
+ isPadLock: isLockField,
156
+ isDisable,
157
+ onPadLockToggle: () => this.toggleLockStatus(fieldId, isLockedState || false),
158
+ children: /* @__PURE__ */ jsx(
159
+ DSComboBox,
160
+ {
161
+ id: fieldId,
162
+ "data-testid": fieldId,
163
+ selectedValues: selectedOption,
164
+ allOptions: effectiveOptions,
165
+ onChange: onChangeEvent,
166
+ onBlur: onBlurEvent,
167
+ ...this.sanitize(rest),
168
+ ...createProps,
169
+ applyAriaDisabled: disabledByState,
170
+ placeholder: ""
171
+ }
172
+ )
173
+ }
174
+ )
175
+ ]
176
+ }
177
+ );
178
+ };
179
+ return React.memo(DropdownComponent);
180
+ }
181
+ }
182
+ var DropdownRenderer_default = DropdownRenderer;
183
+ export {
184
+ DropdownRenderer,
185
+ DropdownRenderer_default as default
186
+ };
@@ -0,0 +1,179 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import React, { useCallback } from "react";
3
+ import { DSControlledLargeTextInput } from "@elliemae/ds-controlled-form";
4
+ import { Renderer } from "../base/renderer";
5
+ import { AddonRenderer } from "./AddonRenderer";
6
+ import { EmptyLabel } from "../styles";
7
+ class LargeTextRenderer extends Renderer {
8
+ AddOnRenderer;
9
+ constructor() {
10
+ super();
11
+ this.AddOnRenderer = new AddonRenderer().render();
12
+ this.BRWrapper = this.renderBR();
13
+ }
14
+ render() {
15
+ const getMaxCharProps = (maxCharactersDisplay, maxCharCounter, fieldValue) => {
16
+ if (!maxCharactersDisplay || maxCharCounter <= 0) {
17
+ return {};
18
+ }
19
+ return {
20
+ maxCharCounter,
21
+ currentChar: fieldValue ? fieldValue.length : 0
22
+ };
23
+ };
24
+ const LargeTextComponent = (props) => {
25
+ const {
26
+ id,
27
+ fieldId,
28
+ isDisable,
29
+ validationRules = [],
30
+ onChange,
31
+ onBlur,
32
+ autoFieldSet = true,
33
+ label,
34
+ rightAddon,
35
+ rows = "3",
36
+ maxCharactersDisplay = false,
37
+ maxCharCounter = 0,
38
+ maxCharExceededMessage = "Max characters reached.",
39
+ extra
40
+ } = props;
41
+ const { BRWrapper, AddOnRenderer } = this;
42
+ const {
43
+ fieldMetadata: {
44
+ isLockField = false,
45
+ maxLength = 0,
46
+ fieldFormat = ""
47
+ } = {},
48
+ fieldValue,
49
+ setFieldValue,
50
+ isLockedState,
51
+ isSearchedField,
52
+ isFieldDisabled,
53
+ validationResult,
54
+ setIsSearchedField,
55
+ ariaDescProps
56
+ } = this.initVM(props);
57
+ this.fieldFormat = fieldFormat;
58
+ const getValidationRules = useCallback(() => {
59
+ const rulesToCheck = [...validationRules];
60
+ if (maxCharactersDisplay && maxCharCounter > 0) {
61
+ rulesToCheck.push({
62
+ type: "maxchar",
63
+ message: maxCharExceededMessage,
64
+ options: { charsLimit: maxCharCounter }
65
+ });
66
+ }
67
+ return rulesToCheck;
68
+ }, [
69
+ validationRules,
70
+ maxCharactersDisplay,
71
+ maxCharCounter,
72
+ maxCharExceededMessage
73
+ ]);
74
+ const onBlurEvent = useCallback(
75
+ () => {
76
+ if (!isDisable && !isFieldDisabled) {
77
+ const formattedValue = this.getFormattedValue(fieldValue);
78
+ setFieldValue(formattedValue);
79
+ const rulesToCheck = getValidationRules();
80
+ const tempValResult = this.Hooks.runValidationsOnValue(
81
+ formattedValue,
82
+ rulesToCheck
83
+ );
84
+ this.VM.setValidationResult(tempValResult);
85
+ if (!tempValResult.isValid && tempValResult.message !== maxCharExceededMessage) {
86
+ return;
87
+ }
88
+ const parsedValue = this.getParsedValue(formattedValue);
89
+ if (autoFieldSet) {
90
+ (async () => {
91
+ await this.BLL.SSF.setFieldValue(fieldId, parsedValue);
92
+ })();
93
+ }
94
+ if (onBlur) {
95
+ onBlur(fieldId, parsedValue);
96
+ }
97
+ }
98
+ },
99
+ // eslint-disable-next-line react-hooks/exhaustive-deps
100
+ [
101
+ autoFieldSet,
102
+ fieldId,
103
+ fieldValue,
104
+ isDisable,
105
+ isFieldDisabled,
106
+ onBlur,
107
+ getValidationRules
108
+ ]
109
+ );
110
+ const onChangeEvent = useCallback(
111
+ (value) => {
112
+ setIsSearchedField(false);
113
+ if (!isDisable && !isFieldDisabled) {
114
+ setFieldValue(value);
115
+ if (onChange) {
116
+ onChange(fieldId, value);
117
+ }
118
+ }
119
+ },
120
+ [
121
+ fieldId,
122
+ isDisable,
123
+ isFieldDisabled,
124
+ onChange,
125
+ setFieldValue,
126
+ setIsSearchedField
127
+ ]
128
+ );
129
+ const validationProps = this.buildValidationProps(validationResult);
130
+ return /* @__PURE__ */ jsx(
131
+ BRWrapper,
132
+ {
133
+ fieldId,
134
+ inputID: id || fieldId,
135
+ label,
136
+ value: fieldValue,
137
+ onBlur: onBlurEvent,
138
+ ...getMaxCharProps(maxCharactersDisplay, maxCharCounter, fieldValue),
139
+ ...props.brCompProps || {},
140
+ ...validationProps,
141
+ withHighlight: isSearchedField,
142
+ children: /* @__PURE__ */ jsxs(
143
+ AddOnRenderer,
144
+ {
145
+ rendererType: "addon",
146
+ fieldId,
147
+ isLocked: isLockedState,
148
+ isPadLock: isLockField,
149
+ isDisable: props.isDisable,
150
+ onPadLockToggle: () => this.toggleLockStatus(fieldId, isLockedState || false),
151
+ rightAddon,
152
+ children: [
153
+ !label && /* @__PURE__ */ jsx(EmptyLabel, { htmlFor: id || fieldId }),
154
+ /* @__PURE__ */ jsx(
155
+ DSControlledLargeTextInput,
156
+ {
157
+ id: id || fieldId,
158
+ "data-testid": fieldId,
159
+ value: fieldValue || "",
160
+ applyAriaDisabled: isFieldDisabled || isDisable,
161
+ onChange: onChangeEvent,
162
+ rows,
163
+ ...maxLength && maxLength > 0 && { maxLength },
164
+ ...ariaDescProps,
165
+ ...extra
166
+ }
167
+ )
168
+ ]
169
+ }
170
+ )
171
+ }
172
+ );
173
+ };
174
+ return React.memo(LargeTextComponent);
175
+ }
176
+ }
177
+ export {
178
+ LargeTextRenderer
179
+ };