@snack-uikit/fields 0.10.4 → 0.11.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 +9 -5
- package/dist/components/FieldDate/FieldDate.d.ts +6 -1
- package/dist/components/FieldDate/FieldDate.js +2 -2
- package/dist/components/FieldDecorator/styles.module.css +3 -0
- package/dist/components/FieldSecure/FieldSecure.d.ts +1 -1
- package/dist/components/FieldSelect/FieldSelectBase.js +1 -1
- package/dist/components/FieldSelect/FieldSelectMulti.d.ts +1 -0
- package/dist/components/FieldSelect/FieldSelectMulti.js +2 -1
- package/dist/components/FieldSelect/FieldSelectSingle.d.ts +1 -0
- package/dist/components/FieldSelect/FieldSelectSingle.js +2 -1
- package/dist/components/FieldSelect/hooks/useList.d.ts +2 -1
- package/dist/components/FieldSelect/hooks/useList.js +2 -2
- package/dist/components/FieldSelect/types.d.ts +6 -1
- package/dist/components/FieldText/FieldText.d.ts +6 -1
- package/dist/components/FieldText/FieldText.js +2 -2
- package/dist/components/FieldTextArea/FieldTextArea.d.ts +6 -1
- package/dist/components/FieldTextArea/FieldTextArea.js +2 -2
- package/package.json +2 -2
- package/src/components/FieldDate/FieldDate.tsx +8 -2
- package/src/components/FieldDecorator/styles.module.scss +4 -0
- package/src/components/FieldSecure/FieldSecure.tsx +1 -1
- package/src/components/FieldSelect/FieldSelectBase.tsx +1 -1
- package/src/components/FieldSelect/FieldSelectMulti.tsx +2 -0
- package/src/components/FieldSelect/FieldSelectSingle.tsx +2 -0
- package/src/components/FieldSelect/hooks/useList.ts +3 -1
- package/src/components/FieldSelect/types.ts +6 -1
- package/src/components/FieldText/FieldText.tsx +8 -2
- package/src/components/FieldTextArea/FieldTextArea.tsx +8 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,28 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## 0.11.1 (2024-01-22)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **FF-4103:** make fields fit parent container ([4312de4](https://github.com/cloud-ru-tech/snack-uikit/commit/4312de4eefb07eed5daf6806274422f61a8063ab))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# 0.11.0 (2024-01-18)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* **FF-4096:** add showClearButton prop ([1e619be](https://github.com/cloud-ru-tech/snack-uikit/commit/1e619befffcc5b50f44cda18edac5b6be2dff60d))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
6
28
|
## 0.10.4 (2023-12-28)
|
|
7
29
|
|
|
8
30
|
### Only dependencies have been changed
|
package/README.md
CHANGED
|
@@ -180,7 +180,8 @@ const [isOpen, setIsOpen] = useState(false);
|
|
|
180
180
|
### Props
|
|
181
181
|
| name | type | default value | description |
|
|
182
182
|
|------|------|---------------|-------------|
|
|
183
|
-
| showCopyButton | `boolean` | - |
|
|
183
|
+
| showCopyButton | `boolean` | - | Отображение кнопки Копировать для поля (актуально только для `readonly = true`) |
|
|
184
|
+
| showClearButton | `boolean` | true | Отображение кнопки очистки поля |
|
|
184
185
|
| allowMoreThanMaxLength | `boolean` | - | Можно ли вводить больше разрешённого кол-ва символов |
|
|
185
186
|
| prefixIcon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка-префикс для поля |
|
|
186
187
|
| value | `string` | - | Значение input |
|
|
@@ -211,7 +212,8 @@ const [isOpen, setIsOpen] = useState(false);
|
|
|
211
212
|
| maxRows | `number` | - | Максимальное кол-во строк, до которого размер поля может быть увеличен |
|
|
212
213
|
| resizable | `boolean` | - | Может ли ли пользователь изменять размеры поля (если св-во не включено, поле автоматически меняет свой размер) |
|
|
213
214
|
| onChange | `(value: string, e?: ChangeEvent<HTMLTextAreaElement>) => void` | - | Колбек смены значения |
|
|
214
|
-
| showCopyButton | `boolean` | - |
|
|
215
|
+
| showCopyButton | `boolean` | - | Отображение кнопки Копировать для поля (актуально только для `readonly = true`) |
|
|
216
|
+
| showClearButton | `boolean` | true | Отображение кнопки очистки поля |
|
|
215
217
|
| allowMoreThanMaxLength | `boolean` | true | Можно ли вводить больше разрешённого кол-ва символов |
|
|
216
218
|
| value | `string` | - | HTML-аттрибут value |
|
|
217
219
|
| disabled | `boolean` | - | Является ли поле деактивированным |
|
|
@@ -239,7 +241,7 @@ const [isOpen, setIsOpen] = useState(false);
|
|
|
239
241
|
|------|------|---------------|-------------|
|
|
240
242
|
| hidden | `boolean` | - | Замаскированно ли значение поля |
|
|
241
243
|
| onHiddenChange | `(value: boolean) => void` | - | Колбек смены маскирования |
|
|
242
|
-
| showCopyButton | `boolean` | - |
|
|
244
|
+
| showCopyButton | `boolean` | - | Отображение кнопки копирования |
|
|
243
245
|
| allowMoreThanMaxLength | `boolean` | - | Можно ли вводить больше разрешённого кол-ва символов |
|
|
244
246
|
| prefixIcon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка-префикс для поля |
|
|
245
247
|
| value | `string` | - | Значение input |
|
|
@@ -271,7 +273,8 @@ const [isOpen, setIsOpen] = useState(false);
|
|
|
271
273
|
| open | `boolean` | - | Открыт date-picker |
|
|
272
274
|
| onOpenChange | `(value: boolean) => void` | - | Колбек открытия пикера |
|
|
273
275
|
| onChange | `(value: string) => void` | - | Колбек смены значения |
|
|
274
|
-
| showCopyButton | `boolean` | - |
|
|
276
|
+
| showCopyButton | `boolean` | - | Отображение кнопки копирования |
|
|
277
|
+
| showClearButton | `boolean` | true | Отображение кнопки Очистки поля |
|
|
275
278
|
| locale | `Locale` | new Intl.Locale('ru-RU') | Текущая локаль календаря |
|
|
276
279
|
| disabled | `boolean` | - | Является ли поле деактивированным |
|
|
277
280
|
| readonly | `boolean` | - | Является ли поле доступным только для чтения |
|
|
@@ -299,7 +302,8 @@ const [isOpen, setIsOpen] = useState(false);
|
|
|
299
302
|
| open | `boolean` | - | Открыт ли выпадающий список |
|
|
300
303
|
| onOpenChange | `(value: boolean) => void` | - | Колбек открытия выпадающего списка |
|
|
301
304
|
| searchable | `boolean` | - | Можно ли искать опции внутри списка |
|
|
302
|
-
| showCopyButton | `boolean` | - |
|
|
305
|
+
| showCopyButton | `boolean` | - | Отображение кнопки Копировать для поля (актуально только для `readonly = true`) |
|
|
306
|
+
| showClearButton | `boolean` | true | Отображение кнопки очистки поля |
|
|
303
307
|
| prefixIcon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка-префикс для поля |
|
|
304
308
|
| noDataText | `string` | - | Текст отсутствия доступных значений |
|
|
305
309
|
| locale | `Locale` | - | Текущая локаль |
|
|
@@ -11,8 +11,13 @@ type FieldDateOwnProps = {
|
|
|
11
11
|
onOpenChange?(value: boolean): void;
|
|
12
12
|
/** Колбек смены значения */
|
|
13
13
|
onChange?(value: string): void;
|
|
14
|
-
/**
|
|
14
|
+
/** Отображение кнопки копирования */
|
|
15
15
|
showCopyButton?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Отображение кнопки Очистки поля
|
|
18
|
+
* @default true
|
|
19
|
+
*/
|
|
20
|
+
showClearButton?: boolean;
|
|
16
21
|
/** Текущая локаль календаря */
|
|
17
22
|
locale?: Intl.Locale;
|
|
18
23
|
};
|
|
@@ -34,7 +34,7 @@ const CALENDAR_SIZE_MAP = {
|
|
|
34
34
|
[SIZE.L]: 'm',
|
|
35
35
|
};
|
|
36
36
|
export const FieldDate = forwardRef((_a, ref) => {
|
|
37
|
-
var { id, name, value: valueProp, disabled = false, readonly = false, showCopyButton: showCopyButtonProp = true, open, onOpenChange, onChange, onFocus, onBlur: onBlurProp, className, label, labelTooltip, labelTooltipPlacement, required = false, hint, showHintIcon, size = SIZE.S, validationState = VALIDATION_STATE.Default, locale = DEFAULT_LOCALE } = _a, rest = __rest(_a, ["id", "name", "value", "disabled", "readonly", "showCopyButton", "open", "onOpenChange", "onChange", "onFocus", "onBlur", "className", "label", "labelTooltip", "labelTooltipPlacement", "required", "hint", "showHintIcon", "size", "validationState", "locale"]);
|
|
37
|
+
var { id, name, value: valueProp, disabled = false, readonly = false, showCopyButton: showCopyButtonProp = true, showClearButton: showClearButtonProp = true, open, onOpenChange, onChange, onFocus, onBlur: onBlurProp, className, label, labelTooltip, labelTooltipPlacement, required = false, hint, showHintIcon, size = SIZE.S, validationState = VALIDATION_STATE.Default, locale = DEFAULT_LOCALE } = _a, rest = __rest(_a, ["id", "name", "value", "disabled", "readonly", "showCopyButton", "showClearButton", "open", "onOpenChange", "onChange", "onFocus", "onBlur", "className", "label", "labelTooltip", "labelTooltipPlacement", "required", "hint", "showHintIcon", "size", "validationState", "locale"]);
|
|
38
38
|
const [isOpen, setIsOpen] = useUncontrolledProp(open, false, onOpenChange);
|
|
39
39
|
const [pickerAutofocus, setPickerAutofocus] = useState(false);
|
|
40
40
|
const localRef = useRef(null);
|
|
@@ -43,7 +43,7 @@ export const FieldDate = forwardRef((_a, ref) => {
|
|
|
43
43
|
const calendarIconSize = size === SIZE.S ? ICON_SIZE.Xs : ICON_SIZE.S;
|
|
44
44
|
const showDropList = isOpen && !readonly && !disabled;
|
|
45
45
|
const showAdditionalButton = Boolean(valueProp && !disabled);
|
|
46
|
-
const showClearButton = showAdditionalButton && !readonly;
|
|
46
|
+
const showClearButton = showClearButtonProp && showAdditionalButton && !readonly;
|
|
47
47
|
const showCopyButton = showCopyButtonProp && showAdditionalButton && readonly;
|
|
48
48
|
const checkForLeavingFocus = useCallback((event) => {
|
|
49
49
|
if (event.key === 'ArrowDown') {
|
|
@@ -9,7 +9,7 @@ type FieldSecureOwnProps = {
|
|
|
9
9
|
hidden?: boolean;
|
|
10
10
|
/** Колбек смены маскирования */
|
|
11
11
|
onHiddenChange?(value: boolean): void;
|
|
12
|
-
/**
|
|
12
|
+
/** Отображение кнопки копирования */
|
|
13
13
|
showCopyButton?: boolean;
|
|
14
14
|
/** Можно ли вводить больше разрешённого кол-ва символов */
|
|
15
15
|
allowMoreThanMaxLength?: boolean;
|
|
@@ -47,5 +47,5 @@ export const FieldSelectBase = forwardRef((_a, ref) => {
|
|
|
47
47
|
},
|
|
48
48
|
onDroplistFocusLeave,
|
|
49
49
|
]);
|
|
50
|
-
return (_jsx(FieldDecorator, Object.assign({ className: className, label: label, labelTooltip: labelTooltip, labelTooltipPlacement: labelTooltipPlacement, labelFor: id, required: required, hint: hint, disabled: disabled, readonly: readonly, showHintIcon: showHintIcon, size: size, validationState: validationState }, extractSupportProps(rest), { children: _jsx(Droplist, Object.assign({ trigger: 'click', triggerClassName: styles.triggerClassName, triggerClickByKeys: !searchable, placement: 'bottom', onFocusLeave: onFocusLeaveHandler, firstElementRefCallback: firstDroplistItemRefCallback, "data-test-id": 'field-select__list' }, (readonly || disabled ? { open: false } : { open, onOpenChange }), { triggerElement: _jsxs(FieldContainerPrivate, { className: styles.container, size: size, validationState: validationState, disabled: disabled, readonly: readonly, variant: CONTAINER_VARIANT.SingleLine, focused: open, selectable: !searchable, inputRef: localRef, prefix: prefixIcon, onMouseDown: onContainerPrivateMouseDown, postfix: _jsxs(_Fragment, { children: [buttons, _jsx(ArrowIcon, { size: arrowIconSize, className: styles.arrowIcon })] }), children: [_jsx(InputPrivate, { id: id, name: name, type: 'text', placeholder: placeholder, ref: mergeRefs(ref, localRef), onFocus: onFocus, onBlur: onBlur, disabled: disabled, "data-size": size, "data-test-id": 'field-select__input', onKeyDown: onInputKeyDownHandler, onChange: searchable ? onInputValueChange : undefined, readonly: !searchable || readonly, value: inputValue, tabIndex: inputTabIndex }), displayedValue && (_jsx("span", { className: styles.displayValue, "data-test-id": 'field-select__displayed-value', children: displayedValue }))] }), children: options.length === 0 ? (_jsx(Droplist.NoData, { size: size, label: noDataText, "data-test-id": 'field-select__no-data' })) : (options.map(option => (_jsx(Item, Object.assign({ onChange: onChange(option), "data-test-id": 'field-select__list-option-' + option.value }, option, { option: option.label }), option.value)))) })) })));
|
|
50
|
+
return (_jsx(FieldDecorator, Object.assign({ className: className, label: label, labelTooltip: labelTooltip, labelTooltipPlacement: labelTooltipPlacement, labelFor: id, required: required, hint: hint, disabled: disabled, readonly: readonly, showHintIcon: showHintIcon, size: size, validationState: validationState }, extractSupportProps(rest), { children: _jsx(Droplist, Object.assign({ trigger: 'click', triggerClassName: styles.triggerClassName, triggerClickByKeys: !searchable, placement: 'bottom', onFocusLeave: onFocusLeaveHandler, firstElementRefCallback: firstDroplistItemRefCallback, "data-test-id": 'field-select__list' }, (readonly || disabled ? { open: false } : { open, onOpenChange }), { triggerElement: _jsxs(FieldContainerPrivate, { className: styles.container, size: size, validationState: validationState, disabled: disabled, readonly: readonly, variant: CONTAINER_VARIANT.SingleLine, focused: open, selectable: !searchable, inputRef: localRef, prefix: prefixIcon, onMouseDown: onContainerPrivateMouseDown, postfix: _jsxs(_Fragment, { children: [buttons, _jsx(ArrowIcon, { size: arrowIconSize, className: styles.arrowIcon })] }), children: [_jsx(InputPrivate, { id: id, name: name, type: 'text', placeholder: displayedValue ? undefined : placeholder, ref: mergeRefs(ref, localRef), onFocus: onFocus, onBlur: onBlur, disabled: disabled, "data-size": size, "data-test-id": 'field-select__input', onKeyDown: onInputKeyDownHandler, onChange: searchable ? onInputValueChange : undefined, readonly: !searchable || readonly, value: inputValue, tabIndex: inputTabIndex }), displayedValue && (_jsx("span", { className: styles.displayValue, "data-test-id": 'field-select__displayed-value', children: displayedValue }))] }), children: options.length === 0 ? (_jsx(Droplist.NoData, { size: size, label: noDataText, "data-test-id": 'field-select__no-data' })) : (options.map(option => (_jsx(Item, Object.assign({ onChange: onChange(option), "data-test-id": 'field-select__list-option-' + option.value }, option, { option: option.label }), option.value)))) })) })));
|
|
51
51
|
});
|
|
@@ -8,6 +8,7 @@ export declare const FieldSelectMulti: import("react").ForwardRefExoticComponent
|
|
|
8
8
|
onOpenChange?(value: boolean): void;
|
|
9
9
|
searchable?: boolean | undefined;
|
|
10
10
|
showCopyButton?: boolean | undefined;
|
|
11
|
+
showClearButton?: boolean | undefined;
|
|
11
12
|
prefixIcon?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
12
13
|
noDataText?: string | undefined;
|
|
13
14
|
locale?: Intl.Locale | undefined;
|
|
@@ -17,7 +17,7 @@ import { FieldSelectBase } from './FieldSelectBase';
|
|
|
17
17
|
import { getDisplayedValue } from './helpers';
|
|
18
18
|
import { useList } from './hooks';
|
|
19
19
|
export const FieldSelectMulti = forwardRef((_a, ref) => {
|
|
20
|
-
var { value: valueProp, onChange, options, disabled = false, readonly = false, searchable = true, required = false, open, onOpenChange, locale = DEFAULT_LOCALE, getSelectedItemsText = number => ((locale === null || locale === void 0 ? void 0 : locale.language) === 'ru' ? `Выбрано: ${number}` : `Selected: ${number}`), showCopyButton: showCopyButtonProp = true, onFocus, onBlur } = _a, rest = __rest(_a, ["value", "onChange", "options", "disabled", "readonly", "searchable", "required", "open", "onOpenChange", "locale", "getSelectedItemsText", "showCopyButton", "onFocus", "onBlur"]);
|
|
20
|
+
var { value: valueProp, onChange, options, disabled = false, readonly = false, searchable = true, required = false, open, onOpenChange, locale = DEFAULT_LOCALE, getSelectedItemsText = number => ((locale === null || locale === void 0 ? void 0 : locale.language) === 'ru' ? `Выбрано: ${number}` : `Selected: ${number}`), showCopyButton: showCopyButtonProp = true, showClearButton: showClearButtonProp = true, onFocus, onBlur } = _a, rest = __rest(_a, ["value", "onChange", "options", "disabled", "readonly", "searchable", "required", "open", "onOpenChange", "locale", "getSelectedItemsText", "showCopyButton", "showClearButton", "onFocus", "onBlur"]);
|
|
21
21
|
const selectionMode = SELECTION_MODE.Multi;
|
|
22
22
|
const [value, setValue] = useUncontrolledProp(valueProp, [], onChange);
|
|
23
23
|
const selected = useMemo(() => options.filter(option => value === null || value === void 0 ? void 0 : value.includes(option.value)), [options, value]);
|
|
@@ -42,6 +42,7 @@ export const FieldSelectMulti = forwardRef((_a, ref) => {
|
|
|
42
42
|
isChecked,
|
|
43
43
|
showAdditionalButton,
|
|
44
44
|
showCopyButton: showCopyButtonProp,
|
|
45
|
+
showClearButton: showClearButtonProp,
|
|
45
46
|
});
|
|
46
47
|
const handleOpenChange = (isOpen) => {
|
|
47
48
|
if (stayOpen.current) {
|
|
@@ -8,6 +8,7 @@ export declare const FieldSelectSingle: import("react").ForwardRefExoticComponen
|
|
|
8
8
|
onOpenChange?(value: boolean): void;
|
|
9
9
|
searchable?: boolean | undefined;
|
|
10
10
|
showCopyButton?: boolean | undefined;
|
|
11
|
+
showClearButton?: boolean | undefined;
|
|
11
12
|
prefixIcon?: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
12
13
|
noDataText?: string | undefined;
|
|
13
14
|
locale?: Intl.Locale | undefined;
|
|
@@ -18,7 +18,7 @@ import { FieldSelectBase } from './FieldSelectBase';
|
|
|
18
18
|
import { getDisplayedValue } from './helpers';
|
|
19
19
|
import { useList } from './hooks';
|
|
20
20
|
export const FieldSelectSingle = forwardRef((_a, ref) => {
|
|
21
|
-
var { value: valueProp, onChange, options, disabled = false, readonly = false, searchable = true, required = false, locale = DEFAULT_LOCALE, open, onOpenChange, showCopyButton: showCopyButtonProp = true } = _a, rest = __rest(_a, ["value", "onChange", "options", "disabled", "readonly", "searchable", "required", "locale", "open", "onOpenChange", "showCopyButton"]);
|
|
21
|
+
var { value: valueProp, onChange, options, disabled = false, readonly = false, searchable = true, required = false, locale = DEFAULT_LOCALE, open, onOpenChange, showCopyButton: showCopyButtonProp = true, showClearButton: showClearButtonProp = true } = _a, rest = __rest(_a, ["value", "onChange", "options", "disabled", "readonly", "searchable", "required", "locale", "open", "onOpenChange", "showCopyButton", "showClearButton"]);
|
|
22
22
|
const selectionMode = SELECTION_MODE.Single;
|
|
23
23
|
const [value, setValue] = useUncontrolledProp(valueProp, '', onChange);
|
|
24
24
|
const selected = useMemo(() => { var _a; return (_a = options.find(option => option.value === value)) !== null && _a !== void 0 ? _a : EMPTY_OPTION; }, [options, value]);
|
|
@@ -37,6 +37,7 @@ export const FieldSelectSingle = forwardRef((_a, ref) => {
|
|
|
37
37
|
options,
|
|
38
38
|
isChecked,
|
|
39
39
|
showCopyButton: showCopyButtonProp,
|
|
40
|
+
showClearButton: showClearButtonProp,
|
|
40
41
|
showAdditionalButton,
|
|
41
42
|
});
|
|
42
43
|
const handleOpenChange = (isOpen) => {
|
|
@@ -4,11 +4,12 @@ import { Option } from '../types';
|
|
|
4
4
|
type UseListProps = Pick<FieldSelectProps, 'readonly' | 'disabled' | 'open' | 'onOpenChange' | 'options' | 'showCopyButton'> & {
|
|
5
5
|
searchable: NonNullable<FieldSelectProps['searchable']>;
|
|
6
6
|
showAdditionalButton: boolean;
|
|
7
|
+
showClearButton: boolean;
|
|
7
8
|
inputValue: string;
|
|
8
9
|
setInputValue(value: string): void;
|
|
9
10
|
isChecked(option: Option): boolean;
|
|
10
11
|
};
|
|
11
|
-
export declare function useList({ open, onOpenChange, readonly, disabled, searchable, showAdditionalButton, showCopyButton: showCopyButtonProp, inputValue, setInputValue, options, isChecked, }: UseListProps): {
|
|
12
|
+
export declare function useList({ open, onOpenChange, readonly, disabled, searchable, showAdditionalButton, showCopyButton: showCopyButtonProp, showClearButton: showClearButtonProp, inputValue, setInputValue, options, isChecked, }: UseListProps): {
|
|
12
13
|
isOpen: boolean;
|
|
13
14
|
setIsOpen: (value: boolean) => void;
|
|
14
15
|
localRef: import("react").RefObject<HTMLInputElement>;
|
|
@@ -2,14 +2,14 @@ import { useEffect, useRef } from 'react';
|
|
|
2
2
|
import { useUncontrolledProp } from 'uncontrollable';
|
|
3
3
|
import { useFilteredOptions } from './useFilteredOptions';
|
|
4
4
|
import { useListNavigation } from './useListNavigation';
|
|
5
|
-
export function useList({ open, onOpenChange, readonly, disabled, searchable, showAdditionalButton, showCopyButton: showCopyButtonProp, inputValue, setInputValue, options, isChecked, }) {
|
|
5
|
+
export function useList({ open, onOpenChange, readonly, disabled, searchable, showAdditionalButton, showCopyButton: showCopyButtonProp, showClearButton: showClearButtonProp, inputValue, setInputValue, options, isChecked, }) {
|
|
6
6
|
const touched = useRef(false);
|
|
7
7
|
const localRef = useRef(null);
|
|
8
8
|
const clearButtonRef = useRef(null);
|
|
9
9
|
const copyButtonRef = useRef(null);
|
|
10
10
|
const [isOpen, setIsOpen] = useUncontrolledProp(open, false, onOpenChange);
|
|
11
11
|
const showDropList = isOpen && !readonly && !disabled;
|
|
12
|
-
const showClearButton = !readonly && (showAdditionalButton || inputValue.length > 0);
|
|
12
|
+
const showClearButton = showClearButtonProp && !readonly && (showAdditionalButton || inputValue.length > 0);
|
|
13
13
|
const showCopyButton = Boolean(showAdditionalButton && showCopyButtonProp && readonly);
|
|
14
14
|
const { extendedOptions, onInputKeyDown, onButtonKeyDown, onDroplistFocusLeave, firstDroplistItemRefCallback } = useListNavigation({
|
|
15
15
|
inputRef: localRef,
|
|
@@ -21,8 +21,13 @@ type FieldSelectOwnProps = {
|
|
|
21
21
|
onOpenChange?(value: boolean): void;
|
|
22
22
|
/** Можно ли искать опции внутри списка */
|
|
23
23
|
searchable?: boolean;
|
|
24
|
-
/**
|
|
24
|
+
/** Отображение кнопки Копировать для поля (актуально только для `readonly = true`) */
|
|
25
25
|
showCopyButton?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Отображение кнопки очистки поля
|
|
28
|
+
* @default true
|
|
29
|
+
*/
|
|
30
|
+
showClearButton?: boolean;
|
|
26
31
|
/** Иконка-префикс для поля */
|
|
27
32
|
prefixIcon?: ReactElement;
|
|
28
33
|
/** Текст отсутствия доступных значений */
|
|
@@ -5,8 +5,13 @@ import { FieldDecoratorProps } from '../FieldDecorator';
|
|
|
5
5
|
type InputProps = Pick<Partial<InputPrivateProps>, 'value' | 'onChange'> & Pick<InputPrivateProps, 'id' | 'name' | 'placeholder' | 'maxLength' | 'disabled' | 'readonly' | 'onFocus' | 'onBlur'>;
|
|
6
6
|
type WrapperProps = Pick<FieldDecoratorProps, 'className' | 'label' | 'labelTooltip' | 'required' | 'hint' | 'showHintIcon' | 'size' | 'validationState' | 'labelTooltipPlacement'>;
|
|
7
7
|
type FieldTextOwnProps = {
|
|
8
|
-
/**
|
|
8
|
+
/** Отображение кнопки Копировать для поля (актуально только для `readonly = true`) */
|
|
9
9
|
showCopyButton?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Отображение кнопки очистки поля
|
|
12
|
+
* @default true
|
|
13
|
+
*/
|
|
14
|
+
showClearButton?: boolean;
|
|
10
15
|
/** Можно ли вводить больше разрешённого кол-ва символов */
|
|
11
16
|
allowMoreThanMaxLength?: boolean;
|
|
12
17
|
/** Иконка-префикс для поля */
|
|
@@ -20,13 +20,13 @@ import { FieldContainerPrivate } from '../../helperComponents';
|
|
|
20
20
|
import { useCopyButton } from '../../hooks';
|
|
21
21
|
import { FieldDecorator } from '../FieldDecorator';
|
|
22
22
|
export const FieldText = forwardRef((_a, ref) => {
|
|
23
|
-
var { id, name, value: valueProp, placeholder, maxLength, disabled = false, readonly = false, showCopyButton: showCopyButtonProp = true, allowMoreThanMaxLength = false, onChange: onChangeProp, onFocus, onBlur, className, label, labelTooltip, labelTooltipPlacement, required = false, hint, showHintIcon, size = SIZE.S, validationState = VALIDATION_STATE.Default, prefixIcon } = _a, rest = __rest(_a, ["id", "name", "value", "placeholder", "maxLength", "disabled", "readonly", "showCopyButton", "allowMoreThanMaxLength", "onChange", "onFocus", "onBlur", "className", "label", "labelTooltip", "labelTooltipPlacement", "required", "hint", "showHintIcon", "size", "validationState", "prefixIcon"]);
|
|
23
|
+
var { id, name, value: valueProp, placeholder, maxLength, disabled = false, readonly = false, showCopyButton: showCopyButtonProp = true, showClearButton: showClearButtonProp = true, allowMoreThanMaxLength = false, onChange: onChangeProp, onFocus, onBlur, className, label, labelTooltip, labelTooltipPlacement, required = false, hint, showHintIcon, size = SIZE.S, validationState = VALIDATION_STATE.Default, prefixIcon } = _a, rest = __rest(_a, ["id", "name", "value", "placeholder", "maxLength", "disabled", "readonly", "showCopyButton", "showClearButton", "allowMoreThanMaxLength", "onChange", "onFocus", "onBlur", "className", "label", "labelTooltip", "labelTooltipPlacement", "required", "hint", "showHintIcon", "size", "validationState", "prefixIcon"]);
|
|
24
24
|
const [value, onChange] = useUncontrolledProp(valueProp, '', onChangeProp);
|
|
25
25
|
const localRef = useRef(null);
|
|
26
26
|
const clearButtonRef = useRef(null);
|
|
27
27
|
const copyButtonRef = useRef(null);
|
|
28
28
|
const showAdditionalButton = Boolean(value && !disabled);
|
|
29
|
-
const showClearButton = showAdditionalButton && !readonly;
|
|
29
|
+
const showClearButton = showClearButtonProp && showAdditionalButton && !readonly;
|
|
30
30
|
const showCopyButton = showCopyButtonProp && showAdditionalButton && readonly;
|
|
31
31
|
const onClear = () => {
|
|
32
32
|
var _a;
|
|
@@ -11,8 +11,13 @@ type FieldTextAreaOwnProps = {
|
|
|
11
11
|
resizable?: boolean;
|
|
12
12
|
/** Колбек смены значения */
|
|
13
13
|
onChange?(value: string, e?: ChangeEvent<HTMLTextAreaElement>): void;
|
|
14
|
-
/**
|
|
14
|
+
/** Отображение кнопки Копировать для поля (актуально только для `readonly = true`) */
|
|
15
15
|
showCopyButton?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Отображение кнопки очистки поля
|
|
18
|
+
* @default true
|
|
19
|
+
*/
|
|
20
|
+
showClearButton?: boolean;
|
|
16
21
|
/** Можно ли вводить больше разрешённого кол-ва символов */
|
|
17
22
|
allowMoreThanMaxLength?: boolean;
|
|
18
23
|
};
|
|
@@ -22,14 +22,14 @@ import { useCopyButton } from '../../hooks';
|
|
|
22
22
|
import { FieldDecorator } from '../FieldDecorator';
|
|
23
23
|
import styles from './styles.module.css';
|
|
24
24
|
export const FieldTextArea = forwardRef((_a, ref) => {
|
|
25
|
-
var { id, name, value: valueProp, placeholder, maxLength, maxRows, disabled = false, resizable = false, readonly = false, showCopyButton: showCopyButtonProp = true, allowMoreThanMaxLength = true, showHintIcon, onChange: onChangeProp, onFocus, onBlur, className, label, labelTooltip, labelTooltipPlacement, required = false, hint, size = SIZE.S, validationState = VALIDATION_STATE.Default } = _a, rest = __rest(_a, ["id", "name", "value", "placeholder", "maxLength", "maxRows", "disabled", "resizable", "readonly", "showCopyButton", "allowMoreThanMaxLength", "showHintIcon", "onChange", "onFocus", "onBlur", "className", "label", "labelTooltip", "labelTooltipPlacement", "required", "hint", "size", "validationState"]);
|
|
25
|
+
var { id, name, value: valueProp, placeholder, maxLength, maxRows, disabled = false, resizable = false, readonly = false, showCopyButton: showCopyButtonProp = true, showClearButton: showClearButtonProp = true, allowMoreThanMaxLength = true, showHintIcon, onChange: onChangeProp, onFocus, onBlur, className, label, labelTooltip, labelTooltipPlacement, required = false, hint, size = SIZE.S, validationState = VALIDATION_STATE.Default } = _a, rest = __rest(_a, ["id", "name", "value", "placeholder", "maxLength", "maxRows", "disabled", "resizable", "readonly", "showCopyButton", "showClearButton", "allowMoreThanMaxLength", "showHintIcon", "onChange", "onFocus", "onBlur", "className", "label", "labelTooltip", "labelTooltipPlacement", "required", "hint", "size", "validationState"]);
|
|
26
26
|
const localRef = useRef(null);
|
|
27
27
|
const clearButtonRef = useRef(null);
|
|
28
28
|
const copyButtonRef = useRef(null);
|
|
29
29
|
const isResizable = !readonly && !disabled && resizable;
|
|
30
30
|
const [value, onChange] = useUncontrolledProp(valueProp, '', onChangeProp);
|
|
31
31
|
const showCopyButton = showCopyButtonProp && Boolean(value) && !disabled && readonly;
|
|
32
|
-
const showClearButton = Boolean(value) && !disabled && !readonly;
|
|
32
|
+
const showClearButton = showClearButtonProp && Boolean(value) && !disabled && !readonly;
|
|
33
33
|
const onClear = () => {
|
|
34
34
|
var _a;
|
|
35
35
|
onChange('');
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Fields",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.11.1",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/merge-refs": "1.0.0"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "42116ba6d69b36f1482f94a55b8473e1baf472ec"
|
|
53
53
|
}
|
|
@@ -60,8 +60,13 @@ type FieldDateOwnProps = {
|
|
|
60
60
|
onOpenChange?(value: boolean): void;
|
|
61
61
|
/** Колбек смены значения */
|
|
62
62
|
onChange?(value: string): void;
|
|
63
|
-
/**
|
|
63
|
+
/** Отображение кнопки копирования */
|
|
64
64
|
showCopyButton?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Отображение кнопки Очистки поля
|
|
67
|
+
* @default true
|
|
68
|
+
*/
|
|
69
|
+
showClearButton?: boolean;
|
|
65
70
|
/** Текущая локаль календаря */
|
|
66
71
|
locale?: Intl.Locale;
|
|
67
72
|
};
|
|
@@ -83,6 +88,7 @@ export const FieldDate = forwardRef<HTMLInputElement, FieldDateProps>(
|
|
|
83
88
|
disabled = false,
|
|
84
89
|
readonly = false,
|
|
85
90
|
showCopyButton: showCopyButtonProp = true,
|
|
91
|
+
showClearButton: showClearButtonProp = true,
|
|
86
92
|
open,
|
|
87
93
|
onOpenChange,
|
|
88
94
|
onChange,
|
|
@@ -111,7 +117,7 @@ export const FieldDate = forwardRef<HTMLInputElement, FieldDateProps>(
|
|
|
111
117
|
const calendarIconSize = size === SIZE.S ? ICON_SIZE.Xs : ICON_SIZE.S;
|
|
112
118
|
const showDropList = isOpen && !readonly && !disabled;
|
|
113
119
|
const showAdditionalButton = Boolean(valueProp && !disabled);
|
|
114
|
-
const showClearButton = showAdditionalButton && !readonly;
|
|
120
|
+
const showClearButton = showClearButtonProp && showAdditionalButton && !readonly;
|
|
115
121
|
const showCopyButton = showCopyButtonProp && showAdditionalButton && readonly;
|
|
116
122
|
|
|
117
123
|
const checkForLeavingFocus = useCallback(
|
|
@@ -38,7 +38,7 @@ type FieldSecureOwnProps = {
|
|
|
38
38
|
hidden?: boolean;
|
|
39
39
|
/** Колбек смены маскирования */
|
|
40
40
|
onHiddenChange?(value: boolean): void;
|
|
41
|
-
/**
|
|
41
|
+
/** Отображение кнопки копирования */
|
|
42
42
|
showCopyButton?: boolean;
|
|
43
43
|
/** Можно ли вводить больше разрешённого кол-ва символов */
|
|
44
44
|
allowMoreThanMaxLength?: boolean;
|
|
@@ -180,7 +180,7 @@ export const FieldSelectBase = forwardRef<HTMLInputElement, Props>(
|
|
|
180
180
|
id={id}
|
|
181
181
|
name={name}
|
|
182
182
|
type='text'
|
|
183
|
-
placeholder={placeholder}
|
|
183
|
+
placeholder={displayedValue ? undefined : placeholder}
|
|
184
184
|
ref={mergeRefs(ref, localRef)}
|
|
185
185
|
onFocus={onFocus}
|
|
186
186
|
onBlur={onBlur}
|
|
@@ -22,6 +22,7 @@ export const FieldSelectMulti = forwardRef<HTMLInputElement, FieldSelectMultiPro
|
|
|
22
22
|
locale = DEFAULT_LOCALE,
|
|
23
23
|
getSelectedItemsText = number => (locale?.language === 'ru' ? `Выбрано: ${number}` : `Selected: ${number}`),
|
|
24
24
|
showCopyButton: showCopyButtonProp = true,
|
|
25
|
+
showClearButton: showClearButtonProp = true,
|
|
25
26
|
onFocus,
|
|
26
27
|
onBlur,
|
|
27
28
|
...rest
|
|
@@ -70,6 +71,7 @@ export const FieldSelectMulti = forwardRef<HTMLInputElement, FieldSelectMultiPro
|
|
|
70
71
|
isChecked,
|
|
71
72
|
showAdditionalButton,
|
|
72
73
|
showCopyButton: showCopyButtonProp,
|
|
74
|
+
showClearButton: showClearButtonProp,
|
|
73
75
|
});
|
|
74
76
|
|
|
75
77
|
const handleOpenChange = (isOpen: boolean) => {
|
|
@@ -23,6 +23,7 @@ export const FieldSelectSingle = forwardRef<HTMLInputElement, FieldSelectSingleP
|
|
|
23
23
|
open,
|
|
24
24
|
onOpenChange,
|
|
25
25
|
showCopyButton: showCopyButtonProp = true,
|
|
26
|
+
showClearButton: showClearButtonProp = true,
|
|
26
27
|
...rest
|
|
27
28
|
},
|
|
28
29
|
ref,
|
|
@@ -60,6 +61,7 @@ export const FieldSelectSingle = forwardRef<HTMLInputElement, FieldSelectSingleP
|
|
|
60
61
|
options,
|
|
61
62
|
isChecked,
|
|
62
63
|
showCopyButton: showCopyButtonProp,
|
|
64
|
+
showClearButton: showClearButtonProp,
|
|
63
65
|
showAdditionalButton,
|
|
64
66
|
});
|
|
65
67
|
|
|
@@ -12,6 +12,7 @@ type UseListProps = Pick<
|
|
|
12
12
|
> & {
|
|
13
13
|
searchable: NonNullable<FieldSelectProps['searchable']>;
|
|
14
14
|
showAdditionalButton: boolean;
|
|
15
|
+
showClearButton: boolean;
|
|
15
16
|
inputValue: string;
|
|
16
17
|
setInputValue(value: string): void;
|
|
17
18
|
isChecked(option: Option): boolean;
|
|
@@ -25,6 +26,7 @@ export function useList({
|
|
|
25
26
|
searchable,
|
|
26
27
|
showAdditionalButton,
|
|
27
28
|
showCopyButton: showCopyButtonProp,
|
|
29
|
+
showClearButton: showClearButtonProp,
|
|
28
30
|
inputValue,
|
|
29
31
|
setInputValue,
|
|
30
32
|
options,
|
|
@@ -36,7 +38,7 @@ export function useList({
|
|
|
36
38
|
const copyButtonRef = useRef<HTMLButtonElement>(null);
|
|
37
39
|
const [isOpen, setIsOpen] = useUncontrolledProp(open, false, onOpenChange);
|
|
38
40
|
const showDropList = isOpen && !readonly && !disabled;
|
|
39
|
-
const showClearButton = !readonly && (showAdditionalButton || inputValue.length > 0);
|
|
41
|
+
const showClearButton = showClearButtonProp && !readonly && (showAdditionalButton || inputValue.length > 0);
|
|
40
42
|
const showCopyButton = Boolean(showAdditionalButton && showCopyButtonProp && readonly);
|
|
41
43
|
|
|
42
44
|
const { extendedOptions, onInputKeyDown, onButtonKeyDown, onDroplistFocusLeave, firstDroplistItemRefCallback } =
|
|
@@ -42,8 +42,13 @@ type FieldSelectOwnProps = {
|
|
|
42
42
|
onOpenChange?(value: boolean): void;
|
|
43
43
|
/** Можно ли искать опции внутри списка */
|
|
44
44
|
searchable?: boolean;
|
|
45
|
-
/**
|
|
45
|
+
/** Отображение кнопки Копировать для поля (актуально только для `readonly = true`) */
|
|
46
46
|
showCopyButton?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Отображение кнопки очистки поля
|
|
49
|
+
* @default true
|
|
50
|
+
*/
|
|
51
|
+
showClearButton?: boolean;
|
|
47
52
|
/** Иконка-префикс для поля */
|
|
48
53
|
prefixIcon?: ReactElement;
|
|
49
54
|
/** Текст отсутствия доступных значений */
|
|
@@ -27,8 +27,13 @@ type WrapperProps = Pick<
|
|
|
27
27
|
>;
|
|
28
28
|
|
|
29
29
|
type FieldTextOwnProps = {
|
|
30
|
-
/**
|
|
30
|
+
/** Отображение кнопки Копировать для поля (актуально только для `readonly = true`) */
|
|
31
31
|
showCopyButton?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Отображение кнопки очистки поля
|
|
34
|
+
* @default true
|
|
35
|
+
*/
|
|
36
|
+
showClearButton?: boolean;
|
|
32
37
|
/** Можно ли вводить больше разрешённого кол-ва символов */
|
|
33
38
|
allowMoreThanMaxLength?: boolean;
|
|
34
39
|
/** Иконка-префикс для поля */
|
|
@@ -48,6 +53,7 @@ export const FieldText = forwardRef<HTMLInputElement, FieldTextProps>(
|
|
|
48
53
|
disabled = false,
|
|
49
54
|
readonly = false,
|
|
50
55
|
showCopyButton: showCopyButtonProp = true,
|
|
56
|
+
showClearButton: showClearButtonProp = true,
|
|
51
57
|
allowMoreThanMaxLength = false,
|
|
52
58
|
onChange: onChangeProp,
|
|
53
59
|
onFocus,
|
|
@@ -71,7 +77,7 @@ export const FieldText = forwardRef<HTMLInputElement, FieldTextProps>(
|
|
|
71
77
|
const clearButtonRef = useRef<HTMLButtonElement>(null);
|
|
72
78
|
const copyButtonRef = useRef<HTMLButtonElement>(null);
|
|
73
79
|
const showAdditionalButton = Boolean(value && !disabled);
|
|
74
|
-
const showClearButton = showAdditionalButton && !readonly;
|
|
80
|
+
const showClearButton = showClearButtonProp && showAdditionalButton && !readonly;
|
|
75
81
|
const showCopyButton = showCopyButtonProp && showAdditionalButton && readonly;
|
|
76
82
|
|
|
77
83
|
const onClear = () => {
|
|
@@ -35,8 +35,13 @@ type FieldTextAreaOwnProps = {
|
|
|
35
35
|
resizable?: boolean;
|
|
36
36
|
/** Колбек смены значения */
|
|
37
37
|
onChange?(value: string, e?: ChangeEvent<HTMLTextAreaElement>): void;
|
|
38
|
-
/**
|
|
38
|
+
/** Отображение кнопки Копировать для поля (актуально только для `readonly = true`) */
|
|
39
39
|
showCopyButton?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Отображение кнопки очистки поля
|
|
42
|
+
* @default true
|
|
43
|
+
*/
|
|
44
|
+
showClearButton?: boolean;
|
|
40
45
|
/** Можно ли вводить больше разрешённого кол-ва символов */
|
|
41
46
|
allowMoreThanMaxLength?: boolean;
|
|
42
47
|
};
|
|
@@ -56,6 +61,7 @@ export const FieldTextArea = forwardRef<HTMLTextAreaElement, FieldTextAreaProps>
|
|
|
56
61
|
resizable = false,
|
|
57
62
|
readonly = false,
|
|
58
63
|
showCopyButton: showCopyButtonProp = true,
|
|
64
|
+
showClearButton: showClearButtonProp = true,
|
|
59
65
|
allowMoreThanMaxLength = true,
|
|
60
66
|
showHintIcon,
|
|
61
67
|
onChange: onChangeProp,
|
|
@@ -79,7 +85,7 @@ export const FieldTextArea = forwardRef<HTMLTextAreaElement, FieldTextAreaProps>
|
|
|
79
85
|
const isResizable = !readonly && !disabled && resizable;
|
|
80
86
|
const [value, onChange] = useUncontrolledProp(valueProp, '', onChangeProp);
|
|
81
87
|
const showCopyButton = showCopyButtonProp && Boolean(value) && !disabled && readonly;
|
|
82
|
-
const showClearButton = Boolean(value) && !disabled && !readonly;
|
|
88
|
+
const showClearButton = showClearButtonProp && Boolean(value) && !disabled && !readonly;
|
|
83
89
|
|
|
84
90
|
const onClear = () => {
|
|
85
91
|
onChange('');
|