intelicoreact 2.0.19 → 2.0.21
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/es/Atomic/FormElements/ActionAlert/ActionAlert.js.map +1 -1
- package/dist/es/Atomic/FormElements/AdvancedStatus/AdvancedStatus.js.map +1 -1
- package/dist/es/Atomic/FormElements/Calendar/Calendar.js +2 -1
- package/dist/es/Atomic/FormElements/Calendar/Calendar.js.map +1 -1
- package/dist/es/Atomic/FormElements/CheckboxInput/CheckboxInput.js.map +1 -1
- package/dist/es/Atomic/FormElements/CheckboxesLine/CheckboxesLine.js.map +1 -1
- package/dist/es/Atomic/FormElements/Datepicker/Datepicker.js +6 -5
- package/dist/es/Atomic/FormElements/Datepicker/Datepicker.js.map +1 -1
- package/dist/es/Atomic/FormElements/Datepicker/components/DatepickerCalendar.js +2 -1
- package/dist/es/Atomic/FormElements/Datepicker/components/DatepickerCalendar.js.map +1 -1
- package/dist/es/Atomic/FormElements/Dropdown/Dropdown.js +35 -26
- package/dist/es/Atomic/FormElements/Dropdown/Dropdown.js.map +1 -1
- package/dist/es/Atomic/FormElements/Dropdown/_utils.js +14 -9
- package/dist/es/Atomic/FormElements/Dropdown/_utils.js.map +1 -1
- package/dist/es/Atomic/FormElements/DropdownLiveSearch/DropdownLiveSearch.js.map +1 -1
- package/dist/es/Atomic/FormElements/FileLoader/FileLoader.js.map +1 -1
- package/dist/es/Atomic/FormElements/FileLoader/partial/LoadZone.js +1 -1
- package/dist/es/Atomic/FormElements/FileLoader/partial/LoadZone.js.map +1 -1
- package/dist/es/Atomic/FormElements/FileLoader/partial/LoadedContent.js +15 -13
- package/dist/es/Atomic/FormElements/FileLoader/partial/LoadedContent.js.map +1 -1
- package/dist/es/Atomic/FormElements/FileLoaderDescription/FileLoaderDescription.js +1 -1
- package/dist/es/Atomic/FormElements/FileLoaderDescription/FileLoaderDescription.js.map +1 -1
- package/dist/es/Atomic/FormElements/FileLoaderLocal/FileLoaderLocal.js +23 -19
- package/dist/es/Atomic/FormElements/FileLoaderLocal/FileLoaderLocal.js.map +1 -1
- package/dist/es/Atomic/FormElements/FileLoaderLocalGroup/FileLoaderLocalGroup.js +1 -1
- package/dist/es/Atomic/FormElements/FileLoaderLocalGroup/FileLoaderLocalGroup.js.map +1 -1
- package/dist/es/Atomic/FormElements/FormattedRawSSN/FormattedRawSSN.js.map +1 -1
- package/dist/es/Atomic/FormElements/Input/Input.js.map +1 -1
- package/dist/es/Atomic/FormElements/Input/hooks/useInputValueProcessing.js +0 -1
- package/dist/es/Atomic/FormElements/Input/hooks/useInputValueProcessing.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputCalendar/InputCalendar.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputColor/InputColor.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputCurrency/InputCurrency.js +28 -25
- package/dist/es/Atomic/FormElements/InputCurrency/InputCurrency.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputDateRange/InputDateRange.js +2 -1
- package/dist/es/Atomic/FormElements/InputDateRange/InputDateRange.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputDateRange/components/DateInput.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputDateRange/components/Datepicker.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputDateRange/components/OpenedPart.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputDateRange/components/SelectItem.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputLink/InputLink.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputMask3/InputMask3.js +16 -14
- package/dist/es/Atomic/FormElements/InputMask3/InputMask3.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputWithAction/InputWithAction.js.map +1 -1
- package/dist/es/Atomic/FormElements/InputsRow/InputsRow.js +3 -2
- package/dist/es/Atomic/FormElements/InputsRow/InputsRow.js.map +1 -1
- package/dist/es/Atomic/FormElements/Label/Label.js.map +1 -1
- package/dist/es/Atomic/FormElements/MobileCalendar/MobileCalendar.js.map +1 -1
- package/dist/es/Atomic/FormElements/MultiSelect/MultiSelect.js.map +1 -1
- package/dist/es/Atomic/FormElements/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/es/Atomic/FormElements/RadioGroupWithInput/RadioGroupWithInput.js.map +1 -1
- package/dist/es/Atomic/FormElements/RadioInput/RadioInput.js.map +1 -1
- package/dist/es/Atomic/FormElements/RadioRowSwitcher/RadioRowSwitcher.js.map +1 -1
- package/dist/es/Atomic/FormElements/RangeCalendar/RangeCalendar.js +2 -1
- package/dist/es/Atomic/FormElements/RangeCalendar/RangeCalendar.js.map +1 -1
- package/dist/es/Atomic/FormElements/RangeInputs/RangeInputs.js.map +1 -1
- package/dist/es/Atomic/FormElements/RangeList/RangeList.js.map +1 -1
- package/dist/es/Atomic/FormElements/RangeList/partial/RangeListRow.js.map +1 -1
- package/dist/es/Atomic/FormElements/RangeSlider/RangeSlider.js +9 -6
- package/dist/es/Atomic/FormElements/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/es/Atomic/FormElements/RangeSlider2/RangeSlider2.js +4 -2
- package/dist/es/Atomic/FormElements/RangeSlider2/RangeSlider2.js.map +1 -1
- package/dist/es/Atomic/FormElements/SwitchableRow/SwitchableRow.js.map +1 -1
- package/dist/es/Atomic/FormElements/Switcher/Switcher.js.map +1 -1
- package/dist/es/Atomic/FormElements/SwitcherCheckbox/SwitcherCheckbox.js.map +1 -1
- package/dist/es/Atomic/FormElements/SwitcherHide/SwitcherHide.js.map +1 -1
- package/dist/es/Atomic/FormElements/SwitcherRadio/SwitcherRadio.js.map +1 -1
- package/dist/es/Atomic/FormElements/SwitcherRange/SwitcherRange.js.map +1 -1
- package/dist/es/Atomic/FormElements/SwitcherRangeList/SwitcherRangeList.js +1 -1
- package/dist/es/Atomic/FormElements/SwitcherRangeList/SwitcherRangeList.js.map +1 -1
- package/dist/es/Atomic/FormElements/SwitcherTagsDropdown/SwitcherTagsDropdown.js.map +1 -1
- package/dist/es/Atomic/FormElements/SwitcherTextarea/SwitcherTextarea.js.map +1 -1
- package/dist/es/Atomic/FormElements/TagsDropdown/TagsDropdown.js.map +1 -1
- package/dist/es/Atomic/FormElements/Text/Text.js.map +1 -1
- package/dist/es/Atomic/FormElements/TextSwitcher/TextSwitcher.js.map +1 -1
- package/dist/es/Atomic/FormElements/Textarea/Textarea.js.map +1 -1
- package/dist/es/Atomic/FormElements/TieredCheckboxes/TieredCheckboxes.js +4 -2
- package/dist/es/Atomic/FormElements/TieredCheckboxes/TieredCheckboxes.js.map +1 -1
- package/dist/es/Atomic/FormElements/TieredCheckboxes/partial/AccordionWithCheckbox.js.map +1 -1
- package/dist/es/Atomic/FormElements/TimeRange/TimeRange.js.map +1 -1
- package/dist/es/Atomic/FormElements/UserContacts/UserContacts.js.map +1 -1
- package/dist/es/Atomic/Layout/Header/Header.js.map +1 -1
- package/dist/es/Atomic/Layout/MainMenu/MainMenu.js.map +1 -1
- package/dist/es/Atomic/Layout/Spinner/Spinner.js.map +1 -1
- package/dist/es/Atomic/UI/Accordion/Accordion.js.map +1 -1
- package/dist/es/Atomic/UI/Accordion/AccordionItem.js.map +1 -1
- package/dist/es/Atomic/UI/AdvancedTag/AdvTag.js +2 -1
- package/dist/es/Atomic/UI/AdvancedTag/AdvTag.js.map +1 -1
- package/dist/es/Atomic/UI/AdvancedTag/AdvancedTags.js.map +1 -1
- package/dist/es/Atomic/UI/Alert/Alert.js.map +1 -1
- package/dist/es/Atomic/UI/Arrow/Arrow.js.map +1 -1
- package/dist/es/Atomic/UI/Button/Button.js.map +1 -1
- package/dist/es/Atomic/UI/ButtonsBar/ButtonsBar.js.map +1 -1
- package/dist/es/Atomic/UI/Chart/Chart.js +2 -1
- package/dist/es/Atomic/UI/Chart/Chart.js.map +1 -1
- package/dist/es/Atomic/UI/Chart/partial/ChartTypeSwitcherIcon/ChartTypeSwitcherIcon.js.map +1 -1
- package/dist/es/Atomic/UI/Chart/partial/utils.js +2 -1
- package/dist/es/Atomic/UI/Chart/partial/utils.js.map +1 -1
- package/dist/es/Atomic/UI/DateTime/DateTime.js.map +1 -1
- package/dist/es/Atomic/UI/DebugContainer/DebugContainer.js.map +1 -1
- package/dist/es/Atomic/UI/DoubleString/DoubleString.js.map +1 -1
- package/dist/es/Atomic/UI/Hint/Hint.js +8 -12
- package/dist/es/Atomic/UI/Hint/Hint.js.map +1 -1
- package/dist/es/Atomic/UI/Hint/partials/_utils.js.map +1 -1
- package/dist/es/Atomic/UI/Modal/Modal.js.map +1 -1
- package/dist/es/Atomic/UI/Modal/ModalHOC.js.map +1 -1
- package/dist/es/Atomic/UI/Modal/partials/ModalTitle.js.map +1 -1
- package/dist/es/Atomic/UI/Modal/partials/_constants.js.map +1 -1
- package/dist/es/Atomic/UI/Modal/partials/_utils.js +1 -4
- package/dist/es/Atomic/UI/Modal/partials/_utils.js.map +1 -1
- package/dist/es/Atomic/UI/Modal/partials/useMobileModal.js +17 -10
- package/dist/es/Atomic/UI/Modal/partials/useMobileModal.js.map +1 -1
- package/dist/es/Atomic/UI/NavLine/NavLine.js.map +1 -1
- package/dist/es/Atomic/UI/PageTitle/PageTitle.js.map +1 -1
- package/dist/es/Atomic/UI/Price/Price.js.map +1 -1
- package/dist/es/Atomic/UI/PriceRange/PriceRange.js.map +1 -1
- package/dist/es/Atomic/UI/ProgressLine/ProgressLine.js.map +1 -1
- package/dist/es/Atomic/UI/Status/Status.js.map +1 -1
- package/dist/es/Atomic/UI/Tag/Tag.js.map +1 -1
- package/dist/es/Atomic/UI/TagList/TagList.js.map +1 -1
- package/dist/es/Atomic/UI/UserBox/UserBox.js.map +1 -1
- package/dist/es/Atomic/UI/WizardStepper/ui/StateIcon/StateIcon.js.map +1 -1
- package/dist/es/Atomic/UI/WizardStepper/ui/StepRow/StepRow.js.map +1 -1
- package/dist/es/Atomic/UI/WizardStepper/ui/StepWrapper/StepWrapper.js.map +1 -1
- package/dist/es/Atomic/UI/WizardStepper/ui/icons.js.map +1 -1
- package/dist/es/Classes/RESTAPI/partials/AbortableFetch.js +9 -2
- package/dist/es/Classes/RESTAPI/partials/AbortableFetch.js.map +1 -1
- package/dist/es/Classes/RESTAPI/partials/CredentialsProcessing.js +4 -2
- package/dist/es/Classes/RESTAPI/partials/CredentialsProcessing.js.map +1 -1
- package/dist/es/Classes/RESTAPI/partials/sse.js +4 -7
- package/dist/es/Classes/RESTAPI/partials/sse.js.map +1 -1
- package/dist/es/Functions/fieldValueFormatters.js +1 -3
- package/dist/es/Functions/fieldValueFormatters.js.map +1 -1
- package/dist/es/Functions/operations.js +22 -20
- package/dist/es/Functions/operations.js.map +1 -1
- package/dist/es/Functions/useFormTools/form-drivers/ObjectWithIterableObjects.js +8 -6
- package/dist/es/Functions/useFormTools/form-drivers/ObjectWithIterableObjects.js.map +1 -1
- package/dist/es/Functions/useFormTools/functions/General.js +8 -6
- package/dist/es/Functions/useFormTools/functions/General.js.map +1 -1
- package/dist/es/Functions/useFormTools/functions/RenderFields.js +6 -5
- package/dist/es/Functions/useFormTools/functions/RenderFields.js.map +1 -1
- package/dist/es/Functions/useFormTools/index.js +1 -4
- package/dist/es/Functions/useFormTools/index.js.map +1 -1
- package/dist/es/Functions/utils.js +2 -1
- package/dist/es/Functions/utils.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/AffiliateNetworks.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/AlertCircle.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/AppStore.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Arrow.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ArrowDown.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ArrowLeft.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ArrowRight.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ArrowUp.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Bell.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Button.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Campaigns.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Check.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Check2.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ChevronDown.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ChevronDownDisabled.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ChevronLeft.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ChevronRight.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ChevronUp.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ChevronUpDown.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Close.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/ColumnsOrder.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Delete.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Edit.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Email.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/FinturfLogo.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/FinturfLogo2.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Flows.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Gift.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/GoogleAuth.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/GooglePlay.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/HelpCircle.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/HelpCircle2.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/HelpCircleFilled.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Home.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Home2.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Key.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Landers.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Lock.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Mail.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Mastercard.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Minus.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Offers.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Pause.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/PayPal.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/PayPalLightLarge.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Phone.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Play.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Plus.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Profile.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/QRCode.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Rectangle.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Revert.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Star.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Star2.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/TrafficSources.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Trash.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/TrashRed.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Triggers.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/User.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/Visa.js.map +1 -1
- package/dist/es/Molecular/CustomIcons/components/X.js.map +1 -1
- package/dist/es/Molecular/FormElement/FormElement.js.map +1 -1
- package/dist/es/Molecular/InputAddress/InputAddress.js +24 -19
- package/dist/es/Molecular/InputAddress/InputAddress.js.map +1 -1
- package/dist/es/Molecular/InputCustomFetch/InputCustomFetch.js +17 -11
- package/dist/es/Molecular/InputCustomFetch/InputCustomFetch.js.map +1 -1
- package/dist/es/Molecular/InputPassword/InputPassword.js.map +1 -1
- package/package.json +2 -2
- /package/dist/es/Atomic/FormElements/{SwitcherRangeList/SwitcherRangeList.styles.css → Datepicker/Datepicker.styles.css} +0 -0
|
@@ -6,20 +6,22 @@ import "react";
|
|
|
6
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
import { Download, Paperclip, Trash2 } from "react-feather";
|
|
8
8
|
//#region src/Atomic/FormElements/FileLoaderLocal/FileLoaderLocal.tsx
|
|
9
|
-
var MAX_FILE_SIZE =
|
|
9
|
+
var MAX_FILE_SIZE = 10485760;
|
|
10
10
|
var FileLoaderLocal = ({ groupId, id, fieldId, fieldKey, label, error, outerError, isRequired, accept, onChange, className, value, isNoTrashIcon = false, maxItemSizeBytes, testId = "file-loader-local", attributesOfNativeInput = {} }) => {
|
|
11
11
|
const getFileName = (value) => {
|
|
12
12
|
return value.match(/[^\\]+$/)?.[0];
|
|
13
13
|
};
|
|
14
14
|
const renderRequiredLabel = () => {
|
|
15
|
-
if (!value)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
if (!value) {
|
|
16
|
+
if (isRequired) return /* @__PURE__ */ jsx("div", {
|
|
17
|
+
className: "file-loader-local--required",
|
|
18
|
+
children: "Required"
|
|
19
|
+
});
|
|
20
|
+
else return /* @__PURE__ */ jsx("div", {
|
|
21
|
+
className: "file-loader-local--optional",
|
|
22
|
+
children: "Optional"
|
|
23
|
+
});
|
|
24
|
+
}
|
|
23
25
|
return null;
|
|
24
26
|
};
|
|
25
27
|
const isFileSizeOutOfLimit = (file) => {
|
|
@@ -44,16 +46,18 @@ var FileLoaderLocal = ({ groupId, id, fieldId, fieldKey, label, error, outerErro
|
|
|
44
46
|
groupId,
|
|
45
47
|
error: maxItemSizeBytes ? `Max file size is ${renderFileSize(maxItemSizeBytes)}` : ""
|
|
46
48
|
});
|
|
47
|
-
else if (!checkExtension(valueExtension))
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
else if (!checkExtension(valueExtension)) {
|
|
50
|
+
const allowedExtensions = accept?.replace(/\./g, "")?.toUpperCase() || "JPG, PNG, PDF";
|
|
51
|
+
onChange({
|
|
52
|
+
id,
|
|
53
|
+
groupId,
|
|
54
|
+
name,
|
|
55
|
+
valueExtension,
|
|
56
|
+
e,
|
|
57
|
+
file,
|
|
58
|
+
error: `Only ${getUniqueFileExtensions(allowedExtensions)} are allowed`
|
|
59
|
+
});
|
|
60
|
+
} else if (!latinRegex.test(fileName)) onChange({
|
|
57
61
|
id,
|
|
58
62
|
groupId,
|
|
59
63
|
name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileLoaderLocal.js","names":[],"sources":["../../../../../src/Atomic/FormElements/FileLoaderLocal/FileLoaderLocal.tsx"],"sourcesContent":["import type { FileLoaderLocalProps } from './FileLoaderLocal.interface';\nimport cn from 'classnames';\nimport React from 'react';\n\nimport { Download, Paperclip, Trash2 } from 'react-feather';\n\nimport { getUniqueFileExtensions, renderFileSize } from '../../../Functions/utils';\nimport './FileLoaderLocal.scss';\n\nconst MAX_FILE_SIZE = 10 * 1024 * 1024;\n\nconst FileLoaderLocal: React.FC<FileLoaderLocalProps> = ({\n groupId,\n id,\n fieldId,\n fieldKey,\n label,\n error,\n outerError,\n isRequired,\n accept,\n onChange,\n className,\n value,\n isNoTrashIcon = false,\n maxItemSizeBytes,\n testId = 'file-loader-local',\n attributesOfNativeInput = {},\n}) => {\n const getFileName = (value: string): string | undefined => {\n return value.match(/[^\\\\]+$/)?.[0];\n };\n\n const renderRequiredLabel = (): JSX.Element | null => {\n if (!value) {\n if (isRequired) return <div className=\"file-loader-local--required\">Required</div>;\n else return <div className=\"file-loader-local--optional\">Optional</div>;\n }\n\n return null;\n };\n\n const isFileSizeOutOfLimit = (file: File): boolean => {\n return file.size > (maxItemSizeBytes ?? MAX_FILE_SIZE);\n };\n\n const checkExtension = (valueExtension: string | undefined): boolean => {\n return valueExtension && accept ? accept.includes(valueExtension) : false;\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n const name = getFileName(e.target.value);\n const valueExtension = name?.match(/[^.]+$/)?.[0];\n const fileName = name?.split('.')?.[0] ?? '';\n const latinRegex = /^[\\w\\u00C0-\\u00FF!@#$%^&*)(+=.\\-\\s]+$/;\n const file = e.target?.files?.[0];\n\n if (!file || !name || !valueExtension) return;\n\n if (isFileSizeOutOfLimit(file)) {\n onChange({\n id,\n name,\n valueExtension,\n e,\n file,\n groupId,\n error: maxItemSizeBytes ? `Max file size is ${renderFileSize(maxItemSizeBytes)}` : '',\n });\n }\n else if (!checkExtension(valueExtension)) {\n const allowedExtensions = accept?.replace(/\\./g, '')?.toUpperCase() || 'JPG, PNG, PDF';\n const uniqExts = getUniqueFileExtensions(allowedExtensions);\n onChange({\n id,\n groupId,\n name,\n valueExtension,\n e,\n file,\n error: `Only ${uniqExts} are allowed`,\n });\n }\n else if (!latinRegex.test(fileName)) {\n onChange({\n id,\n groupId,\n name,\n valueExtension,\n e,\n file,\n error: `File name must be Latin characters only.`,\n });\n }\n else {\n onChange({ id, groupId, name, valueExtension, e, file });\n }\n };\n\n const inputId = fieldKey || `file-input-${id}${groupId ? `-${groupId}` : ''}`;\n\n return (\n <div\n data-testid={testId}\n className={cn('file-loader-local', className, {\n 'file-loader-local_outer-error': Boolean(outerError),\n 'file-loader-local--with-file': value,\n })}\n >\n {(fieldId === 'uploadTrigger' || !value) && (\n <input\n key={id}\n onChange={handleChange}\n className=\"file-loader-local__file-input\"\n id={inputId}\n type=\"file\"\n name={fieldKey || id?.toString()}\n required={isRequired}\n accept={accept}\n {...attributesOfNativeInput}\n />\n )}\n\n <label\n className={cn('file-loader-local__label-box', {\n 'file-loader-local__label-box--upload-trigger': fieldId === 'uploadTrigger' || !value,\n })}\n htmlFor={inputId}\n >\n {!value && <Download className=\"file-loader-local__upload-icon\" />}\n {value && <Paperclip className=\"file-loader-local__upload-icon\" />}\n\n <div title={value || label} className=\"file-loader-local__label-wrapper\">\n <div\n className={cn('file-loader-local__label', {\n 'file-loader-local__label-filled': value,\n })}\n >\n <span className=\"file-loader-local__label-text\">{value || label}</span>\n {error && <span className=\"file-loader-local__error\">{error}</span>}\n {typeof outerError === 'string' && (\n <span className=\"file-loader-local__error\">{outerError}</span>\n )}\n </div>\n </div>\n\n {value && !isNoTrashIcon && (\n <Trash2\n data-testid=\"file-loader-local__trash-icon\"\n className=\"file-loader-local__trash-icon\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onChange({ id: fieldId ?? id, groupId });\n }}\n />\n )}\n {renderRequiredLabel()}\n </label>\n </div>\n );\n};\n\nexport default FileLoaderLocal;\n"],"mappings":";;;;;;;AASA,IAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"FileLoaderLocal.js","names":[],"sources":["../../../../../src/Atomic/FormElements/FileLoaderLocal/FileLoaderLocal.tsx"],"sourcesContent":["import type { FileLoaderLocalProps } from './FileLoaderLocal.interface';\nimport cn from 'classnames';\nimport React from 'react';\n\nimport { Download, Paperclip, Trash2 } from 'react-feather';\n\nimport { getUniqueFileExtensions, renderFileSize } from '../../../Functions/utils';\nimport './FileLoaderLocal.scss';\n\nconst MAX_FILE_SIZE = 10 * 1024 * 1024;\n\nconst FileLoaderLocal: React.FC<FileLoaderLocalProps> = ({\n groupId,\n id,\n fieldId,\n fieldKey,\n label,\n error,\n outerError,\n isRequired,\n accept,\n onChange,\n className,\n value,\n isNoTrashIcon = false,\n maxItemSizeBytes,\n testId = 'file-loader-local',\n attributesOfNativeInput = {},\n}) => {\n const getFileName = (value: string): string | undefined => {\n return value.match(/[^\\\\]+$/)?.[0];\n };\n\n const renderRequiredLabel = (): JSX.Element | null => {\n if (!value) {\n if (isRequired) return <div className=\"file-loader-local--required\">Required</div>;\n else return <div className=\"file-loader-local--optional\">Optional</div>;\n }\n\n return null;\n };\n\n const isFileSizeOutOfLimit = (file: File): boolean => {\n return file.size > (maxItemSizeBytes ?? MAX_FILE_SIZE);\n };\n\n const checkExtension = (valueExtension: string | undefined): boolean => {\n return valueExtension && accept ? accept.includes(valueExtension) : false;\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n const name = getFileName(e.target.value);\n const valueExtension = name?.match(/[^.]+$/)?.[0];\n const fileName = name?.split('.')?.[0] ?? '';\n const latinRegex = /^[\\w\\u00C0-\\u00FF!@#$%^&*)(+=.\\-\\s]+$/;\n const file = e.target?.files?.[0];\n\n if (!file || !name || !valueExtension) return;\n\n if (isFileSizeOutOfLimit(file)) {\n onChange({\n id,\n name,\n valueExtension,\n e,\n file,\n groupId,\n error: maxItemSizeBytes ? `Max file size is ${renderFileSize(maxItemSizeBytes)}` : '',\n });\n }\n else if (!checkExtension(valueExtension)) {\n const allowedExtensions = accept?.replace(/\\./g, '')?.toUpperCase() || 'JPG, PNG, PDF';\n const uniqExts = getUniqueFileExtensions(allowedExtensions);\n onChange({\n id,\n groupId,\n name,\n valueExtension,\n e,\n file,\n error: `Only ${uniqExts} are allowed`,\n });\n }\n else if (!latinRegex.test(fileName)) {\n onChange({\n id,\n groupId,\n name,\n valueExtension,\n e,\n file,\n error: `File name must be Latin characters only.`,\n });\n }\n else {\n onChange({ id, groupId, name, valueExtension, e, file });\n }\n };\n\n const inputId = fieldKey || `file-input-${id}${groupId ? `-${groupId}` : ''}`;\n\n return (\n <div\n data-testid={testId}\n className={cn('file-loader-local', className, {\n 'file-loader-local_outer-error': Boolean(outerError),\n 'file-loader-local--with-file': value,\n })}\n >\n {(fieldId === 'uploadTrigger' || !value) && (\n <input\n key={id}\n onChange={handleChange}\n className=\"file-loader-local__file-input\"\n id={inputId}\n type=\"file\"\n name={fieldKey || id?.toString()}\n required={isRequired}\n accept={accept}\n {...attributesOfNativeInput}\n />\n )}\n\n <label\n className={cn('file-loader-local__label-box', {\n 'file-loader-local__label-box--upload-trigger': fieldId === 'uploadTrigger' || !value,\n })}\n htmlFor={inputId}\n >\n {!value && <Download className=\"file-loader-local__upload-icon\" />}\n {value && <Paperclip className=\"file-loader-local__upload-icon\" />}\n\n <div title={value || label} className=\"file-loader-local__label-wrapper\">\n <div\n className={cn('file-loader-local__label', {\n 'file-loader-local__label-filled': value,\n })}\n >\n <span className=\"file-loader-local__label-text\">{value || label}</span>\n {error && <span className=\"file-loader-local__error\">{error}</span>}\n {typeof outerError === 'string' && (\n <span className=\"file-loader-local__error\">{outerError}</span>\n )}\n </div>\n </div>\n\n {value && !isNoTrashIcon && (\n <Trash2\n data-testid=\"file-loader-local__trash-icon\"\n className=\"file-loader-local__trash-icon\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onChange({ id: fieldId ?? id, groupId });\n }}\n />\n )}\n {renderRequiredLabel()}\n </label>\n </div>\n );\n};\n\nexport default FileLoaderLocal;\n"],"mappings":";;;;;;;AASA,IAAM,gBAAgB;AAEtB,IAAM,mBAAmD,EACvD,SACA,IACA,SACA,UACA,OACA,OACA,YACA,YACA,QACA,UACA,WACA,OACA,gBAAgB,OAChB,kBACA,SAAS,qBACT,0BAA0B,CAAC,QACvB;CACJ,MAAM,eAAe,UAAsC;EACzD,OAAO,MAAM,MAAM,SAAS,CAAC,GAAG;CAClC;CAEA,MAAM,4BAAgD;EACpD,IAAI,CAAC,OAAO;GACV,IAAI,YAAY,OAAO,oBAAC,OAAD;IAAK,WAAU;IAA8B,UAAA;GAAa,CAAA;QAC5E,OAAO,oBAAC,OAAD;IAAK,WAAU;IAA8B,UAAA;GAAa,CAAA;EACxE;EAEA,OAAO;CACT;CAEA,MAAM,wBAAwB,SAAwB;EACpD,OAAO,KAAK,QAAQ,oBAAoB;CAC1C;CAEA,MAAM,kBAAkB,mBAAgD;EACtE,OAAO,kBAAkB,SAAS,OAAO,SAAS,cAAc,IAAI;CACtE;CAEA,MAAM,gBAAgB,MAAiD;EACrE,MAAM,OAAO,YAAY,EAAE,OAAO,KAAK;EACvC,MAAM,iBAAiB,MAAM,MAAM,QAAQ,CAAC,GAAG;EAC/C,MAAM,WAAW,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM;EAC1C,MAAM,aAAa;EACnB,MAAM,OAAO,EAAE,QAAQ,QAAQ;EAE/B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB;EAEvC,IAAI,qBAAqB,IAAI,GAC3B,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA,OAAO,mBAAmB,oBAAoB,eAAe,gBAAgB,MAAM;EACrF,CAAC;OAEE,IAAI,CAAC,eAAe,cAAc,GAAG;GACxC,MAAM,oBAAoB,QAAQ,QAAQ,OAAO,EAAE,CAAC,EAAE,YAAY,KAAK;GAEvE,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA,OAAO,QARQ,wBAAwB,iBAQxB,EAAS;GAC1B,CAAC;EACH,OACK,IAAI,CAAC,WAAW,KAAK,QAAQ,GAChC,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA,OAAO;EACT,CAAC;OAGD,SAAS;GAAE;GAAI;GAAS;GAAM;GAAgB;GAAG;EAAK,CAAC;CAE3D;CAEA,MAAM,UAAU,YAAY,cAAc,KAAK,UAAU,IAAI,YAAY;CAEzE,OACE,qBAAC,OAAD;EACE,eAAa;EACb,WAAW,GAAG,qBAAqB,WAAW;GAC5C,iCAAiC,QAAQ,UAAU;GACnD,gCAAgC;EAClC,CAAC;EALH,UAAA,EAOI,YAAY,mBAAmB,CAAC,UAChC,oBAAC,SAAD;GAEE,UAAU;GACV,WAAU;GACV,IAAI;GACJ,MAAK;GACL,MAAM,YAAY,IAAI,SAAS;GAC/B,UAAU;GACF;GACR,GAAI;EACL,GATM,EASN,GAGH,qBAAC,SAAD;GACE,WAAW,GAAG,gCAAgC,EAC5C,gDAAgD,YAAY,mBAAmB,CAAC,MAClF,CAAC;GACD,SAAS;GAJX,UAAA;IAMG,CAAC,SAAS,oBAAC,UAAD,EAAU,WAAU,iCAAkC,CAAA;IAChE,SAAS,oBAAC,WAAD,EAAW,WAAU,iCAAkC,CAAA;IAEjE,oBAAC,OAAD;KAAK,OAAO,SAAS;KAAO,WAAU;KACpC,UAAA,qBAAC,OAAD;MACE,WAAW,GAAG,4BAA4B,EACxC,mCAAmC,MACrC,CAAC;MAHH,UAAA;OAKE,oBAAC,QAAD;QAAM,WAAU;QAAiC,UAAA,SAAS;OAAY,CAAA;OACrE,SAAS,oBAAC,QAAD;QAAM,WAAU;QAA4B,UAAA;OAAY,CAAA;OACjE,OAAO,eAAe,YACrB,oBAAC,QAAD;QAAM,WAAU;QAA4B,UAAA;OAAiB,CAAA;MAE5D;;IACF,CAAA;IAEJ,SAAS,CAAC,iBACT,oBAAC,QAAD;KACE,eAAY;KACZ,WAAU;KACV,UAAU,MAAM;MACd,EAAE,eAAe;MACjB,EAAE,gBAAgB;MAClB,SAAS;OAAE,IAAI,WAAW;OAAI;MAAQ,CAAC;KACzC;IACD,CAAA;IAEF,oBAAoB;GAChB;EACJ,CAAA,CAAA;;AAET"}
|
|
@@ -9,7 +9,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
import { Info } from "react-feather";
|
|
10
10
|
//#region src/Atomic/FormElements/FileLoaderLocalGroup/FileLoaderLocalGroup.tsx
|
|
11
11
|
var DEFAULT_LABEL_PREFIX = "Please attach";
|
|
12
|
-
var MAX_FILE_SIZE =
|
|
12
|
+
var MAX_FILE_SIZE = 10485760;
|
|
13
13
|
var FileLoaderLocalGroup = ({ className, groupsArray = [], isSingleGroup, onChange, labelPrefix = DEFAULT_LABEL_PREFIX, testId = "file-loader-local-group" }) => {
|
|
14
14
|
const [groups, setGroups] = useState(clone(groupsArray));
|
|
15
15
|
const getNewFile = (group) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileLoaderLocalGroup.js","names":[],"sources":["../../../../../src/Atomic/FormElements/FileLoaderLocalGroup/FileLoaderLocalGroup.tsx"],"sourcesContent":["import type { FileGroup, FileItem, FileLoaderLocalGroupProps } from './FileLoaderLocalGroup.interface';\nimport cn from 'classnames';\nimport React, { useEffect, useState } from 'react';\n\nimport { Info } from 'react-feather';\nimport {\n clone,\n getBase64,\n getUniqueFileExtensions,\n} from '../../../Functions/utils';\nimport Alert from '../../UI/Alert/Alert';\n\nimport FileLoaderLocal from '../FileLoaderLocal/FileLoaderLocal';\n\nimport './FileLoaderLocalGroup.scss';\n\nconst DEFAULT_LABEL_PREFIX = 'Please attach';\nconst MAX_FILE_SIZE = 10 * 1024 * 1024;\n\nconst FileLoaderLocalGroup: React.FC<FileLoaderLocalGroupProps> = ({\n className,\n groupsArray = [],\n isSingleGroup,\n onChange,\n labelPrefix = DEFAULT_LABEL_PREFIX,\n testId = 'file-loader-local-group',\n}) => {\n const [groups, setGroups] = useState<FileGroup[]>(clone(groupsArray));\n\n const getNewFile = (group: FileGroup): FileItem => {\n const newId = group.files.at(-1)?.id ?? 0 + 1;\n return {\n id: newId,\n value: '',\n base64: '',\n error: '',\n accept: group.accept || '.jpg, .jpeg, .png, .pdf',\n maxItemSizeBytes: group.maxItemSizeBytes ?? MAX_FILE_SIZE,\n isRequired: group?.isRequired || false,\n fieldKey: newId?.toString(),\n };\n };\n\n const generateUniqueFileName = (files: FileItem[], name: string): string => {\n let fileName = name;\n const [nameWithoutExtension, extension] = name.split(/(?=\\.[^.]+$)/);\n let count = 1;\n\n while (files.some(file => file.value === fileName)) {\n fileName = `${nameWithoutExtension}(${count})${extension}`;\n count += 1;\n }\n\n return fileName;\n };\n\n useEffect(() => {\n const mergedGroups = groupsArray?.map(group => ({\n ...group,\n files: [getNewFile(group)],\n }));\n setGroups(mergedGroups);\n }, []);\n\n const handle = {\n change: ({ groupId, name, id, error, file }: any, fileId: number | string) => {\n const currentGroup = groups.find(group => group.groupId === groupId.toString());\n if (!currentGroup) return;\n\n const files = currentGroup.files;\n const changedField = files.find(item => Number(item.id) === Number(fileId));\n if (!changedField) return;\n\n if (error) {\n changedField.value = name;\n changedField.error = error;\n setGroups([...groups]);\n onChange(groups);\n }\n else if (name && !error) {\n const uniqueFileName = generateUniqueFileName(files, name);\n getBase64(file)\n ?.then((result) => {\n changedField.value = uniqueFileName;\n changedField.base64 = result;\n changedField.error = '';\n\n const updatedGroups = groups.map((group) => {\n if (group.groupId === groupId.toString()) {\n const newFiles = isSingleGroup\n ? [...group.files]\n : group.files.length < 10\n ? [\n ...group.files,\n {\n ...getNewFile(group),\n isRequired: group.files.length > 1,\n },\n ]\n : [...group.files];\n\n return {\n ...group,\n files: newFiles,\n };\n }\n return group;\n });\n\n setGroups(updatedGroups);\n onChange(updatedGroups);\n })\n .catch(e => console.error(e));\n }\n else {\n const updatedGroups = groups.map((group) => {\n if (group.groupId === groupId.toString()) {\n const newFiles = isSingleGroup\n ? [{ ...getNewFile(group), value: '', base64: '' }]\n : group.files.filter(item => item.id !== id);\n return {\n ...group,\n files: newFiles,\n };\n }\n return group;\n });\n setGroups(updatedGroups);\n onChange(updatedGroups);\n }\n },\n };\n\n const getUniqueExts = (acceptExts: string): string =>\n getUniqueFileExtensions(acceptExts?.replace(/\\./g, ''));\n\n return (\n <>\n {groups?.map(group => (\n <div\n data-testid={testId}\n key={group.groupId}\n className={cn('file-loader-local-groups', className)}\n >\n <span className=\"file-loader-local-groups__label\">\n <div className=\"file-loader-local-groups__label-text\">\n {labelPrefix}\n {' '}\n {group?.groupTitleDescription}\n {' '}\n <span className=\"file-loader-local-groups__label-extension\">\n (\n {getUniqueExts(group?.accept)}\n ):\n </span>\n </div>\n </span>\n\n {group?.alertText && (\n // @ts-ignore\n <Alert\n className=\"file-loader-local-groups__alert\"\n noDismiss\n icon={<Info />}\n message={group?.alertText}\n />\n )}\n\n <div className=\"file-loader-local-groups__item\">\n {group?.files?.map((file, index) => (\n <FileLoaderLocal\n groupId={group?.groupId}\n fieldKey={`${file.fieldKey}:${group?.groupId}:${index}`}\n key={file?.id || index}\n id={file?.id || index}\n error={file?.error}\n label=\"Upload document\"\n accept={file?.accept}\n value={file?.value}\n maxItemSizeBytes={file?.maxItemSizeBytes}\n onChange={value => handle.change(value, file?.id)}\n isRequired={group.files?.length <= 1 || false}\n isNoTrashIcon={group.files?.length <= 1 && !isSingleGroup}\n />\n ))}\n </div>\n </div>\n ))}\n </>\n );\n};\n\nexport default FileLoaderLocalGroup;\n"],"mappings":";;;;;;;;;AAgBA,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"FileLoaderLocalGroup.js","names":[],"sources":["../../../../../src/Atomic/FormElements/FileLoaderLocalGroup/FileLoaderLocalGroup.tsx"],"sourcesContent":["import type { FileGroup, FileItem, FileLoaderLocalGroupProps } from './FileLoaderLocalGroup.interface';\nimport cn from 'classnames';\nimport React, { useEffect, useState } from 'react';\n\nimport { Info } from 'react-feather';\nimport {\n clone,\n getBase64,\n getUniqueFileExtensions,\n} from '../../../Functions/utils';\nimport Alert from '../../UI/Alert/Alert';\n\nimport FileLoaderLocal from '../FileLoaderLocal/FileLoaderLocal';\n\nimport './FileLoaderLocalGroup.scss';\n\nconst DEFAULT_LABEL_PREFIX = 'Please attach';\nconst MAX_FILE_SIZE = 10 * 1024 * 1024;\n\nconst FileLoaderLocalGroup: React.FC<FileLoaderLocalGroupProps> = ({\n className,\n groupsArray = [],\n isSingleGroup,\n onChange,\n labelPrefix = DEFAULT_LABEL_PREFIX,\n testId = 'file-loader-local-group',\n}) => {\n const [groups, setGroups] = useState<FileGroup[]>(clone(groupsArray));\n\n const getNewFile = (group: FileGroup): FileItem => {\n const newId = group.files.at(-1)?.id ?? 0 + 1;\n return {\n id: newId,\n value: '',\n base64: '',\n error: '',\n accept: group.accept || '.jpg, .jpeg, .png, .pdf',\n maxItemSizeBytes: group.maxItemSizeBytes ?? MAX_FILE_SIZE,\n isRequired: group?.isRequired || false,\n fieldKey: newId?.toString(),\n };\n };\n\n const generateUniqueFileName = (files: FileItem[], name: string): string => {\n let fileName = name;\n const [nameWithoutExtension, extension] = name.split(/(?=\\.[^.]+$)/);\n let count = 1;\n\n while (files.some(file => file.value === fileName)) {\n fileName = `${nameWithoutExtension}(${count})${extension}`;\n count += 1;\n }\n\n return fileName;\n };\n\n useEffect(() => {\n const mergedGroups = groupsArray?.map(group => ({\n ...group,\n files: [getNewFile(group)],\n }));\n setGroups(mergedGroups);\n }, []);\n\n const handle = {\n change: ({ groupId, name, id, error, file }: any, fileId: number | string) => {\n const currentGroup = groups.find(group => group.groupId === groupId.toString());\n if (!currentGroup) return;\n\n const files = currentGroup.files;\n const changedField = files.find(item => Number(item.id) === Number(fileId));\n if (!changedField) return;\n\n if (error) {\n changedField.value = name;\n changedField.error = error;\n setGroups([...groups]);\n onChange(groups);\n }\n else if (name && !error) {\n const uniqueFileName = generateUniqueFileName(files, name);\n getBase64(file)\n ?.then((result) => {\n changedField.value = uniqueFileName;\n changedField.base64 = result;\n changedField.error = '';\n\n const updatedGroups = groups.map((group) => {\n if (group.groupId === groupId.toString()) {\n const newFiles = isSingleGroup\n ? [...group.files]\n : group.files.length < 10\n ? [\n ...group.files,\n {\n ...getNewFile(group),\n isRequired: group.files.length > 1,\n },\n ]\n : [...group.files];\n\n return {\n ...group,\n files: newFiles,\n };\n }\n return group;\n });\n\n setGroups(updatedGroups);\n onChange(updatedGroups);\n })\n .catch(e => console.error(e));\n }\n else {\n const updatedGroups = groups.map((group) => {\n if (group.groupId === groupId.toString()) {\n const newFiles = isSingleGroup\n ? [{ ...getNewFile(group), value: '', base64: '' }]\n : group.files.filter(item => item.id !== id);\n return {\n ...group,\n files: newFiles,\n };\n }\n return group;\n });\n setGroups(updatedGroups);\n onChange(updatedGroups);\n }\n },\n };\n\n const getUniqueExts = (acceptExts: string): string =>\n getUniqueFileExtensions(acceptExts?.replace(/\\./g, ''));\n\n return (\n <>\n {groups?.map(group => (\n <div\n data-testid={testId}\n key={group.groupId}\n className={cn('file-loader-local-groups', className)}\n >\n <span className=\"file-loader-local-groups__label\">\n <div className=\"file-loader-local-groups__label-text\">\n {labelPrefix}\n {' '}\n {group?.groupTitleDescription}\n {' '}\n <span className=\"file-loader-local-groups__label-extension\">\n (\n {getUniqueExts(group?.accept)}\n ):\n </span>\n </div>\n </span>\n\n {group?.alertText && (\n // @ts-ignore\n <Alert\n className=\"file-loader-local-groups__alert\"\n noDismiss\n icon={<Info />}\n message={group?.alertText}\n />\n )}\n\n <div className=\"file-loader-local-groups__item\">\n {group?.files?.map((file, index) => (\n <FileLoaderLocal\n groupId={group?.groupId}\n fieldKey={`${file.fieldKey}:${group?.groupId}:${index}`}\n key={file?.id || index}\n id={file?.id || index}\n error={file?.error}\n label=\"Upload document\"\n accept={file?.accept}\n value={file?.value}\n maxItemSizeBytes={file?.maxItemSizeBytes}\n onChange={value => handle.change(value, file?.id)}\n isRequired={group.files?.length <= 1 || false}\n isNoTrashIcon={group.files?.length <= 1 && !isSingleGroup}\n />\n ))}\n </div>\n </div>\n ))}\n </>\n );\n};\n\nexport default FileLoaderLocalGroup;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormattedRawSSN.js","names":[],"sources":["../../../../../src/Atomic/FormElements/FormattedRawSSN/FormattedRawSSN.tsx"],"sourcesContent":["import type { IFormattedRawSSNProps } from './FormattedRawSSN.interface';\n\nimport React, { useRef, useState } from 'react';\n\nimport { Eye, EyeOff } from 'react-feather';\n\nimport { getLimitedMask } from '../../../Functions/utils/getLimitedMask';\nimport InputMask3 from '../InputMask3/InputMask3';\nimport './FormattedRawSSN.scss';\n\nconst DEFAULT_SSN_MASK = 'DDD-DD-DDDD';\nconst SIGNIFICANT_CHARACTERS = ['D'];\n\nconst FormattedRawSSN: React.FC<IFormattedRawSSNProps> = ({\n value = '',\n onChange: onChangeProp = () => {},\n testId = 'formatted-raw-ssn',\n\n // ! ВСЕ \"пляшет\" от fullSnnMask и significantChars\n // Маска для полного snn (технически ограничений нет, НО нужно передавать то, что понимает InputMask3)\n fullSnnMask = DEFAULT_SSN_MASK,\n // Значащие символы в fullSnnMask\n // Технически ограничений нет, НО нужно передавать\n // - массив ОДИНОЧНЫХ символов\n // - массив тех символов, которые правильно трактуются в InputMask3 (смотри InputMask3/config)\n significantChars = SIGNIFICANT_CHARACTERS,\n // Символ для маскировки\n maskChar = '*',\n // Инициализационное значение (сразу скрывать или нет)\n isHiddenDefault = true,\n // Максимальное значение ВВОДИМЫХ цифр\n maxLen = 9, // ? Речь о значащих символах\n // Сколько из ПЕРВЫХ вводимых нужно прятать при включении мода маскировки\n countOfFirstDigitsToHide = 5, // ? Речь о значащих символах\n // Статическая часть\n postfix = '',\n\n ...args\n}) => {\n // ? Будем пользоваться своим (верхним относительно InputMask3) стейтом\n // ? Это потребует отрисовки триггера \"поверх\" InputMask3.\n const [isHidden, setIsHidden] = useState<boolean>(isHiddenDefault);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n\n const onChange = (value: string | number | undefined | null): void => {\n const newValue = value == null ? '' : value.toString();\n onChangeProp(newValue);\n };\n\n // ? Пересчитываем маску с учетом переданного maxLen.\n // ? Если maxLen меньше количества значащих символов в fullSnnMask, то маска корректно обрежется.\n // ? Передаем опцию isOnlyMask: false, чтобы получить НЕ только новую маску, а еще и статистику.\n // ? В этом случае приходит объект формата: { mask, countOfSignificantChars, countOfNotSignificantChars }\n const infoAboutMask = getLimitedMask({\n mask: fullSnnMask,\n significantChars,\n limit: maxLen,\n isOnlyMask: false,\n });\n\n // ? Расчитываем ИНДЕКС крайнего символа части маски, которая подлежит скрытию,\n // ? исходя из countOfFirstDigitsToHide\n const maxHiddenIndex = (() => {\n // если не приводится к числу или ноль (передавать ноль лишено смысла)\n if (\n Number.isNaN(Number(countOfFirstDigitsToHide))\n || !Number(countOfFirstDigitsToHide)\n ) {\n return -1;\n }\n // если больше чем значимых символов\n if (countOfFirstDigitsToHide > infoAboutMask.countOfSignificantChars)\n return infoAboutMask.mask.length;\n\n // ? Для расчетов получаем дополнительно корректно \"обрезанную\" маску (до уровня скрываемой части)\n // ? на основе ранее полученной \"обрезанной\" по maxLen. Нам нужна НЕ сама маска, а статистика по ней.\n // ? В частности - количество \"незначащих\" символов содержащихся в скрываемой части маски.\n const infoAboutMaskOfHidden = getLimitedMask({\n mask: infoAboutMask.mask,\n significantChars,\n limit: countOfFirstDigitsToHide,\n isOnlyMask: false,\n });\n\n // ? Для InputMask3 maxHiddenIndex должен быть передан относительно длины ВСЕЙ применяемой маски (наша \"обрезанная\" по maxLen).\n // ? Поэтому к количеству \"скрываемых\" символов добавляем количество \"незначащих\", входящих в скрываемую часть маски.\n // ? Т.к. расчитываем НЕ длинну, а индекс - отнимаем 1\n return (\n countOfFirstDigitsToHide\n + infoAboutMaskOfHidden.countOfNotSignificantChars\n - 1\n );\n })();\n\n return (\n <div data-testid={testId} className=\"formatted-raw-ssn\" ref={wrapperRef}>\n <InputMask3\n {...args}\n value={value}\n // @ts-ignore\n onChange={onChange}\n testId={`formattedRawSNN--input--key-${testId}`}\n maskPattern={infoAboutMask.mask}\n maskPlaceholder=\"X\"\n blinkErrors={true}\n showErrors={false}\n withHiddenMode={true}\n isValueHiddenDefault={isHiddenDefault}\n hiddenChar={maskChar}\n maxHiddenIndex={maxHiddenIndex}\n isHide={isHidden}\n />\n {postfix && (\n <span\n className=\"formatted-raw-ssn-postfix\"\n onClick={() => wrapperRef?.current?.querySelector('input')?.focus()}\n >\n {postfix}\n </span>\n )}\n <span\n className=\"formatted-raw-ssn-eye-holder\"\n onClick={() => setIsHidden(!isHidden)}\n >\n {isHidden\n ? (\n <Eye strokeWidth={1} className=\"password-icon\" />\n )\n : (\n <EyeOff strokeWidth={1} className=\"password-icon\" />\n )}\n </span>\n </div>\n );\n};\n\nexport default FormattedRawSSN;\n"],"mappings":";;;;;;;AAUA,IAAM,mBAAmB;AACzB,IAAM,yBAAyB,CAAC,GAAG;AAEnC,IAAM,mBAAoD,EACxD,QAAQ,IACR,UAAU,qBAAqB,CAAC,GAChC,SAAS,qBAIT,cAAc,kBAKd,mBAAmB,wBAEnB,WAAW,KAEX,kBAAkB,MAElB,SAAS,GAET,2BAA2B,GAE3B,UAAU,IAEV,GAAG,WACC;CAGJ,MAAM,CAAC,UAAU,eAAe,SAAkB,eAAe;CACjE,MAAM,aAAa,OAA8B,IAAI;CAErD,MAAM,YAAY,UAAoD;EAEpE,aADiB,SAAS,OAAO,KAAK,MAAM,SAAS,CAChC;CACvB;CAMA,MAAM,gBAAgB,eAAe;EACnC,MAAM;EACN;EACA,OAAO;EACP,YAAY;CACd,CAAC;CAID,MAAM,wBAAwB;EAE5B,IACE,OAAO,MAAM,OAAO,wBAAwB,CAAC,KAC1C,CAAC,OAAO,wBAAwB,GAEnC,OAAO;EAGT,IAAI,2BAA2B,cAAc,yBAC3C,OAAO,cAAc,KAAK;EAe5B,OACE,2BAX4B,eAAe;GAC3C,MAAM,cAAc;GACpB;GACA,OAAO;GACP,YAAY;EACd,CAOI,CAAA,CAAsB,6BACtB;CAEN,EAAA,CAAG;CAEH,OACE,qBAAC,OAAD;EAAK,eAAa;EAAQ,WAAU;EAAoB,KAAK;
|
|
1
|
+
{"version":3,"file":"FormattedRawSSN.js","names":[],"sources":["../../../../../src/Atomic/FormElements/FormattedRawSSN/FormattedRawSSN.tsx"],"sourcesContent":["import type { IFormattedRawSSNProps } from './FormattedRawSSN.interface';\n\nimport React, { useRef, useState } from 'react';\n\nimport { Eye, EyeOff } from 'react-feather';\n\nimport { getLimitedMask } from '../../../Functions/utils/getLimitedMask';\nimport InputMask3 from '../InputMask3/InputMask3';\nimport './FormattedRawSSN.scss';\n\nconst DEFAULT_SSN_MASK = 'DDD-DD-DDDD';\nconst SIGNIFICANT_CHARACTERS = ['D'];\n\nconst FormattedRawSSN: React.FC<IFormattedRawSSNProps> = ({\n value = '',\n onChange: onChangeProp = () => {},\n testId = 'formatted-raw-ssn',\n\n // ! ВСЕ \"пляшет\" от fullSnnMask и significantChars\n // Маска для полного snn (технически ограничений нет, НО нужно передавать то, что понимает InputMask3)\n fullSnnMask = DEFAULT_SSN_MASK,\n // Значащие символы в fullSnnMask\n // Технически ограничений нет, НО нужно передавать\n // - массив ОДИНОЧНЫХ символов\n // - массив тех символов, которые правильно трактуются в InputMask3 (смотри InputMask3/config)\n significantChars = SIGNIFICANT_CHARACTERS,\n // Символ для маскировки\n maskChar = '*',\n // Инициализационное значение (сразу скрывать или нет)\n isHiddenDefault = true,\n // Максимальное значение ВВОДИМЫХ цифр\n maxLen = 9, // ? Речь о значащих символах\n // Сколько из ПЕРВЫХ вводимых нужно прятать при включении мода маскировки\n countOfFirstDigitsToHide = 5, // ? Речь о значащих символах\n // Статическая часть\n postfix = '',\n\n ...args\n}) => {\n // ? Будем пользоваться своим (верхним относительно InputMask3) стейтом\n // ? Это потребует отрисовки триггера \"поверх\" InputMask3.\n const [isHidden, setIsHidden] = useState<boolean>(isHiddenDefault);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n\n const onChange = (value: string | number | undefined | null): void => {\n const newValue = value == null ? '' : value.toString();\n onChangeProp(newValue);\n };\n\n // ? Пересчитываем маску с учетом переданного maxLen.\n // ? Если maxLen меньше количества значащих символов в fullSnnMask, то маска корректно обрежется.\n // ? Передаем опцию isOnlyMask: false, чтобы получить НЕ только новую маску, а еще и статистику.\n // ? В этом случае приходит объект формата: { mask, countOfSignificantChars, countOfNotSignificantChars }\n const infoAboutMask = getLimitedMask({\n mask: fullSnnMask,\n significantChars,\n limit: maxLen,\n isOnlyMask: false,\n });\n\n // ? Расчитываем ИНДЕКС крайнего символа части маски, которая подлежит скрытию,\n // ? исходя из countOfFirstDigitsToHide\n const maxHiddenIndex = (() => {\n // если не приводится к числу или ноль (передавать ноль лишено смысла)\n if (\n Number.isNaN(Number(countOfFirstDigitsToHide))\n || !Number(countOfFirstDigitsToHide)\n ) {\n return -1;\n }\n // если больше чем значимых символов\n if (countOfFirstDigitsToHide > infoAboutMask.countOfSignificantChars)\n return infoAboutMask.mask.length;\n\n // ? Для расчетов получаем дополнительно корректно \"обрезанную\" маску (до уровня скрываемой части)\n // ? на основе ранее полученной \"обрезанной\" по maxLen. Нам нужна НЕ сама маска, а статистика по ней.\n // ? В частности - количество \"незначащих\" символов содержащихся в скрываемой части маски.\n const infoAboutMaskOfHidden = getLimitedMask({\n mask: infoAboutMask.mask,\n significantChars,\n limit: countOfFirstDigitsToHide,\n isOnlyMask: false,\n });\n\n // ? Для InputMask3 maxHiddenIndex должен быть передан относительно длины ВСЕЙ применяемой маски (наша \"обрезанная\" по maxLen).\n // ? Поэтому к количеству \"скрываемых\" символов добавляем количество \"незначащих\", входящих в скрываемую часть маски.\n // ? Т.к. расчитываем НЕ длинну, а индекс - отнимаем 1\n return (\n countOfFirstDigitsToHide\n + infoAboutMaskOfHidden.countOfNotSignificantChars\n - 1\n );\n })();\n\n return (\n <div data-testid={testId} className=\"formatted-raw-ssn\" ref={wrapperRef}>\n <InputMask3\n {...args}\n value={value}\n // @ts-ignore\n onChange={onChange}\n testId={`formattedRawSNN--input--key-${testId}`}\n maskPattern={infoAboutMask.mask}\n maskPlaceholder=\"X\"\n blinkErrors={true}\n showErrors={false}\n withHiddenMode={true}\n isValueHiddenDefault={isHiddenDefault}\n hiddenChar={maskChar}\n maxHiddenIndex={maxHiddenIndex}\n isHide={isHidden}\n />\n {postfix && (\n <span\n className=\"formatted-raw-ssn-postfix\"\n onClick={() => wrapperRef?.current?.querySelector('input')?.focus()}\n >\n {postfix}\n </span>\n )}\n <span\n className=\"formatted-raw-ssn-eye-holder\"\n onClick={() => setIsHidden(!isHidden)}\n >\n {isHidden\n ? (\n <Eye strokeWidth={1} className=\"password-icon\" />\n )\n : (\n <EyeOff strokeWidth={1} className=\"password-icon\" />\n )}\n </span>\n </div>\n );\n};\n\nexport default FormattedRawSSN;\n"],"mappings":";;;;;;;AAUA,IAAM,mBAAmB;AACzB,IAAM,yBAAyB,CAAC,GAAG;AAEnC,IAAM,mBAAoD,EACxD,QAAQ,IACR,UAAU,qBAAqB,CAAC,GAChC,SAAS,qBAIT,cAAc,kBAKd,mBAAmB,wBAEnB,WAAW,KAEX,kBAAkB,MAElB,SAAS,GAET,2BAA2B,GAE3B,UAAU,IAEV,GAAG,WACC;CAGJ,MAAM,CAAC,UAAU,eAAe,SAAkB,eAAe;CACjE,MAAM,aAAa,OAA8B,IAAI;CAErD,MAAM,YAAY,UAAoD;EAEpE,aADiB,SAAS,OAAO,KAAK,MAAM,SAAS,CAChC;CACvB;CAMA,MAAM,gBAAgB,eAAe;EACnC,MAAM;EACN;EACA,OAAO;EACP,YAAY;CACd,CAAC;CAID,MAAM,wBAAwB;EAE5B,IACE,OAAO,MAAM,OAAO,wBAAwB,CAAC,KAC1C,CAAC,OAAO,wBAAwB,GAEnC,OAAO;EAGT,IAAI,2BAA2B,cAAc,yBAC3C,OAAO,cAAc,KAAK;EAe5B,OACE,2BAX4B,eAAe;GAC3C,MAAM,cAAc;GACpB;GACA,OAAO;GACP,YAAY;EACd,CAOI,CAAA,CAAsB,6BACtB;CAEN,EAAA,CAAG;CAEH,OACE,qBAAC,OAAD;EAAK,eAAa;EAAQ,WAAU;EAAoB,KAAK;EAA7D,UAAA;GACE,oBAAC,YAAD;IACE,GAAI;IACG;IAEG;IACV,QAAQ,+BAA+B;IACvC,aAAa,cAAc;IAC3B,iBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,sBAAsB;IACtB,YAAY;IACI;IAChB,QAAQ;GACT,CAAA;GACA,WACC,oBAAC,QAAD;IACE,WAAU;IACV,eAAe,YAAY,SAAS,cAAc,OAAO,CAAC,EAAE,MAAM;IAEjE,UAAA;GACG,CAAA;GAER,oBAAC,QAAD;IACE,WAAU;IACV,eAAe,YAAY,CAAC,QAAQ;IAEnC,UAAA,WAEK,oBAAC,KAAD;KAAK,aAAa;KAAG,WAAU;IAAiB,CAAA,IAGhD,oBAAC,QAAD;KAAQ,aAAa;KAAG,WAAU;IAAiB,CAAA;GAErD,CAAA;EACH;;AAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","names":[],"sources":["../../../../../src/Atomic/FormElements/Input/Input.tsx"],"sourcesContent":["import type { HTMLInputTypeAttribute, ReactElement } from 'react';\nimport type { InputProps } from './types';\nimport cn from 'classnames';\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { getSafelyValue } from '../../../Functions/fieldValueFormatters';\nimport Spinner from '../../Layout/Spinner/Spinner';\n\nimport { useErrorBlink, useInputFocus, useInputHover, useInputValueProcessing, useKeyboardHandling } from './hooks';\nimport './Input.scss';\n\nfunction defaultCallback(): void {}\n\nfunction Input({ ref, blurTrim, autocomplete = 'off', isSelect, onChange = defaultCallback, onBlur = defaultCallback, onFocus = defaultCallback, onKeyUp = defaultCallback, onKeyDown = defaultCallback, isNotBlinkErrors, isPriceInput, onlyNumbers, disabled, withDelete, value, placeholder, className, type = 'text', mask, maskChar, formatChars, error, icon, symbolsLimit, blinkTime, isFocusDefault = false, isNotValidateASCII = false, isNumericMobileKeyboard = false, isCropFirstNool = false, testId = 'input', action, isUseAutoSelect = true, isReadOnly = false, isLoading = false, name, fieldKey, id, attributesOfNativeInput = {} }: InputProps & { ref?: React.RefObject<Omit<HTMLInputElement, 'value'> | null> }): ReactElement {\n const inputInnerRef = useRef(null);\n const inputRef = useMemo((): React.RefObject<HTMLInputElement> => (ref || inputInnerRef) as React.RefObject<HTMLInputElement>, [ref]);\n\n const isUseErrorsBlink = !isNotBlinkErrors && !mask;\n const inputName = name || fieldKey || id;\n\n const {\n isFocused,\n isEditing,\n setIsFocused,\n setEditing,\n handleFocus,\n handleToggleEdit,\n } = useInputFocus({\n isSelect,\n isFocusDefault,\n onFocus,\n });\n\n const {\n isToHighlightError,\n setPreviousValue,\n checkValueChange,\n } = useErrorBlink({\n isUseErrorsBlink,\n blinkTime,\n });\n\n const {\n keyDownData,\n handleKeyDown,\n handleKeyUp,\n } = useKeyboardHandling({\n onKeyDown,\n onKeyUp,\n checkValueChange,\n setPreviousValue,\n value,\n });\n\n const {\n formatedValue,\n handleChange,\n handleBlur,\n correctMinMax: _correctMinMax,\n } = useInputValueProcessing({\n onlyNumbers,\n isPriceInput,\n value,\n isNotValidateASCII,\n symbolsLimit,\n isCropFirstNool,\n type,\n keyDownData,\n onChange,\n blurTrim,\n });\n\n const {\n onInputHover,\n handleMouseEnter,\n handleMouseLeave,\n } = useInputHover();\n\n // Handlers with side effects\n const handleToggleWithClear = (): void => {\n handleToggleEdit();\n onChange('');\n };\n\n const handleBlurWithEffects = (e: React.FocusEvent<HTMLInputElement, Element>): void => {\n handleBlur(e, onBlur);\n setIsFocused(false);\n setEditing(false);\n };\n\n // Component effects\n useEffect(() => {\n if (isEditing) inputRef?.current?.focus?.();\n }, [isEditing, isFocused]);\n\n const getInputType = (): HTMLInputTypeAttribute => {\n if (isPriceInput || type === 'pseudoPassword') return 'text';\n return type;\n };\n\n const uniProps = {\n name: inputName,\n className: cn('input', className, {\n 'input--with-icon': icon,\n 'input--with-delete': withDelete,\n }),\n placeholder,\n value: formatedValue,\n inputMode: isNumericMobileKeyboard ? 'decimal' as const : 'text' as const,\n disabled,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlurWithEffects,\n onKeyUp: handleKeyUp,\n onKeyDown: handleKeyDown,\n ...(maskChar ? { maskChar } : {}),\n ...(formatChars ? { formatChars } : {}),\n };\n\n return (\n <div\n data-testid={testId}\n className={cn(\n `input__wrap`,\n { [`input__wrap_focus`]: isFocused },\n { [`input__wrap_error`]: error || isToHighlightError },\n { [`input__wrap--disabled`]: disabled || isLoading },\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <input\n readOnly={isReadOnly}\n {...uniProps}\n ref={inputRef}\n type={getInputType()}\n autoComplete={type === 'pseudoPassword' ? 'off' : autocomplete}\n {...attributesOfNativeInput}\n onFocus={(...params) => {\n attributesOfNativeInput?.onFocus?.(...params);\n if (isUseAutoSelect) inputRef.current?.select();\n if (uniProps.onFocus) uniProps.onFocus(...params);\n }}\n onBlur={(...params) => {\n attributesOfNativeInput?.onBlur?.(...params);\n if (uniProps.onBlur) uniProps.onBlur(...params);\n }}\n />\n {icon}\n {action}\n {withDelete && onInputHover && (\n <span\n className={cn(`input__close`, { hidden: !getSafelyValue(value) })}\n onClick={handleToggleWithClear}\n />\n )}\n {isLoading && <Spinner size=\"small\" />}\n </div>\n );\n}\n\nexport default Input;\n"],"mappings":";;;;;;;;;;;;AAUA,SAAS,kBAAwB,CAAC;AAElC,SAAS,MAAM,EAAE,KAAK,UAAU,eAAe,OAAO,UAAU,WAAW,iBAAiB,SAAS,iBAAiB,UAAU,iBAAiB,UAAU,iBAAiB,YAAY,iBAAiB,kBAAkB,cAAc,aAAa,UAAU,YAAY,OAAO,aAAa,WAAW,OAAO,QAAQ,MAAM,UAAU,aAAa,OAAO,MAAM,cAAc,WAAW,iBAAiB,OAAO,qBAAqB,OAAO,0BAA0B,OAAO,kBAAkB,OAAO,SAAS,SAAS,QAAQ,kBAAkB,MAAM,aAAa,OAAO,YAAY,OAAO,MAAM,UAAU,IAAI,0BAA0B,CAAC,KAAmG;CACptB,MAAM,gBAAgB,OAAO,IAAI;CACjC,MAAM,WAAW,cAAkD,OAAO,eAAqD,CAAC,GAAG,CAAC;CAEpI,MAAM,mBAAmB,CAAC,oBAAoB,CAAC;CAC/C,MAAM,YAAY,QAAQ,YAAY;CAEtC,MAAM,EACJ,WACA,WACA,cACA,YACA,aACA,qBACE,cAAc;EAChB;EACA;EACA;CACF,CAAC;CAED,MAAM,EACJ,oBACA,kBACA,qBACE,cAAc;EAChB;EACA;CACF,CAAC;CAED,MAAM,EACJ,aACA,eACA,gBACE,oBAAoB;EACtB;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,EACJ,eACA,cACA,YACA,eAAe,mBACb,wBAAwB;EAC1B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,EACJ,cACA,kBACA,qBACE,cAAc;CAGlB,MAAM,8BAAoC;EACxC,iBAAiB;EACjB,SAAS,EAAE;CACb;CAEA,MAAM,yBAAyB,MAAyD;EACtF,WAAW,GAAG,MAAM;EACpB,aAAa,KAAK;EAClB,WAAW,KAAK;CAClB;CAGA,gBAAgB;EACd,IAAI,WAAW,UAAU,SAAS,QAAQ;CAC5C,GAAG,CAAC,WAAW,SAAS,CAAC;CAEzB,MAAM,qBAA6C;EACjD,IAAI,gBAAgB,SAAS,kBAAkB,OAAO;EACtD,OAAO;CACT;CAEA,MAAM,WAAW;EACf,MAAM;EACN,WAAW,GAAG,SAAS,WAAW;GAChC,oBAAoB;GACpB,sBAAsB;EACxB,CAAC;EACD;EACA,OAAO;EACP,WAAW,0BAA0B,YAAqB;EAC1D;EACA,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;EACT,WAAW;EACX,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EAC/B,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;CACvC;CAEA,OACE,qBAAC,OAAD;EACE,eAAa;EACb,WAAW,GACT,eACA,GAAG,sBAAsB,UAAU,GACnC,GAAG,sBAAsB,SAAS,mBAAmB,GACrD,GAAG,0BAA0B,YAAY,UAAU,CACrD;EACA,cAAc;EACd,cAAc;
|
|
1
|
+
{"version":3,"file":"Input.js","names":[],"sources":["../../../../../src/Atomic/FormElements/Input/Input.tsx"],"sourcesContent":["import type { HTMLInputTypeAttribute, ReactElement } from 'react';\nimport type { InputProps } from './types';\nimport cn from 'classnames';\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { getSafelyValue } from '../../../Functions/fieldValueFormatters';\nimport Spinner from '../../Layout/Spinner/Spinner';\n\nimport { useErrorBlink, useInputFocus, useInputHover, useInputValueProcessing, useKeyboardHandling } from './hooks';\nimport './Input.scss';\n\nfunction defaultCallback(): void {}\n\nfunction Input({ ref, blurTrim, autocomplete = 'off', isSelect, onChange = defaultCallback, onBlur = defaultCallback, onFocus = defaultCallback, onKeyUp = defaultCallback, onKeyDown = defaultCallback, isNotBlinkErrors, isPriceInput, onlyNumbers, disabled, withDelete, value, placeholder, className, type = 'text', mask, maskChar, formatChars, error, icon, symbolsLimit, blinkTime, isFocusDefault = false, isNotValidateASCII = false, isNumericMobileKeyboard = false, isCropFirstNool = false, testId = 'input', action, isUseAutoSelect = true, isReadOnly = false, isLoading = false, name, fieldKey, id, attributesOfNativeInput = {} }: InputProps & { ref?: React.RefObject<Omit<HTMLInputElement, 'value'> | null> }): ReactElement {\n const inputInnerRef = useRef(null);\n const inputRef = useMemo((): React.RefObject<HTMLInputElement> => (ref || inputInnerRef) as React.RefObject<HTMLInputElement>, [ref]);\n\n const isUseErrorsBlink = !isNotBlinkErrors && !mask;\n const inputName = name || fieldKey || id;\n\n const {\n isFocused,\n isEditing,\n setIsFocused,\n setEditing,\n handleFocus,\n handleToggleEdit,\n } = useInputFocus({\n isSelect,\n isFocusDefault,\n onFocus,\n });\n\n const {\n isToHighlightError,\n setPreviousValue,\n checkValueChange,\n } = useErrorBlink({\n isUseErrorsBlink,\n blinkTime,\n });\n\n const {\n keyDownData,\n handleKeyDown,\n handleKeyUp,\n } = useKeyboardHandling({\n onKeyDown,\n onKeyUp,\n checkValueChange,\n setPreviousValue,\n value,\n });\n\n const {\n formatedValue,\n handleChange,\n handleBlur,\n correctMinMax: _correctMinMax,\n } = useInputValueProcessing({\n onlyNumbers,\n isPriceInput,\n value,\n isNotValidateASCII,\n symbolsLimit,\n isCropFirstNool,\n type,\n keyDownData,\n onChange,\n blurTrim,\n });\n\n const {\n onInputHover,\n handleMouseEnter,\n handleMouseLeave,\n } = useInputHover();\n\n // Handlers with side effects\n const handleToggleWithClear = (): void => {\n handleToggleEdit();\n onChange('');\n };\n\n const handleBlurWithEffects = (e: React.FocusEvent<HTMLInputElement, Element>): void => {\n handleBlur(e, onBlur);\n setIsFocused(false);\n setEditing(false);\n };\n\n // Component effects\n useEffect(() => {\n if (isEditing) inputRef?.current?.focus?.();\n }, [isEditing, isFocused]);\n\n const getInputType = (): HTMLInputTypeAttribute => {\n if (isPriceInput || type === 'pseudoPassword') return 'text';\n return type;\n };\n\n const uniProps = {\n name: inputName,\n className: cn('input', className, {\n 'input--with-icon': icon,\n 'input--with-delete': withDelete,\n }),\n placeholder,\n value: formatedValue,\n inputMode: isNumericMobileKeyboard ? 'decimal' as const : 'text' as const,\n disabled,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlurWithEffects,\n onKeyUp: handleKeyUp,\n onKeyDown: handleKeyDown,\n ...(maskChar ? { maskChar } : {}),\n ...(formatChars ? { formatChars } : {}),\n };\n\n return (\n <div\n data-testid={testId}\n className={cn(\n `input__wrap`,\n { [`input__wrap_focus`]: isFocused },\n { [`input__wrap_error`]: error || isToHighlightError },\n { [`input__wrap--disabled`]: disabled || isLoading },\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <input\n readOnly={isReadOnly}\n {...uniProps}\n ref={inputRef}\n type={getInputType()}\n autoComplete={type === 'pseudoPassword' ? 'off' : autocomplete}\n {...attributesOfNativeInput}\n onFocus={(...params) => {\n attributesOfNativeInput?.onFocus?.(...params);\n if (isUseAutoSelect) inputRef.current?.select();\n if (uniProps.onFocus) uniProps.onFocus(...params);\n }}\n onBlur={(...params) => {\n attributesOfNativeInput?.onBlur?.(...params);\n if (uniProps.onBlur) uniProps.onBlur(...params);\n }}\n />\n {icon}\n {action}\n {withDelete && onInputHover && (\n <span\n className={cn(`input__close`, { hidden: !getSafelyValue(value) })}\n onClick={handleToggleWithClear}\n />\n )}\n {isLoading && <Spinner size=\"small\" />}\n </div>\n );\n}\n\nexport default Input;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputValueProcessing.js","names":[],"sources":["../../../../../../src/Atomic/FormElements/Input/hooks/useInputValueProcessing.ts"],"sourcesContent":["/* eslint-disable react-hooks-extra/no-unnecessary-use-prefix */\nimport type { ChangeEvent, FocusEvent } from 'react';\nimport type {\n InputProps,\n KeyDownData,\n NativeAttributesProps,\n OnlyNumbersOptions,\n ValueFormattingProps,\n ValueHandlers,\n} from '../types';\nimport {\n formatToAddBitDepthPoints as addCommas,\n filterNumeric,\n formatToOnlyASCIICodeText,\n getSafelyValue,\n formatToRemoveComa as removeCommas,\n} from '../../../../Functions/fieldValueFormatters';\nimport { getIsOnlyAnObject } from '../../../../Functions/utils';\n\nconst HIDE_SYMBOL = '\\u2022';\n\ninterface InputValueProcessingParams extends ValueFormattingProps, Pick<InputProps, 'value'>, Pick<NativeAttributesProps, 'type'>, ValueHandlers {\n keyDownData: KeyDownData;\n}\n\nexport function useInputValueProcessing({\n onlyNumbers,\n isPriceInput,\n value,\n isNotValidateASCII = false,\n symbolsLimit,\n isCropFirstNool = false,\n type = 'text',\n keyDownData,\n onChange,\n blurTrim,\n}: InputValueProcessingParams): {\n formatedValue: string;\n handleChange: (e: ChangeEvent<HTMLInputElement> | string) => void;\n handleBlur: (e: FocusEvent<HTMLInputElement, Element>, onBlur?: (e: FocusEvent<HTMLInputElement, Element>) => void) => void;\n correctMinMax: (value: string, correctionType: 'min' | 'max') => string;\n } {\n const { trimStart, trimEnd, characters } = blurTrim || {};\n const isUseBitDepthPoints = Boolean(onlyNumbers) && isPriceInput;\n const isPseudoPasswordMode = type === 'pseudoPassword';\n /**\n * `onlyNumbers` имеет union `boolean | OnlyNumbersOptions`, а\n * `filterNumeric` / `addCommas` принимают only `IBitDepthSettings` (object).\n * `boolean` подвид union'а сюда не передаём — нормализуем к object | undefined.\n * `typeof === 'object'` сразу сужает union без `as`-cast.\n */\n const bitDepthSettings: OnlyNumbersOptions | undefined\n = typeof onlyNumbers === 'object' && onlyNumbers !== null ? onlyNumbers : undefined;\n\n const correctMinMax = (value: string, correctionType: 'min' | 'max'): string => {\n if (!onlyNumbers) return value;\n\n const { min, max, isOnlyPositive, isNoEmptyValues } = getIsOnlyAnObject(\n onlyNumbers,\n )\n ? onlyNumbers as OnlyNumbersOptions\n : {};\n const minimum\n = !Number.isNaN(Number(min))\n && min !== null && min !== undefined\n && (min >= 0 || !isOnlyPositive)\n ? min\n : undefined;\n const maximum\n = !Number.isNaN(Number(max))\n && max !== null && max !== undefined\n && (max >= 0 || !isOnlyPositive)\n ? max\n : undefined;\n\n let minusSymbol: string | null = null;\n let inputValue = getSafelyValue(value);\n\n const checkMin = (): void => {\n if (!inputValue && isNoEmptyValues) {\n inputValue = minimum !== undefined ? String(minimum) : '0';\n }\n /**\n * `minimum !== undefined` дублирует `!Number.isNaN(Number(minimum))`\n * (Number(undefined) = NaN), но даёт TS narrowing для `String(minimum)` ниже.\n */\n else if (\n inputValue\n && minimum !== undefined\n && !Number.isNaN(Number(minimum))\n && Number(minimum) > Number((minusSymbol ?? '') + inputValue)\n ) {\n inputValue = String(minimum);\n }\n };\n\n const checkMax = (): void => {\n if (\n maximum !== undefined\n && !Number.isNaN(Number(maximum))\n && Number(maximum) < Number((minusSymbol ?? '') + inputValue)\n ) {\n inputValue = String(maximum);\n minusSymbol = null;\n }\n };\n\n if (isUseBitDepthPoints) inputValue = removeCommas(inputValue);\n if (!isOnlyPositive && inputValue[0] === '-') {\n minusSymbol = '-';\n inputValue = inputValue.slice(1);\n }\n\n inputValue = filterNumeric(inputValue, bitDepthSettings);\n\n switch (correctionType) {\n case 'min':\n checkMin();\n break;\n case 'max':\n checkMax();\n break;\n default:\n checkMin();\n checkMax();\n break;\n }\n return inputValue;\n };\n\n const processPseudoValue = (newValue: string, oldValue: string): boolean | string => {\n const insertedPart = newValue.replace(new RegExp(HIDE_SYMBOL, 'g'), '');\n\n // ? Если insertedPart.length > 1, то это точно копи-паст\n // ? По договоренности любой копипаст заменяет текущее велью\n if (insertedPart.length > 1) return insertedPart;\n\n const isOldValueHasBeenReduced\n = newValue.replace(/^HIDE_SYMBOL/g, '').length\n < oldValue.length;\n const oldValueArr = oldValue.split('');\n\n const getIsInclude = (idx: number): string | boolean => {\n const BACKSPACE_CODE = 8;\n\n if (keyDownData.start === null || keyDownData.end === null) return false;\n // ? Если позиции не равны, значит была выделена область, значит будем воспринимать как копи-паст\n if (keyDownData.start !== keyDownData.end) return false;\n\n // ? Если позиции равны и есть вставляемое значение - обрезаем \"хвост\"\n if (insertedPart) return idx < keyDownData.start;\n\n // ? Если позиции равны и нет вставляемого значения - значит симвовол удалили\n return keyDownData.keyCode === BACKSPACE_CODE\n ? idx < keyDownData.start - 1 || idx > keyDownData.end - 1\n : idx < keyDownData.start || idx > keyDownData.end;\n };\n\n if (!insertedPart) {\n return oldValueArr.reduce(\n (acc: string, sym: string, idx: number) => (getIsInclude(idx) ? `${acc}${sym}` : acc),\n '',\n );\n }\n\n const outputStructure = oldValueArr.reduce(\n (acc: { result: string; position: number | null }, sym: string, idx: number) => {\n if (getIsInclude(idx)) acc.result = `${acc.result}${sym}`;\n else if (!acc.position) acc.position = insertedPart ? idx : idx - 1;\n return acc;\n },\n {\n result: '',\n position: !isOldValueHasBeenReduced ? keyDownData.start : null,\n },\n );\n\n return `${outputStructure.result.slice(\n 0,\n outputStructure.position as number,\n )}${insertedPart}${outputStructure.result.slice(outputStructure.position as number)}`;\n };\n\n const handleChange = (e: ChangeEvent<HTMLInputElement> | string): void => {\n const { isOnlyPositive } = getIsOnlyAnObject(onlyNumbers)\n ? onlyNumbers as OnlyNumbersOptions\n : {};\n\n let minusSymbol: string | null = null;\n let inputValue = (typeof e !== 'string' && e.target ? e.target.value : e) as string;\n if (isPseudoPasswordMode && typeof inputValue === 'string') {\n inputValue = (inputValue.includes(HIDE_SYMBOL)\n ? processPseudoValue(inputValue, value as string)\n : inputValue) as string;\n }\n\n // If user typed comma(',') replace it to dot('.') for float value typing\n if (isPriceInput && typeof inputValue === 'string' && inputValue.charAt(inputValue.length - 1) === ',')\n inputValue = inputValue.substring(0, inputValue.length - 1).concat('.');\n\n if (isUseBitDepthPoints) inputValue = removeCommas(inputValue);\n if (onlyNumbers && typeof inputValue === 'string') inputValue = inputValue.replace(/,/g, '.');\n\n if (onlyNumbers && !isOnlyPositive && String(inputValue)[0] === '-' && typeof inputValue === 'string') {\n minusSymbol = '-';\n inputValue = inputValue.slice(1);\n }\n if (!isNotValidateASCII)\n inputValue = formatToOnlyASCIICodeText(inputValue);\n if (symbolsLimit && typeof inputValue === 'string' && inputValue.length > Number(symbolsLimit))\n inputValue = inputValue.substring(0, Number(symbolsLimit));\n if (isCropFirstNool && typeof inputValue === 'string' && inputValue[0] === '0') {\n onChange?.('');\n return;\n }\n else if (onlyNumbers) {\n inputValue = correctMinMax(inputValue, 'max');\n }\n onChange?.(((minusSymbol ?? '') + inputValue).toString());\n };\n\n const handleBlur = (e: FocusEvent<HTMLInputElement, Element>, onBlur?: (e: FocusEvent<HTMLInputElement, Element>) => void): void => {\n const { isOnlyPositive } = getIsOnlyAnObject(onlyNumbers)\n ? onlyNumbers as OnlyNumbersOptions\n : {};\n\n let minusSymbol;\n\n if (value && onlyNumbers && !isOnlyPositive && value[0] === '-') {\n minusSymbol = '-';\n value = value.slice(1);\n }\n\n let inputValue = correctMinMax(getSafelyValue(value), 'min');\n if (trimStart)\n inputValue = inputValue.replace(new RegExp(`^[${characters}]+`), '');\n if (trimEnd)\n inputValue = inputValue.replace(new RegExp(`[${characters}]+$`), '');\n\n if (value !== inputValue) onChange?.(minusSymbol ? (minusSymbol + inputValue).toString() : inputValue);\n\n // использую setTimeout для того чтоб прошли переназначения велью, если они есть,\n // для того, чтоб верхний onBlur при обращении к e.target.value получал обновленное велью\n if (onBlur) setTimeout(() => onBlur(e), 0);\n };\n\n const formatedValue = (() => {\n let safelyValue = getSafelyValue(value);\n\n const hideSymbols = (): string =>\n safelyValue\n .split('')\n .map(() => HIDE_SYMBOL)\n .join('');\n\n if (isPseudoPasswordMode) return hideSymbols();\n if (typeof onlyNumbers === 'object' && onlyNumbers?.isNoEmptyValues)\n safelyValue = correctMinMax(safelyValue, 'min');\n if (isUseBitDepthPoints)\n safelyValue = addCommas(safelyValue, bitDepthSettings);\n return safelyValue;\n })();\n\n return {\n formatedValue,\n handleChange,\n handleBlur,\n correctMinMax,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useInputValueProcessing.js","names":[],"sources":["../../../../../../src/Atomic/FormElements/Input/hooks/useInputValueProcessing.ts"],"sourcesContent":["/* eslint-disable react-hooks-extra/no-unnecessary-use-prefix */\nimport type { ChangeEvent, FocusEvent } from 'react';\nimport type {\n InputProps,\n KeyDownData,\n NativeAttributesProps,\n OnlyNumbersOptions,\n ValueFormattingProps,\n ValueHandlers,\n} from '../types';\nimport {\n formatToAddBitDepthPoints as addCommas,\n filterNumeric,\n formatToOnlyASCIICodeText,\n getSafelyValue,\n formatToRemoveComa as removeCommas,\n} from '../../../../Functions/fieldValueFormatters';\nimport { getIsOnlyAnObject } from '../../../../Functions/utils';\n\nconst HIDE_SYMBOL = '\\u2022';\n\ninterface InputValueProcessingParams extends ValueFormattingProps, Pick<InputProps, 'value'>, Pick<NativeAttributesProps, 'type'>, ValueHandlers {\n keyDownData: KeyDownData;\n}\n\nexport function useInputValueProcessing({\n onlyNumbers,\n isPriceInput,\n value,\n isNotValidateASCII = false,\n symbolsLimit,\n isCropFirstNool = false,\n type = 'text',\n keyDownData,\n onChange,\n blurTrim,\n}: InputValueProcessingParams): {\n formatedValue: string;\n handleChange: (e: ChangeEvent<HTMLInputElement> | string) => void;\n handleBlur: (e: FocusEvent<HTMLInputElement, Element>, onBlur?: (e: FocusEvent<HTMLInputElement, Element>) => void) => void;\n correctMinMax: (value: string, correctionType: 'min' | 'max') => string;\n } {\n const { trimStart, trimEnd, characters } = blurTrim || {};\n const isUseBitDepthPoints = Boolean(onlyNumbers) && isPriceInput;\n const isPseudoPasswordMode = type === 'pseudoPassword';\n /**\n * `onlyNumbers` имеет union `boolean | OnlyNumbersOptions`, а\n * `filterNumeric` / `addCommas` принимают only `IBitDepthSettings` (object).\n * `boolean` подвид union'а сюда не передаём — нормализуем к object | undefined.\n * `typeof === 'object'` сразу сужает union без `as`-cast.\n */\n const bitDepthSettings: OnlyNumbersOptions | undefined\n = typeof onlyNumbers === 'object' && onlyNumbers !== null ? onlyNumbers : undefined;\n\n const correctMinMax = (value: string, correctionType: 'min' | 'max'): string => {\n if (!onlyNumbers) return value;\n\n const { min, max, isOnlyPositive, isNoEmptyValues } = getIsOnlyAnObject(\n onlyNumbers,\n )\n ? onlyNumbers as OnlyNumbersOptions\n : {};\n const minimum\n = !Number.isNaN(Number(min))\n && min !== null && min !== undefined\n && (min >= 0 || !isOnlyPositive)\n ? min\n : undefined;\n const maximum\n = !Number.isNaN(Number(max))\n && max !== null && max !== undefined\n && (max >= 0 || !isOnlyPositive)\n ? max\n : undefined;\n\n let minusSymbol: string | null = null;\n let inputValue = getSafelyValue(value);\n\n const checkMin = (): void => {\n if (!inputValue && isNoEmptyValues) {\n inputValue = minimum !== undefined ? String(minimum) : '0';\n }\n /**\n * `minimum !== undefined` дублирует `!Number.isNaN(Number(minimum))`\n * (Number(undefined) = NaN), но даёт TS narrowing для `String(minimum)` ниже.\n */\n else if (\n inputValue\n && minimum !== undefined\n && !Number.isNaN(Number(minimum))\n && Number(minimum) > Number((minusSymbol ?? '') + inputValue)\n ) {\n inputValue = String(minimum);\n }\n };\n\n const checkMax = (): void => {\n if (\n maximum !== undefined\n && !Number.isNaN(Number(maximum))\n && Number(maximum) < Number((minusSymbol ?? '') + inputValue)\n ) {\n inputValue = String(maximum);\n minusSymbol = null;\n }\n };\n\n if (isUseBitDepthPoints) inputValue = removeCommas(inputValue);\n if (!isOnlyPositive && inputValue[0] === '-') {\n minusSymbol = '-';\n inputValue = inputValue.slice(1);\n }\n\n inputValue = filterNumeric(inputValue, bitDepthSettings);\n\n switch (correctionType) {\n case 'min':\n checkMin();\n break;\n case 'max':\n checkMax();\n break;\n default:\n checkMin();\n checkMax();\n break;\n }\n return inputValue;\n };\n\n const processPseudoValue = (newValue: string, oldValue: string): boolean | string => {\n const insertedPart = newValue.replace(new RegExp(HIDE_SYMBOL, 'g'), '');\n\n // ? Если insertedPart.length > 1, то это точно копи-паст\n // ? По договоренности любой копипаст заменяет текущее велью\n if (insertedPart.length > 1) return insertedPart;\n\n const isOldValueHasBeenReduced\n = newValue.replace(/^HIDE_SYMBOL/g, '').length\n < oldValue.length;\n const oldValueArr = oldValue.split('');\n\n const getIsInclude = (idx: number): string | boolean => {\n const BACKSPACE_CODE = 8;\n\n if (keyDownData.start === null || keyDownData.end === null) return false;\n // ? Если позиции не равны, значит была выделена область, значит будем воспринимать как копи-паст\n if (keyDownData.start !== keyDownData.end) return false;\n\n // ? Если позиции равны и есть вставляемое значение - обрезаем \"хвост\"\n if (insertedPart) return idx < keyDownData.start;\n\n // ? Если позиции равны и нет вставляемого значения - значит симвовол удалили\n return keyDownData.keyCode === BACKSPACE_CODE\n ? idx < keyDownData.start - 1 || idx > keyDownData.end - 1\n : idx < keyDownData.start || idx > keyDownData.end;\n };\n\n if (!insertedPart) {\n return oldValueArr.reduce(\n (acc: string, sym: string, idx: number) => (getIsInclude(idx) ? `${acc}${sym}` : acc),\n '',\n );\n }\n\n const outputStructure = oldValueArr.reduce(\n (acc: { result: string; position: number | null }, sym: string, idx: number) => {\n if (getIsInclude(idx)) acc.result = `${acc.result}${sym}`;\n else if (!acc.position) acc.position = insertedPart ? idx : idx - 1;\n return acc;\n },\n {\n result: '',\n position: !isOldValueHasBeenReduced ? keyDownData.start : null,\n },\n );\n\n return `${outputStructure.result.slice(\n 0,\n outputStructure.position as number,\n )}${insertedPart}${outputStructure.result.slice(outputStructure.position as number)}`;\n };\n\n const handleChange = (e: ChangeEvent<HTMLInputElement> | string): void => {\n const { isOnlyPositive } = getIsOnlyAnObject(onlyNumbers)\n ? onlyNumbers as OnlyNumbersOptions\n : {};\n\n let minusSymbol: string | null = null;\n let inputValue = (typeof e !== 'string' && e.target ? e.target.value : e) as string;\n if (isPseudoPasswordMode && typeof inputValue === 'string') {\n inputValue = (inputValue.includes(HIDE_SYMBOL)\n ? processPseudoValue(inputValue, value as string)\n : inputValue) as string;\n }\n\n // If user typed comma(',') replace it to dot('.') for float value typing\n if (isPriceInput && typeof inputValue === 'string' && inputValue.charAt(inputValue.length - 1) === ',')\n inputValue = inputValue.substring(0, inputValue.length - 1).concat('.');\n\n if (isUseBitDepthPoints) inputValue = removeCommas(inputValue);\n if (onlyNumbers && typeof inputValue === 'string') inputValue = inputValue.replace(/,/g, '.');\n\n if (onlyNumbers && !isOnlyPositive && String(inputValue)[0] === '-' && typeof inputValue === 'string') {\n minusSymbol = '-';\n inputValue = inputValue.slice(1);\n }\n if (!isNotValidateASCII)\n inputValue = formatToOnlyASCIICodeText(inputValue);\n if (symbolsLimit && typeof inputValue === 'string' && inputValue.length > Number(symbolsLimit))\n inputValue = inputValue.substring(0, Number(symbolsLimit));\n if (isCropFirstNool && typeof inputValue === 'string' && inputValue[0] === '0') {\n onChange?.('');\n return;\n }\n else if (onlyNumbers) {\n inputValue = correctMinMax(inputValue, 'max');\n }\n onChange?.(((minusSymbol ?? '') + inputValue).toString());\n };\n\n const handleBlur = (e: FocusEvent<HTMLInputElement, Element>, onBlur?: (e: FocusEvent<HTMLInputElement, Element>) => void): void => {\n const { isOnlyPositive } = getIsOnlyAnObject(onlyNumbers)\n ? onlyNumbers as OnlyNumbersOptions\n : {};\n\n let minusSymbol;\n\n if (value && onlyNumbers && !isOnlyPositive && value[0] === '-') {\n minusSymbol = '-';\n value = value.slice(1);\n }\n\n let inputValue = correctMinMax(getSafelyValue(value), 'min');\n if (trimStart)\n inputValue = inputValue.replace(new RegExp(`^[${characters}]+`), '');\n if (trimEnd)\n inputValue = inputValue.replace(new RegExp(`[${characters}]+$`), '');\n\n if (value !== inputValue) onChange?.(minusSymbol ? (minusSymbol + inputValue).toString() : inputValue);\n\n // использую setTimeout для того чтоб прошли переназначения велью, если они есть,\n // для того, чтоб верхний onBlur при обращении к e.target.value получал обновленное велью\n if (onBlur) setTimeout(() => onBlur(e), 0);\n };\n\n const formatedValue = (() => {\n let safelyValue = getSafelyValue(value);\n\n const hideSymbols = (): string =>\n safelyValue\n .split('')\n .map(() => HIDE_SYMBOL)\n .join('');\n\n if (isPseudoPasswordMode) return hideSymbols();\n if (typeof onlyNumbers === 'object' && onlyNumbers?.isNoEmptyValues)\n safelyValue = correctMinMax(safelyValue, 'min');\n if (isUseBitDepthPoints)\n safelyValue = addCommas(safelyValue, bitDepthSettings);\n return safelyValue;\n })();\n\n return {\n formatedValue,\n handleChange,\n handleBlur,\n correctMinMax,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputCalendar.js","names":[],"sources":["../../../../../src/Atomic/FormElements/InputCalendar/InputCalendar.tsx"],"sourcesContent":["import type { IInputCalendarProps } from './InputCalendar.interface';\n\nimport cn from 'classnames';\nimport moment from 'moment-timezone';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport InputMask from 'react-input-mask';\nimport { useClickOutside } from '../../../Functions/useClickOutside';\n\nimport Calendar from '../Calendar/Calendar';\nimport './InputCalendar.scss';\n\nconst InputCalendar: React.FC<IInputCalendarProps> = ({\n value,\n minDate,\n maxDate,\n format = 'MM/DD/YYYY',\n isDontLimitFuture,\n onChange,\n className = '',\n placeholder = 'mm/dd/yyyy',\n mask = '99/99/9999',\n isListTop,\n disabled,\n testId = 'input-calendar',\n\n onKeyDown: onKeyDownProp,\n onKeyUp: onKeyUpProp,\n onBlur: onBlurProp,\n}) => {\n const [isOpened, setIsOpened] = useState<boolean | null>(null);\n const calendarRef = useRef(null);\n const inputRef = useRef(null);\n\n const formattedMinDate\n = moment(minDate, format).format(format) !== 'Invalid date'\n ? moment(minDate, format).format(format)\n : null;\n const formattedMaxDate\n = moment(maxDate, format).format(format) !== 'Invalid date'\n ? moment(maxDate, format).format(format)\n : null;\n\n const momentMinDate = moment(formattedMinDate, format).startOf('day');\n const momentMaxDate = moment(formattedMaxDate, format).startOf('day');\n\n useClickOutside(calendarRef, () => setIsOpened(false));\n\n const changeInputValue = (val: string): void => {\n if (onChange) onChange(val);\n };\n\n const changeCalendarDay = (val: string): void => {\n if (onChange) onChange(val);\n };\n\n const getCalendarValue = (value: string): string => {\n const date = moment(value).format('L');\n\n if (date !== 'Invalid date') return date;\n\n return moment(new Date()).format('L');\n };\n\n const handleBlur = (): void => {\n let value = inputRef?.current ? (inputRef?.current as HTMLInputElement)?.value : '';\n if (\n moment(value, format).format(format) === 'Invalid date'\n || value.includes('_')\n ) {\n value = '';\n }\n\n if (\n value\n && typeof isOpened === 'boolean'\n && moment(value, format).startOf('day').isBefore(momentMinDate, 'days')\n ) {\n if (formattedMinDate) onChange(formattedMinDate);\n }\n else if (\n value\n && typeof isOpened === 'boolean'\n && moment(value, format).endOf('day').isAfter(momentMaxDate, 'days')\n ) {\n if (formattedMaxDate) onChange(formattedMaxDate);\n }\n else if (value) {\n onChange(moment(value, format).format(format));\n }\n };\n\n const onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (e): void => {\n if (isOpened && [9, 13].includes(e.keyCode)) {\n setIsOpened(false);\n }\n\n onKeyDownProp?.(e);\n };\n\n const onKeyUp: React.KeyboardEventHandler<HTMLInputElement> | undefined = (e): void => {\n const isValidLenght = (e.target as HTMLInputElement).value?.replace(/\\D/g, '').length === 8;\n\n if ([9, 13].includes(e.keyCode)) {\n setIsOpened(true);\n }\n\n if (isValidLenght) {\n setIsOpened(false);\n handleBlur();\n }\n else {\n setIsOpened(true);\n }\n onKeyUpProp?.(e);\n };\n\n useEffect(() => {\n if (typeof isOpened === 'boolean' && !isOpened) {\n handleBlur();\n }\n }, [isOpened]);\n\n return (\n <div\n data-testid={testId}\n className={cn('input__wrap calendar-container', className, {\n 'calendar-container_disabled': disabled,\n })}\n ref={calendarRef}\n >\n <InputMask\n mask={mask}\n placeholder={placeholder}\n value={value}\n onChange={e => changeInputValue(e.target.value)}\n className=\"calendar-dropdown\"\n onClick={() => setIsOpened(true)}\n onKeyUp={onKeyUp}\n onKeyDown={onKeyDown}\n onBlur={e => onBlurProp?.(e)}\n ref={inputRef}\n />\n {isOpened\n ? (\n <Calendar\n date={getCalendarValue(value)}\n setDate={newDate => changeCalendarDay(newDate)}\n params={{\n minDate: formattedMinDate as string,\n maxDate: formattedMaxDate as string,\n momentMinDate,\n momentMaxDate,\n isDontLimitFuture,\n }}\n isListTop={isListTop}\n setIsOpened={setIsOpened}\n />\n )\n : null}\n </div>\n );\n};\n\nexport default InputCalendar;\n"],"mappings":";;;;;;;;;AAYA,IAAM,iBAAgD,EACpD,OACA,SACA,SACA,SAAS,cACT,mBACA,UACA,YAAY,IACZ,cAAc,cACd,OAAO,cACP,WACA,UACA,SAAS,kBAET,WAAW,eACX,SAAS,aACT,QAAQ,iBACJ;CACJ,MAAM,CAAC,UAAU,eAAe,SAAyB,IAAI;CAC7D,MAAM,cAAc,OAAO,IAAI;CAC/B,MAAM,WAAW,OAAO,IAAI;CAE5B,MAAM,mBACF,OAAO,SAAS,MAAM,CAAC,CAAC,OAAO,MAAM,MAAM,iBACzC,OAAO,SAAS,MAAM,CAAC,CAAC,OAAO,MAAM,IACrC;CACN,MAAM,mBACF,OAAO,SAAS,MAAM,CAAC,CAAC,OAAO,MAAM,MAAM,iBACzC,OAAO,SAAS,MAAM,CAAC,CAAC,OAAO,MAAM,IACrC;CAEN,MAAM,gBAAgB,OAAO,kBAAkB,MAAM,CAAC,CAAC,QAAQ,KAAK;CACpE,MAAM,gBAAgB,OAAO,kBAAkB,MAAM,CAAC,CAAC,QAAQ,KAAK;CAEpE,gBAAgB,mBAAmB,YAAY,KAAK,CAAC;CAErD,MAAM,oBAAoB,QAAsB;EAC9C,IAAI,UAAU,SAAS,GAAG;CAC5B;CAEA,MAAM,qBAAqB,QAAsB;EAC/C,IAAI,UAAU,SAAS,GAAG;CAC5B;CAEA,MAAM,oBAAoB,UAA0B;EAClD,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC,OAAO,GAAG;EAErC,IAAI,SAAS,gBAAgB,OAAO;EAEpC,OAAO,uBAAO,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG;CACtC;CAEA,MAAM,mBAAyB;EAC7B,IAAI,QAAQ,UAAU,WAAW,UAAU,QAAA,EAA8B,QAAQ;EACjF,IACE,OAAO,OAAO,MAAM,CAAC,CAAC,OAAO,MAAM,MAAM,kBACtC,MAAM,SAAS,GAAG,GAErB,QAAQ;EAGV,IACE,SACG,OAAO,aAAa,aACpB,OAAO,OAAO,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,SAAS,eAAe,MAAM;
|
|
1
|
+
{"version":3,"file":"InputCalendar.js","names":[],"sources":["../../../../../src/Atomic/FormElements/InputCalendar/InputCalendar.tsx"],"sourcesContent":["import type { IInputCalendarProps } from './InputCalendar.interface';\n\nimport cn from 'classnames';\nimport moment from 'moment-timezone';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport InputMask from 'react-input-mask';\nimport { useClickOutside } from '../../../Functions/useClickOutside';\n\nimport Calendar from '../Calendar/Calendar';\nimport './InputCalendar.scss';\n\nconst InputCalendar: React.FC<IInputCalendarProps> = ({\n value,\n minDate,\n maxDate,\n format = 'MM/DD/YYYY',\n isDontLimitFuture,\n onChange,\n className = '',\n placeholder = 'mm/dd/yyyy',\n mask = '99/99/9999',\n isListTop,\n disabled,\n testId = 'input-calendar',\n\n onKeyDown: onKeyDownProp,\n onKeyUp: onKeyUpProp,\n onBlur: onBlurProp,\n}) => {\n const [isOpened, setIsOpened] = useState<boolean | null>(null);\n const calendarRef = useRef(null);\n const inputRef = useRef(null);\n\n const formattedMinDate\n = moment(minDate, format).format(format) !== 'Invalid date'\n ? moment(minDate, format).format(format)\n : null;\n const formattedMaxDate\n = moment(maxDate, format).format(format) !== 'Invalid date'\n ? moment(maxDate, format).format(format)\n : null;\n\n const momentMinDate = moment(formattedMinDate, format).startOf('day');\n const momentMaxDate = moment(formattedMaxDate, format).startOf('day');\n\n useClickOutside(calendarRef, () => setIsOpened(false));\n\n const changeInputValue = (val: string): void => {\n if (onChange) onChange(val);\n };\n\n const changeCalendarDay = (val: string): void => {\n if (onChange) onChange(val);\n };\n\n const getCalendarValue = (value: string): string => {\n const date = moment(value).format('L');\n\n if (date !== 'Invalid date') return date;\n\n return moment(new Date()).format('L');\n };\n\n const handleBlur = (): void => {\n let value = inputRef?.current ? (inputRef?.current as HTMLInputElement)?.value : '';\n if (\n moment(value, format).format(format) === 'Invalid date'\n || value.includes('_')\n ) {\n value = '';\n }\n\n if (\n value\n && typeof isOpened === 'boolean'\n && moment(value, format).startOf('day').isBefore(momentMinDate, 'days')\n ) {\n if (formattedMinDate) onChange(formattedMinDate);\n }\n else if (\n value\n && typeof isOpened === 'boolean'\n && moment(value, format).endOf('day').isAfter(momentMaxDate, 'days')\n ) {\n if (formattedMaxDate) onChange(formattedMaxDate);\n }\n else if (value) {\n onChange(moment(value, format).format(format));\n }\n };\n\n const onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (e): void => {\n if (isOpened && [9, 13].includes(e.keyCode)) {\n setIsOpened(false);\n }\n\n onKeyDownProp?.(e);\n };\n\n const onKeyUp: React.KeyboardEventHandler<HTMLInputElement> | undefined = (e): void => {\n const isValidLenght = (e.target as HTMLInputElement).value?.replace(/\\D/g, '').length === 8;\n\n if ([9, 13].includes(e.keyCode)) {\n setIsOpened(true);\n }\n\n if (isValidLenght) {\n setIsOpened(false);\n handleBlur();\n }\n else {\n setIsOpened(true);\n }\n onKeyUpProp?.(e);\n };\n\n useEffect(() => {\n if (typeof isOpened === 'boolean' && !isOpened) {\n handleBlur();\n }\n }, [isOpened]);\n\n return (\n <div\n data-testid={testId}\n className={cn('input__wrap calendar-container', className, {\n 'calendar-container_disabled': disabled,\n })}\n ref={calendarRef}\n >\n <InputMask\n mask={mask}\n placeholder={placeholder}\n value={value}\n onChange={e => changeInputValue(e.target.value)}\n className=\"calendar-dropdown\"\n onClick={() => setIsOpened(true)}\n onKeyUp={onKeyUp}\n onKeyDown={onKeyDown}\n onBlur={e => onBlurProp?.(e)}\n ref={inputRef}\n />\n {isOpened\n ? (\n <Calendar\n date={getCalendarValue(value)}\n setDate={newDate => changeCalendarDay(newDate)}\n params={{\n minDate: formattedMinDate as string,\n maxDate: formattedMaxDate as string,\n momentMinDate,\n momentMaxDate,\n isDontLimitFuture,\n }}\n isListTop={isListTop}\n setIsOpened={setIsOpened}\n />\n )\n : null}\n </div>\n );\n};\n\nexport default InputCalendar;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputColor.js","names":[],"sources":["../../../../../src/Atomic/FormElements/InputColor/InputColor.tsx"],"sourcesContent":["import type { IInputColorProps } from './InputColor.interface';\n\nimport cn from 'classnames';\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n formatToHex,\n formatToOnlyASCIICodeText,\n} from '../../../Functions/fieldValueFormatters';\n\nimport Input from '../Input/Input';\n\nimport './InputColor.scss';\n\nconst InputColor: React.FC<IInputColorProps> = ({\n value = '',\n className,\n symbolsLimit = 7,\n onChange,\n withHexFormat = {\n withSharp: false,\n isTurnOn: true,\n },\n initialHexOfColorBlock = '#9AA0B9',\n testId = '',\n withDelete = true,\n ...args\n}) => {\n const { withSharp = false, isTurnOn: isHex = true } = withHexFormat;\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement> | string) => {\n let inputValue = typeof e === 'string' ? e : e.target.value;\n inputValue = formatToOnlyASCIICodeText(inputValue);\n if (isHex) {\n inputValue = formatToHex({ inputValue, withSharp });\n }\n if (symbolsLimit && inputValue.length > symbolsLimit) {\n inputValue = inputValue.substring(0, symbolsLimit);\n }\n onChange?.(inputValue);\n },\n [isHex, withSharp, symbolsLimit, onChange],\n );\n\n const colorBlockStyle = useMemo(() => {\n const isValidHex = /^#[0-9A-F]{6}$/i.test(value);\n return {\n backgroundColor: isValidHex ? value : initialHexOfColorBlock,\n };\n }, [value, initialHexOfColorBlock]);\n\n return (\n <div className={cn('inputColor', className)}>\n <div className=\"inputColor__color-block\" style={colorBlockStyle} />\n <Input\n {...args}\n // @ts-ignore\n value={value}\n withDelete={withDelete}\n onChange={handleChange}\n symbolsLimit={symbolsLimit}\n testId={`inputColor--key-${testId}`}\n className={cn('input inputColor__input')}\n type=\"text\"\n />\n </div>\n );\n};\n\nexport default InputColor;\n"],"mappings":";;;;;;;AAeA,IAAM,cAA0C,EAC9C,QAAQ,IACR,WACA,eAAe,GACf,UACA,gBAAgB;CACd,WAAW;CACX,UAAU;AACZ,GACA,yBAAyB,WACzB,SAAS,IACT,aAAa,MACb,GAAG,WACC;CACJ,MAAM,EAAE,YAAY,OAAO,UAAU,QAAQ,SAAS;CAEtD,MAAM,eAAe,aAClB,MAAoD;EACnD,IAAI,aAAa,OAAO,MAAM,WAAW,IAAI,EAAE,OAAO;EACtD,aAAa,0BAA0B,UAAU;EACjD,IAAI,OACF,aAAa,YAAY;GAAE;GAAY;EAAU,CAAC;EAEpD,IAAI,gBAAgB,WAAW,SAAS,cACtC,aAAa,WAAW,UAAU,GAAG,YAAY;EAEnD,WAAW,UAAU;CACvB,GACA;EAAC;EAAO;EAAW;EAAc;CAAQ,CAC3C;CAEA,MAAM,kBAAkB,cAAc;EAEpC,OAAO,EACL,iBAFiB,kBAAkB,KAAK,KAEvB,IAAa,QAAQ,uBACxC;CACF,GAAG,CAAC,OAAO,sBAAsB,CAAC;CAElC,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,cAAc,SAAS;
|
|
1
|
+
{"version":3,"file":"InputColor.js","names":[],"sources":["../../../../../src/Atomic/FormElements/InputColor/InputColor.tsx"],"sourcesContent":["import type { IInputColorProps } from './InputColor.interface';\n\nimport cn from 'classnames';\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n formatToHex,\n formatToOnlyASCIICodeText,\n} from '../../../Functions/fieldValueFormatters';\n\nimport Input from '../Input/Input';\n\nimport './InputColor.scss';\n\nconst InputColor: React.FC<IInputColorProps> = ({\n value = '',\n className,\n symbolsLimit = 7,\n onChange,\n withHexFormat = {\n withSharp: false,\n isTurnOn: true,\n },\n initialHexOfColorBlock = '#9AA0B9',\n testId = '',\n withDelete = true,\n ...args\n}) => {\n const { withSharp = false, isTurnOn: isHex = true } = withHexFormat;\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement> | string) => {\n let inputValue = typeof e === 'string' ? e : e.target.value;\n inputValue = formatToOnlyASCIICodeText(inputValue);\n if (isHex) {\n inputValue = formatToHex({ inputValue, withSharp });\n }\n if (symbolsLimit && inputValue.length > symbolsLimit) {\n inputValue = inputValue.substring(0, symbolsLimit);\n }\n onChange?.(inputValue);\n },\n [isHex, withSharp, symbolsLimit, onChange],\n );\n\n const colorBlockStyle = useMemo(() => {\n const isValidHex = /^#[0-9A-F]{6}$/i.test(value);\n return {\n backgroundColor: isValidHex ? value : initialHexOfColorBlock,\n };\n }, [value, initialHexOfColorBlock]);\n\n return (\n <div className={cn('inputColor', className)}>\n <div className=\"inputColor__color-block\" style={colorBlockStyle} />\n <Input\n {...args}\n // @ts-ignore\n value={value}\n withDelete={withDelete}\n onChange={handleChange}\n symbolsLimit={symbolsLimit}\n testId={`inputColor--key-${testId}`}\n className={cn('input inputColor__input')}\n type=\"text\"\n />\n </div>\n );\n};\n\nexport default InputColor;\n"],"mappings":";;;;;;;AAeA,IAAM,cAA0C,EAC9C,QAAQ,IACR,WACA,eAAe,GACf,UACA,gBAAgB;CACd,WAAW;CACX,UAAU;AACZ,GACA,yBAAyB,WACzB,SAAS,IACT,aAAa,MACb,GAAG,WACC;CACJ,MAAM,EAAE,YAAY,OAAO,UAAU,QAAQ,SAAS;CAEtD,MAAM,eAAe,aAClB,MAAoD;EACnD,IAAI,aAAa,OAAO,MAAM,WAAW,IAAI,EAAE,OAAO;EACtD,aAAa,0BAA0B,UAAU;EACjD,IAAI,OACF,aAAa,YAAY;GAAE;GAAY;EAAU,CAAC;EAEpD,IAAI,gBAAgB,WAAW,SAAS,cACtC,aAAa,WAAW,UAAU,GAAG,YAAY;EAEnD,WAAW,UAAU;CACvB,GACA;EAAC;EAAO;EAAW;EAAc;CAAQ,CAC3C;CAEA,MAAM,kBAAkB,cAAc;EAEpC,OAAO,EACL,iBAFiB,kBAAkB,KAAK,KAEvB,IAAa,QAAQ,uBACxC;CACF,GAAG,CAAC,OAAO,sBAAsB,CAAC;CAElC,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,cAAc,SAAS;EAA1C,UAAA,CACE,oBAAC,OAAD;GAAK,WAAU;GAA0B,OAAO;EAAkB,CAAA,GAClE,oBAAC,OAAD;GACE,GAAI;GAEG;GACK;GACZ,UAAU;GACI;GACd,QAAQ,mBAAmB;GAC3B,WAAW,GAAG,yBAAyB;GACvC,MAAK;EACN,CAAA,CACE;;AAET"}
|
|
@@ -36,24 +36,26 @@ var InputCurrency = ({ currencySymbol = "$", testId = CN, onChange, className, v
|
|
|
36
36
|
type: "int"
|
|
37
37
|
});
|
|
38
38
|
const parsedIntegerValue = Number.parseInt(preparedIntegerValue);
|
|
39
|
-
if (!Number.isNaN(parsedIntegerValue))
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (
|
|
51
|
-
|
|
39
|
+
if (!Number.isNaN(parsedIntegerValue)) {
|
|
40
|
+
if (parsedIntegerValue === 0 && !decimalPart) {
|
|
41
|
+
if (allowZero) {
|
|
42
|
+
setInputValue(`${currencySymbol}0`);
|
|
43
|
+
onChange(0);
|
|
44
|
+
} else {
|
|
45
|
+
setInputValue(currencySymbol);
|
|
46
|
+
onChange("");
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
let formattedValue = formatNumberWithCommas(parsedIntegerValue);
|
|
50
|
+
if (decimalPart !== void 0) {
|
|
51
|
+
const filteredDecimal = filterNumeric(decimalPart, { type: "int" });
|
|
52
|
+
if (filteredDecimal) formattedValue += `.${filteredDecimal.slice(0, onlyNumbers.decimalPlaces)}`;
|
|
53
|
+
else if (decimalPart === "") formattedValue += ".";
|
|
54
|
+
}
|
|
55
|
+
setInputValue(`${currencySymbol}${formattedValue}`);
|
|
56
|
+
onChange(Number.parseFloat(formattedValue.replace(/,/g, "")));
|
|
52
57
|
}
|
|
53
|
-
|
|
54
|
-
onChange(Number.parseFloat(formattedValue.replace(/,/g, "")));
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
58
|
+
} else {
|
|
57
59
|
setInputValue(currencySymbol);
|
|
58
60
|
onChange("");
|
|
59
61
|
}
|
|
@@ -81,14 +83,15 @@ var InputCurrency = ({ currencySymbol = "$", testId = CN, onChange, className, v
|
|
|
81
83
|
return true;
|
|
82
84
|
};
|
|
83
85
|
useEffect(() => {
|
|
84
|
-
if (value === 0 || value === "0")
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
86
|
+
if (value === 0 || value === "0") {
|
|
87
|
+
if (allowZero) {
|
|
88
|
+
setInputValue(`${currencySymbol}0`);
|
|
89
|
+
onChange(0);
|
|
90
|
+
} else {
|
|
91
|
+
setInputValue(currencySymbol);
|
|
92
|
+
onChange("");
|
|
93
|
+
}
|
|
94
|
+
} else if (value) setInputValue(`${currencySymbol}${formatNumberWithCommas(value)}`);
|
|
92
95
|
else setInputValue(currencySymbol);
|
|
93
96
|
}, [
|
|
94
97
|
value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputCurrency.js","names":[],"sources":["../../../../../src/Atomic/FormElements/InputCurrency/InputCurrency.tsx"],"sourcesContent":["import type { FC } from 'react';\n\nimport type { IInputCurrencyProps, IOnlyNumbersConfig } from './InputCurrency.interface';\n\nimport cn from 'classnames';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { filterNumeric } from '../../../Functions/fieldValueFormatters';\n\nimport './InputCurrency.scss';\n\nconst attrsOfNativeInputDefault = {} as IInputCurrencyProps['attributesOfNativeInput'];\nconst CN = 'input-currency';\n/**\n * Type-annotation обязателен: без него TS widens `type: 'float'` → `type: string`,\n * и при передаче в `filterNumeric(...: IBitDepthSettings)` ловим TS2345.\n */\nconst ONLY_NUMBERS_DEFAULT: IOnlyNumbersConfig = {\n type: 'float',\n decimalPlaces: 2,\n};\n\nconst InputCurrency: FC<IInputCurrencyProps> = ({\n currencySymbol = '$',\n testId = CN,\n onChange,\n className,\n value,\n disabled,\n attributesOfNativeInput = attrsOfNativeInputDefault,\n min = 0,\n max,\n error,\n isNoCheckMinMax,\n allowZero = false,\n onlyNumbers = ONLY_NUMBERS_DEFAULT,\n}) => {\n const [inputValue, setInputValue] = useState<string>(currencySymbol);\n const [isFocused, setIsFocused] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const formatNumberWithCommas = (number: number | string): string => {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n };\n\n const formatCurrencyInput = (event: React.ChangeEvent<HTMLInputElement>): void => {\n let newValue = event.target.value;\n newValue = newValue.replace(currencySymbol, '');\n\n // If user typed comma(',') replace it to dot('.') for float value typing\n if (typeof newValue === 'string' && newValue.charAt(newValue.length - 1) === ',')\n newValue = newValue.substring(0, newValue.length - 1).concat('.');\n\n // Handle decimal input separately\n const parts = newValue.split('.');\n const integerPart = parts[0];\n const decimalPart = parts[1];\n\n // Filter and format the integer part\n const preparedIntegerValue = filterNumeric(integerPart, { ...onlyNumbers, type: 'int' });\n const parsedIntegerValue = Number.parseInt(preparedIntegerValue);\n\n if (!Number.isNaN(parsedIntegerValue)) {\n if (parsedIntegerValue === 0 && !decimalPart) {\n if (allowZero) {\n setInputValue(`${currencySymbol}0`);\n onChange(0);\n }\n else {\n setInputValue(currencySymbol);\n onChange('');\n }\n }\n else {\n let formattedValue = formatNumberWithCommas(parsedIntegerValue);\n\n // Add decimal part if exists\n if (decimalPart !== undefined) {\n const filteredDecimal = filterNumeric(decimalPart, { type: 'int' });\n if (filteredDecimal) {\n formattedValue += `.${filteredDecimal.slice(0, onlyNumbers.decimalPlaces)}`;\n }\n else if (decimalPart === '') {\n formattedValue += '.';\n }\n }\n\n setInputValue(`${currencySymbol}${formattedValue}`);\n onChange(Number.parseFloat(formattedValue.replace(/,/g, '')));\n }\n }\n else {\n setInputValue(currencySymbol);\n onChange('');\n }\n };\n\n const onInputClick = (): void => {\n if (!inputValue && inputRef.current) {\n inputRef.current.selectionStart = inputRef.current.selectionEnd\n = currencySymbol ? currencySymbol.length : 1;\n }\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>): void => {\n if (event.key.match(/^[a-z0-9]$/i) && inputRef.current) {\n setInputValue(inputValue.slice(0, inputRef.current.selectionStart || 0));\n }\n };\n\n const checkMinMax = (event: React.FocusEvent<HTMLInputElement> | null, checkValue?: string | number): boolean => {\n const clearValue = checkValue ?? filterNumeric(event?.target?.value || '', onlyNumbers);\n\n if (!clearValue) return false;\n\n const numericValue = typeof clearValue === 'string' ? Number.parseFloat(clearValue) : clearValue;\n\n if (numericValue < min) {\n setInputValue(`${currencySymbol}${formatNumberWithCommas(min)}`);\n onChange(min);\n return false;\n }\n\n if (max && numericValue > max) {\n setInputValue(`${currencySymbol}${formatNumberWithCommas(max)}`);\n onChange(max);\n return false;\n }\n\n return true;\n };\n\n useEffect(() => {\n if (value === 0 || value === '0') {\n if (allowZero) {\n setInputValue(`${currencySymbol}0`);\n onChange(0);\n }\n else {\n setInputValue(currencySymbol);\n onChange('');\n }\n }\n else if (value) {\n setInputValue(`${currencySymbol}${formatNumberWithCommas(value)}`);\n }\n else {\n setInputValue(currencySymbol);\n }\n }, [value, currencySymbol, allowZero]);\n\n return (\n <div\n data-testid={testId}\n className={cn('input-currency-box', className, {\n disabled,\n 'input-currency__error': error,\n 'input-currency__focused': isFocused,\n })}\n >\n <input\n className={CN}\n type=\"text\"\n ref={inputRef}\n value={inputValue}\n onChange={formatCurrencyInput}\n onClick={onInputClick}\n onKeyDown={onKeyDown}\n {...attributesOfNativeInput}\n onFocus={(e) => {\n attributesOfNativeInput?.onFocus?.(e);\n setIsFocused(true);\n }}\n onBlur={(e) => {\n attributesOfNativeInput?.onBlur?.(e);\n if (!isNoCheckMinMax) {\n const currentValue = Number.parseFloat(\n filterNumeric(inputValue.replace(currencySymbol, ''), onlyNumbers),\n );\n checkMinMax(null, currentValue);\n }\n setIsFocused(false);\n }}\n />\n </div>\n );\n};\n\nInputCurrency.displayName = 'InputCurrency';\n\nexport default InputCurrency;\n"],"mappings":";;;;;;AAWA,IAAM,4BAA4B,CAAC;AACnC,IAAM,KAAK;;;;;AAKX,IAAM,uBAA2C;CAC/C,MAAM;CACN,eAAe;AACjB;AAEA,IAAM,iBAA0C,EAC9C,iBAAiB,KACjB,SAAS,IACT,UACA,WACA,OACA,UACA,0BAA0B,2BAC1B,MAAM,GACN,KACA,OACA,iBACA,YAAY,OACZ,cAAc,2BACV;CACJ,MAAM,CAAC,YAAY,iBAAiB,SAAiB,cAAc;CACnE,MAAM,CAAC,WAAW,gBAAgB,SAAkB,KAAK;CACzD,MAAM,WAAW,OAAyB,IAAI;CAE9C,MAAM,0BAA0B,WAAoC;EAClE,MAAM,QAAQ,OAAO,SAAS,CAAC,CAAC,MAAM,GAAG;EACzC,MAAM,KAAK,MAAM,EAAE,CAAC,QAAQ,yBAAyB,GAAG;EACxD,OAAO,MAAM,KAAK,GAAG;CACvB;CAEA,MAAM,uBAAuB,UAAqD;EAChF,IAAI,WAAW,MAAM,OAAO;EAC5B,WAAW,SAAS,QAAQ,gBAAgB,EAAE;EAG9C,IAAI,OAAO,aAAa,YAAY,SAAS,OAAO,SAAS,SAAS,CAAC,MAAM,KAC3E,WAAW,SAAS,UAAU,GAAG,SAAS,SAAS,CAAC,CAAC,CAAC,OAAO,GAAG;EAGlE,MAAM,QAAQ,SAAS,MAAM,GAAG;EAChC,MAAM,cAAc,MAAM;EAC1B,MAAM,cAAc,MAAM;EAG1B,MAAM,uBAAuB,cAAc,aAAa;GAAE,GAAG;GAAa,MAAM;EAAM,CAAC;EACvF,MAAM,qBAAqB,OAAO,SAAS,oBAAoB;EAE/D,IAAI,CAAC,OAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"InputCurrency.js","names":[],"sources":["../../../../../src/Atomic/FormElements/InputCurrency/InputCurrency.tsx"],"sourcesContent":["import type { FC } from 'react';\n\nimport type { IInputCurrencyProps, IOnlyNumbersConfig } from './InputCurrency.interface';\n\nimport cn from 'classnames';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { filterNumeric } from '../../../Functions/fieldValueFormatters';\n\nimport './InputCurrency.scss';\n\nconst attrsOfNativeInputDefault = {} as IInputCurrencyProps['attributesOfNativeInput'];\nconst CN = 'input-currency';\n/**\n * Type-annotation обязателен: без него TS widens `type: 'float'` → `type: string`,\n * и при передаче в `filterNumeric(...: IBitDepthSettings)` ловим TS2345.\n */\nconst ONLY_NUMBERS_DEFAULT: IOnlyNumbersConfig = {\n type: 'float',\n decimalPlaces: 2,\n};\n\nconst InputCurrency: FC<IInputCurrencyProps> = ({\n currencySymbol = '$',\n testId = CN,\n onChange,\n className,\n value,\n disabled,\n attributesOfNativeInput = attrsOfNativeInputDefault,\n min = 0,\n max,\n error,\n isNoCheckMinMax,\n allowZero = false,\n onlyNumbers = ONLY_NUMBERS_DEFAULT,\n}) => {\n const [inputValue, setInputValue] = useState<string>(currencySymbol);\n const [isFocused, setIsFocused] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const formatNumberWithCommas = (number: number | string): string => {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n };\n\n const formatCurrencyInput = (event: React.ChangeEvent<HTMLInputElement>): void => {\n let newValue = event.target.value;\n newValue = newValue.replace(currencySymbol, '');\n\n // If user typed comma(',') replace it to dot('.') for float value typing\n if (typeof newValue === 'string' && newValue.charAt(newValue.length - 1) === ',')\n newValue = newValue.substring(0, newValue.length - 1).concat('.');\n\n // Handle decimal input separately\n const parts = newValue.split('.');\n const integerPart = parts[0];\n const decimalPart = parts[1];\n\n // Filter and format the integer part\n const preparedIntegerValue = filterNumeric(integerPart, { ...onlyNumbers, type: 'int' });\n const parsedIntegerValue = Number.parseInt(preparedIntegerValue);\n\n if (!Number.isNaN(parsedIntegerValue)) {\n if (parsedIntegerValue === 0 && !decimalPart) {\n if (allowZero) {\n setInputValue(`${currencySymbol}0`);\n onChange(0);\n }\n else {\n setInputValue(currencySymbol);\n onChange('');\n }\n }\n else {\n let formattedValue = formatNumberWithCommas(parsedIntegerValue);\n\n // Add decimal part if exists\n if (decimalPart !== undefined) {\n const filteredDecimal = filterNumeric(decimalPart, { type: 'int' });\n if (filteredDecimal) {\n formattedValue += `.${filteredDecimal.slice(0, onlyNumbers.decimalPlaces)}`;\n }\n else if (decimalPart === '') {\n formattedValue += '.';\n }\n }\n\n setInputValue(`${currencySymbol}${formattedValue}`);\n onChange(Number.parseFloat(formattedValue.replace(/,/g, '')));\n }\n }\n else {\n setInputValue(currencySymbol);\n onChange('');\n }\n };\n\n const onInputClick = (): void => {\n if (!inputValue && inputRef.current) {\n inputRef.current.selectionStart = inputRef.current.selectionEnd\n = currencySymbol ? currencySymbol.length : 1;\n }\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>): void => {\n if (event.key.match(/^[a-z0-9]$/i) && inputRef.current) {\n setInputValue(inputValue.slice(0, inputRef.current.selectionStart || 0));\n }\n };\n\n const checkMinMax = (event: React.FocusEvent<HTMLInputElement> | null, checkValue?: string | number): boolean => {\n const clearValue = checkValue ?? filterNumeric(event?.target?.value || '', onlyNumbers);\n\n if (!clearValue) return false;\n\n const numericValue = typeof clearValue === 'string' ? Number.parseFloat(clearValue) : clearValue;\n\n if (numericValue < min) {\n setInputValue(`${currencySymbol}${formatNumberWithCommas(min)}`);\n onChange(min);\n return false;\n }\n\n if (max && numericValue > max) {\n setInputValue(`${currencySymbol}${formatNumberWithCommas(max)}`);\n onChange(max);\n return false;\n }\n\n return true;\n };\n\n useEffect(() => {\n if (value === 0 || value === '0') {\n if (allowZero) {\n setInputValue(`${currencySymbol}0`);\n onChange(0);\n }\n else {\n setInputValue(currencySymbol);\n onChange('');\n }\n }\n else if (value) {\n setInputValue(`${currencySymbol}${formatNumberWithCommas(value)}`);\n }\n else {\n setInputValue(currencySymbol);\n }\n }, [value, currencySymbol, allowZero]);\n\n return (\n <div\n data-testid={testId}\n className={cn('input-currency-box', className, {\n disabled,\n 'input-currency__error': error,\n 'input-currency__focused': isFocused,\n })}\n >\n <input\n className={CN}\n type=\"text\"\n ref={inputRef}\n value={inputValue}\n onChange={formatCurrencyInput}\n onClick={onInputClick}\n onKeyDown={onKeyDown}\n {...attributesOfNativeInput}\n onFocus={(e) => {\n attributesOfNativeInput?.onFocus?.(e);\n setIsFocused(true);\n }}\n onBlur={(e) => {\n attributesOfNativeInput?.onBlur?.(e);\n if (!isNoCheckMinMax) {\n const currentValue = Number.parseFloat(\n filterNumeric(inputValue.replace(currencySymbol, ''), onlyNumbers),\n );\n checkMinMax(null, currentValue);\n }\n setIsFocused(false);\n }}\n />\n </div>\n );\n};\n\nInputCurrency.displayName = 'InputCurrency';\n\nexport default InputCurrency;\n"],"mappings":"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"}
|
|
@@ -24,7 +24,8 @@ var InputDateRange = (props) => {
|
|
|
24
24
|
const { isToggled, toggle, toggleOn, toggleOff } = useToggle(false);
|
|
25
25
|
const [current, setCurrent] = useState(actualValues?.intervalKey);
|
|
26
26
|
const [isCompare, setIsCompare] = useState(actualValues?.compare);
|
|
27
|
-
const
|
|
27
|
+
const dropdownContainers = document.getElementsByClassName("dropdown__container");
|
|
28
|
+
const ref = useClickOutside(toggleOff, dropdownContainers, !(!isUseAbs && !isMobile));
|
|
28
29
|
const internalContainerRef = useRef(null);
|
|
29
30
|
const [dateRangeContainerId] = useState(Math.random().toString(16).slice(2));
|
|
30
31
|
const handleChange = (input) => {
|