@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.
- package/CHANGELOG.md +22 -0
- package/README.md +161 -0
- package/dist/cjs/components/FieldAi/FieldAi.d.ts +2 -2
- package/dist/cjs/components/FieldAi/components/MobileFieldAi/MobileFieldAi.d.ts +1 -1
- package/dist/cjs/components/FieldDescription/FieldDescription.d.ts +12 -0
- package/dist/cjs/components/FieldDescription/FieldDescription.js +68 -0
- package/dist/cjs/components/FieldDescription/FieldDescriptionRHF.d.ts +11 -0
- package/dist/cjs/components/FieldDescription/FieldDescriptionRHF.js +62 -0
- package/dist/cjs/components/FieldDescription/components/FieldWithAddButton.d.ts +7 -0
- package/dist/cjs/components/FieldDescription/components/FieldWithAddButton.js +21 -0
- package/dist/cjs/components/FieldDescription/components/index.d.ts +1 -0
- package/dist/cjs/components/FieldDescription/components/index.js +5 -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 +7 -0
- package/dist/cjs/components/FieldDescription/types.d.ts +16 -0
- package/dist/cjs/components/FieldDescription/types.js +2 -0
- package/dist/cjs/components/FieldName/FieldName.d.ts +12 -0
- package/dist/cjs/components/FieldName/FieldName.js +95 -0
- package/dist/cjs/components/FieldName/FieldNameRHF.d.ts +11 -0
- package/dist/cjs/components/FieldName/FieldNameRHF.js +81 -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 +7 -0
- package/dist/cjs/components/FieldName/types.d.ts +15 -0
- package/dist/cjs/components/FieldName/types.js +2 -0
- package/dist/cjs/components/FieldPhone/FieldPhone.d.ts +1 -1
- package/dist/cjs/components/index.d.ts +2 -0
- package/dist/cjs/components/index.js +2 -0
- package/dist/cjs/hooks/index.d.ts +1 -0
- package/dist/cjs/hooks/index.js +1 -0
- package/dist/cjs/hooks/useCustomFieldValidation.d.ts +12 -0
- package/dist/cjs/hooks/useCustomFieldValidation.js +32 -0
- package/dist/esm/components/FieldAi/FieldAi.d.ts +2 -2
- package/dist/esm/components/FieldAi/components/MobileFieldAi/MobileFieldAi.d.ts +1 -1
- package/dist/esm/components/FieldDescription/FieldDescription.d.ts +12 -0
- package/dist/esm/components/FieldDescription/FieldDescription.js +62 -0
- package/dist/esm/components/FieldDescription/FieldDescriptionRHF.d.ts +11 -0
- package/dist/esm/components/FieldDescription/FieldDescriptionRHF.js +56 -0
- package/dist/esm/components/FieldDescription/components/FieldWithAddButton.d.ts +7 -0
- package/dist/esm/components/FieldDescription/components/FieldWithAddButton.js +18 -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 +2 -0
- package/dist/esm/components/FieldDescription/types.d.ts +16 -0
- package/dist/esm/components/FieldDescription/types.js +1 -0
- package/dist/esm/components/FieldName/FieldName.d.ts +12 -0
- package/dist/esm/components/FieldName/FieldName.js +89 -0
- package/dist/esm/components/FieldName/FieldNameRHF.d.ts +11 -0
- package/dist/esm/components/FieldName/FieldNameRHF.js +75 -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 +2 -0
- package/dist/esm/components/FieldName/types.d.ts +15 -0
- package/dist/esm/components/FieldName/types.js +1 -0
- package/dist/esm/components/FieldPhone/FieldPhone.d.ts +1 -1
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/components/index.js +2 -0
- package/dist/esm/hooks/index.d.ts +1 -0
- package/dist/esm/hooks/index.js +1 -0
- package/dist/esm/hooks/useCustomFieldValidation.d.ts +12 -0
- package/dist/esm/hooks/useCustomFieldValidation.js +28 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +13 -11
- package/src/components/FieldDescription/FieldDescription.tsx +97 -0
- package/src/components/FieldDescription/FieldDescriptionRHF.tsx +93 -0
- package/src/components/FieldDescription/components/FieldWithAddButton.tsx +43 -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/FieldName/FieldName.tsx +125 -0
- package/src/components/FieldName/FieldNameRHF.tsx +112 -0
- package/src/components/FieldName/constants.ts +1 -0
- package/src/components/FieldName/index.ts +3 -0
- package/src/components/FieldName/types.ts +22 -0
- package/src/components/index.ts +2 -0
- package/src/hooks/index.ts +1 -0
- 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,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
|
|
24
|
+
layoutType: import("@cloud-ru/uikit-product-utils").LayoutType;
|
|
25
25
|
} & import("react").RefAttributes<HTMLInputElement>>;
|
package/dist/esm/hooks/index.js
CHANGED
|
@@ -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
|
+
};
|