@x15ventures/x15-ui-library 3.14.0 → 3.15.1
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.
- package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
- package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
- package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
- package/dist/cjs/components/design/dialog/Dialog.js +1 -1
- package/dist/cjs/components/design/dialog/Dialog.js.map +1 -1
- package/dist/cjs/components/design/headerBar/HeaderBar.js +3 -1
- package/dist/cjs/components/design/headerBar/HeaderBar.js.map +1 -1
- package/dist/cjs/components/design/headerBar/headerBar.css +6 -1
- package/dist/cjs/components/design/skeleton/Skeleton.js +48 -0
- package/dist/cjs/components/design/skeleton/Skeleton.js.map +1 -0
- package/dist/cjs/components/design/skeleton/_skeletonVariables.css +0 -0
- package/dist/cjs/components/design/skeleton/skeleton.css +86 -0
- package/dist/cjs/components/form/formFields/formFieldWrapper/FormField.js +8 -5
- package/dist/cjs/components/form/formFields/formFieldWrapper/FormField.js.map +1 -1
- package/dist/cjs/components/form/formFields/formFieldWrapper/formFieldProps.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.js +15 -11
- package/dist/cjs/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.js +37 -15
- package/dist/cjs/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/inputs/checkbox/inputCheckbox.css +4 -4
- package/dist/cjs/components/form/formFields/subComponents/inputs/checkbox/inputCheckboxProps.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +9 -9
- package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.js +14 -4
- package/dist/cjs/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/inputs/text/InputText.js +23 -17
- package/dist/cjs/components/form/formFields/subComponents/inputs/text/InputText.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/select/Select.js +6 -5
- package/dist/cjs/components/form/formFields/subComponents/select/Select.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/textarea/Textarea.js +55 -83
- package/dist/cjs/components/form/formFields/subComponents/textarea/Textarea.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/textarea/textarea.css +20 -0
- package/dist/cjs/components/form/hookFormWrapper/HookFormWrapper.js +22 -5
- package/dist/cjs/components/form/hookFormWrapper/HookFormWrapper.js.map +1 -1
- package/dist/cjs/components/form/validation/ValidationMessages.js +36 -38
- package/dist/cjs/components/form/validation/ValidationMessages.js.map +1 -1
- package/dist/cjs/components/index.js +7 -0
- package/dist/cjs/components/index.js.map +1 -1
- package/dist/cjs/exampleUIs/exampleComponents/DemoContactForm.js +1 -2
- package/dist/cjs/exampleUIs/exampleComponents/DemoContactForm.js.map +1 -1
- package/dist/cjs/helpers/index.js +12 -0
- package/dist/cjs/helpers/index.js.map +1 -1
- package/dist/cjs/helpers/stringHelpers.js +48 -2
- package/dist/cjs/helpers/stringHelpers.js.map +1 -1
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interfaces/headerText.interface.js.map +1 -1
- package/dist/cjs/package.json +137 -151
- package/dist/cjs/styles/index.css +36 -25
- package/dist/cjs/styles/shared/_allPartials.css +22 -25
- package/dist/cjs/styles/shared/forms/_forms.css +22 -25
- package/dist/cjs/styles/variables/cssVars/_darkModeVariables.css +3 -0
- package/dist/cjs/styles/variables/cssVars/_designVariables.css +11 -0
- package/dist/components/design/dialog/Dialog.d.ts.map +1 -1
- package/dist/components/design/dialog/Dialog.test.d.ts +5 -0
- package/dist/components/design/dialog/Dialog.test.d.ts.map +1 -0
- package/dist/components/design/headerBar/HeaderBar.d.ts.map +1 -1
- package/dist/components/design/skeleton/Skeleton.d.ts +27 -0
- package/dist/components/design/skeleton/Skeleton.d.ts.map +1 -0
- package/dist/components/form/formFields/formFieldWrapper/FormField.d.ts.map +1 -1
- package/dist/components/form/formFields/formFieldWrapper/formFieldProps.d.ts +7 -2
- package/dist/components/form/formFields/formFieldWrapper/formFieldProps.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts +5 -0
- package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts.map +1 -0
- package/dist/components/form/formFields/subComponents/inputs/checkbox/inputCheckboxProps.d.ts +8 -6
- package/dist/components/form/formFields/subComponents/inputs/checkbox/inputCheckboxProps.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/inputs/text/InputText.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts +5 -0
- package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts.map +1 -0
- package/dist/components/form/formFields/subComponents/select/Select.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/textarea/Textarea.d.ts +4 -3
- package/dist/components/form/formFields/subComponents/textarea/Textarea.d.ts.map +1 -1
- package/dist/components/form/hookFormWrapper/HookFormWrapper.d.ts +3 -0
- package/dist/components/form/hookFormWrapper/HookFormWrapper.d.ts.map +1 -1
- package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts +5 -0
- package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts.map +1 -0
- package/dist/components/form/validation/ValidationMessages.d.ts +8 -1
- package/dist/components/form/validation/ValidationMessages.d.ts.map +1 -1
- package/dist/components/form/validation/ValidationMessages.test.d.ts +5 -0
- package/dist/components/form/validation/ValidationMessages.test.d.ts.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/esm/autoGenerated/libraryThemes.js +12 -12
- package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
- package/dist/esm/autoGenerated/libraryThemes.json +12 -12
- package/dist/esm/components/design/dialog/Dialog.js +1 -1
- package/dist/esm/components/design/dialog/Dialog.js.map +1 -1
- package/dist/esm/components/design/headerBar/HeaderBar.js +3 -1
- package/dist/esm/components/design/headerBar/HeaderBar.js.map +1 -1
- package/dist/esm/components/design/headerBar/headerBar.css +6 -1
- package/dist/esm/components/design/skeleton/Skeleton.js +40 -0
- package/dist/esm/components/design/skeleton/Skeleton.js.map +1 -0
- package/dist/esm/components/design/skeleton/_skeletonVariables.css +0 -0
- package/dist/esm/components/design/skeleton/skeleton.css +86 -0
- package/dist/esm/components/form/formFields/formFieldWrapper/FormField.js +8 -5
- package/dist/esm/components/form/formFields/formFieldWrapper/FormField.js.map +1 -1
- package/dist/esm/components/form/formFields/formFieldWrapper/formFieldProps.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.js +16 -12
- package/dist/esm/components/form/formFields/subComponents/inputs/autocomplete/Autocomplete.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.js +37 -15
- package/dist/esm/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/inputs/checkbox/inputCheckbox.css +4 -4
- package/dist/esm/components/form/formFields/subComponents/inputs/checkbox/inputCheckboxProps.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +8 -8
- package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.js +16 -6
- package/dist/esm/components/form/formFields/subComponents/inputs/radio/styled/StyledRadioGroup.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/inputs/text/InputText.js +23 -17
- package/dist/esm/components/form/formFields/subComponents/inputs/text/InputText.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/select/Select.js +6 -5
- package/dist/esm/components/form/formFields/subComponents/select/Select.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/textarea/Textarea.js +50 -78
- package/dist/esm/components/form/formFields/subComponents/textarea/Textarea.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/textarea/textarea.css +20 -0
- package/dist/esm/components/form/hookFormWrapper/HookFormWrapper.js +22 -5
- package/dist/esm/components/form/hookFormWrapper/HookFormWrapper.js.map +1 -1
- package/dist/esm/components/form/validation/ValidationMessages.js +36 -38
- package/dist/esm/components/form/validation/ValidationMessages.js.map +1 -1
- package/dist/esm/components/index.js +1 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/exampleUIs/exampleComponents/DemoContactForm.js +1 -2
- package/dist/esm/exampleUIs/exampleComponents/DemoContactForm.js.map +1 -1
- package/dist/esm/helpers/index.js +1 -1
- package/dist/esm/helpers/index.js.map +1 -1
- package/dist/esm/helpers/stringHelpers.js +44 -0
- package/dist/esm/helpers/stringHelpers.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interfaces/headerText.interface.js.map +1 -1
- package/dist/esm/package.json +137 -151
- package/dist/esm/styles/index.css +36 -25
- package/dist/esm/styles/shared/_allPartials.css +22 -25
- package/dist/esm/styles/shared/forms/_forms.css +22 -25
- package/dist/esm/styles/variables/cssVars/_darkModeVariables.css +3 -0
- package/dist/esm/styles/variables/cssVars/_designVariables.css +11 -0
- package/dist/exampleUIs/exampleComponents/DemoContactForm.d.ts.map +1 -1
- package/dist/helpers/index.d.ts +1 -1
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/stringHelpers.d.ts +17 -0
- package/dist/helpers/stringHelpers.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/interfaces/headerText.interface.d.ts +1 -0
- package/dist/interfaces/headerText.interface.d.ts.map +1 -1
- package/dist/package.json +137 -151
- package/package.json +137 -151
- package/dist/cjs/components/form/formFields/utilities/formUtilities.js +0 -22
- package/dist/cjs/components/form/formFields/utilities/formUtilities.js.map +0 -1
- package/dist/components/form/formFields/utilities/formUtilities.d.ts +0 -18
- package/dist/components/form/formFields/utilities/formUtilities.d.ts.map +0 -1
- package/dist/esm/components/form/formFields/utilities/formUtilities.js +0 -16
- package/dist/esm/components/form/formFields/utilities/formUtilities.js.map +0 -1
|
@@ -8,7 +8,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.InputText = void 0;
|
|
9
9
|
var _react = _interopRequireDefault(require("react"));
|
|
10
10
|
var _reactHookForm = require("react-hook-form");
|
|
11
|
-
var _formUtilities = require("../../../utilities/formUtilities");
|
|
12
11
|
var _validationHelpers = require("../../../../../../helpers/validationHelpers");
|
|
13
12
|
const InputText = ({
|
|
14
13
|
field: {
|
|
@@ -33,18 +32,19 @@ const InputText = ({
|
|
|
33
32
|
register,
|
|
34
33
|
getFieldState,
|
|
35
34
|
setValue
|
|
36
|
-
} = (0, _reactHookForm.useFormContext)()
|
|
35
|
+
} = (0, _reactHookForm.useFormContext)();
|
|
37
36
|
const fieldState = getFieldState(name);
|
|
38
37
|
const HandleAutoFill = event => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
// Some browsers trigger onAnimationStart when autofill happens.
|
|
39
|
+
// We need to notify react-hook-form of the new value.
|
|
40
|
+
if (event.animationName === 'onAutoFill') {
|
|
41
|
+
setValue(name, event.currentTarget.value, {
|
|
42
|
+
shouldValidate: true,
|
|
43
|
+
shouldDirty: true
|
|
44
|
+
});
|
|
45
|
+
onChange({
|
|
46
|
+
target: event.currentTarget
|
|
47
|
+
});
|
|
48
48
|
}
|
|
49
49
|
};
|
|
50
50
|
const HandleOnBlur = event => {
|
|
@@ -52,9 +52,14 @@ const InputText = ({
|
|
|
52
52
|
target
|
|
53
53
|
} = event;
|
|
54
54
|
if (target) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
if (type === 'text' && target.value !== target.value.trim()) {
|
|
56
|
+
const trimmedValue = target.value.trim();
|
|
57
|
+
// Keep the uncontrolled input in step with the trimmed value held in form state.
|
|
58
|
+
target.value = trimmedValue;
|
|
59
|
+
setValue(name, trimmedValue, {
|
|
60
|
+
shouldValidate: true,
|
|
61
|
+
shouldDirty: true
|
|
62
|
+
});
|
|
58
63
|
}
|
|
59
64
|
onTouched();
|
|
60
65
|
onBlur(event);
|
|
@@ -73,6 +78,7 @@ const InputText = ({
|
|
|
73
78
|
return {};
|
|
74
79
|
};
|
|
75
80
|
const inputProps = {
|
|
81
|
+
...htmlNativeDomProps,
|
|
76
82
|
type,
|
|
77
83
|
id,
|
|
78
84
|
className: cssClass,
|
|
@@ -90,12 +96,12 @@ const InputText = ({
|
|
|
90
96
|
...addLengthValidatorProps('max'),
|
|
91
97
|
...addLengthValidatorProps('min'),
|
|
92
98
|
...register(name, {
|
|
93
|
-
onChange
|
|
99
|
+
onChange,
|
|
94
100
|
onBlur: HandleOnBlur,
|
|
95
101
|
...validation
|
|
96
102
|
}),
|
|
97
|
-
|
|
98
|
-
|
|
103
|
+
onAnimationStart: HandleAutoFill,
|
|
104
|
+
onKeyDown: HandleKeyEvent
|
|
99
105
|
};
|
|
100
106
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, customContent?.preField && /*#__PURE__*/_react.default.createElement("span", {
|
|
101
107
|
className: `preField preField_${type}Input`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputText.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","InputText","_react","_reactHookForm","
|
|
1
|
+
{"version":3,"file":"InputText.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","InputText","_react","_reactHookForm","_validationHelpers","field","type","id","name","placeholder","defaultValue","disabled","onBlur","onChange","onKeyDown","onTouched","htmlNativeDomProps","validation","showSpinner","customCssClasses","customContent","register","getFieldState","setValue","useFormContext","fieldState","HandleAutoFill","event","animationName","currentTarget","shouldValidate","shouldDirty","target","HandleOnBlur","trim","trimmedValue","HandleKeyEvent","cssClass","input","invalid","addLengthValidatorProps","validatorKey","isValidationRuleWithValue","inputProps","className","required","onAnimationStart","default","createElement","Fragment","preField","postField"],"sources":["../../../../../../../../src/components/form/formFields/subComponents/inputs/text/InputText.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { FormFieldProps, ValidationKey } from '../../../formFieldWrapper/formFieldProps';\nimport { isValidationRuleWithValue } from '../../../../../../helpers/validationHelpers';\n\nexport interface InputTextProps extends FormFieldProps, React.InputHTMLAttributes<HTMLInputElement> { }\n\nexport const InputText: React.FC<InputTextProps> = (\n {\n field: {\n type = 'text',\n id,\n name,\n placeholder,\n defaultValue,\n disabled,\n onBlur = () => { },\n onChange = () => { },\n onKeyDown = () => { },\n onTouched = () => { },\n ...htmlNativeDomProps\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState, setValue } = useFormContext();\n const fieldState = getFieldState(name);\n\n const HandleAutoFill = (event: React.AnimationEvent<HTMLInputElement>) => {\n // Some browsers trigger onAnimationStart when autofill happens.\n // We need to notify react-hook-form of the new value.\n if (event.animationName === 'onAutoFill') {\n setValue(name, event.currentTarget.value, { shouldValidate: true, shouldDirty: true });\n onChange({ target: event.currentTarget } as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n if (type === 'text' && target.value !== target.value.trim()) {\n const trimmedValue = target.value.trim();\n // Keep the uncontrolled input in step with the trimmed value held in form state.\n target.value = trimmedValue;\n setValue(name, trimmedValue, { shouldValidate: true, shouldDirty: true });\n }\n onTouched();\n onBlur(event);\n }\n };\n\n const HandleKeyEvent = (\n event: React.KeyboardEvent<HTMLInputElement> &\n React.KeyboardEvent<HTMLSelectElement> &\n React.KeyboardEvent<HTMLTextAreaElement>\n ) => {\n onKeyDown(event);\n };\n\n const cssClass = `${ customCssClasses?.input || '' }${ fieldState && fieldState?.invalid ? ' invalidField' : '' }`;\n\n const addLengthValidatorProps = (validatorKey: ValidationKey) => {\n if (\n validation\n && typeof validation[validatorKey] !== 'undefined'\n && isValidationRuleWithValue(validation[validatorKey])\n ) {\n return {\n [validatorKey]: validation[validatorKey]?.value\n };\n }\n return {};\n };\n\n const inputProps = {\n ...htmlNativeDomProps,\n type,\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n disabled,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...(addLengthValidatorProps('maxLength')),\n ...(addLengthValidatorProps('minLength')),\n ...(addLengthValidatorProps('max')),\n ...(addLengthValidatorProps('min')),\n ...register(\n name,\n {\n onChange,\n onBlur: HandleOnBlur,\n ...validation\n }\n ),\n onAnimationStart: HandleAutoFill,\n onKeyDown: HandleKeyEvent\n };\n\n return (\n <>\n {\n customContent?.preField\n && <span className={ `preField preField_${ type }Input` }>{ customContent?.preField }</span>\n }\n\n <input { ...inputProps } />\n\n {\n customContent?.postField\n && <span className={ `postField postField_${ type }Input` }>{ customContent?.postField }</span>\n }\n </>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,8 +10,7 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
10
10
|
var _reactHookForm = require("react-hook-form");
|
|
11
11
|
var _HookFormWrapper = require("../../../hookFormWrapper/HookFormWrapper");
|
|
12
12
|
var _objectHelpers = require("../../../../../helpers/objectHelpers");
|
|
13
|
-
|
|
14
|
-
const Select = ({
|
|
13
|
+
const SelectField = ({
|
|
15
14
|
field: {
|
|
16
15
|
id,
|
|
17
16
|
name,
|
|
@@ -33,7 +32,7 @@ const Select = ({
|
|
|
33
32
|
const {
|
|
34
33
|
register,
|
|
35
34
|
getFieldState
|
|
36
|
-
} = (0, _reactHookForm.useFormContext)()
|
|
35
|
+
} = (0, _reactHookForm.useFormContext)();
|
|
37
36
|
const fieldState = getFieldState(name);
|
|
38
37
|
const HandleAutoFill = event => {
|
|
39
38
|
const {
|
|
@@ -53,7 +52,6 @@ const Select = ({
|
|
|
53
52
|
}
|
|
54
53
|
};
|
|
55
54
|
const HandleKeyEvent = event => {
|
|
56
|
-
onTouched();
|
|
57
55
|
onKeyDown(event);
|
|
58
56
|
};
|
|
59
57
|
const cssClass = `${customCssClasses?.input || ''}${fieldState && fieldState?.invalid ? ' invalidField' : ''}`;
|
|
@@ -90,7 +88,7 @@ const Select = ({
|
|
|
90
88
|
value: option
|
|
91
89
|
}, option);
|
|
92
90
|
};
|
|
93
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
91
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, customContent?.preField && /*#__PURE__*/_react.default.createElement("span", {
|
|
94
92
|
className: "preField"
|
|
95
93
|
}, customContent?.preField), /*#__PURE__*/_react.default.createElement("select", selectProps, includeEmptyOption && /*#__PURE__*/_react.default.createElement("option", {
|
|
96
94
|
value: ""
|
|
@@ -98,5 +96,8 @@ const Select = ({
|
|
|
98
96
|
className: "postField"
|
|
99
97
|
}, customContent?.postField));
|
|
100
98
|
};
|
|
99
|
+
const Select = props => /*#__PURE__*/_react.default.createElement(_HookFormWrapper.HookFormWrapper, {
|
|
100
|
+
formContext: props.formContext
|
|
101
|
+
}, /*#__PURE__*/_react.default.createElement(SelectField, props));
|
|
101
102
|
exports.Select = Select;
|
|
102
103
|
//# sourceMappingURL=Select.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","Select","_react","_reactHookForm","_HookFormWrapper","_objectHelpers","
|
|
1
|
+
{"version":3,"file":"Select.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","Select","_react","_reactHookForm","_HookFormWrapper","_objectHelpers","SelectField","field","id","name","placeholder","defaultValue","onBlur","onChange","onKeyDown","onTouched","includeEmptyOption","emptyOptionLabel","options","validation","showSpinner","customCssClasses","customContent","register","getFieldState","useFormContext","fieldState","HandleAutoFill","event","target","HandleOnBlur","HandleKeyEvent","cssClass","input","invalid","selectProps","className","disabled","required","renderOption","option","isAnObject","typedOption","default","createElement","key","JSON","stringify","label","Fragment","preField","map","postField","props","HookFormWrapper","formContext"],"sources":["../../../../../../../src/components/form/formFields/subComponents/select/Select.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { HookFormWrapper } from '../../../hookFormWrapper/HookFormWrapper';\nimport { isAnObject } from '../../../../../helpers/objectHelpers';\nimport {\n FieldProps,\n FormFieldProps,\n SelectOptionObjectType,\n SelectOptionType,\n} from '../../formFieldWrapper/formFieldProps';\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement>, Omit<FormFieldProps, 'field'> {\n field: Omit<FieldProps, 'type'>;\n}\n\nconst SelectField: React.FC<SelectProps> = (\n {\n field: {\n id,\n name,\n placeholder,\n defaultValue,\n onBlur = () => {},\n onChange = () => {},\n onKeyDown = () => {},\n onTouched = () => {},\n includeEmptyOption = true,\n emptyOptionLabel = 'Please select',\n options\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState } = useFormContext();\n const fieldState = getFieldState(name);\n\n const HandleAutoFill = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n onChange(event);\n }\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const { target } = event;\n if (target) {\n onTouched();\n onBlur(event);\n }\n };\n\n const HandleKeyEvent = (\n event: React.KeyboardEvent<HTMLInputElement> &\n React.KeyboardEvent<HTMLSelectElement> &\n React.KeyboardEvent<HTMLTextAreaElement>\n ) => {\n onKeyDown(event);\n };\n\n const cssClass = `${ customCssClasses?.input || '' }${ fieldState && fieldState?.invalid ? ' invalidField' : '' }`;\n\n const selectProps = {\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...register(\n name,\n {\n onChange: HandleAutoFill,\n onBlur: HandleOnBlur,\n ...validation\n }\n ),\n onKeyDown: HandleKeyEvent\n };\n\n const renderOption = (option: SelectOptionType) => {\n if (isAnObject(option)) {\n const typedOption = option as SelectOptionObjectType;\n return (\n <option key={ `${ id }_${ typedOption.value }` } data-option={ JSON.stringify(typedOption) } value={ typedOption.value as string }>\n { typedOption.label }\n </option>\n );\n }\n return (\n <option key={ `${ id }_${ option }` } data-option={ JSON.stringify(option) } value={ option as string }>\n { option as string }\n </option>\n );\n };\n\n return (\n <>\n { customContent?.preField && <span className=\"preField\">{ customContent?.preField }</span> }\n\n <select { ...selectProps }>\n { includeEmptyOption && <option value=\"\">{ emptyOptionLabel }</option> }\n { (options as SelectOptionType[])?.map(renderOption) }\n </select>\n\n { customContent?.postField && <span className=\"postField\">{ customContent?.postField }</span> }\n </>\n );\n};\n\nexport const Select: React.FC<SelectProps> = (props) => (\n <HookFormWrapper formContext={ props.formContext }>\n <SelectField { ...props } />\n </HookFormWrapper>\n);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -8,36 +8,15 @@ exports.Textarea = void 0;
|
|
|
8
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
9
|
var _reactHookForm = require("react-hook-form");
|
|
10
10
|
var _HookFormWrapper = require("../../../hookFormWrapper/HookFormWrapper");
|
|
11
|
-
var _formUtilities = require("../../utilities/formUtilities");
|
|
12
11
|
var _ValidationMessages = require("../../../validation/ValidationMessages");
|
|
12
|
+
var _stringHelpers = require("../../../../../helpers/stringHelpers");
|
|
13
|
+
require("./textarea.css");
|
|
13
14
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
function getCharacterCount(value) {
|
|
20
|
-
if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {
|
|
21
|
-
const segmenter = new Intl.Segmenter(undefined, {
|
|
22
|
-
granularity: 'grapheme'
|
|
23
|
-
});
|
|
24
|
-
return Array.from(segmenter.segment(value)).length;
|
|
25
|
-
}
|
|
26
|
-
return Array.from(value).length;
|
|
27
|
-
}
|
|
28
|
-
function clampToGraphemeMax(value, maxAllowed) {
|
|
29
|
-
if (getCharacterCount(value) <= maxAllowed) {
|
|
30
|
-
return value;
|
|
31
|
-
}
|
|
32
|
-
if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {
|
|
33
|
-
const segmenter = new Intl.Segmenter(undefined, {
|
|
34
|
-
granularity: 'grapheme'
|
|
35
|
-
});
|
|
36
|
-
return Array.from(segmenter.segment(value)).slice(0, maxAllowed).map(segment => segment.segment).join('');
|
|
37
|
-
}
|
|
38
|
-
return Array.from(value).slice(0, maxAllowed).join('');
|
|
39
|
-
}
|
|
40
|
-
const Textarea = ({
|
|
15
|
+
const Textarea = props => /*#__PURE__*/_react.default.createElement(_HookFormWrapper.HookFormWrapper, {
|
|
16
|
+
formContext: props.formContext
|
|
17
|
+
}, /*#__PURE__*/_react.default.createElement(TextareaField, props));
|
|
18
|
+
exports.Textarea = Textarea;
|
|
19
|
+
const TextareaField = ({
|
|
41
20
|
field: {
|
|
42
21
|
id,
|
|
43
22
|
name,
|
|
@@ -62,20 +41,16 @@ const Textarea = ({
|
|
|
62
41
|
formState: {
|
|
63
42
|
errors
|
|
64
43
|
}
|
|
65
|
-
} = (0, _reactHookForm.useFormContext)()
|
|
44
|
+
} = (0, _reactHookForm.useFormContext)();
|
|
66
45
|
const fieldState = getFieldState(name);
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
const [count, setCount] = (0, _react.useState)(() => getCharacterCount(defaultValue?.toString() || ''));
|
|
46
|
+
// getFieldState alone does not subscribe to errors, so the direct lookup keeps this in sync.
|
|
47
|
+
const isInvalid = Boolean(fieldState?.invalid || (0, _ValidationMessages.extractError)(errors, name));
|
|
48
|
+
const isRequiredError = fieldState?.error?.type === 'required';
|
|
49
|
+
const [count, setCount] = (0, _react.useState)(() => (0, _stringHelpers.getCharacterCount)(defaultValue?.toString() || ''));
|
|
72
50
|
const [hasStartedTyping, setHasStartedTyping] = (0, _react.useState)(false);
|
|
73
51
|
const hasMaxLength = typeof maxLength === 'number';
|
|
74
52
|
const isAtLimit = hasMaxLength ? count >= maxLength : false;
|
|
75
|
-
|
|
76
|
-
// should show counter instead of error message.
|
|
77
|
-
const isRequiredError = fieldState?.error?.type === 'required';
|
|
78
|
-
const characterCounter = !hasStartedTyping || !hasMaxLength || isRequiredError ? undefined : `${count}/${maxLength}`;
|
|
53
|
+
const showsCharacterCount = hasStartedTyping && hasMaxLength && !isRequiredError;
|
|
79
54
|
const cssClass = `${customCssClasses?.input || ''}${isInvalid ? ' invalidField' : ''}`;
|
|
80
55
|
const normalizedValidation = (0, _react.useMemo)(() => {
|
|
81
56
|
if (!validation || typeof validation.maxLength === 'undefined') {
|
|
@@ -87,7 +62,7 @@ const Textarea = ({
|
|
|
87
62
|
return validation;
|
|
88
63
|
}
|
|
89
64
|
const maxLengthMessage = `Maximum length is ${maxLengthValue}`;
|
|
90
|
-
const graphemeMaxLengthValidator = value => getCharacterCount(value || '') <= maxLengthValue || maxLengthMessage;
|
|
65
|
+
const graphemeMaxLengthValidator = value => (0, _stringHelpers.getCharacterCount)(value || '') <= maxLengthValue || maxLengthMessage;
|
|
91
66
|
|
|
92
67
|
// eslint-disable-next-line no-unused-vars
|
|
93
68
|
const {
|
|
@@ -121,37 +96,53 @@ const Textarea = ({
|
|
|
121
96
|
validate: graphemeMaxLengthValidator
|
|
122
97
|
};
|
|
123
98
|
}, [validation]);
|
|
124
|
-
const
|
|
99
|
+
const fieldRegistration = register(name, normalizedValidation);
|
|
125
100
|
|
|
126
101
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* can be treated as multiple characters. We avoid using native maxLength and enforce
|
|
130
|
-
* the limit here instead.
|
|
102
|
+
* Native maxLength counts UTF-16 units, so emojis and composed characters are treated as
|
|
103
|
+
* several characters. The limit is enforced here against grapheme clusters instead.
|
|
131
104
|
*/
|
|
132
105
|
const HandleBeforeInput = event => {
|
|
133
|
-
if (enforceMaxLength !== true || !hasMaxLength)
|
|
106
|
+
if (enforceMaxLength !== true || !hasMaxLength) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
134
109
|
const nativeEvent = event.nativeEvent;
|
|
135
110
|
const inserted = nativeEvent.data ?? '';
|
|
136
|
-
if (!inserted)
|
|
111
|
+
if (!inserted) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
137
114
|
const target = event.currentTarget;
|
|
138
115
|
const start = target.selectionStart ?? target.value.length;
|
|
139
116
|
const end = target.selectionEnd ?? target.value.length;
|
|
140
117
|
const nextValue = target.value.slice(0, start) + inserted + target.value.slice(end);
|
|
141
|
-
if (getCharacterCount(nextValue) > maxLength) {
|
|
118
|
+
if ((0, _stringHelpers.getCharacterCount)(nextValue) > maxLength) {
|
|
142
119
|
event.preventDefault();
|
|
143
120
|
}
|
|
144
121
|
};
|
|
145
122
|
const HandleChange = event => {
|
|
146
123
|
const rawValue = event.target.value || '';
|
|
147
|
-
const newValue = enforceMaxLength === true && hasMaxLength ? clampToGraphemeMax(rawValue, maxLength) : rawValue;
|
|
124
|
+
const newValue = enforceMaxLength === true && hasMaxLength ? (0, _stringHelpers.clampToGraphemeMax)(rawValue, maxLength) : rawValue;
|
|
148
125
|
if (newValue !== rawValue) {
|
|
149
126
|
event.target.value = newValue;
|
|
150
127
|
}
|
|
151
128
|
setHasStartedTyping(true);
|
|
152
|
-
setCount(getCharacterCount(newValue));
|
|
153
|
-
|
|
154
|
-
|
|
129
|
+
setCount((0, _stringHelpers.getCharacterCount)(newValue));
|
|
130
|
+
onChange(event);
|
|
131
|
+
fieldRegistration?.onChange?.(event);
|
|
132
|
+
};
|
|
133
|
+
const HandleAutoFill = event => {
|
|
134
|
+
// Browsers trigger onAnimationStart when autofill happens.
|
|
135
|
+
// We need to notify react-hook-form of the new value.
|
|
136
|
+
if (event.animationName === 'onAutoFill') {
|
|
137
|
+
const {
|
|
138
|
+
value
|
|
139
|
+
} = event.currentTarget;
|
|
140
|
+
setHasStartedTyping(true);
|
|
141
|
+
setCount((0, _stringHelpers.getCharacterCount)(value || ''));
|
|
142
|
+
HandleChange({
|
|
143
|
+
target: event.currentTarget
|
|
144
|
+
});
|
|
145
|
+
}
|
|
155
146
|
};
|
|
156
147
|
const HandleOnBlur = event => {
|
|
157
148
|
const {
|
|
@@ -161,17 +152,12 @@ const Textarea = ({
|
|
|
161
152
|
onTouched();
|
|
162
153
|
onBlur(event);
|
|
163
154
|
}
|
|
155
|
+
fieldRegistration?.onBlur?.(event);
|
|
164
156
|
};
|
|
165
157
|
const HandleKeyEvent = event => {
|
|
166
158
|
onTouched();
|
|
167
|
-
|
|
168
|
-
onTextareaKeyDown?.(event);
|
|
159
|
+
onKeyDown(event);
|
|
169
160
|
};
|
|
170
|
-
const characterCounterId = `${id}_characterCount`;
|
|
171
|
-
const errorsId = `${name}_errors`;
|
|
172
|
-
const existingDescribedBy = typeof htmlNativeDomProps['aria-describedby'] === 'string' ? htmlNativeDomProps['aria-describedby'] : undefined;
|
|
173
|
-
const showsRequiredError = isInvalid && isRequiredError;
|
|
174
|
-
const mergedDescribedBy = showsRequiredError ? [existingDescribedBy, errorsId].filter(Boolean).join(' ') : characterCounter !== undefined ? [existingDescribedBy, characterCounterId].filter(Boolean).join(' ') : existingDescribedBy;
|
|
175
161
|
const textareaProps = {
|
|
176
162
|
id,
|
|
177
163
|
className: cssClass,
|
|
@@ -183,40 +169,26 @@ const Textarea = ({
|
|
|
183
169
|
...(validation && typeof validation.required !== 'undefined' ? {
|
|
184
170
|
required: true
|
|
185
171
|
} : {}),
|
|
186
|
-
...
|
|
172
|
+
...htmlNativeDomProps,
|
|
173
|
+
...fieldRegistration,
|
|
187
174
|
onBeforeInput: HandleBeforeInput,
|
|
188
|
-
onChange:
|
|
189
|
-
|
|
190
|
-
registered?.onChange?.(event);
|
|
191
|
-
},
|
|
192
|
-
onBlur: event => {
|
|
193
|
-
HandleOnBlur(event);
|
|
194
|
-
registered?.onBlur?.(event);
|
|
195
|
-
},
|
|
175
|
+
onChange: HandleChange,
|
|
176
|
+
onBlur: HandleOnBlur,
|
|
196
177
|
onKeyDown: HandleKeyEvent,
|
|
197
|
-
|
|
198
|
-
'aria-describedby': mergedDescribedBy
|
|
178
|
+
onAnimationStart: HandleAutoFill
|
|
199
179
|
};
|
|
200
|
-
|
|
180
|
+
const containerCssClass = `textareaFieldContainer${showsCharacterCount ? ' withCharacterCount' : ''}`;
|
|
181
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, customContent?.preField && /*#__PURE__*/_react.default.createElement("span", {
|
|
201
182
|
className: "preField"
|
|
202
|
-
}, customContent?.preField), /*#__PURE__*/_react.default.createElement("
|
|
203
|
-
className:
|
|
204
|
-
}, /*#__PURE__*/_react.default.createElement("textarea", textareaProps), /*#__PURE__*/_react.default.createElement("
|
|
205
|
-
className: "textareaFooter"
|
|
206
|
-
}, isInvalid && isRequiredError ? /*#__PURE__*/_react.default.createElement(_ValidationMessages.ValidationMessages, {
|
|
207
|
-
name: name,
|
|
208
|
-
validation: {
|
|
209
|
-
required: validation?.required
|
|
210
|
-
}
|
|
211
|
-
}) : /*#__PURE__*/_react.default.createElement("div", {
|
|
212
|
-
id: characterCounterId,
|
|
183
|
+
}, customContent?.preField), /*#__PURE__*/_react.default.createElement("span", {
|
|
184
|
+
className: containerCssClass
|
|
185
|
+
}, /*#__PURE__*/_react.default.createElement("textarea", textareaProps), showsCharacterCount && /*#__PURE__*/_react.default.createElement("span", {
|
|
213
186
|
className: `textareaCharacterCount ${isAtLimit ? 'textareaCharacterCountExceeded' : ''}`,
|
|
214
187
|
role: isAtLimit ? 'status' : undefined,
|
|
215
188
|
"aria-live": isAtLimit ? 'polite' : undefined,
|
|
216
189
|
"aria-atomic": isAtLimit ? 'true' : undefined
|
|
217
|
-
},
|
|
190
|
+
}, `${count}/${maxLength}`)), customContent?.postField && /*#__PURE__*/_react.default.createElement("span", {
|
|
218
191
|
className: "postField"
|
|
219
192
|
}, customContent?.postField));
|
|
220
193
|
};
|
|
221
|
-
exports.Textarea = Textarea;
|
|
222
194
|
//# sourceMappingURL=Textarea.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","names":["Object","defineProperty","exports","value","Textarea","_react","_interopRequireWildcard","require","_reactHookForm","_HookFormWrapper","_formUtilities","_ValidationMessages","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","getCharacterCount","Intl","segmenter","Segmenter","undefined","granularity","Array","from","segment","length","clampToGraphemeMax","maxAllowed","slice","map","join","field","id","name","placeholder","defaultValue","maxLength","enforceMaxLength","onBlur","onChange","onKeyDown","onTouched","htmlNativeDomProps","validation","showSpinner","customCssClasses","customContent","register","getFieldState","formState","errors","useFormContext","NoHookFormContext","fieldState","hasFieldError","Boolean","extractError","isInvalid","invalid","count","setCount","useState","toString","hasStartedTyping","setHasStartedTyping","hasMaxLength","isAtLimit","isRequiredError","error","type","characterCounter","cssClass","input","normalizedValidation","useMemo","maxLengthRule","maxLengthValue","Number","isNaN","maxLengthMessage","graphemeMaxLengthValidator","_maxLength","validate","restValidation","formValues","validationResult","graphemeMaxLength","registered","HandleBeforeInput","event","nativeEvent","inserted","data","target","currentTarget","start","selectionStart","end","selectionEnd","nextValue","preventDefault","HandleChange","rawValue","newValue","onTextareaChange","HandleOnBlur","HandleKeyEvent","onTextareaKeyDown","characterCounterId","errorsId","existingDescribedBy","showsRequiredError","mergedDescribedBy","filter","textareaProps","className","disabled","required","onBeforeInput","createElement","HookFormWrapper","preField","ValidationMessages","role","postField"],"sources":["../../../../../../../src/components/form/formFields/subComponents/textarea/Textarea.tsx"],"sourcesContent":["'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { HookFormWrapper } from '../../../hookFormWrapper/HookFormWrapper';\nimport { FormFieldProps } from '../../formFieldWrapper/formFieldProps';\nimport { NoHookFormContext } from '../../utilities/formUtilities';\nimport { extractError, ValidationMessages } from '../../../validation/ValidationMessages';\n\ninterface TextareaProps extends FormFieldProps, React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\n/**\n* Counts user-perceived characters (grapheme clusters).\n* Treats emojis and composed characters (e.g. accented letters) as a single character.\n* Falls back to basic code-point counting if Intl.Segmenter is not available.\n*/\nfunction getCharacterCount(value: string): number {\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n const segmenter = new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n return Array.from(segmenter.segment(value)).length;\n }\n return Array.from(value).length;\n}\n\nfunction clampToGraphemeMax(value: string, maxAllowed: number): string {\n if (getCharacterCount(value) <= maxAllowed) {\n return value;\n }\n\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n const segmenter = new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n\n return Array.from(segmenter.segment(value))\n .slice(0, maxAllowed)\n .map((segment) => segment.segment)\n .join('');\n }\n\n return Array.from(value).slice(0, maxAllowed).join('');\n}\n\nexport const Textarea: React.FC<TextareaProps> = (\n {\n field: {\n id,\n name,\n placeholder,\n defaultValue,\n maxLength,\n enforceMaxLength,\n onBlur = () => {},\n onChange = () => {},\n onKeyDown = () => {},\n onTouched = () => {},\n ...htmlNativeDomProps\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState, formState: { errors } } = useFormContext() || NoHookFormContext;\n const fieldState = getFieldState(name);\n const hasFieldError = Boolean(extractError(errors, name));\n // Combine fieldState.invalid with a direct errors lookup so this component re-renders\n // whenever formState.errors changes (getFieldState alone does not subscribe to errors).\n const isInvalid = Boolean(fieldState?.invalid ?? hasFieldError);\n const [count, setCount] = useState<number>(() =>\n getCharacterCount(defaultValue?.toString() || '')\n );\n const [hasStartedTyping, setHasStartedTyping] = useState(false);\n const hasMaxLength = typeof maxLength === 'number';\n const isAtLimit = hasMaxLength ? count >= maxLength : false;\n // Only hide counter for 'required' error. All other errors (maxLength, pattern, etc)\n // should show counter instead of error message.\n const isRequiredError = fieldState?.error?.type === 'required';\n const characterCounter =\n !hasStartedTyping || !hasMaxLength || isRequiredError\n ? undefined\n : `${ count }/${ maxLength }`;\n const cssClass = `${ customCssClasses?.input || '' }${ isInvalid ? ' invalidField' : '' }`;\n\n const normalizedValidation = useMemo(() => {\n if (!validation || typeof validation.maxLength === 'undefined') {\n return validation;\n }\n\n const maxLengthRule = validation.maxLength;\n const maxLengthValue =\n typeof maxLengthRule === 'number'\n ? maxLengthRule\n : typeof maxLengthRule === 'object' && maxLengthRule && 'value' in maxLengthRule\n ? Number(maxLengthRule.value)\n : undefined;\n\n if (typeof maxLengthValue !== 'number' || Number.isNaN(maxLengthValue)) {\n return validation;\n }\n\n const maxLengthMessage = `Maximum length is ${ maxLengthValue }`;\n\n const graphemeMaxLengthValidator = (value: string) =>\n getCharacterCount(value || '') <= maxLengthValue || maxLengthMessage;\n\n // eslint-disable-next-line no-unused-vars\n const { maxLength: _maxLength, validate, ...restValidation } = validation;\n\n if (typeof validate === 'function') {\n return {\n ...restValidation,\n validate: async (value: string, formValues?: unknown) => {\n const validationResult = await validate(value, formValues);\n if (validationResult !== true) {\n return validationResult;\n }\n return graphemeMaxLengthValidator(value);\n },\n };\n }\n\n if (validate && typeof validate === 'object') {\n return {\n ...restValidation,\n validate: {\n ...validate,\n graphemeMaxLength: graphemeMaxLengthValidator,\n },\n };\n }\n\n return {\n ...restValidation,\n validate: graphemeMaxLengthValidator,\n };\n }, [validation]);\n\n const registered = register(name, normalizedValidation);\n\n /**\n * Prevents input that would exceed the maxLength when counting grapheme clusters.\n * Native <textarea maxLength> counts UTF-16 units, so emojis and composed characters\n * can be treated as multiple characters. We avoid using native maxLength and enforce\n * the limit here instead.\n */\n const HandleBeforeInput = (event: React.FormEvent<HTMLTextAreaElement>) => {\n if (enforceMaxLength !== true || !hasMaxLength) return;\n\n const nativeEvent = event.nativeEvent as InputEvent;\n const inserted = nativeEvent.data ?? '';\n\n if (!inserted) return;\n\n const target = event.currentTarget;\n const start = target.selectionStart ?? target.value.length;\n const end = target.selectionEnd ?? target.value.length;\n\n const nextValue =\n target.value.slice(0, start) +\n inserted +\n target.value.slice(end);\n\n if (getCharacterCount(nextValue) > maxLength) {\n event.preventDefault();\n }\n };\n\n const HandleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const rawValue = event.target.value || '';\n const newValue =\n enforceMaxLength === true && hasMaxLength\n ? clampToGraphemeMax(rawValue, maxLength)\n : rawValue;\n\n if (newValue !== rawValue) {\n event.target.value = newValue;\n }\n\n setHasStartedTyping(true);\n setCount(getCharacterCount(newValue));\n const onTextareaChange = onChange as\n | React.ChangeEventHandler<HTMLTextAreaElement>\n | undefined;\n onTextareaChange?.(event);\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n const { target } = event;\n if (target) {\n onTouched();\n onBlur(event);\n }\n };\n\n const HandleKeyEvent = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n onTouched();\n const onTextareaKeyDown = onKeyDown as\n | React.KeyboardEventHandler<HTMLTextAreaElement>\n | undefined;\n onTextareaKeyDown?.(event);\n };\n\n const characterCounterId = `${ id }_characterCount`;\n const errorsId = `${ name }_errors`;\n const existingDescribedBy =\n typeof htmlNativeDomProps['aria-describedby'] === 'string'\n ? htmlNativeDomProps['aria-describedby']\n : undefined;\n const showsRequiredError = isInvalid && isRequiredError;\n const mergedDescribedBy = showsRequiredError\n ? [existingDescribedBy, errorsId].filter(Boolean).join(' ')\n : characterCounter !== undefined\n ? [existingDescribedBy, characterCounterId].filter(Boolean).join(' ')\n : existingDescribedBy;\n \n const textareaProps = {\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...registered,\n onBeforeInput: HandleBeforeInput,\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n HandleChange(event);\n registered?.onChange?.(event);\n },\n onBlur: (event: React.FocusEvent<HTMLTextAreaElement>) => {\n HandleOnBlur(event);\n registered?.onBlur?.(event);\n },\n onKeyDown: HandleKeyEvent,\n ...htmlNativeDomProps,\n 'aria-describedby': mergedDescribedBy,\n };\n\n return (\n <HookFormWrapper>\n { customContent?.preField && <span className=\"preField\">{ customContent?.preField }</span> }\n\n <div className=\"textareaFieldContainer\">\n <textarea { ...textareaProps } /> \n\n <div className=\"textareaFooter\">\n { isInvalid && isRequiredError\n ? <ValidationMessages name={ name } validation={ { required: validation?.required } } />\n : (\n <div\n id={ characterCounterId }\n className={ `textareaCharacterCount ${\n isAtLimit\n ? 'textareaCharacterCountExceeded'\n : ''\n }` }\n role={ isAtLimit ? 'status' : undefined }\n aria-live={ isAtLimit ? 'polite' : undefined }\n aria-atomic={ isAtLimit ? 'true' : undefined }\n >\n { characterCounter }\n </div>\n )\n }\n </div>\n </div>\n\n { customContent?.postField && <span className=\"postField\">{ customContent?.postField }</span> }\n </HookFormWrapper>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Textarea.js","names":["Object","defineProperty","exports","value","Textarea","_react","_interopRequireWildcard","require","_reactHookForm","_HookFormWrapper","_ValidationMessages","_stringHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","props","createElement","HookFormWrapper","formContext","TextareaField","field","id","name","placeholder","defaultValue","maxLength","enforceMaxLength","onBlur","onChange","onKeyDown","onTouched","htmlNativeDomProps","validation","showSpinner","customCssClasses","customContent","register","getFieldState","formState","errors","useFormContext","fieldState","isInvalid","Boolean","invalid","extractError","isRequiredError","error","type","count","setCount","useState","getCharacterCount","toString","hasStartedTyping","setHasStartedTyping","hasMaxLength","isAtLimit","showsCharacterCount","cssClass","input","normalizedValidation","useMemo","maxLengthRule","maxLengthValue","Number","undefined","isNaN","maxLengthMessage","graphemeMaxLengthValidator","_maxLength","validate","restValidation","formValues","validationResult","graphemeMaxLength","fieldRegistration","HandleBeforeInput","event","nativeEvent","inserted","data","target","currentTarget","start","selectionStart","length","end","selectionEnd","nextValue","slice","preventDefault","HandleChange","rawValue","newValue","clampToGraphemeMax","HandleAutoFill","animationName","HandleOnBlur","HandleKeyEvent","textareaProps","className","disabled","required","onBeforeInput","onAnimationStart","containerCssClass","Fragment","preField","role","postField"],"sources":["../../../../../../../src/components/form/formFields/subComponents/textarea/Textarea.tsx"],"sourcesContent":["'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { HookFormWrapper } from '../../../hookFormWrapper/HookFormWrapper';\nimport {\n FormFieldProps,\n TextareaFieldProps,\n} from '../../formFieldWrapper/formFieldProps';\nimport { extractError } from '../../../validation/ValidationMessages';\nimport { clampToGraphemeMax, getCharacterCount } from '../../../../../helpers/stringHelpers';\n\nimport './textarea.scss';\n\nexport interface TextareaProps extends Omit<FormFieldProps, 'field'> {\n field: Omit<TextareaFieldProps, 'type'>;\n}\n\nexport const Textarea: React.FC<TextareaProps> = (props) => (\n <HookFormWrapper formContext={ props.formContext }>\n <TextareaField { ...props } />\n </HookFormWrapper>\n);\n\nconst TextareaField: React.FC<TextareaProps> = (\n {\n field: {\n id,\n name,\n placeholder,\n defaultValue,\n maxLength,\n enforceMaxLength,\n onBlur = () => {},\n onChange = () => {},\n onKeyDown = () => {},\n onTouched = () => {},\n ...htmlNativeDomProps\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n) => {\n const { register, getFieldState, formState: { errors } } = useFormContext();\n const fieldState = getFieldState(name);\n // getFieldState alone does not subscribe to errors, so the direct lookup keeps this in sync.\n const isInvalid = Boolean(fieldState?.invalid || extractError(errors, name));\n const isRequiredError = fieldState?.error?.type === 'required';\n\n const [count, setCount] = useState<number>(() => getCharacterCount(defaultValue?.toString() || ''));\n const [hasStartedTyping, setHasStartedTyping] = useState(false);\n\n const hasMaxLength = typeof maxLength === 'number';\n const isAtLimit = hasMaxLength ? count >= maxLength : false;\n const showsCharacterCount = hasStartedTyping && hasMaxLength && !isRequiredError;\n\n const cssClass = `${ customCssClasses?.input || '' }${ isInvalid ? ' invalidField' : '' }`;\n\n const normalizedValidation = useMemo(() => {\n if (!validation || typeof validation.maxLength === 'undefined') {\n return validation;\n }\n\n const maxLengthRule = validation.maxLength;\n const maxLengthValue =\n typeof maxLengthRule === 'number'\n ? maxLengthRule\n : typeof maxLengthRule === 'object' && maxLengthRule && 'value' in maxLengthRule\n ? Number(maxLengthRule.value)\n : undefined;\n\n if (typeof maxLengthValue !== 'number' || Number.isNaN(maxLengthValue)) {\n return validation;\n }\n\n const maxLengthMessage = `Maximum length is ${ maxLengthValue }`;\n\n const graphemeMaxLengthValidator = (value: string) =>\n getCharacterCount(value || '') <= maxLengthValue || maxLengthMessage;\n\n // eslint-disable-next-line no-unused-vars\n const { maxLength: _maxLength, validate, ...restValidation } = validation;\n\n if (typeof validate === 'function') {\n return {\n ...restValidation,\n validate: async (value: string, formValues?: unknown) => {\n const validationResult = await validate(value, formValues);\n\n if (validationResult !== true) {\n return validationResult;\n }\n\n return graphemeMaxLengthValidator(value);\n },\n };\n }\n\n if (validate && typeof validate === 'object') {\n return {\n ...restValidation,\n validate: {\n ...validate,\n graphemeMaxLength: graphemeMaxLengthValidator,\n },\n };\n }\n\n return {\n ...restValidation,\n validate: graphemeMaxLengthValidator,\n };\n }, [validation]);\n\n const fieldRegistration = register(name, normalizedValidation);\n\n /**\n * Native maxLength counts UTF-16 units, so emojis and composed characters are treated as\n * several characters. The limit is enforced here against grapheme clusters instead.\n */\n const HandleBeforeInput = (event: React.FormEvent<HTMLTextAreaElement>) => {\n if (enforceMaxLength !== true || !hasMaxLength) {\n return;\n }\n\n const nativeEvent = event.nativeEvent as InputEvent;\n const inserted = nativeEvent.data ?? '';\n\n if (!inserted) {\n return;\n }\n\n const target = event.currentTarget;\n const start = target.selectionStart ?? target.value.length;\n const end = target.selectionEnd ?? target.value.length;\n const nextValue = target.value.slice(0, start) + inserted + target.value.slice(end);\n\n if (getCharacterCount(nextValue) > maxLength) {\n event.preventDefault();\n }\n };\n\n const HandleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const rawValue = event.target.value || '';\n const newValue = enforceMaxLength === true && hasMaxLength\n ? clampToGraphemeMax(rawValue, maxLength)\n : rawValue;\n\n if (newValue !== rawValue) {\n event.target.value = newValue;\n }\n\n setHasStartedTyping(true);\n setCount(getCharacterCount(newValue));\n\n (onChange as React.ChangeEventHandler<HTMLTextAreaElement>)(event);\n fieldRegistration?.onChange?.(event);\n };\n\n const HandleAutoFill = (event: React.AnimationEvent<HTMLTextAreaElement>) => {\n // Browsers trigger onAnimationStart when autofill happens.\n // We need to notify react-hook-form of the new value.\n if (event.animationName === 'onAutoFill') {\n const { value } = event.currentTarget;\n setHasStartedTyping(true);\n setCount(getCharacterCount(value || ''));\n HandleChange({ target: event.currentTarget } as unknown as React.ChangeEvent<HTMLTextAreaElement>);\n }\n };\n\n const HandleOnBlur = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n const { target } = event;\n\n if (target) {\n onTouched();\n (onBlur as React.FocusEventHandler<HTMLTextAreaElement>)(event);\n }\n\n fieldRegistration?.onBlur?.(event);\n };\n\n const HandleKeyEvent = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n onTouched();\n (onKeyDown as React.KeyboardEventHandler<HTMLTextAreaElement>)(event);\n };\n\n const textareaProps = {\n id,\n className: cssClass,\n placeholder,\n defaultValue,\n ...(showSpinner ? { disabled: true } : {}),\n ...(validation && typeof validation.required !== 'undefined' ? { required: true } : {}),\n ...htmlNativeDomProps,\n ...fieldRegistration,\n onBeforeInput: HandleBeforeInput,\n onChange: HandleChange,\n onBlur: HandleOnBlur,\n onKeyDown: HandleKeyEvent,\n onAnimationStart: HandleAutoFill,\n };\n\n const containerCssClass = `textareaFieldContainer${ showsCharacterCount ? ' withCharacterCount' : '' }`;\n\n return (\n <>\n { customContent?.preField && <span className=\"preField\">{ customContent?.preField }</span> }\n\n <span className={ containerCssClass }>\n <textarea { ...textareaProps } />\n\n {\n showsCharacterCount && (\n <span\n className={ `textareaCharacterCount ${ isAtLimit ? 'textareaCharacterCountExceeded' : '' }` }\n role={ isAtLimit ? 'status' : undefined }\n aria-live={ isAtLimit ? 'polite' : undefined }\n aria-atomic={ isAtLimit ? 'true' : undefined }\n >\n { `${ count }/${ maxLength }` }\n </span>\n )\n }\n </span>\n\n { customContent?.postField && <span className=\"postField\">{ customContent?.postField }</span> }\n </>\n );\n};\n"],"mappings":";AAAA,YAAY;;AAACA,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,QAAA;AAEb,IAAAC,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AAKA,IAAAG,mBAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AAEAA,OAAA;AAAyB,SAAAD,wBAAAM,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAR,uBAAA,YAAAA,CAAAM,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAlB,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAA4B,wBAAA,CAAAhB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAMlB,MAAMT,QAAiC,GAAIyB,KAAK,iBACrDxB,MAAA,CAAAiB,OAAA,CAAAQ,aAAA,CAACrB,gBAAA,CAAAsB,eAAe;EAACC,WAAW,EAAGH,KAAK,CAACG;AAAa,gBAChD3B,MAAA,CAAAiB,OAAA,CAAAQ,aAAA,CAACG,aAAa,EAAMJ,KAAS,CACd,CAClB;AAAC3B,OAAA,CAAAE,QAAA,GAAAA,QAAA;AAEF,MAAM6B,aAAsC,GAAGA,CAC7C;EACEC,KAAK,EAAE;IACLC,EAAE;IACFC,IAAI;IACJC,WAAW;IACXC,YAAY;IACZC,SAAS;IACTC,gBAAgB;IAChBC,MAAM,GAAGA,CAAA,KAAM,CAAC,CAAC;IACjBC,QAAQ,GAAGA,CAAA,KAAM,CAAC,CAAC;IACnBC,SAAS,GAAGA,CAAA,KAAM,CAAC,CAAC;IACpBC,SAAS,GAAGA,CAAA,KAAM,CAAC,CAAC;IACpB,GAAGC;EACL,CAAC;EACDC,UAAU;EACVC,WAAW;EACXC,gBAAgB;EAChBC;AACF,CAAC,KACE;EACH,MAAM;IAAEC,QAAQ;IAAEC,aAAa;IAAEC,SAAS,EAAE;MAAEC;IAAO;EAAE,CAAC,GAAG,IAAAC,6BAAc,EAAC,CAAC;EAC3E,MAAMC,UAAU,GAAGJ,aAAa,CAACf,IAAI,CAAC;EACtC;EACA,MAAMoB,SAAS,GAAGC,OAAO,CAACF,UAAU,EAAEG,OAAO,IAAI,IAAAC,gCAAY,EAACN,MAAM,EAAEjB,IAAI,CAAC,CAAC;EAC5E,MAAMwB,eAAe,GAAGL,UAAU,EAAEM,KAAK,EAAEC,IAAI,KAAK,UAAU;EAE9D,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAAS,MAAM,IAAAC,gCAAiB,EAAC5B,YAAY,EAAE6B,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;EACnG,MAAM,CAACC,gBAAgB,EAAEC,mBAAmB,CAAC,GAAG,IAAAJ,eAAQ,EAAC,KAAK,CAAC;EAE/D,MAAMK,YAAY,GAAG,OAAO/B,SAAS,KAAK,QAAQ;EAClD,MAAMgC,SAAS,GAAGD,YAAY,GAAGP,KAAK,IAAIxB,SAAS,GAAG,KAAK;EAC3D,MAAMiC,mBAAmB,GAAGJ,gBAAgB,IAAIE,YAAY,IAAI,CAACV,eAAe;EAEhF,MAAMa,QAAQ,GAAG,GAAIzB,gBAAgB,EAAE0B,KAAK,IAAI,EAAE,GAAKlB,SAAS,GAAG,eAAe,GAAG,EAAE,EAAG;EAE1F,MAAMmB,oBAAoB,GAAG,IAAAC,cAAO,EAAC,MAAM;IACzC,IAAI,CAAC9B,UAAU,IAAI,OAAOA,UAAU,CAACP,SAAS,KAAK,WAAW,EAAE;MAC9D,OAAOO,UAAU;IACnB;IAEA,MAAM+B,aAAa,GAAG/B,UAAU,CAACP,SAAS;IAC1C,MAAMuC,cAAc,GAClB,OAAOD,aAAa,KAAK,QAAQ,GAC7BA,aAAa,GACb,OAAOA,aAAa,KAAK,QAAQ,IAAIA,aAAa,IAAI,OAAO,IAAIA,aAAa,GAC5EE,MAAM,CAACF,aAAa,CAAC1E,KAAK,CAAC,GAC3B6E,SAAS;IAEjB,IAAI,OAAOF,cAAc,KAAK,QAAQ,IAAIC,MAAM,CAACE,KAAK,CAACH,cAAc,CAAC,EAAE;MACtE,OAAOhC,UAAU;IACnB;IAEA,MAAMoC,gBAAgB,GAAG,qBAAsBJ,cAAc,EAAG;IAEhE,MAAMK,0BAA0B,GAAIhF,KAAa,IAC/C,IAAA+D,gCAAiB,EAAC/D,KAAK,IAAI,EAAE,CAAC,IAAI2E,cAAc,IAAII,gBAAgB;;IAEtE;IACA,MAAM;MAAE3C,SAAS,EAAE6C,UAAU;MAAEC,QAAQ;MAAE,GAAGC;IAAe,CAAC,GAAGxC,UAAU;IAEzE,IAAI,OAAOuC,QAAQ,KAAK,UAAU,EAAE;MAClC,OAAO;QACL,GAAGC,cAAc;QACjBD,QAAQ,EAAE,MAAAA,CAAOlF,KAAa,EAAEoF,UAAoB,KAAK;UACvD,MAAMC,gBAAgB,GAAG,MAAMH,QAAQ,CAAClF,KAAK,EAAEoF,UAAU,CAAC;UAE1D,IAAIC,gBAAgB,KAAK,IAAI,EAAE;YAC7B,OAAOA,gBAAgB;UACzB;UAEA,OAAOL,0BAA0B,CAAChF,KAAK,CAAC;QAC1C;MACF,CAAC;IACH;IAEA,IAAIkF,QAAQ,IAAI,OAAOA,QAAQ,KAAK,QAAQ,EAAE;MAC5C,OAAO;QACL,GAAGC,cAAc;QACjBD,QAAQ,EAAE;UACR,GAAGA,QAAQ;UACXI,iBAAiB,EAAEN;QACrB;MACF,CAAC;IACH;IAEA,OAAO;MACL,GAAGG,cAAc;MACjBD,QAAQ,EAAEF;IACZ,CAAC;EACH,CAAC,EAAE,CAACrC,UAAU,CAAC,CAAC;EAEhB,MAAM4C,iBAAiB,GAAGxC,QAAQ,CAACd,IAAI,EAAEuC,oBAAoB,CAAC;;EAE9D;AACF;AACA;AACA;EACE,MAAMgB,iBAAiB,GAAIC,KAA2C,IAAK;IACzE,IAAIpD,gBAAgB,KAAK,IAAI,IAAI,CAAC8B,YAAY,EAAE;MAC9C;IACF;IAEA,MAAMuB,WAAW,GAAGD,KAAK,CAACC,WAAyB;IACnD,MAAMC,QAAQ,GAAGD,WAAW,CAACE,IAAI,IAAI,EAAE;IAEvC,IAAI,CAACD,QAAQ,EAAE;MACb;IACF;IAEA,MAAME,MAAM,GAAGJ,KAAK,CAACK,aAAa;IAClC,MAAMC,KAAK,GAAGF,MAAM,CAACG,cAAc,IAAIH,MAAM,CAAC7F,KAAK,CAACiG,MAAM;IAC1D,MAAMC,GAAG,GAAGL,MAAM,CAACM,YAAY,IAAIN,MAAM,CAAC7F,KAAK,CAACiG,MAAM;IACtD,MAAMG,SAAS,GAAGP,MAAM,CAAC7F,KAAK,CAACqG,KAAK,CAAC,CAAC,EAAEN,KAAK,CAAC,GAAGJ,QAAQ,GAAGE,MAAM,CAAC7F,KAAK,CAACqG,KAAK,CAACH,GAAG,CAAC;IAEnF,IAAI,IAAAnC,gCAAiB,EAACqC,SAAS,CAAC,GAAGhE,SAAS,EAAE;MAC5CqD,KAAK,CAACa,cAAc,CAAC,CAAC;IACxB;EACF,CAAC;EAED,MAAMC,YAAY,GAAId,KAA6C,IAAK;IACtE,MAAMe,QAAQ,GAAGf,KAAK,CAACI,MAAM,CAAC7F,KAAK,IAAI,EAAE;IACzC,MAAMyG,QAAQ,GAAGpE,gBAAgB,KAAK,IAAI,IAAI8B,YAAY,GACtD,IAAAuC,iCAAkB,EAACF,QAAQ,EAAEpE,SAAS,CAAC,GACvCoE,QAAQ;IAEZ,IAAIC,QAAQ,KAAKD,QAAQ,EAAE;MACzBf,KAAK,CAACI,MAAM,CAAC7F,KAAK,GAAGyG,QAAQ;IAC/B;IAEAvC,mBAAmB,CAAC,IAAI,CAAC;IACzBL,QAAQ,CAAC,IAAAE,gCAAiB,EAAC0C,QAAQ,CAAC,CAAC;IAEpClE,QAAQ,CAAmDkD,KAAK,CAAC;IAClEF,iBAAiB,EAAEhD,QAAQ,GAAGkD,KAAK,CAAC;EACtC,CAAC;EAED,MAAMkB,cAAc,GAAIlB,KAAgD,IAAK;IAC3E;IACA;IACA,IAAIA,KAAK,CAACmB,aAAa,KAAK,YAAY,EAAE;MACxC,MAAM;QAAE5G;MAAM,CAAC,GAAGyF,KAAK,CAACK,aAAa;MACrC5B,mBAAmB,CAAC,IAAI,CAAC;MACzBL,QAAQ,CAAC,IAAAE,gCAAiB,EAAC/D,KAAK,IAAI,EAAE,CAAC,CAAC;MACxCuG,YAAY,CAAC;QAAEV,MAAM,EAAEJ,KAAK,CAACK;MAAc,CAAsD,CAAC;IACpG;EACF,CAAC;EAED,MAAMe,YAAY,GAAIpB,KAA4C,IAAK;IACrE,MAAM;MAAEI;IAAO,CAAC,GAAGJ,KAAK;IAExB,IAAII,MAAM,EAAE;MACVpD,SAAS,CAAC,CAAC;MACVH,MAAM,CAAkDmD,KAAK,CAAC;IACjE;IAEAF,iBAAiB,EAAEjD,MAAM,GAAGmD,KAAK,CAAC;EACpC,CAAC;EAED,MAAMqB,cAAc,GAAIrB,KAA+C,IAAK;IAC1EhD,SAAS,CAAC,CAAC;IACVD,SAAS,CAAqDiD,KAAK,CAAC;EACvE,CAAC;EAED,MAAMsB,aAAa,GAAG;IACpB/E,EAAE;IACFgF,SAAS,EAAE1C,QAAQ;IACnBpC,WAAW;IACXC,YAAY;IACZ,IAAIS,WAAW,GAAG;MAAEqE,QAAQ,EAAE;IAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAItE,UAAU,IAAI,OAAOA,UAAU,CAACuE,QAAQ,KAAK,WAAW,GAAG;MAAEA,QAAQ,EAAE;IAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,GAAGxE,kBAAkB;IACrB,GAAG6C,iBAAiB;IACpB4B,aAAa,EAAE3B,iBAAiB;IAChCjD,QAAQ,EAAEgE,YAAY;IACtBjE,MAAM,EAAEuE,YAAY;IACpBrE,SAAS,EAAEsE,cAAc;IACzBM,gBAAgB,EAAET;EACpB,CAAC;EAED,MAAMU,iBAAiB,GAAG,yBAA0BhD,mBAAmB,GAAG,qBAAqB,GAAG,EAAE,EAAG;EAEvG,oBACEnE,MAAA,CAAAiB,OAAA,CAAAQ,aAAA,CAAAzB,MAAA,CAAAiB,OAAA,CAAAmG,QAAA,QACIxE,aAAa,EAAEyE,QAAQ,iBAAIrH,MAAA,CAAAiB,OAAA,CAAAQ,aAAA;IAAMqF,SAAS,EAAC;EAAU,GAAGlE,aAAa,EAAEyE,QAAgB,CAAC,eAE1FrH,MAAA,CAAAiB,OAAA,CAAAQ,aAAA;IAAMqF,SAAS,EAAGK;EAAmB,gBACnCnH,MAAA,CAAAiB,OAAA,CAAAQ,aAAA,aAAeoF,aAAiB,CAAC,EAG/B1C,mBAAmB,iBACjBnE,MAAA,CAAAiB,OAAA,CAAAQ,aAAA;IACEqF,SAAS,EAAG,0BAA2B5C,SAAS,GAAG,gCAAgC,GAAG,EAAE,EAAK;IAC7FoD,IAAI,EAAGpD,SAAS,GAAG,QAAQ,GAAGS,SAAW;IACzC,aAAYT,SAAS,GAAG,QAAQ,GAAGS,SAAW;IAC9C,eAAcT,SAAS,GAAG,MAAM,GAAGS;EAAW,GAE5C,GAAIjB,KAAK,IAAMxB,SAAS,EACtB,CAGN,CAAC,EAELU,aAAa,EAAE2E,SAAS,iBAAIvH,MAAA,CAAAiB,OAAA,CAAAQ,aAAA;IAAMqF,SAAS,EAAC;EAAW,GAAGlE,aAAa,EAAE2E,SAAiB,CAC5F,CAAC;AAEP,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
.textareaFieldContainer {
|
|
2
|
+
position: relative;
|
|
3
|
+
width: 100%;
|
|
4
|
+
}
|
|
5
|
+
.textareaFieldContainer.withCharacterCount textarea {
|
|
6
|
+
padding-bottom: 26px;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.textareaCharacterCount {
|
|
10
|
+
line-height: 15px;
|
|
11
|
+
font-size: 13px;
|
|
12
|
+
color: var(--inputLabelColor);
|
|
13
|
+
position: absolute;
|
|
14
|
+
right: 10px;
|
|
15
|
+
bottom: 10px;
|
|
16
|
+
pointer-events: none;
|
|
17
|
+
}
|
|
18
|
+
.textareaCharacterCount.textareaCharacterCountExceeded {
|
|
19
|
+
color: var(--inputErrorColor);
|
|
20
|
+
}
|
|
@@ -12,21 +12,38 @@ var _reactHookForm = require("react-hook-form");
|
|
|
12
12
|
const HookFormWrapper = ({
|
|
13
13
|
formCssClass = 'x15StandardForm',
|
|
14
14
|
children,
|
|
15
|
-
formProps
|
|
15
|
+
formProps,
|
|
16
|
+
formContext,
|
|
17
|
+
onSubmit
|
|
16
18
|
}) => {
|
|
17
|
-
const
|
|
19
|
+
const inheritedHookFormContext = (0, _reactHookForm.useFormContext)();
|
|
18
20
|
const hookFormMethods = (0, _reactHookForm.useForm)({
|
|
19
21
|
mode: 'all',
|
|
20
22
|
criteriaMode: 'all',
|
|
21
23
|
shouldFocusError: true
|
|
22
24
|
});
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
|
|
26
|
+
// A manually supplied context re-publishes the form state across a boundary the
|
|
27
|
+
// React context could not cross (e.g. a Next.js server/client component split).
|
|
28
|
+
if (formContext) {
|
|
29
|
+
return /*#__PURE__*/_react.default.createElement(_reactHookForm.FormProvider, formContext, children);
|
|
30
|
+
}
|
|
31
|
+
if (inheritedHookFormContext) {
|
|
32
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
|
|
25
33
|
}
|
|
34
|
+
const {
|
|
35
|
+
onSubmit: nativeOnSubmit,
|
|
36
|
+
...remainingFormProps
|
|
37
|
+
} = formProps || {};
|
|
38
|
+
|
|
39
|
+
// `onSubmit` receives the validated values, so consumers never need to call useForm themselves.
|
|
40
|
+
const handleFormSubmit = onSubmit ? hookFormMethods.handleSubmit(onSubmit) : nativeOnSubmit;
|
|
26
41
|
return /*#__PURE__*/_react.default.createElement(_reactHookForm.FormProvider, hookFormMethods, /*#__PURE__*/_react.default.createElement("form", (0, _extends2.default)({
|
|
27
42
|
className: formCssClass,
|
|
28
43
|
autoComplete: "off"
|
|
29
|
-
},
|
|
44
|
+
}, remainingFormProps, {
|
|
45
|
+
onSubmit: handleFormSubmit
|
|
46
|
+
}), children));
|
|
30
47
|
};
|
|
31
48
|
exports.HookFormWrapper = HookFormWrapper;
|
|
32
49
|
var _default = exports.default = HookFormWrapper;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HookFormWrapper.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","HookFormWrapper","_extends2","_react","_reactHookForm","formCssClass","children","formProps","
|
|
1
|
+
{"version":3,"file":"HookFormWrapper.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","HookFormWrapper","_extends2","_react","_reactHookForm","formCssClass","children","formProps","formContext","onSubmit","inheritedHookFormContext","useFormContext","hookFormMethods","useForm","mode","criteriaMode","shouldFocusError","createElement","FormProvider","Fragment","nativeOnSubmit","remainingFormProps","handleFormSubmit","handleSubmit","className","autoComplete","_default"],"sources":["../../../../../src/components/form/hookFormWrapper/HookFormWrapper.tsx"],"sourcesContent":["'use client';\n\nimport React, { ReactNode, ReactElement, FormHTMLAttributes } from 'react';\nimport { FieldValues, FormProvider, useForm, useFormContext, UseFormReturn } from 'react-hook-form';\n\ninterface FormWrapperProps {\n formCssClass?: string;\n formProps?: FormHTMLAttributes<HTMLFormElement>;\n children: ReactNode | ReactElement;\n formContext?: UseFormReturn<FieldValues, any, FieldValues>\n /* eslint-disable-next-line no-unused-vars */\n onSubmit?: (values: FieldValues) => void | Promise<void>;\n}\n\nexport const HookFormWrapper: React.FC<FormWrapperProps> = (\n {\n formCssClass = 'x15StandardForm',\n children,\n formProps,\n formContext,\n onSubmit,\n }\n) => {\n const inheritedHookFormContext = useFormContext();\n\n const hookFormMethods = useForm({\n mode: 'all',\n criteriaMode: 'all',\n shouldFocusError: true\n });\n\n // A manually supplied context re-publishes the form state across a boundary the\n // React context could not cross (e.g. a Next.js server/client component split).\n if (formContext) {\n return (\n <FormProvider { ...formContext }>\n { children }\n </FormProvider>\n );\n }\n\n if (inheritedHookFormContext) {\n return <>{ children }</>;\n }\n\n const { onSubmit: nativeOnSubmit, ...remainingFormProps } = formProps || {};\n\n // `onSubmit` receives the validated values, so consumers never need to call useForm themselves.\n const handleFormSubmit = onSubmit\n ? hookFormMethods.handleSubmit(onSubmit)\n : nativeOnSubmit;\n\n return (\n <FormProvider { ...hookFormMethods }>\n <form\n className={ formCssClass }\n autoComplete=\"off\"\n { ...remainingFormProps }\n onSubmit={ handleFormSubmit }\n >\n {\n children\n }\n </form>\n </FormProvider>\n );\n};\n\nexport default HookFormWrapper;\n"],"mappings":";AAAA,YAAY;;AAAC,IAAAA,sBAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,OAAA,GAAAF,OAAA,CAAAG,eAAA;AAAA,IAAAC,SAAA,GAAAR,sBAAA,CAAAC,OAAA;AAEb,IAAAQ,MAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,cAAA,GAAAT,OAAA;AAWO,MAAMM,eAA2C,GAAGA,CACzD;EACEI,YAAY,GAAG,iBAAiB;EAChCC,QAAQ;EACRC,SAAS;EACTC,WAAW;EACXC;AACF,CAAC,KACE;EACH,MAAMC,wBAAwB,GAAG,IAAAC,6BAAc,EAAC,CAAC;EAEjD,MAAMC,eAAe,GAAG,IAAAC,sBAAO,EAAC;IAC9BC,IAAI,EAAE,KAAK;IACXC,YAAY,EAAE,KAAK;IACnBC,gBAAgB,EAAE;EACpB,CAAC,CAAC;;EAEF;EACA;EACA,IAAIR,WAAW,EAAE;IACf,oBACEL,MAAA,CAAAH,OAAA,CAAAiB,aAAA,CAACb,cAAA,CAAAc,YAAY,EAAMV,WAAW,EAC1BF,QACU,CAAC;EAEnB;EAEA,IAAII,wBAAwB,EAAE;IAC5B,oBAAOP,MAAA,CAAAH,OAAA,CAAAiB,aAAA,CAAAd,MAAA,CAAAH,OAAA,CAAAmB,QAAA,QAAIb,QAAY,CAAC;EAC1B;EAEA,MAAM;IAAEG,QAAQ,EAAEW,cAAc;IAAE,GAAGC;EAAmB,CAAC,GAAGd,SAAS,IAAI,CAAC,CAAC;;EAE3E;EACA,MAAMe,gBAAgB,GAAGb,QAAQ,GAC7BG,eAAe,CAACW,YAAY,CAACd,QAAQ,CAAC,GACtCW,cAAc;EAElB,oBACEjB,MAAA,CAAAH,OAAA,CAAAiB,aAAA,CAACb,cAAA,CAAAc,YAAY,EAAMN,eAAe,eAChCT,MAAA,CAAAH,OAAA,CAAAiB,aAAA,aAAAf,SAAA,CAAAF,OAAA;IACEwB,SAAS,EAAGnB,YAAc;IAC1BoB,YAAY,EAAC;EAAK,GACbJ,kBAAkB;IACvBZ,QAAQ,EAAGa;EAAkB,IAG3BhB,QAEE,CACM,CAAC;AAEnB,CAAC;AAACR,OAAA,CAAAG,eAAA,GAAAA,eAAA;AAAA,IAAAyB,QAAA,GAAA5B,OAAA,CAAAE,OAAA,GAEaC,eAAe","ignoreList":[]}
|