@cloud-ru/uikit-product-fields-predefined 0.13.11 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +161 -0
  3. package/dist/cjs/components/FieldAi/FieldAi.d.ts +2 -2
  4. package/dist/cjs/components/FieldAi/components/MobileFieldAi/MobileFieldAi.d.ts +1 -1
  5. package/dist/cjs/components/FieldDescription/FieldDescription.d.ts +12 -0
  6. package/dist/cjs/components/FieldDescription/FieldDescription.js +68 -0
  7. package/dist/cjs/components/FieldDescription/FieldDescriptionRHF.d.ts +11 -0
  8. package/dist/cjs/components/FieldDescription/FieldDescriptionRHF.js +62 -0
  9. package/dist/cjs/components/FieldDescription/components/FieldWithAddButton.d.ts +7 -0
  10. package/dist/cjs/components/FieldDescription/components/FieldWithAddButton.js +21 -0
  11. package/dist/cjs/components/FieldDescription/components/index.d.ts +1 -0
  12. package/dist/cjs/components/FieldDescription/components/index.js +5 -0
  13. package/dist/cjs/components/FieldDescription/constants.d.ts +1 -0
  14. package/dist/cjs/components/FieldDescription/constants.js +4 -0
  15. package/dist/cjs/components/FieldDescription/index.d.ts +3 -0
  16. package/dist/cjs/components/FieldDescription/index.js +7 -0
  17. package/dist/cjs/components/FieldDescription/types.d.ts +16 -0
  18. package/dist/cjs/components/FieldDescription/types.js +2 -0
  19. package/dist/cjs/components/FieldName/FieldName.d.ts +12 -0
  20. package/dist/cjs/components/FieldName/FieldName.js +95 -0
  21. package/dist/cjs/components/FieldName/FieldNameRHF.d.ts +11 -0
  22. package/dist/cjs/components/FieldName/FieldNameRHF.js +81 -0
  23. package/dist/cjs/components/FieldName/constants.d.ts +1 -0
  24. package/dist/cjs/components/FieldName/constants.js +4 -0
  25. package/dist/cjs/components/FieldName/index.d.ts +3 -0
  26. package/dist/cjs/components/FieldName/index.js +7 -0
  27. package/dist/cjs/components/FieldName/types.d.ts +15 -0
  28. package/dist/cjs/components/FieldName/types.js +2 -0
  29. package/dist/cjs/components/FieldPhone/FieldPhone.d.ts +1 -1
  30. package/dist/cjs/components/index.d.ts +2 -0
  31. package/dist/cjs/components/index.js +2 -0
  32. package/dist/cjs/hooks/index.d.ts +1 -0
  33. package/dist/cjs/hooks/index.js +1 -0
  34. package/dist/cjs/hooks/useCustomFieldValidation.d.ts +12 -0
  35. package/dist/cjs/hooks/useCustomFieldValidation.js +32 -0
  36. package/dist/esm/components/FieldAi/FieldAi.d.ts +2 -2
  37. package/dist/esm/components/FieldAi/components/MobileFieldAi/MobileFieldAi.d.ts +1 -1
  38. package/dist/esm/components/FieldDescription/FieldDescription.d.ts +12 -0
  39. package/dist/esm/components/FieldDescription/FieldDescription.js +62 -0
  40. package/dist/esm/components/FieldDescription/FieldDescriptionRHF.d.ts +11 -0
  41. package/dist/esm/components/FieldDescription/FieldDescriptionRHF.js +56 -0
  42. package/dist/esm/components/FieldDescription/components/FieldWithAddButton.d.ts +7 -0
  43. package/dist/esm/components/FieldDescription/components/FieldWithAddButton.js +18 -0
  44. package/dist/esm/components/FieldDescription/components/index.d.ts +1 -0
  45. package/dist/esm/components/FieldDescription/components/index.js +1 -0
  46. package/dist/esm/components/FieldDescription/constants.d.ts +1 -0
  47. package/dist/esm/components/FieldDescription/constants.js +1 -0
  48. package/dist/esm/components/FieldDescription/index.d.ts +3 -0
  49. package/dist/esm/components/FieldDescription/index.js +2 -0
  50. package/dist/esm/components/FieldDescription/types.d.ts +16 -0
  51. package/dist/esm/components/FieldDescription/types.js +1 -0
  52. package/dist/esm/components/FieldName/FieldName.d.ts +12 -0
  53. package/dist/esm/components/FieldName/FieldName.js +89 -0
  54. package/dist/esm/components/FieldName/FieldNameRHF.d.ts +11 -0
  55. package/dist/esm/components/FieldName/FieldNameRHF.js +75 -0
  56. package/dist/esm/components/FieldName/constants.d.ts +1 -0
  57. package/dist/esm/components/FieldName/constants.js +1 -0
  58. package/dist/esm/components/FieldName/index.d.ts +3 -0
  59. package/dist/esm/components/FieldName/index.js +2 -0
  60. package/dist/esm/components/FieldName/types.d.ts +15 -0
  61. package/dist/esm/components/FieldName/types.js +1 -0
  62. package/dist/esm/components/FieldPhone/FieldPhone.d.ts +1 -1
  63. package/dist/esm/components/index.d.ts +2 -0
  64. package/dist/esm/components/index.js +2 -0
  65. package/dist/esm/hooks/index.d.ts +1 -0
  66. package/dist/esm/hooks/index.js +1 -0
  67. package/dist/esm/hooks/useCustomFieldValidation.d.ts +12 -0
  68. package/dist/esm/hooks/useCustomFieldValidation.js +28 -0
  69. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  70. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  71. package/package.json +13 -11
  72. package/src/components/FieldDescription/FieldDescription.tsx +97 -0
  73. package/src/components/FieldDescription/FieldDescriptionRHF.tsx +93 -0
  74. package/src/components/FieldDescription/components/FieldWithAddButton.tsx +43 -0
  75. package/src/components/FieldDescription/components/index.ts +1 -0
  76. package/src/components/FieldDescription/constants.ts +1 -0
  77. package/src/components/FieldDescription/index.ts +3 -0
  78. package/src/components/FieldDescription/types.ts +23 -0
  79. package/src/components/FieldName/FieldName.tsx +125 -0
  80. package/src/components/FieldName/FieldNameRHF.tsx +112 -0
  81. package/src/components/FieldName/constants.ts +1 -0
  82. package/src/components/FieldName/index.ts +3 -0
  83. package/src/components/FieldName/types.ts +22 -0
  84. package/src/components/index.ts +2 -0
  85. package/src/hooks/index.ts +1 -0
  86. package/src/hooks/useCustomFieldValidation.ts +38 -0
@@ -0,0 +1,75 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import mergeRefs from 'merge-refs';
14
+ import { forwardRef, useMemo, useState } from 'react';
15
+ import { Controller, useFormContext } from 'react-hook-form';
16
+ import { string } from 'yup';
17
+ import { useLocale } from '@cloud-ru/uikit-product-locale';
18
+ import { AdaptiveFieldText } from '@cloud-ru/uikit-product-mobile-fields';
19
+ import { runAfterRerender } from '@snack-uikit/input-private';
20
+ import { useCustomFieldValidation } from '../../hooks';
21
+ import { DEFAULT_MAX_NAME_LENGTH } from './constants';
22
+ /**
23
+ * Поле имя c оберткой для React Hook Form
24
+ */
25
+ export const FieldNameRHF = forwardRef((props, ref) => {
26
+ const { t } = useLocale('FieldsPredefined');
27
+ const { controllerProps, maxLength = DEFAULT_MAX_NAME_LENGTH, required = true, customSchema, showLabel = true, size = 'm', allowMoreThanMaxLength = true, error: propError } = props, inputProps = __rest(props, ["controllerProps", "maxLength", "required", "customSchema", "showLabel", "size", "allowMoreThanMaxLength", "error"]);
28
+ const [isFocused, setIsFocused] = useState(false);
29
+ const { trigger } = useFormContext();
30
+ const validationSchema = useMemo(() => {
31
+ let baseSchema = string()
32
+ .test('maxLength', t('FieldName.maxSymbols', { max: maxLength }), value => {
33
+ if (!value)
34
+ return true;
35
+ return value.length <= maxLength;
36
+ })
37
+ .matches(/^[a-zA-Z0-9.\-_]*$/, {
38
+ message: t('FieldName.wrongSymbols'),
39
+ name: 'allowedSymbols',
40
+ excludeEmptyString: true,
41
+ });
42
+ if (customSchema) {
43
+ baseSchema = baseSchema.concat(customSchema);
44
+ }
45
+ return required ? baseSchema.required(t('FieldName.required')) : baseSchema;
46
+ }, [customSchema, maxLength, required, t]);
47
+ const { validateRHF } = useCustomFieldValidation({ schema: validationSchema });
48
+ const handleFocus = value => {
49
+ var _a;
50
+ setIsFocused(true);
51
+ (_a = inputProps.onFocus) === null || _a === void 0 ? void 0 : _a.call(inputProps, value);
52
+ };
53
+ return (_jsx(Controller, Object.assign({}, controllerProps, { rules: { validate: validateRHF }, render: ({ field: { value, ref: localRef, onBlur, onChange }, fieldState: { error } }) => {
54
+ var _a, _b;
55
+ const isRequiredError = Boolean(error && ((_a = error.message) === null || _a === void 0 ? void 0 : _a.match(t('FieldName.required'))));
56
+ const shouldShowCounter = error && (((_b = error.message) === null || _b === void 0 ? void 0 : _b.match(t('FieldName.maxSymbols', { max: maxLength }))) || isRequiredError);
57
+ // - Есть ошибка обязательного поля и поле не в фокусе
58
+ // - Или другая ошибка
59
+ // - Или принудительно показываем ошибку
60
+ const showError = error && ((isRequiredError && !isFocused) || !isRequiredError);
61
+ const errorMes = propError !== null && propError !== void 0 ? propError : error === null || error === void 0 ? void 0 : error.message;
62
+ const handleChange = (newValue) => {
63
+ var _a;
64
+ (_a = inputProps.onChange) === null || _a === void 0 ? void 0 : _a.call(inputProps, newValue);
65
+ onChange(newValue);
66
+ };
67
+ const handleBlur = value => {
68
+ var _a;
69
+ runAfterRerender(() => setIsFocused(false));
70
+ (_a = inputProps.onBlur) === null || _a === void 0 ? void 0 : _a.call(inputProps, value);
71
+ onBlur();
72
+ };
73
+ return (_jsx(AdaptiveFieldText, Object.assign({}, inputProps, { inputMode: 'text', onClearButtonClick: () => trigger(controllerProps.name), allowMoreThanMaxLength: allowMoreThanMaxLength, ref: mergeRefs(ref, localRef), value: value, onChange: handleChange, onFocus: handleFocus, onBlur: handleBlur, validationState: showError ? 'error' : inputProps.validationState, hint: showError ? errorMes : undefined, maxLength: shouldShowCounter && showError ? maxLength : undefined, size: size, label: showLabel ? t('FieldName.label') : undefined, caption: !required ? t('FieldDescription.optional') : undefined })));
74
+ } })));
75
+ });
@@ -0,0 +1 @@
1
+ export declare const DEFAULT_MAX_NAME_LENGTH = 64;
@@ -0,0 +1 @@
1
+ export const DEFAULT_MAX_NAME_LENGTH = 64;
@@ -0,0 +1,3 @@
1
+ export { FieldName } from './FieldName';
2
+ export { FieldNameRHF } from './FieldNameRHF';
3
+ export type { BaseFieldNameProps, FieldNameRHFProps, FieldNameProps } from './types';
@@ -0,0 +1,2 @@
1
+ export { FieldName } from './FieldName';
2
+ export { FieldNameRHF } from './FieldNameRHF';
@@ -0,0 +1,15 @@
1
+ import { ControllerProps, FieldValues } from 'react-hook-form';
2
+ import { StringSchema, ValidationError } from 'yup';
3
+ import { FieldTextProps } from '@cloud-ru/uikit-product-mobile-fields';
4
+ export type BaseFieldNameProps = Omit<FieldTextProps, 'placeholder' | 'label' | 'footer' | 'type' | 'inputMode' | 'caption' | 'hint'> & {
5
+ showLabel?: boolean;
6
+ customSchema?: StringSchema;
7
+ };
8
+ export type FieldNameProps = BaseFieldNameProps & {
9
+ /** Колбэк, вызываемый при изменении ошибки валидации */
10
+ onValidationError?: (error: ValidationError | null) => void;
11
+ };
12
+ export type FieldNameRHFProps = BaseFieldNameProps & {
13
+ /** Режим контроллера с использованием react-hook-form */
14
+ controllerProps: Omit<ControllerProps<FieldValues>, 'render' | 'rules' | 'disabled'>;
15
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -21,5 +21,5 @@ export declare const FieldPhone: import("react").ForwardRefExoticComponent<Omit<
21
21
  /** options — объект конфигурации для изменения стандартного списка стран */
22
22
  options?: CountrySettings;
23
23
  } & {
24
- layoutType: import("@cloud-ru/uikit-product-utils/.").LayoutType;
24
+ layoutType: import("@cloud-ru/uikit-product-utils").LayoutType;
25
25
  } & import("react").RefAttributes<HTMLInputElement>>;
@@ -3,3 +3,5 @@ export * from './SelectCreate';
3
3
  export * from './FieldAi';
4
4
  export * from './FieldChat';
5
5
  export * from './AIDisclaimer';
6
+ export * from './FieldName';
7
+ export * from './FieldDescription';
@@ -3,3 +3,5 @@ export * from './SelectCreate';
3
3
  export * from './FieldAi';
4
4
  export * from './FieldChat';
5
5
  export * from './AIDisclaimer';
6
+ export * from './FieldName';
7
+ export * from './FieldDescription';
@@ -1 +1,2 @@
1
1
  export * from './useOpen';
2
+ export * from './useCustomFieldValidation';
@@ -1 +1,2 @@
1
1
  export * from './useOpen';
2
+ export * from './useCustomFieldValidation';
@@ -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
+ };
@@ -0,0 +1,28 @@
1
+ import { useCallback } from 'react';
2
+ import { ValidationError } from 'yup';
3
+ export const useCustomFieldValidation = ({ schema }) => {
4
+ const validate = useCallback((value) => {
5
+ try {
6
+ schema.validateSync(value);
7
+ return { error: null };
8
+ }
9
+ catch (err) {
10
+ if (err instanceof ValidationError) {
11
+ return { error: err };
12
+ }
13
+ return { error: null };
14
+ }
15
+ }, [schema]);
16
+ const validateRHF = useCallback((value) => {
17
+ try {
18
+ schema.validateSync(value);
19
+ return true;
20
+ }
21
+ catch (err) {
22
+ if (err instanceof ValidationError)
23
+ return err.message;
24
+ return;
25
+ }
26
+ }, [schema]);
27
+ return { validate, validateRHF };
28
+ };