@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.
Files changed (29) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +9 -5
  3. package/dist/components/FieldDate/FieldDate.d.ts +6 -1
  4. package/dist/components/FieldDate/FieldDate.js +2 -2
  5. package/dist/components/FieldDecorator/styles.module.css +3 -0
  6. package/dist/components/FieldSecure/FieldSecure.d.ts +1 -1
  7. package/dist/components/FieldSelect/FieldSelectBase.js +1 -1
  8. package/dist/components/FieldSelect/FieldSelectMulti.d.ts +1 -0
  9. package/dist/components/FieldSelect/FieldSelectMulti.js +2 -1
  10. package/dist/components/FieldSelect/FieldSelectSingle.d.ts +1 -0
  11. package/dist/components/FieldSelect/FieldSelectSingle.js +2 -1
  12. package/dist/components/FieldSelect/hooks/useList.d.ts +2 -1
  13. package/dist/components/FieldSelect/hooks/useList.js +2 -2
  14. package/dist/components/FieldSelect/types.d.ts +6 -1
  15. package/dist/components/FieldText/FieldText.d.ts +6 -1
  16. package/dist/components/FieldText/FieldText.js +2 -2
  17. package/dist/components/FieldTextArea/FieldTextArea.d.ts +6 -1
  18. package/dist/components/FieldTextArea/FieldTextArea.js +2 -2
  19. package/package.json +2 -2
  20. package/src/components/FieldDate/FieldDate.tsx +8 -2
  21. package/src/components/FieldDecorator/styles.module.scss +4 -0
  22. package/src/components/FieldSecure/FieldSecure.tsx +1 -1
  23. package/src/components/FieldSelect/FieldSelectBase.tsx +1 -1
  24. package/src/components/FieldSelect/FieldSelectMulti.tsx +2 -0
  25. package/src/components/FieldSelect/FieldSelectSingle.tsx +2 -0
  26. package/src/components/FieldSelect/hooks/useList.ts +3 -1
  27. package/src/components/FieldSelect/types.ts +6 -1
  28. package/src/components/FieldText/FieldText.tsx +8 -2
  29. 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` | - | Показывать ли кнопку Копировать для поля (актуально только для `readonly = true`) |
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` | - | Показывать ли кнопку Копировать для поля (актуально только для `readonly = true`) |
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` | - | Показывать ли кнопку Копировать для поля (актуально только для readonly = true) |
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') {
@@ -1,6 +1,9 @@
1
1
  .decorator{
2
2
  display:flex;
3
3
  flex-direction:column;
4
+ flex-grow:1;
5
+ width:100%;
6
+ min-width:0;
4
7
  }
5
8
  .decorator[data-size=s]{
6
9
  gap:var(--space-fields-decorator-single-gap, 4px);
@@ -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
- /** Показывать ли кнопку Копировать для поля (актуально только для readonly = true) */
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
- /** Показывать ли кнопку Копировать для поля (актуально только для `readonly = true`) */
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
- /** Показывать ли кнопку Копировать для поля (актуально только для `readonly = true`) */
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.10.4",
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": "57c597a3eebaf6528c0c61b6b27dd244753de1cf"
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(
@@ -21,6 +21,10 @@ $hint-icon-container: (
21
21
  .decorator {
22
22
  display: flex;
23
23
  flex-direction: column;
24
+ flex-grow: 1;
25
+
26
+ width: 100%;
27
+ min-width: 0;
24
28
 
25
29
  @each $size in $sizes {
26
30
  &[data-size='#{$size}'] {
@@ -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
- /** Показывать ли кнопку Копировать для поля (актуально только для readonly = true) */
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
- /** Показывать ли кнопку Копировать для поля (актуально только для `readonly = true`) */
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
- /** Показывать ли кнопку Копировать для поля (актуально только для `readonly = true`) */
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('');