@cloud-ru/ds-uikit-product-fields-predefined 1.0.0
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/CHANGELOG.md +8 -0
- package/LICENSE +201 -0
- package/README.md +1339 -0
- package/dist/cjs/components/FieldChat/FieldChat.d.ts +7 -0
- package/dist/cjs/components/FieldChat/FieldChat.js +50 -0
- package/dist/cjs/components/FieldChat/components/Attachments/Attachments.d.ts +8 -0
- package/dist/cjs/components/FieldChat/components/Attachments/Attachments.js +16 -0
- package/dist/cjs/components/FieldChat/components/Attachments/index.d.ts +1 -0
- package/dist/cjs/components/FieldChat/components/Attachments/index.js +17 -0
- package/dist/cjs/components/FieldChat/components/Attachments/styles.module.css +12 -0
- package/dist/cjs/components/FieldChat/components/FieldSubmitButton/FieldSubmitButton.d.ts +18 -0
- package/dist/cjs/components/FieldChat/components/FieldSubmitButton/FieldSubmitButton.js +22 -0
- package/dist/cjs/components/FieldChat/components/FieldSubmitButton/index.d.ts +1 -0
- package/dist/cjs/components/FieldChat/components/FieldSubmitButton/index.js +17 -0
- package/dist/cjs/components/FieldChat/components/FieldSubmitButton/styles.module.css +3 -0
- package/dist/cjs/components/FieldChat/components/TextAreaActionsFooter/TextAreaActionsFooter.d.ts +8 -0
- package/dist/cjs/components/FieldChat/components/TextAreaActionsFooter/TextAreaActionsFooter.js +11 -0
- package/dist/cjs/components/FieldChat/components/TextAreaActionsFooter/index.d.ts +1 -0
- package/dist/cjs/components/FieldChat/components/TextAreaActionsFooter/index.js +17 -0
- package/dist/cjs/components/FieldChat/components/TextAreaActionsFooter/styles.module.css +25 -0
- package/dist/cjs/components/FieldChat/index.d.ts +2 -0
- package/dist/cjs/components/FieldChat/index.js +18 -0
- package/dist/cjs/components/FieldChat/styles.module.css +14 -0
- package/dist/cjs/components/FieldChat/types.d.ts +14 -0
- package/dist/cjs/components/FieldChat/types.js +2 -0
- package/dist/cjs/components/FieldCode/FieldCode.d.ts +30 -0
- package/dist/cjs/components/FieldCode/FieldCode.js +42 -0
- package/dist/cjs/components/FieldCode/components/Cell/Cell.d.ts +7 -0
- package/dist/cjs/components/FieldCode/components/Cell/Cell.js +17 -0
- package/dist/cjs/components/FieldCode/components/Cell/index.d.ts +1 -0
- package/dist/cjs/components/FieldCode/components/Cell/index.js +17 -0
- package/dist/cjs/components/FieldCode/components/Cell/styles.module.css +19 -0
- package/dist/cjs/components/FieldCode/components/ResendCode/ResendCode.d.ts +8 -0
- package/dist/cjs/components/FieldCode/components/ResendCode/ResendCode.js +19 -0
- package/dist/cjs/components/FieldCode/components/ResendCode/index.d.ts +1 -0
- package/dist/cjs/components/FieldCode/components/ResendCode/index.js +17 -0
- package/dist/cjs/components/FieldCode/components/ResendCode/utils.d.ts +1 -0
- package/dist/cjs/components/FieldCode/components/ResendCode/utils.js +8 -0
- package/dist/cjs/components/FieldCode/components/index.d.ts +2 -0
- package/dist/cjs/components/FieldCode/components/index.js +18 -0
- package/dist/cjs/components/FieldCode/constants.d.ts +2 -0
- package/dist/cjs/components/FieldCode/constants.js +5 -0
- package/dist/cjs/components/FieldCode/hooks/index.d.ts +5 -0
- package/dist/cjs/components/FieldCode/hooks/index.js +21 -0
- package/dist/cjs/components/FieldCode/hooks/useCodeInput.d.ts +22 -0
- package/dist/cjs/components/FieldCode/hooks/useCodeInput.js +97 -0
- package/dist/cjs/components/FieldCode/hooks/useFieldCodeOverflow.d.ts +6 -0
- package/dist/cjs/components/FieldCode/hooks/useFieldCodeOverflow.js +43 -0
- package/dist/cjs/components/FieldCode/hooks/useFieldCodeValidate.d.ts +6 -0
- package/dist/cjs/components/FieldCode/hooks/useFieldCodeValidate.js +22 -0
- package/dist/cjs/components/FieldCode/hooks/useFieldHelpers.d.ts +12 -0
- package/dist/cjs/components/FieldCode/hooks/useFieldHelpers.js +31 -0
- package/dist/cjs/components/FieldCode/hooks/useFocusCell.d.ts +5 -0
- package/dist/cjs/components/FieldCode/hooks/useFocusCell.js +21 -0
- package/dist/cjs/components/FieldCode/hooks/useRefState.d.ts +7 -0
- package/dist/cjs/components/FieldCode/hooks/useRefState.js +21 -0
- package/dist/cjs/components/FieldCode/index.d.ts +3 -0
- package/dist/cjs/components/FieldCode/index.js +19 -0
- package/dist/cjs/components/FieldCode/styles.module.css +45 -0
- package/dist/cjs/components/FieldCode/utils.d.ts +6 -0
- package/dist/cjs/components/FieldCode/utils.js +21 -0
- package/dist/cjs/components/FieldDescription/FieldDescription.d.ts +10 -0
- package/dist/cjs/components/FieldDescription/FieldDescription.js +55 -0
- package/dist/cjs/components/FieldDescription/FieldDescriptionRHF.d.ts +9 -0
- package/dist/cjs/components/FieldDescription/FieldDescriptionRHF.js +47 -0
- package/dist/cjs/components/FieldDescription/components/FieldWithAddButton.d.ts +7 -0
- package/dist/cjs/components/FieldDescription/components/FieldWithAddButton.js +27 -0
- package/dist/cjs/components/FieldDescription/components/index.d.ts +1 -0
- package/dist/cjs/components/FieldDescription/components/index.js +17 -0
- package/dist/cjs/components/FieldDescription/constants.d.ts +1 -0
- package/dist/cjs/components/FieldDescription/constants.js +4 -0
- package/dist/cjs/components/FieldDescription/index.d.ts +3 -0
- package/dist/cjs/components/FieldDescription/index.js +19 -0
- package/dist/cjs/components/FieldDescription/types.d.ts +17 -0
- package/dist/cjs/components/FieldDescription/types.js +2 -0
- package/dist/cjs/components/FieldMask/FieldMask.d.ts +12 -0
- package/dist/cjs/components/FieldMask/FieldMask.js +30 -0
- package/dist/cjs/components/FieldMask/constants.d.ts +19 -0
- package/dist/cjs/components/FieldMask/constants.js +60 -0
- package/dist/cjs/components/FieldMask/index.d.ts +3 -0
- package/dist/cjs/components/FieldMask/index.js +21 -0
- package/dist/cjs/components/FieldMask/types.d.ts +3 -0
- package/dist/cjs/components/FieldMask/types.js +2 -0
- package/dist/cjs/components/FieldName/FieldName.d.ts +5 -0
- package/dist/cjs/components/FieldName/FieldName.js +84 -0
- package/dist/cjs/components/FieldName/FieldNameRHF.d.ts +5 -0
- package/dist/cjs/components/FieldName/FieldNameRHF.js +68 -0
- package/dist/cjs/components/FieldName/constants.d.ts +1 -0
- package/dist/cjs/components/FieldName/constants.js +4 -0
- package/dist/cjs/components/FieldName/index.d.ts +3 -0
- package/dist/cjs/components/FieldName/index.js +19 -0
- package/dist/cjs/components/FieldName/types.d.ts +22 -0
- package/dist/cjs/components/FieldName/types.js +2 -0
- package/dist/cjs/components/FieldPhone/FieldPhone.d.ts +13 -0
- package/dist/cjs/components/FieldPhone/FieldPhone.js +166 -0
- package/dist/cjs/components/FieldPhone/constants.d.ts +8 -0
- package/dist/cjs/components/FieldPhone/constants.js +11 -0
- package/dist/cjs/components/FieldPhone/countries.d.ts +3500 -0
- package/dist/cjs/components/FieldPhone/countries.js +1441 -0
- package/dist/cjs/components/FieldPhone/hooks/index.d.ts +2 -0
- package/dist/cjs/components/FieldPhone/hooks/index.js +18 -0
- package/dist/cjs/components/FieldPhone/hooks/useCountries.d.ts +2 -0
- package/dist/cjs/components/FieldPhone/hooks/useCountries.js +36 -0
- package/dist/cjs/components/FieldPhone/hooks/useMapCountryToOptions.d.ts +2 -0
- package/dist/cjs/components/FieldPhone/hooks/useMapCountryToOptions.js +20 -0
- package/dist/cjs/components/FieldPhone/index.d.ts +5 -0
- package/dist/cjs/components/FieldPhone/index.js +24 -0
- package/dist/cjs/components/FieldPhone/styles.module.css +3 -0
- package/dist/cjs/components/FieldPhone/types.d.ts +31 -0
- package/dist/cjs/components/FieldPhone/types.js +2 -0
- package/dist/cjs/components/FieldPhone/utils.d.ts +14 -0
- package/dist/cjs/components/FieldPhone/utils.js +85 -0
- package/dist/cjs/components/FieldSelectCreate/FieldSelectCreate.d.ts +8 -0
- package/dist/cjs/components/FieldSelectCreate/FieldSelectCreate.js +66 -0
- package/dist/cjs/components/FieldSelectCreate/constants.d.ts +14 -0
- package/dist/cjs/components/FieldSelectCreate/constants.js +17 -0
- package/dist/cjs/components/FieldSelectCreate/helperComponents/SelectFooter/SelectFooter.d.ts +8 -0
- package/dist/cjs/components/FieldSelectCreate/helperComponents/SelectFooter/SelectFooter.js +19 -0
- package/dist/cjs/components/FieldSelectCreate/helperComponents/SelectFooter/index.d.ts +1 -0
- package/dist/cjs/components/FieldSelectCreate/helperComponents/SelectFooter/index.js +17 -0
- package/dist/cjs/components/FieldSelectCreate/helperComponents/SelectFooter/styles.module.css +6 -0
- package/dist/cjs/components/FieldSelectCreate/index.d.ts +3 -0
- package/dist/cjs/components/FieldSelectCreate/index.js +19 -0
- package/dist/cjs/components/FieldSelectCreate/styles.module.css +9 -0
- package/dist/cjs/components/FieldSelectCreate/types.d.ts +58 -0
- package/dist/cjs/components/FieldSelectCreate/types.js +2 -0
- package/dist/cjs/components/FieldSelectCreate/useSelectDataStates.d.ts +11 -0
- package/dist/cjs/components/FieldSelectCreate/useSelectDataStates.js +29 -0
- package/dist/cjs/components/FieldSelectCreate/utils.d.ts +2 -0
- package/dist/cjs/components/FieldSelectCreate/utils.js +7 -0
- package/dist/cjs/components/index.d.ts +7 -0
- package/dist/cjs/components/index.js +23 -0
- package/dist/cjs/constants.d.ts +19 -0
- package/dist/cjs/constants.js +22 -0
- package/dist/cjs/helpers/getSymbolsRangeFromMask.d.ts +7 -0
- package/dist/cjs/helpers/getSymbolsRangeFromMask.js +15 -0
- package/dist/cjs/helpers/index.d.ts +1 -0
- package/dist/cjs/helpers/index.js +17 -0
- package/dist/cjs/hooks/index.d.ts +2 -0
- package/dist/cjs/hooks/index.js +18 -0
- package/dist/cjs/hooks/useCustomFieldValidation.d.ts +12 -0
- package/dist/cjs/hooks/useCustomFieldValidation.js +32 -0
- package/dist/cjs/hooks/useOpen.d.ts +5 -0
- package/dist/cjs/hooks/useOpen.js +18 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/locale/index.d.ts +845 -0
- package/dist/cjs/locale/index.js +429 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/style.css +136 -0
- package/dist/esm/components/FieldChat/FieldChat.d.ts +7 -0
- package/dist/esm/components/FieldChat/FieldChat.js +44 -0
- package/dist/esm/components/FieldChat/components/Attachments/Attachments.d.ts +8 -0
- package/dist/esm/components/FieldChat/components/Attachments/Attachments.js +10 -0
- package/dist/esm/components/FieldChat/components/Attachments/index.d.ts +1 -0
- package/dist/esm/components/FieldChat/components/Attachments/index.js +1 -0
- package/dist/esm/components/FieldChat/components/Attachments/styles.module.css +12 -0
- package/dist/esm/components/FieldChat/components/FieldSubmitButton/FieldSubmitButton.d.ts +18 -0
- package/dist/esm/components/FieldChat/components/FieldSubmitButton/FieldSubmitButton.js +16 -0
- package/dist/esm/components/FieldChat/components/FieldSubmitButton/index.d.ts +1 -0
- package/dist/esm/components/FieldChat/components/FieldSubmitButton/index.js +1 -0
- package/dist/esm/components/FieldChat/components/FieldSubmitButton/styles.module.css +3 -0
- package/dist/esm/components/FieldChat/components/TextAreaActionsFooter/TextAreaActionsFooter.d.ts +8 -0
- package/dist/esm/components/FieldChat/components/TextAreaActionsFooter/TextAreaActionsFooter.js +5 -0
- package/dist/esm/components/FieldChat/components/TextAreaActionsFooter/index.d.ts +1 -0
- package/dist/esm/components/FieldChat/components/TextAreaActionsFooter/index.js +1 -0
- package/dist/esm/components/FieldChat/components/TextAreaActionsFooter/styles.module.css +25 -0
- package/dist/esm/components/FieldChat/index.d.ts +2 -0
- package/dist/esm/components/FieldChat/index.js +2 -0
- package/dist/esm/components/FieldChat/styles.module.css +14 -0
- package/dist/esm/components/FieldChat/types.d.ts +14 -0
- package/dist/esm/components/FieldChat/types.js +1 -0
- package/dist/esm/components/FieldCode/FieldCode.d.ts +30 -0
- package/dist/esm/components/FieldCode/FieldCode.js +36 -0
- package/dist/esm/components/FieldCode/components/Cell/Cell.d.ts +7 -0
- package/dist/esm/components/FieldCode/components/Cell/Cell.js +11 -0
- package/dist/esm/components/FieldCode/components/Cell/index.d.ts +1 -0
- package/dist/esm/components/FieldCode/components/Cell/index.js +1 -0
- package/dist/esm/components/FieldCode/components/Cell/styles.module.css +19 -0
- package/dist/esm/components/FieldCode/components/ResendCode/ResendCode.d.ts +8 -0
- package/dist/esm/components/FieldCode/components/ResendCode/ResendCode.js +16 -0
- package/dist/esm/components/FieldCode/components/ResendCode/index.d.ts +1 -0
- package/dist/esm/components/FieldCode/components/ResendCode/index.js +1 -0
- package/dist/esm/components/FieldCode/components/ResendCode/utils.d.ts +1 -0
- package/dist/esm/components/FieldCode/components/ResendCode/utils.js +5 -0
- package/dist/esm/components/FieldCode/components/index.d.ts +2 -0
- package/dist/esm/components/FieldCode/components/index.js +2 -0
- package/dist/esm/components/FieldCode/constants.d.ts +2 -0
- package/dist/esm/components/FieldCode/constants.js +2 -0
- package/dist/esm/components/FieldCode/hooks/index.d.ts +5 -0
- package/dist/esm/components/FieldCode/hooks/index.js +5 -0
- package/dist/esm/components/FieldCode/hooks/useCodeInput.d.ts +22 -0
- package/dist/esm/components/FieldCode/hooks/useCodeInput.js +94 -0
- package/dist/esm/components/FieldCode/hooks/useFieldCodeOverflow.d.ts +6 -0
- package/dist/esm/components/FieldCode/hooks/useFieldCodeOverflow.js +40 -0
- package/dist/esm/components/FieldCode/hooks/useFieldCodeValidate.d.ts +6 -0
- package/dist/esm/components/FieldCode/hooks/useFieldCodeValidate.js +19 -0
- package/dist/esm/components/FieldCode/hooks/useFieldHelpers.d.ts +12 -0
- package/dist/esm/components/FieldCode/hooks/useFieldHelpers.js +28 -0
- package/dist/esm/components/FieldCode/hooks/useFocusCell.d.ts +5 -0
- package/dist/esm/components/FieldCode/hooks/useFocusCell.js +18 -0
- package/dist/esm/components/FieldCode/hooks/useRefState.d.ts +7 -0
- package/dist/esm/components/FieldCode/hooks/useRefState.js +18 -0
- package/dist/esm/components/FieldCode/index.d.ts +3 -0
- package/dist/esm/components/FieldCode/index.js +3 -0
- package/dist/esm/components/FieldCode/styles.module.css +45 -0
- package/dist/esm/components/FieldCode/utils.d.ts +6 -0
- package/dist/esm/components/FieldCode/utils.js +13 -0
- package/dist/esm/components/FieldDescription/FieldDescription.d.ts +10 -0
- package/dist/esm/components/FieldDescription/FieldDescription.js +49 -0
- package/dist/esm/components/FieldDescription/FieldDescriptionRHF.d.ts +9 -0
- package/dist/esm/components/FieldDescription/FieldDescriptionRHF.js +41 -0
- package/dist/esm/components/FieldDescription/components/FieldWithAddButton.d.ts +7 -0
- package/dist/esm/components/FieldDescription/components/FieldWithAddButton.js +24 -0
- package/dist/esm/components/FieldDescription/components/index.d.ts +1 -0
- package/dist/esm/components/FieldDescription/components/index.js +1 -0
- package/dist/esm/components/FieldDescription/constants.d.ts +1 -0
- package/dist/esm/components/FieldDescription/constants.js +1 -0
- package/dist/esm/components/FieldDescription/index.d.ts +3 -0
- package/dist/esm/components/FieldDescription/index.js +3 -0
- package/dist/esm/components/FieldDescription/types.d.ts +17 -0
- package/dist/esm/components/FieldDescription/types.js +1 -0
- package/dist/esm/components/FieldMask/FieldMask.d.ts +12 -0
- package/dist/esm/components/FieldMask/FieldMask.js +24 -0
- package/dist/esm/components/FieldMask/constants.d.ts +19 -0
- package/dist/esm/components/FieldMask/constants.js +57 -0
- package/dist/esm/components/FieldMask/index.d.ts +3 -0
- package/dist/esm/components/FieldMask/index.js +3 -0
- package/dist/esm/components/FieldMask/types.d.ts +3 -0
- package/dist/esm/components/FieldMask/types.js +1 -0
- package/dist/esm/components/FieldName/FieldName.d.ts +5 -0
- package/dist/esm/components/FieldName/FieldName.js +78 -0
- package/dist/esm/components/FieldName/FieldNameRHF.d.ts +5 -0
- package/dist/esm/components/FieldName/FieldNameRHF.js +62 -0
- package/dist/esm/components/FieldName/constants.d.ts +1 -0
- package/dist/esm/components/FieldName/constants.js +1 -0
- package/dist/esm/components/FieldName/index.d.ts +3 -0
- package/dist/esm/components/FieldName/index.js +3 -0
- package/dist/esm/components/FieldName/types.d.ts +22 -0
- package/dist/esm/components/FieldName/types.js +1 -0
- package/dist/esm/components/FieldPhone/FieldPhone.d.ts +13 -0
- package/dist/esm/components/FieldPhone/FieldPhone.js +160 -0
- package/dist/esm/components/FieldPhone/constants.d.ts +8 -0
- package/dist/esm/components/FieldPhone/constants.js +8 -0
- package/dist/esm/components/FieldPhone/countries.d.ts +3500 -0
- package/dist/esm/components/FieldPhone/countries.js +1435 -0
- package/dist/esm/components/FieldPhone/hooks/index.d.ts +2 -0
- package/dist/esm/components/FieldPhone/hooks/index.js +2 -0
- package/dist/esm/components/FieldPhone/hooks/useCountries.d.ts +2 -0
- package/dist/esm/components/FieldPhone/hooks/useCountries.js +33 -0
- package/dist/esm/components/FieldPhone/hooks/useMapCountryToOptions.d.ts +2 -0
- package/dist/esm/components/FieldPhone/hooks/useMapCountryToOptions.js +17 -0
- package/dist/esm/components/FieldPhone/index.d.ts +5 -0
- package/dist/esm/components/FieldPhone/index.js +5 -0
- package/dist/esm/components/FieldPhone/styles.module.css +3 -0
- package/dist/esm/components/FieldPhone/types.d.ts +31 -0
- package/dist/esm/components/FieldPhone/types.js +1 -0
- package/dist/esm/components/FieldPhone/utils.d.ts +14 -0
- package/dist/esm/components/FieldPhone/utils.js +78 -0
- package/dist/esm/components/FieldSelectCreate/FieldSelectCreate.d.ts +8 -0
- package/dist/esm/components/FieldSelectCreate/FieldSelectCreate.js +60 -0
- package/dist/esm/components/FieldSelectCreate/constants.d.ts +14 -0
- package/dist/esm/components/FieldSelectCreate/constants.js +14 -0
- package/dist/esm/components/FieldSelectCreate/helperComponents/SelectFooter/SelectFooter.d.ts +8 -0
- package/dist/esm/components/FieldSelectCreate/helperComponents/SelectFooter/SelectFooter.js +13 -0
- package/dist/esm/components/FieldSelectCreate/helperComponents/SelectFooter/index.d.ts +1 -0
- package/dist/esm/components/FieldSelectCreate/helperComponents/SelectFooter/index.js +1 -0
- package/dist/esm/components/FieldSelectCreate/helperComponents/SelectFooter/styles.module.css +6 -0
- package/dist/esm/components/FieldSelectCreate/index.d.ts +3 -0
- package/dist/esm/components/FieldSelectCreate/index.js +3 -0
- package/dist/esm/components/FieldSelectCreate/styles.module.css +9 -0
- package/dist/esm/components/FieldSelectCreate/types.d.ts +58 -0
- package/dist/esm/components/FieldSelectCreate/types.js +1 -0
- package/dist/esm/components/FieldSelectCreate/useSelectDataStates.d.ts +11 -0
- package/dist/esm/components/FieldSelectCreate/useSelectDataStates.js +26 -0
- package/dist/esm/components/FieldSelectCreate/utils.d.ts +2 -0
- package/dist/esm/components/FieldSelectCreate/utils.js +4 -0
- package/dist/esm/components/index.d.ts +7 -0
- package/dist/esm/components/index.js +7 -0
- package/dist/esm/constants.d.ts +19 -0
- package/dist/esm/constants.js +19 -0
- package/dist/esm/helpers/getSymbolsRangeFromMask.d.ts +7 -0
- package/dist/esm/helpers/getSymbolsRangeFromMask.js +12 -0
- package/dist/esm/helpers/index.d.ts +1 -0
- package/dist/esm/helpers/index.js +1 -0
- package/dist/esm/hooks/index.d.ts +2 -0
- package/dist/esm/hooks/index.js +2 -0
- package/dist/esm/hooks/useCustomFieldValidation.d.ts +12 -0
- package/dist/esm/hooks/useCustomFieldValidation.js +28 -0
- package/dist/esm/hooks/useOpen.d.ts +5 -0
- package/dist/esm/hooks/useOpen.js +15 -0
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/locale/index.d.ts +845 -0
- package/dist/esm/locale/index.js +426 -0
- package/dist/esm/style.css +136 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +74 -0
- package/src/components/FieldChat/FieldChat.tsx +113 -0
- package/src/components/FieldChat/components/Attachments/Attachments.tsx +31 -0
- package/src/components/FieldChat/components/Attachments/index.ts +1 -0
- package/src/components/FieldChat/components/Attachments/styles.module.scss +19 -0
- package/src/components/FieldChat/components/FieldSubmitButton/FieldSubmitButton.tsx +71 -0
- package/src/components/FieldChat/components/FieldSubmitButton/index.ts +1 -0
- package/src/components/FieldChat/components/FieldSubmitButton/styles.module.scss +6 -0
- package/src/components/FieldChat/components/TextAreaActionsFooter/TextAreaActionsFooter.tsx +19 -0
- package/src/components/FieldChat/components/TextAreaActionsFooter/index.ts +1 -0
- package/src/components/FieldChat/components/TextAreaActionsFooter/styles.module.scss +29 -0
- package/src/components/FieldChat/index.ts +2 -0
- package/src/components/FieldChat/styles.module.scss +20 -0
- package/src/components/FieldChat/types.ts +29 -0
- package/src/components/FieldCode/FieldCode.tsx +138 -0
- package/src/components/FieldCode/components/Cell/Cell.tsx +35 -0
- package/src/components/FieldCode/components/Cell/index.ts +1 -0
- package/src/components/FieldCode/components/Cell/styles.module.scss +27 -0
- package/src/components/FieldCode/components/ResendCode/ResendCode.tsx +41 -0
- package/src/components/FieldCode/components/ResendCode/index.ts +1 -0
- package/src/components/FieldCode/components/ResendCode/utils.ts +5 -0
- package/src/components/FieldCode/components/index.ts +2 -0
- package/src/components/FieldCode/constants.ts +2 -0
- package/src/components/FieldCode/hooks/index.ts +5 -0
- package/src/components/FieldCode/hooks/useCodeInput.ts +146 -0
- package/src/components/FieldCode/hooks/useFieldCodeOverflow.ts +53 -0
- package/src/components/FieldCode/hooks/useFieldCodeValidate.ts +32 -0
- package/src/components/FieldCode/hooks/useFieldHelpers.ts +45 -0
- package/src/components/FieldCode/hooks/useFocusCell.ts +26 -0
- package/src/components/FieldCode/hooks/useRefState.ts +23 -0
- package/src/components/FieldCode/index.ts +3 -0
- package/src/components/FieldCode/styles.module.scss +51 -0
- package/src/components/FieldCode/utils.ts +23 -0
- package/src/components/FieldDescription/FieldDescription.tsx +98 -0
- package/src/components/FieldDescription/FieldDescriptionRHF.tsx +93 -0
- package/src/components/FieldDescription/components/FieldWithAddButton.tsx +51 -0
- package/src/components/FieldDescription/components/index.ts +1 -0
- package/src/components/FieldDescription/constants.ts +1 -0
- package/src/components/FieldDescription/index.ts +3 -0
- package/src/components/FieldDescription/types.ts +23 -0
- package/src/components/FieldMask/FieldMask.tsx +56 -0
- package/src/components/FieldMask/constants.ts +70 -0
- package/src/components/FieldMask/index.ts +3 -0
- package/src/components/FieldMask/types.ts +5 -0
- package/src/components/FieldName/FieldName.tsx +126 -0
- package/src/components/FieldName/FieldNameRHF.tsx +114 -0
- package/src/components/FieldName/constants.ts +1 -0
- package/src/components/FieldName/index.ts +3 -0
- package/src/components/FieldName/types.ts +28 -0
- package/src/components/FieldPhone/FieldPhone.tsx +264 -0
- package/src/components/FieldPhone/constants.ts +10 -0
- package/src/components/FieldPhone/countries.tsx +1755 -0
- package/src/components/FieldPhone/hooks/index.ts +2 -0
- package/src/components/FieldPhone/hooks/useCountries.ts +40 -0
- package/src/components/FieldPhone/hooks/useMapCountryToOptions.ts +25 -0
- package/src/components/FieldPhone/index.ts +5 -0
- package/src/components/FieldPhone/styles.module.scss +9 -0
- package/src/components/FieldPhone/types.ts +32 -0
- package/src/components/FieldPhone/utils.ts +112 -0
- package/src/components/FieldSelectCreate/FieldSelectCreate.tsx +133 -0
- package/src/components/FieldSelectCreate/constants.ts +15 -0
- package/src/components/FieldSelectCreate/helperComponents/SelectFooter/SelectFooter.tsx +37 -0
- package/src/components/FieldSelectCreate/helperComponents/SelectFooter/index.ts +1 -0
- package/src/components/FieldSelectCreate/helperComponents/SelectFooter/styles.module.scss +8 -0
- package/src/components/FieldSelectCreate/index.ts +3 -0
- package/src/components/FieldSelectCreate/styles.module.scss +12 -0
- package/src/components/FieldSelectCreate/types.ts +70 -0
- package/src/components/FieldSelectCreate/useSelectDataStates.tsx +57 -0
- package/src/components/FieldSelectCreate/utils.ts +4 -0
- package/src/components/index.ts +7 -0
- package/src/constants.ts +19 -0
- package/src/helpers/getSymbolsRangeFromMask.ts +15 -0
- package/src/helpers/index.ts +1 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useCustomFieldValidation.ts +38 -0
- package/src/hooks/useOpen.ts +22 -0
- package/src/index.ts +6 -0
- package/src/locale/index.ts +431 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { ALL_COUNTRY_CODES } from '../countries.js';
|
|
3
|
+
import { uniqueSet } from '../utils.js';
|
|
4
|
+
import { useMapCountryToOptions } from './useMapCountryToOptions.js';
|
|
5
|
+
export function useCountries(optionsSettings) {
|
|
6
|
+
const mapCountryToOption = useMapCountryToOptions();
|
|
7
|
+
const filterCountries = useMemo(() => {
|
|
8
|
+
if (!optionsSettings) {
|
|
9
|
+
return () => true;
|
|
10
|
+
}
|
|
11
|
+
const { includedCountries, excludedCountries } = optionsSettings;
|
|
12
|
+
const uniqueKey = 'value';
|
|
13
|
+
if (includedCountries) {
|
|
14
|
+
const includedSet = uniqueSet(includedCountries, uniqueKey);
|
|
15
|
+
return (country) => includedSet.has(country[uniqueKey]);
|
|
16
|
+
}
|
|
17
|
+
if (excludedCountries) {
|
|
18
|
+
const excludedSet = uniqueSet(excludedCountries, uniqueKey);
|
|
19
|
+
return (country) => !excludedSet.has(country[uniqueKey]);
|
|
20
|
+
}
|
|
21
|
+
return () => true;
|
|
22
|
+
}, [optionsSettings]);
|
|
23
|
+
return useMemo(() => {
|
|
24
|
+
if (optionsSettings?.overriddenOptions)
|
|
25
|
+
return optionsSettings.overriddenOptions;
|
|
26
|
+
return ALL_COUNTRY_CODES.reduce((result, country) => {
|
|
27
|
+
if (filterCountries(country)) {
|
|
28
|
+
result.push(mapCountryToOption(country));
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}, []);
|
|
32
|
+
}, [optionsSettings, filterCountries, mapCountryToOption]);
|
|
33
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createElement, useCallback } from 'react';
|
|
2
|
+
import { fieldsPredefinedLocale } from '../../../locale/index.js';
|
|
3
|
+
import { FLAG_ICON_SIZE } from '../constants.js';
|
|
4
|
+
export function useMapCountryToOptions() {
|
|
5
|
+
const { t } = fieldsPredefinedLocale.useTranslations();
|
|
6
|
+
const mapCountryToOption = useCallback(({ value: id, mask, caption, icon, iso2 }) => ({
|
|
7
|
+
id,
|
|
8
|
+
mask,
|
|
9
|
+
content: {
|
|
10
|
+
label: t(`FieldPhone.${id}`),
|
|
11
|
+
caption,
|
|
12
|
+
},
|
|
13
|
+
beforeContent: createElement(icon, { size: FLAG_ICON_SIZE }),
|
|
14
|
+
iso2,
|
|
15
|
+
}), [t]);
|
|
16
|
+
return mapCountryToOption;
|
|
17
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { useIMask } from 'react-imask';
|
|
3
|
+
import { ALL_COUNTRY_CODES } from './countries.js';
|
|
4
|
+
export type FieldPhoneOptionsProps = {
|
|
5
|
+
id: string;
|
|
6
|
+
beforeContent: ReactNode;
|
|
7
|
+
content: {
|
|
8
|
+
label: string;
|
|
9
|
+
caption: string;
|
|
10
|
+
};
|
|
11
|
+
mask: string;
|
|
12
|
+
iso2: string;
|
|
13
|
+
};
|
|
14
|
+
export type MaskOptions = Parameters<typeof useIMask>[0];
|
|
15
|
+
export type Country = (typeof ALL_COUNTRY_CODES)[number];
|
|
16
|
+
type OneOf<T extends object> = {
|
|
17
|
+
[K in keyof T]: {
|
|
18
|
+
[P in K]: T[P];
|
|
19
|
+
} & {
|
|
20
|
+
[P in Exclude<keyof T, K>]?: never;
|
|
21
|
+
};
|
|
22
|
+
}[keyof T];
|
|
23
|
+
export type CountrySettings = OneOf<{
|
|
24
|
+
/** Список элементов выпадающего списка со странами; переопределяет встроенный список пакета */
|
|
25
|
+
overriddenOptions: FieldPhoneOptionsProps[];
|
|
26
|
+
/** Список стран, которые должны отображаться в селекторе (из встроенного перечня пакета) */
|
|
27
|
+
includedCountries: Country[];
|
|
28
|
+
/** Список стран, которые будут исключены из встроенного перечня пакета */
|
|
29
|
+
excludedCountries: Country[];
|
|
30
|
+
}>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FieldPhoneOptionsProps } from './types.js';
|
|
2
|
+
export declare const uniqueSet: <T, K extends keyof T>(arr: T[], key: K) => Set<T[K]>;
|
|
3
|
+
export declare const formatPhoneNumber: <T extends {
|
|
4
|
+
caption: string;
|
|
5
|
+
mask: string;
|
|
6
|
+
}>(phone: string, countries: readonly T[]) => string;
|
|
7
|
+
export declare function detectCountryByPhone(text: string, options: FieldPhoneOptionsProps[]): FieldPhoneOptionsProps | undefined;
|
|
8
|
+
export declare const handleAutoInsert: ({ raw, onValueChange, onCountryChange, country, options, }: {
|
|
9
|
+
raw: string;
|
|
10
|
+
onValueChange(str: string): void;
|
|
11
|
+
onCountryChange(country: FieldPhoneOptionsProps): void;
|
|
12
|
+
country?: FieldPhoneOptionsProps;
|
|
13
|
+
options: FieldPhoneOptionsProps[];
|
|
14
|
+
}) => void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { parsePhoneNumber } from 'awesome-phonenumber';
|
|
2
|
+
import { ABKHAZIA_COUNTRY_CODE, RUSSIA_COUNTRY_CODE } from './countries.js';
|
|
3
|
+
export const uniqueSet = (arr, key) => new Set(arr.map(obj => obj[key]));
|
|
4
|
+
/* Приходит +79878887879/+7987****875, на основании mask возвращается +7 987-888-78-79/+7 987-***-*8-75 */
|
|
5
|
+
export const formatPhoneNumber = (phone, countries) => {
|
|
6
|
+
const digits = phone.replace(/[^\d*]/g, '');
|
|
7
|
+
const country = countries.find(item => digits.startsWith(item.caption.replace('+', '')));
|
|
8
|
+
if (!country) {
|
|
9
|
+
return phone;
|
|
10
|
+
}
|
|
11
|
+
const countryCode = country.caption.replace('+', '');
|
|
12
|
+
const restNumber = digits.slice(countryCode.length);
|
|
13
|
+
let formatted = '';
|
|
14
|
+
let index = 0;
|
|
15
|
+
for (const char of country.mask) {
|
|
16
|
+
if (char === 'X') {
|
|
17
|
+
formatted += restNumber.charAt(index) || '';
|
|
18
|
+
index++;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
formatted += char;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return `${country.caption} ${formatted}`;
|
|
25
|
+
};
|
|
26
|
+
const byId = (id) => (option) => option.id === id;
|
|
27
|
+
export function detectCountryByPhone(text, options) {
|
|
28
|
+
const cleaned = text.replace(/[^\d+]/g, '');
|
|
29
|
+
const withPlus = cleaned.startsWith('+') ? cleaned : `+${cleaned}`;
|
|
30
|
+
const parsedNumber = parsePhoneNumber(withPlus);
|
|
31
|
+
const regionCode = parsedNumber.regionCode;
|
|
32
|
+
/* У Абхазии iso2 совпадает с Россией */
|
|
33
|
+
if (/^\+?7(840|940)/.test(cleaned)) {
|
|
34
|
+
let russia;
|
|
35
|
+
for (const option of options) {
|
|
36
|
+
const id = option.id;
|
|
37
|
+
const iso = option.iso2;
|
|
38
|
+
if (id === ABKHAZIA_COUNTRY_CODE.value) {
|
|
39
|
+
return option;
|
|
40
|
+
}
|
|
41
|
+
if (!russia && (id === RUSSIA_COUNTRY_CODE.value || iso === RUSSIA_COUNTRY_CODE.iso2)) {
|
|
42
|
+
russia = option;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return russia;
|
|
46
|
+
}
|
|
47
|
+
if (regionCode === RUSSIA_COUNTRY_CODE.iso2) {
|
|
48
|
+
return options.find(byId(RUSSIA_COUNTRY_CODE.value));
|
|
49
|
+
}
|
|
50
|
+
return options.find(opt => opt.iso2 === regionCode);
|
|
51
|
+
}
|
|
52
|
+
export const handleAutoInsert = ({ raw, onValueChange, onCountryChange, country, options, }) => {
|
|
53
|
+
if (!raw)
|
|
54
|
+
return;
|
|
55
|
+
const parsed = parsePhoneNumber(raw);
|
|
56
|
+
const ok = parsed.valid || parsed.possible;
|
|
57
|
+
if (!ok)
|
|
58
|
+
return;
|
|
59
|
+
const detected = detectCountryByPhone(raw, options);
|
|
60
|
+
if (!detected)
|
|
61
|
+
return;
|
|
62
|
+
let national = parsed.number?.significant.replace(/\D/g, '');
|
|
63
|
+
if (!national)
|
|
64
|
+
return;
|
|
65
|
+
const nextNationalLength = (detected.mask?.match(/X/g) ?? []).length;
|
|
66
|
+
if (nextNationalLength && national.length > nextNationalLength) {
|
|
67
|
+
national = national.slice(-nextNationalLength);
|
|
68
|
+
}
|
|
69
|
+
const fullDigits = (parsed.number?.e164 ?? raw).replace(/\D/g, '');
|
|
70
|
+
const countryCodeDigits = String(parsed.countryCode ?? '');
|
|
71
|
+
const expected = countryCodeDigits.length + nextNationalLength;
|
|
72
|
+
if (fullDigits.length < expected)
|
|
73
|
+
return;
|
|
74
|
+
if (detected.id !== country?.id) {
|
|
75
|
+
onCountryChange(detected);
|
|
76
|
+
}
|
|
77
|
+
onValueChange(national);
|
|
78
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FieldSelectCreateProps } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Поле выбора с действием «создать»: `FieldSelect` из `@cloud-ru/ds-fields` + встроенная форма создания опции
|
|
4
|
+
* в модалке или дровере (`createLayoutType`). Кнопка «Создать <entityName>» — под полем и в футере
|
|
5
|
+
* дроплиста (`SelectFooter`). Пустые состояния и тексты строятся из `entityName`. Доступ рулит `permission`.
|
|
6
|
+
* На mobile дроплист и модалка/дровер — `BottomSheet` (адаптив `@ds`), своего пропа `layoutType` нет.
|
|
7
|
+
*/
|
|
8
|
+
export declare const FieldSelectCreate: import("react").ForwardRefExoticComponent<FieldSelectCreateProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { APPEARANCE, Button, ICON_POSITION, VIEW } from '@cloud-ru/ds-button';
|
|
3
|
+
import { Drawer, POSITION } from '@cloud-ru/ds-drawer';
|
|
4
|
+
import { FieldSelect } from '@cloud-ru/ds-fields';
|
|
5
|
+
import { PlusSVG } from '@cloud-ru/ds-icons/interface/system';
|
|
6
|
+
import { Modal } from '@cloud-ru/ds-modal';
|
|
7
|
+
import { Tooltip } from '@cloud-ru/ds-tooltip';
|
|
8
|
+
import { extractSupportProps } from '@cloud-ru/ds-utils';
|
|
9
|
+
import cn from 'classnames';
|
|
10
|
+
import { forwardRef, useCallback } from 'react';
|
|
11
|
+
import { TEST_IDS } from '../../constants.js';
|
|
12
|
+
import { useOpen } from '../../hooks/index.js';
|
|
13
|
+
import { fieldsPredefinedLocale } from '../../locale/index.js';
|
|
14
|
+
import { CREATE_LAYOUT_TYPE, PERMISSION } from './constants.js';
|
|
15
|
+
import { SelectFooter } from './helperComponents/SelectFooter/index.js';
|
|
16
|
+
import styles from './styles.module.css';
|
|
17
|
+
import { useSelectDataStates } from './useSelectDataStates.js';
|
|
18
|
+
/**
|
|
19
|
+
* Поле выбора с действием «создать»: `FieldSelect` из `@cloud-ru/ds-fields` + встроенная форма создания опции
|
|
20
|
+
* в модалке или дровере (`createLayoutType`). Кнопка «Создать <entityName>» — под полем и в футере
|
|
21
|
+
* дроплиста (`SelectFooter`). Пустые состояния и тексты строятся из `entityName`. Доступ рулит `permission`.
|
|
22
|
+
* На mobile дроплист и модалка/дровер — `BottomSheet` (адаптив `@ds`), своего пропа `layoutType` нет.
|
|
23
|
+
*/
|
|
24
|
+
export const FieldSelectCreate = forwardRef(function FieldSelectCreate({ selectProps, createLayoutProps, createLayoutType = CREATE_LAYOUT_TYPE.Drawer, entityName, submitHandler, onRefetch, className, afterClose, entityIcon, permission = PERMISSION.CanCreate, ...rest }, ref) {
|
|
25
|
+
const { t } = fieldsPredefinedLocale.useTranslations();
|
|
26
|
+
const { isOpen, onOpen, onClose } = useOpen();
|
|
27
|
+
const selectDataStates = useSelectDataStates({ entityName, entityIcon, onRefetch });
|
|
28
|
+
const size = selectProps.size ?? 'm';
|
|
29
|
+
const isNone = permission === PERMISSION.None;
|
|
30
|
+
const canCreate = permission === PERMISSION.CanCreate;
|
|
31
|
+
const handleClose = useCallback(() => {
|
|
32
|
+
onClose();
|
|
33
|
+
afterClose?.();
|
|
34
|
+
}, [afterClose, onClose]);
|
|
35
|
+
const handleCreate = useCallback(async () => {
|
|
36
|
+
const newValue = await submitHandler();
|
|
37
|
+
// Автовыбор новой опции — в single-режиме; в multiple выбор оставляем потребителю.
|
|
38
|
+
if (typeof newValue === 'string' && selectProps.selection !== 'multiple') {
|
|
39
|
+
selectProps.onChange?.(newValue);
|
|
40
|
+
}
|
|
41
|
+
handleClose();
|
|
42
|
+
}, [handleClose, selectProps, submitHandler]);
|
|
43
|
+
const createButtonLabel = `${t('FieldSelectCreate.create')} ${entityName.single.toLocaleLowerCase()}`;
|
|
44
|
+
const noPermissionTip = t('FieldSelectCreate.noPermission');
|
|
45
|
+
// createLayoutType и createLayoutProps дискриминируются союзом, но при деструктуризации корреляция
|
|
46
|
+
// теряется — поэтому приводим тип поверхности к целевому внутри ветки (как в легаси).
|
|
47
|
+
const layoutProps = {
|
|
48
|
+
...createLayoutProps,
|
|
49
|
+
open: isOpen,
|
|
50
|
+
onClose: handleClose,
|
|
51
|
+
'data-test-id': TEST_IDS.fieldSelectCreateSurface,
|
|
52
|
+
approveButton: { label: t('FieldSelectCreate.create'), onClick: handleCreate },
|
|
53
|
+
cancelButton: { label: t('FieldSelectCreate.cancel'), onClick: handleClose },
|
|
54
|
+
};
|
|
55
|
+
const formLayout = createLayoutType === CREATE_LAYOUT_TYPE.Modal ? (_jsx(Modal, { ...layoutProps })) : (_jsx(Drawer, { ...layoutProps, position: createLayoutProps.position ?? POSITION.Right }));
|
|
56
|
+
const withTip = (node, show) => show ? _jsx(Tooltip, { tip: noPermissionTip, children: node }) : node;
|
|
57
|
+
return (_jsxs("div", { className: cn(styles.fieldSelectCreate, className), ...extractSupportProps(rest), "data-test-id": TEST_IDS.fieldSelectCreate, children: [withTip(_jsx(FieldSelect, { ...selectProps, ref: ref, size: size, disabled: isNone || selectProps.disabled, placeholder: selectProps.placeholder ?? t('FieldSelectCreate.placeholder'), ...selectDataStates, footer:
|
|
58
|
+
// В состоянии ошибки показываем только «Обновить» из errorDataState — без футера «Создать» (по макету).
|
|
59
|
+
selectProps.dataError ? undefined : (_jsx(SelectFooter, { onClick: onOpen, createButtonLabel: createButtonLabel, canCreate: canCreate })) }), isNone), withTip(_jsx(Button, { view: VIEW.Function, appearance: APPEARANCE.Neutral, label: createButtonLabel, icon: _jsx(PlusSVG, {}), iconPosition: ICON_POSITION.Before, onClick: onOpen, size: size, disabled: !canCreate, className: styles.createButton, "data-test-id": TEST_IDS.fieldSelectCreateButton }), !canCreate), formLayout] }));
|
|
60
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Поверхность формы создания опции: модальное окно или дровер. */
|
|
2
|
+
export declare const CREATE_LAYOUT_TYPE: {
|
|
3
|
+
readonly Modal: "modal";
|
|
4
|
+
readonly Drawer: "drawer";
|
|
5
|
+
};
|
|
6
|
+
/** Права пользователя на чтение/создание опций. */
|
|
7
|
+
export declare const PERMISSION: {
|
|
8
|
+
/** Поле недоступно. */
|
|
9
|
+
readonly None: "none";
|
|
10
|
+
/** Поле активно, создание опции недоступно. */
|
|
11
|
+
readonly CanRead: "canRead";
|
|
12
|
+
/** Полный доступ: чтение и создание. */
|
|
13
|
+
readonly CanCreate: "canCreate";
|
|
14
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Поверхность формы создания опции: модальное окно или дровер. */
|
|
2
|
+
export const CREATE_LAYOUT_TYPE = {
|
|
3
|
+
Modal: 'modal',
|
|
4
|
+
Drawer: 'drawer',
|
|
5
|
+
};
|
|
6
|
+
/** Права пользователя на чтение/создание опций. */
|
|
7
|
+
export const PERMISSION = {
|
|
8
|
+
/** Поле недоступно. */
|
|
9
|
+
None: 'none',
|
|
10
|
+
/** Поле активно, создание опции недоступно. */
|
|
11
|
+
CanRead: 'canRead',
|
|
12
|
+
/** Полный доступ: чтение и создание. */
|
|
13
|
+
CanCreate: 'canCreate',
|
|
14
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type SelectFooterProps = {
|
|
2
|
+
onClick(): void;
|
|
3
|
+
createButtonLabel: string;
|
|
4
|
+
canCreate: boolean;
|
|
5
|
+
};
|
|
6
|
+
/** Персистентный футер дроплиста с кнопкой «Создать» (недоступна и с tooltip при нехватке прав). */
|
|
7
|
+
export declare function SelectFooter({ onClick, createButtonLabel, canCreate }: SelectFooterProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { APPEARANCE, Button, ICON_POSITION, VIEW } from '@cloud-ru/ds-button';
|
|
3
|
+
import { PlusSVG } from '@cloud-ru/ds-icons/interface/system';
|
|
4
|
+
import { Tooltip } from '@cloud-ru/ds-tooltip';
|
|
5
|
+
import { TEST_IDS } from '../../../../constants.js';
|
|
6
|
+
import { fieldsPredefinedLocale } from '../../../../locale/index.js';
|
|
7
|
+
import styles from './styles.module.css';
|
|
8
|
+
/** Персистентный футер дроплиста с кнопкой «Создать» (недоступна и с tooltip при нехватке прав). */
|
|
9
|
+
export function SelectFooter({ onClick, createButtonLabel, canCreate }) {
|
|
10
|
+
const { t } = fieldsPredefinedLocale.useTranslations();
|
|
11
|
+
const button = (_jsx(Button, { view: VIEW.Function, appearance: APPEARANCE.Neutral, label: createButtonLabel, icon: _jsx(PlusSVG, {}), iconPosition: ICON_POSITION.Before, onClick: onClick, disabled: !canCreate, "data-test-id": TEST_IDS.fieldSelectCreateFooterButton }));
|
|
12
|
+
return (_jsx("div", { className: styles.footerWrapper, children: canCreate ? button : _jsx(Tooltip, { tip: t('FieldSelectCreate.noPermission'), children: button }) }));
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SelectFooter.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SelectFooter.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
.footerWrapper{
|
|
2
|
+
display:flex;
|
|
3
|
+
align-items:center;
|
|
4
|
+
padding-top:var(--sn-primitive-dimension-4, 4px);
|
|
5
|
+
border-top:var(--sn-primitive-strokeWeight-strokeRegular, 1px) solid var(--sn-theme-color-available-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
|
|
6
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { DrawerProps, Position } from '@cloud-ru/ds-drawer';
|
|
2
|
+
import { FieldSelectMultipleProps, FieldSelectSingleProps } from '@cloud-ru/ds-fields';
|
|
3
|
+
import { ModalProps } from '@cloud-ru/ds-modal';
|
|
4
|
+
import { ValueOf, WithSupportProps } from '@cloud-ru/ds-utils';
|
|
5
|
+
import { CREATE_LAYOUT_TYPE, PERMISSION } from './constants.js';
|
|
6
|
+
export type CreateLayoutType = ValueOf<typeof CREATE_LAYOUT_TYPE>;
|
|
7
|
+
export type Permission = ValueOf<typeof PERMISSION>;
|
|
8
|
+
export type EntityName = {
|
|
9
|
+
/** Единственное число (винительный падеж) — для кнопки «Создать <single>». */
|
|
10
|
+
single: string;
|
|
11
|
+
/** Множественное число — для текстов пустых состояний и ошибки. */
|
|
12
|
+
plural: string;
|
|
13
|
+
};
|
|
14
|
+
export type EntityIcon = NonNullable<NonNullable<FieldSelectSingleProps['noDataState']>['icon']>['icon'];
|
|
15
|
+
type OmittedSelectKeys = 'footer' | 'noDataState' | 'noResultsState' | 'errorDataState';
|
|
16
|
+
export type SelectFieldProps = (Omit<FieldSelectSingleProps, OmittedSelectKeys> & {
|
|
17
|
+
selection?: 'single';
|
|
18
|
+
}) | (Omit<FieldSelectMultipleProps, OmittedSelectKeys> & {
|
|
19
|
+
selection: 'multiple';
|
|
20
|
+
});
|
|
21
|
+
type ManagedLayoutKeys = 'open' | 'onClose' | 'approveButton' | 'cancelButton';
|
|
22
|
+
export type LayoutProps = {
|
|
23
|
+
/** По клику на «Создать» открывается модальное окно. */
|
|
24
|
+
createLayoutType: 'modal';
|
|
25
|
+
/** Пропсы модалки создания (`content` — форма создания опции). */
|
|
26
|
+
createLayoutProps: Omit<ModalProps, ManagedLayoutKeys>;
|
|
27
|
+
} | {
|
|
28
|
+
/** По клику на «Создать» открывается дровер (по умолчанию). */
|
|
29
|
+
createLayoutType?: 'drawer';
|
|
30
|
+
/** Пропсы дровера создания (`content` — форма создания опции); `position` по умолчанию `right`. */
|
|
31
|
+
createLayoutProps: Omit<DrawerProps, ManagedLayoutKeys | 'position'> & {
|
|
32
|
+
position?: Position;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export type FieldSelectCreateProps = WithSupportProps<LayoutProps & {
|
|
36
|
+
/** Название сущности в единственном и множественном числе — для кнопок и пустых состояний. */
|
|
37
|
+
entityName: EntityName;
|
|
38
|
+
/** Действие создания опции: возвращает `value` новой опции, которая выбирается в поле (single-режим). */
|
|
39
|
+
submitHandler(): Promise<string | void>;
|
|
40
|
+
/** Пропсы, прокидываемые в `FieldSelect` (`@cloud-ru/ds-fields`). */
|
|
41
|
+
selectProps: SelectFieldProps;
|
|
42
|
+
/** Повтор загрузки в состоянии ошибки (кнопка «Обновить» в футере `errorDataState`). */
|
|
43
|
+
onRefetch?(): void;
|
|
44
|
+
/** CSS-класс корневой обёртки. */
|
|
45
|
+
className?: string;
|
|
46
|
+
/** Колбэк после закрытия модалки/дровера создания. */
|
|
47
|
+
afterClose?(): void;
|
|
48
|
+
/** Иконка пустого состояния `noData` (по умолчанию — иконка поиска). */
|
|
49
|
+
entityIcon?: EntityIcon;
|
|
50
|
+
/**
|
|
51
|
+
* Права пользователя:
|
|
52
|
+
* - `canCreate` (по умолчанию) — доступны и выбор, и создание;
|
|
53
|
+
* - `canRead` — поле активно, но создание недоступно (кнопки «Создать» с tooltip);
|
|
54
|
+
* - `none` — поле недоступно (с tooltip).
|
|
55
|
+
*/
|
|
56
|
+
permission?: Permission;
|
|
57
|
+
}>;
|
|
58
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FieldSelectSingleProps } from '@cloud-ru/ds-fields';
|
|
2
|
+
import { EntityIcon, EntityName } from './types.js';
|
|
3
|
+
type Props = {
|
|
4
|
+
entityName: EntityName;
|
|
5
|
+
entityIcon?: EntityIcon;
|
|
6
|
+
onRefetch?(): void;
|
|
7
|
+
};
|
|
8
|
+
type SelectDataStates = Pick<FieldSelectSingleProps, 'noDataState' | 'noResultsState' | 'errorDataState'>;
|
|
9
|
+
/** Строит пустые/ошибочные состояния дроплиста из `entityName` (единственное/множественное число). */
|
|
10
|
+
export declare function useSelectDataStates({ entityName, entityIcon, onRefetch }: Props): SelectDataStates;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { APPEARANCE, Button, ICON_POSITION, VIEW } from '@cloud-ru/ds-button';
|
|
3
|
+
import { CrossCircleSVG, SearchSVG, UpdateSVG } from '@cloud-ru/ds-icons/interface/system';
|
|
4
|
+
import { useMemo } from 'react';
|
|
5
|
+
import { TEST_IDS } from '../../constants.js';
|
|
6
|
+
import { fieldsPredefinedLocale } from '../../locale/index.js';
|
|
7
|
+
import { capitalize } from './utils.js';
|
|
8
|
+
/** Строит пустые/ошибочные состояния дроплиста из `entityName` (единственное/множественное число). */
|
|
9
|
+
export function useSelectDataStates({ entityName, entityIcon, onRefetch }) {
|
|
10
|
+
const { t } = fieldsPredefinedLocale.useTranslations();
|
|
11
|
+
return useMemo(() => ({
|
|
12
|
+
noDataState: {
|
|
13
|
+
icon: { icon: entityIcon ?? SearchSVG, appearance: 'green' },
|
|
14
|
+
description: `${capitalize(entityName.plural)} ${t('FieldSelectCreate.noData')}`,
|
|
15
|
+
},
|
|
16
|
+
noResultsState: {
|
|
17
|
+
icon: { icon: SearchSVG, appearance: 'green' },
|
|
18
|
+
description: (_jsxs(_Fragment, { children: [capitalize(entityName.plural), " ", t('FieldSelectCreate.noResult'), ".", _jsx("br", {}), t('FieldSelectCreate.changeRequest'), " ", entityName.single.toLocaleLowerCase()] })),
|
|
19
|
+
},
|
|
20
|
+
errorDataState: {
|
|
21
|
+
icon: { icon: CrossCircleSVG, appearance: 'neutral' },
|
|
22
|
+
description: `${t('FieldSelectCreate.loadError')} ${entityName.plural.toLocaleLowerCase()}`,
|
|
23
|
+
footer: onRefetch ? (_jsx(Button, { view: VIEW.Tonal, appearance: APPEARANCE.Neutral, label: t('FieldSelectCreate.refetch'), icon: _jsx(UpdateSVG, {}), iconPosition: ICON_POSITION.After, onClick: onRefetch, "data-test-id": TEST_IDS.fieldSelectCreateRetry })) : undefined,
|
|
24
|
+
},
|
|
25
|
+
}), [entityIcon, entityName, onRefetch, t]);
|
|
26
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './FieldChat/index.js';
|
|
2
|
+
export * from './FieldCode/index.js';
|
|
3
|
+
export * from './FieldDescription/index.js';
|
|
4
|
+
export * from './FieldMask/index.js';
|
|
5
|
+
export * from './FieldName/index.js';
|
|
6
|
+
export * from './FieldPhone/index.js';
|
|
7
|
+
export * from './FieldSelectCreate/index.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './FieldChat/index.js';
|
|
2
|
+
export * from './FieldCode/index.js';
|
|
3
|
+
export * from './FieldDescription/index.js';
|
|
4
|
+
export * from './FieldMask/index.js';
|
|
5
|
+
export * from './FieldName/index.js';
|
|
6
|
+
export * from './FieldPhone/index.js';
|
|
7
|
+
export * from './FieldSelectCreate/index.js';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const TEST_IDS: {
|
|
2
|
+
readonly fieldMask: "field-mask";
|
|
3
|
+
readonly fieldName: "field-name";
|
|
4
|
+
readonly fieldDescription: "field-description";
|
|
5
|
+
readonly fieldDescriptionAddButton: "field-description__add-button";
|
|
6
|
+
readonly fieldPhone: "field-phone";
|
|
7
|
+
readonly fieldPhoneCountrySelect: "field-phone__country-select";
|
|
8
|
+
readonly fieldChat: "field-chat";
|
|
9
|
+
readonly fieldCode: "field-code";
|
|
10
|
+
readonly fieldCodeCell: "field-code__cell";
|
|
11
|
+
readonly fieldCodeResend: "field-code__resend";
|
|
12
|
+
readonly fieldChatUpload: "field-chat__upload";
|
|
13
|
+
readonly fieldChatSubmit: "field-chat__submit";
|
|
14
|
+
readonly fieldSelectCreate: "field-select-create";
|
|
15
|
+
readonly fieldSelectCreateButton: "field-select-create__button";
|
|
16
|
+
readonly fieldSelectCreateFooterButton: "field-select-create__footer-button";
|
|
17
|
+
readonly fieldSelectCreateRetry: "field-select-create__retry";
|
|
18
|
+
readonly fieldSelectCreateSurface: "field-select-create__surface";
|
|
19
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const TEST_IDS = {
|
|
2
|
+
fieldMask: 'field-mask',
|
|
3
|
+
fieldName: 'field-name',
|
|
4
|
+
fieldDescription: 'field-description',
|
|
5
|
+
fieldDescriptionAddButton: 'field-description__add-button',
|
|
6
|
+
fieldPhone: 'field-phone',
|
|
7
|
+
fieldPhoneCountrySelect: 'field-phone__country-select',
|
|
8
|
+
fieldChat: 'field-chat',
|
|
9
|
+
fieldCode: 'field-code',
|
|
10
|
+
fieldCodeCell: 'field-code__cell',
|
|
11
|
+
fieldCodeResend: 'field-code__resend',
|
|
12
|
+
fieldChatUpload: 'field-chat__upload',
|
|
13
|
+
fieldChatSubmit: 'field-chat__submit',
|
|
14
|
+
fieldSelectCreate: 'field-select-create',
|
|
15
|
+
fieldSelectCreateButton: 'field-select-create__button',
|
|
16
|
+
fieldSelectCreateFooterButton: 'field-select-create__footer-button',
|
|
17
|
+
fieldSelectCreateRetry: 'field-select-create__retry',
|
|
18
|
+
fieldSelectCreateSurface: 'field-select-create__surface',
|
|
19
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Возвращает количество символов для маски — со скобками и без.
|
|
3
|
+
*/
|
|
4
|
+
export function getSymbolsRangeFromMask(mask = '') {
|
|
5
|
+
// Считаем все 'X' и цифры в строке.
|
|
6
|
+
const maxNumberLength = (mask.match(/[X\d]/g) || []).length;
|
|
7
|
+
// Удаляем содержимое внутри скобок (включая сами скобки) для подсчёта без их содержимого.
|
|
8
|
+
const stringWithoutBrackets = mask.replace(/\[[^\]]*\]/g, '');
|
|
9
|
+
// Считаем 'X' и цифры после удаления содержимого в скобках.
|
|
10
|
+
const minNumberLength = (stringWithoutBrackets.match(/[X\d]/g) || []).length;
|
|
11
|
+
return { minNumberLength, maxNumberLength };
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getSymbolsRangeFromMask.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getSymbolsRangeFromMask.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AnySchema, ValidationError } from 'yup';
|
|
2
|
+
export type UseFieldValidationProps = {
|
|
3
|
+
schema: AnySchema;
|
|
4
|
+
};
|
|
5
|
+
export declare const useCustomFieldValidation: ({ schema }: UseFieldValidationProps) => {
|
|
6
|
+
validate: (value: string) => {
|
|
7
|
+
error: null;
|
|
8
|
+
} | {
|
|
9
|
+
error: ValidationError;
|
|
10
|
+
};
|
|
11
|
+
validateRHF: (value: string) => string | true | undefined;
|
|
12
|
+
};
|