@snack-uikit/fields 0.53.2-preview-0a70077b.0 → 0.53.2-preview-0be0d183.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -130
- package/dist/cjs/components/FieldSecure/FieldSecure.d.ts +1 -1
- package/dist/cjs/components/FieldSelect/FieldSelectMultiple.d.ts +4 -2
- package/dist/cjs/components/FieldSelect/FieldSelectMultiple.js +30 -7
- package/dist/cjs/components/FieldSelect/FieldSelectSingle.d.ts +3 -1
- package/dist/cjs/components/FieldSelect/FieldSelectSingle.js +26 -12
- package/dist/cjs/components/FieldSelect/hooks.d.ts +6 -1
- package/dist/cjs/components/FieldSelect/hooks.js +13 -0
- package/dist/cjs/components/FieldSelect/index.d.ts +1 -1
- package/dist/cjs/components/FieldSelect/types.d.ts +20 -3
- package/dist/cjs/components/FieldSelect/utils/getCustomOptionTriggerByCode.d.ts +4 -0
- package/dist/cjs/components/FieldSelect/utils/getCustomOptionTriggerByCode.js +21 -0
- package/dist/cjs/components/FieldSelect/utils/index.d.ts +1 -0
- package/dist/cjs/components/FieldSelect/utils/index.js +2 -1
- package/dist/cjs/components/FieldText/FieldText.d.ts +1 -1
- package/dist/cjs/components/FieldTextArea/FieldTextArea.d.ts +1 -1
- package/dist/cjs/components/index.d.ts +0 -1
- package/dist/cjs/components/index.js +0 -1
- package/dist/cjs/helperComponents/ButtonFieldList/ButtonFieldList.d.ts +1 -1
- package/dist/esm/components/FieldSecure/FieldSecure.d.ts +1 -1
- package/dist/esm/components/FieldSelect/FieldSelectMultiple.d.ts +4 -2
- package/dist/esm/components/FieldSelect/FieldSelectMultiple.js +32 -9
- package/dist/esm/components/FieldSelect/FieldSelectSingle.d.ts +3 -1
- package/dist/esm/components/FieldSelect/FieldSelectSingle.js +28 -14
- package/dist/esm/components/FieldSelect/hooks.d.ts +6 -1
- package/dist/esm/components/FieldSelect/hooks.js +8 -0
- package/dist/esm/components/FieldSelect/index.d.ts +1 -1
- package/dist/esm/components/FieldSelect/types.d.ts +20 -3
- package/dist/esm/components/FieldSelect/utils/getCustomOptionTriggerByCode.d.ts +4 -0
- package/dist/esm/components/FieldSelect/utils/getCustomOptionTriggerByCode.js +13 -0
- package/dist/esm/components/FieldSelect/utils/index.d.ts +1 -0
- package/dist/esm/components/FieldSelect/utils/index.js +1 -0
- package/dist/esm/components/FieldText/FieldText.d.ts +1 -1
- package/dist/esm/components/FieldTextArea/FieldTextArea.d.ts +1 -1
- package/dist/esm/components/index.d.ts +0 -1
- package/dist/esm/components/index.js +0 -1
- package/dist/esm/helperComponents/ButtonFieldList/ButtonFieldList.d.ts +1 -1
- package/package.json +2 -2
- package/src/components/FieldSelect/FieldSelectMultiple.tsx +71 -11
- package/src/components/FieldSelect/FieldSelectSingle.tsx +48 -16
- package/src/components/FieldSelect/hooks.ts +19 -1
- package/src/components/FieldSelect/index.ts +2 -0
- package/src/components/FieldSelect/types.ts +21 -3
- package/src/components/FieldSelect/utils/getCustomOptionTriggerByCode.ts +23 -0
- package/src/components/FieldSelect/utils/index.ts +1 -0
- package/src/components/index.ts +0 -1
- package/dist/cjs/components/FieldAdd/FieldAdd.d.ts +0 -52
- package/dist/cjs/components/FieldAdd/FieldAdd.js +0 -216
- package/dist/cjs/components/FieldAdd/index.d.ts +0 -2
- package/dist/cjs/components/FieldAdd/index.js +0 -13
- package/dist/cjs/components/FieldAdd/styles.module.css +0 -51
- package/dist/esm/components/FieldAdd/FieldAdd.d.ts +0 -52
- package/dist/esm/components/FieldAdd/FieldAdd.js +0 -31
- package/dist/esm/components/FieldAdd/index.d.ts +0 -2
- package/dist/esm/components/FieldAdd/index.js +0 -1
- package/dist/esm/components/FieldAdd/styles.module.css +0 -51
- package/src/components/FieldAdd/FieldAdd.tsx +0 -215
- package/src/components/FieldAdd/index.ts +0 -3
- package/src/components/FieldAdd/styles.module.scss +0 -60
package/README.md
CHANGED
|
@@ -128,50 +128,6 @@ export function FieldSelectExample() {
|
|
|
128
128
|
}
|
|
129
129
|
```
|
|
130
130
|
|
|
131
|
-
## FieldAdd
|
|
132
|
-
|
|
133
|
-
### Description
|
|
134
|
-
|
|
135
|
-
- `FieldAdd` — составной контрол для сценариев, где нужно выбрать существующее значение и рядом дать быстрое действие на создание нового.
|
|
136
|
-
- Внутри использует одиночный `FieldSelect` и кнопку добавления, поэтому наследует состояния поля (`disabled`, `readonly`, `loading`, `validationState`) и возможности селекта вроде поиска, очистки и кастомных empty-state экранов.
|
|
137
|
-
- Подходит для форм и мастеров создания сущностей, где пользователь может либо выбрать уже существующий объект, либо сразу перейти к созданию нового.
|
|
138
|
-
- Figma: [`FieldAdd`](https://www.figma.com/design/sLD7Z9OcMX5GPsp9LXb6mw/-PD-2059--%D0%9F%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD-FieldAdd?node-id=16177-2&m=dev).
|
|
139
|
-
|
|
140
|
-
### Example
|
|
141
|
-
|
|
142
|
-
```tsx
|
|
143
|
-
import { useState } from 'react';
|
|
144
|
-
import { FieldAdd } from '@snack-uikit/fields';
|
|
145
|
-
|
|
146
|
-
const OPTIONS = [
|
|
147
|
-
{ value: 'op1', option: 'Option 1' },
|
|
148
|
-
{ value: 'op2', option: 'Option 2' },
|
|
149
|
-
];
|
|
150
|
-
|
|
151
|
-
export function FieldAddExample() {
|
|
152
|
-
const [value, setValue] = useState<string | undefined>();
|
|
153
|
-
|
|
154
|
-
return (
|
|
155
|
-
<FieldAdd
|
|
156
|
-
id='field-add'
|
|
157
|
-
label='Select option'
|
|
158
|
-
placeholder='Placeholder'
|
|
159
|
-
options={OPTIONS}
|
|
160
|
-
value={value}
|
|
161
|
-
onChange={setValue}
|
|
162
|
-
searchable
|
|
163
|
-
addButton={{
|
|
164
|
-
label: 'Create',
|
|
165
|
-
onClick: () => {
|
|
166
|
-
// open create flow
|
|
167
|
-
},
|
|
168
|
-
}}
|
|
169
|
-
size='s'
|
|
170
|
-
/>
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
131
|
## FieldSecure
|
|
176
132
|
|
|
177
133
|
### Description
|
|
@@ -599,70 +555,6 @@ FieldStepper в основном предназначен для работы с
|
|
|
599
555
|
|
|
600
556
|
[//]: DOCUMENTATION_SECTION_START
|
|
601
557
|
[//]: THIS_SECTION_IS_AUTOGENERATED_PLEASE_DONT_EDIT_IT
|
|
602
|
-
## FieldAdd
|
|
603
|
-
### Props
|
|
604
|
-
| name | type | default value | description |
|
|
605
|
-
|------|------|---------------|-------------|
|
|
606
|
-
| options* | `OptionProps[]` | - | |
|
|
607
|
-
| id | `string` | - | Значение html-атрибута id |
|
|
608
|
-
| name | `string` | - | Значение html-атрибута name |
|
|
609
|
-
| placeholder | `string` | - | Значение плейсхолдера |
|
|
610
|
-
| disabled | `boolean` | - | Является ли поле деактивированным |
|
|
611
|
-
| readonly | `boolean` | - | Является ли поле доступным только для чтения |
|
|
612
|
-
| onFocus | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки получения фокуса |
|
|
613
|
-
| onBlur | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки потери фокуса |
|
|
614
|
-
| onKeyDown | `KeyboardEventHandler<HTMLInputElement>` | - | Колбек обработки начала нажатия клавиши клавиатуры |
|
|
615
|
-
| autoFocus | `boolean` | false | Включен ли авто-фокус для поля |
|
|
616
|
-
| className | `string` | - | CSS-класс |
|
|
617
|
-
| label | `string` | - | Лейбл |
|
|
618
|
-
| labelTooltip | `ReactNode` | - | Всплывающая подсказка лейбла |
|
|
619
|
-
| required | `boolean` | - | Является ли поле обязательным |
|
|
620
|
-
| caption | `string` | - | Подпись справа от лейбла |
|
|
621
|
-
| hint | `string` | - | Подсказка внизу |
|
|
622
|
-
| showHintIcon | `boolean` | - | Отображать иконку подсказки |
|
|
623
|
-
| size | enum Size: `"s"`, `"m"`, `"l"` | s | Размер |
|
|
624
|
-
| validationState | enum ValidationState: `"error"`, `"default"`, `"warning"`, `"success"` | default | Состояние валидации |
|
|
625
|
-
| labelTooltipPlacement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | top | Расположение подсказки лейбла |
|
|
626
|
-
| error | `string` | - | |
|
|
627
|
-
| loading | `boolean` | - | Отображать ли состояние загрузки данных в поле и списке |
|
|
628
|
-
| prefix | `ReactNode` | - | Произвольный префикс для поля |
|
|
629
|
-
| postfix | `ReactNode` | - | Произвольный постфикс для поля |
|
|
630
|
-
| defaultValue | `ItemId` | - | Начальное состояние |
|
|
631
|
-
| value | `ItemId` | - | Controlled состояние |
|
|
632
|
-
| onChange | `OnChangeHandler<any>` | - | Controlled обработчик измения состояния |
|
|
633
|
-
| pinTop | `OptionProps[]` | - | |
|
|
634
|
-
| pinBottom | `OptionProps[]` | - | |
|
|
635
|
-
| searchable | `boolean` | true | |
|
|
636
|
-
| showCopyButton | `boolean` | true | Отображение кнопки Копировать для поля (актуально только для `readonly = true`) |
|
|
637
|
-
| onCopyButtonClick | `() => void` | - | Колбек клика по кнопке Копировать для поля |
|
|
638
|
-
| showClearButton | `boolean` | true | Отображение кнопки очистки поля |
|
|
639
|
-
| prefixIcon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка-префикс для поля |
|
|
640
|
-
| footer | `ReactNode` | - | |
|
|
641
|
-
| widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | - | |
|
|
642
|
-
| search | `SearchState` | - | |
|
|
643
|
-
| autocomplete | `boolean` | - | |
|
|
644
|
-
| addOptionByEnter | `boolean` | - | |
|
|
645
|
-
| open | `boolean` | - | |
|
|
646
|
-
| enableFuzzySearch | `boolean` | true | Включить нечеткий поиск |
|
|
647
|
-
| resetSearchOnOptionSelection | `boolean` | true | Поведение строки поиска при выборе опции из списка, false необходимо при асинхронной подгрузке значений с бэка, в случае если надо поиск оставить как значение при отсутствии данных |
|
|
648
|
-
| onOpenChange | `(open: boolean) => void` | - | |
|
|
649
|
-
| selectedOptionFormatter | `SelectedOptionFormatter` | - | |
|
|
650
|
-
| scrollToSelectedItem | `boolean` | - | Флаг, отвещающий за прокручивание до выбранного элемента |
|
|
651
|
-
| virtualized | `boolean` | - | Включить виртуализацию на компоненты списка. Рекомендуется если у вас от 1к элементов списка |
|
|
652
|
-
| scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
|
|
653
|
-
| scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
|
|
654
|
-
| untouchableScrollbars | `boolean` | - | Отключает возможность взаимодействовать со скролбарами мышью. |
|
|
655
|
-
| onScroll | `(event?: Event) => void` | - | Колбек на скролл прокручиваемого списка |
|
|
656
|
-
| dataFiltered | `boolean` | - | |
|
|
657
|
-
| dataError | `boolean` | - | |
|
|
658
|
-
| noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
|
|
659
|
-
| noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
|
|
660
|
-
| errorDataState | `EmptyStateProps` | - | Экран при ошибке запроса |
|
|
661
|
-
| addButton | `FieldAddButtonProps` | - | Настройки кнопки добавления справа от поля |
|
|
662
|
-
| controlTooltip | `Omit<TooltipProps, "children">` | - | Тултип над контролом выбора значения |
|
|
663
|
-
| showAddButton | `boolean` | - | Показывать ли кнопку добавления; в `readonly` режиме кнопка скрывается независимо от значения пропса |
|
|
664
|
-
| ref | `LegacyRef<HTMLInputElement>` | - | Allows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref). @see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs} |
|
|
665
|
-
| key | `Key` | - | |
|
|
666
558
|
## FieldColor
|
|
667
559
|
### Props
|
|
668
560
|
| name | type | default value | description |
|
|
@@ -674,17 +566,17 @@ FieldStepper в основном предназначен для работы с
|
|
|
674
566
|
| showClearButton | `boolean` | true | Отображение кнопки Очистки поля |
|
|
675
567
|
| value | `string` | - | Значение input |
|
|
676
568
|
| onChange | `(value: string) => void` | - | |
|
|
677
|
-
| className | `string` | - | Класснейм |
|
|
678
569
|
| withAlpha | `boolean` | - | Значение с альфаканалом |
|
|
679
570
|
| autoApply | `boolean` | - | Применять изменения автоматически, если значение false - то изменения происходят по кнопке |
|
|
571
|
+
| className | `string` | - | Класснейм |
|
|
680
572
|
| colorMode | `{ hex?: boolean; rgb?: boolean; hsv?: boolean; }` | - | |
|
|
681
573
|
| id | `string` | - | Значение html-атрибута id |
|
|
682
574
|
| name | `string` | - | Значение html-атрибута name |
|
|
683
|
-
| placeholder | `string` | - | Значение плейсхолдера |
|
|
684
575
|
| disabled | `boolean` | - | Является ли поле деактивированным |
|
|
685
576
|
| readonly | `boolean` | - | Является ли поле доступным только для чтения |
|
|
686
577
|
| onFocus | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки получения фокуса |
|
|
687
578
|
| onBlur | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки потери фокуса |
|
|
579
|
+
| placeholder | `string` | - | Значение плейсхолдера |
|
|
688
580
|
| autoFocus | `boolean` | false | Включен ли авто-фокус для поля |
|
|
689
581
|
| label | `string` | - | Лейбл |
|
|
690
582
|
| labelTooltip | `ReactNode` | - | Всплывающая подсказка лейбла |
|
|
@@ -765,15 +657,15 @@ FieldStepper в основном предназначен для работы с
|
|
|
765
657
|
| allowMoreThanMaxLength | `boolean` | - | Можно ли вводить больше разрешённого кол-ва символов |
|
|
766
658
|
| prefixIcon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка-префикс для поля |
|
|
767
659
|
| asyncValueGetter | `() => Promise<string>` | - | Свойство позволяет грузить данные в поле по требованию |
|
|
768
|
-
| value | `string` | - | Значение input |
|
|
769
660
|
| onChange | `(value: string, e?: ChangeEvent<HTMLInputElement>) => void` | - | Колбек смены значения |
|
|
661
|
+
| value | `string` | - | Значение input |
|
|
770
662
|
| id | `string` | - | Значение html-атрибута id |
|
|
771
663
|
| name | `string` | - | Значение html-атрибута name |
|
|
772
|
-
| placeholder | `string` | - | Значение плейсхолдера |
|
|
773
664
|
| disabled | `boolean` | - | Является ли поле деактивированным |
|
|
774
665
|
| readonly | `boolean` | - | Является ли поле доступным только для чтения |
|
|
775
666
|
| onFocus | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки получения фокуса |
|
|
776
667
|
| onBlur | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки потери фокуса |
|
|
668
|
+
| placeholder | `string` | - | Значение плейсхолдера |
|
|
777
669
|
| autoFocus | `boolean` | false | Включен ли авто-фокус для поля |
|
|
778
670
|
| maxLength | `number` | - | Максимальная длина вводимого значения |
|
|
779
671
|
| autoComplete | `string \| boolean` | false | Включен ли автокомплит для поля |
|
|
@@ -797,13 +689,13 @@ FieldStepper в основном предназначен для работы с
|
|
|
797
689
|
| options* | `OptionProps[]` | - | |
|
|
798
690
|
| id | `string` | - | Значение html-атрибута id |
|
|
799
691
|
| name | `string` | - | Значение html-атрибута name |
|
|
800
|
-
| placeholder | `string` | - | Значение плейсхолдера |
|
|
801
692
|
| disabled | `boolean` | false | Является ли поле деактивированным |
|
|
802
693
|
| readonly | `boolean` | false false | Является ли поле доступным только для чтения |
|
|
803
694
|
| onFocus | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки получения фокуса |
|
|
804
695
|
| onBlur | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки потери фокуса |
|
|
805
|
-
|
|
|
696
|
+
| placeholder | `string` | - | Значение плейсхолдера |
|
|
806
697
|
| autoFocus | `boolean` | false | Включен ли авто-фокус для поля |
|
|
698
|
+
| onKeyDown | `KeyboardEventHandler<HTMLInputElement>` | - | Колбек обработки начала нажатия клавиши клавиатуры |
|
|
807
699
|
| className | `string` | - | CSS-класс |
|
|
808
700
|
| label | `string` | - | Лейбл |
|
|
809
701
|
| labelTooltip | `ReactNode` | - | Всплывающая подсказка лейбла |
|
|
@@ -815,12 +707,12 @@ FieldStepper в основном предназначен для работы с
|
|
|
815
707
|
| validationState | enum ValidationState: `"error"`, `"default"`, `"warning"`, `"success"` | - | Состояние валидации |
|
|
816
708
|
| labelTooltipPlacement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | top | Расположение подсказки лейбла |
|
|
817
709
|
| error | `string` | - | |
|
|
818
|
-
| loading | `boolean` | - |
|
|
710
|
+
| loading | `boolean` | - | |
|
|
819
711
|
| prefix | `ReactNode` | - | Произвольный префикс для поля |
|
|
820
712
|
| postfix | `ReactNode` | - | Произвольный постфикс для поля |
|
|
821
|
-
| defaultValue | `ItemId \| ItemId[]` | - | Начальное состояние |
|
|
822
|
-
| value | `ItemId \| ItemId[]` | - | Controlled состояние |
|
|
823
713
|
| onChange | `OnChangeHandler<any>` | - | Controlled обработчик измения состояния |
|
|
714
|
+
| value | `ItemId \| ItemId[]` | - | Controlled состояние |
|
|
715
|
+
| defaultValue | `ItemId \| ItemId[]` | - | Начальное состояние |
|
|
824
716
|
| pinTop | `OptionProps[]` | - | |
|
|
825
717
|
| pinBottom | `OptionProps[]` | - | |
|
|
826
718
|
| searchable | `boolean` | - | |
|
|
@@ -832,7 +724,7 @@ FieldStepper в основном предназначен для работы с
|
|
|
832
724
|
| widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | - | |
|
|
833
725
|
| search | `SearchState` | - | |
|
|
834
726
|
| autocomplete | `boolean` | - | |
|
|
835
|
-
| addOptionByEnter | `boolean` | - |
|
|
727
|
+
| addOptionByEnter | `boolean` | - | @deprecated Используйте `addCustomOptionTriggers` |
|
|
836
728
|
| open | `boolean` | - | |
|
|
837
729
|
| enableFuzzySearch | `boolean` | - | Включить нечеткий поиск |
|
|
838
730
|
| resetSearchOnOptionSelection | `boolean` | true | Поведение строки поиска при выборе опции из списка, false необходимо при асинхронной подгрузке значений с бэка, в случае если надо поиск оставить как значение при отсутствии данных |
|
|
@@ -840,8 +732,8 @@ FieldStepper в основном предназначен для работы с
|
|
|
840
732
|
| selectedOptionFormatter | `SelectedOptionFormatter` | - | |
|
|
841
733
|
| scrollToSelectedItem | `boolean` | - | Флаг, отвещающий за прокручивание до выбранного элемента |
|
|
842
734
|
| virtualized | `boolean` | - | Включить виртуализацию на компоненты списка. Рекомендуется если у вас от 1к элементов списка |
|
|
843
|
-
| scrollRef | `
|
|
844
|
-
| scrollContainerRef | `
|
|
735
|
+
| scrollRef | `Ref<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
|
|
736
|
+
| scrollContainerRef | `Ref<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
|
|
845
737
|
| untouchableScrollbars | `boolean` | - | Отключает возможность взаимодействовать со скролбарами мышью. |
|
|
846
738
|
| onScroll | `(event?: Event) => void` | - | Колбек на скролл прокручиваемого списка |
|
|
847
739
|
| dataFiltered | `boolean` | - | |
|
|
@@ -849,10 +741,16 @@ FieldStepper в основном предназначен для работы с
|
|
|
849
741
|
| noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
|
|
850
742
|
| noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
|
|
851
743
|
| errorDataState | `EmptyStateProps` | - | Экран при ошибке запроса |
|
|
744
|
+
| addCustomOptionTriggers | `FieldSelectSingleAddCustomOptionTrigger[] \| FieldSelectAddCustomOptionTrigger[]` | - | Триггеры фиксации произвольного значения из строки поиска в режиме `single`. Если передан, имеет приоритет над устаревшим `addOptionByEnter`. Триггеры фиксации произвольного значения из строки поиска в режиме `multiple`. Если передан, имеет приоритет над устаревшим `addOptionByEnter`. |
|
|
852
745
|
| selection | "single" \| "multiple" | - | |
|
|
853
746
|
| ref | `LegacyRef<HTMLInputElement>` | - | Allows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref). @see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs} |
|
|
854
747
|
| key | `Key` | - | |
|
|
855
748
|
| removeByBackspace | `boolean` | - | |
|
|
749
|
+
## FieldSelectAddCustomOptionTrigger
|
|
750
|
+
События, по которым произвольное значение из строки поиска фиксируется в значении поля
|
|
751
|
+
### Props
|
|
752
|
+
| name | type | default value | description |
|
|
753
|
+
|------|------|---------------|-------------|
|
|
856
754
|
## FieldSlider
|
|
857
755
|
### Props
|
|
858
756
|
| name | type | default value | description |
|
|
@@ -870,8 +768,8 @@ FieldStepper в основном предназначен для работы с
|
|
|
870
768
|
| onFocus | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки получения фокуса |
|
|
871
769
|
| onBlur | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки потери фокуса |
|
|
872
770
|
| autoFocus | `boolean` | false | Включен ли авто-фокус для поля |
|
|
873
|
-
| value | `number \| number[]` | - | |
|
|
874
771
|
| onChange | `(value: number \| number[]) => void` | - | |
|
|
772
|
+
| value | `number \| number[]` | - | |
|
|
875
773
|
| range | `boolean` | - | |
|
|
876
774
|
| tipFormatter | `(value: string \| number) => ReactNode` | - | |
|
|
877
775
|
| step | `number` | - | |
|
|
@@ -937,22 +835,22 @@ FieldStepper в основном предназначен для работы с
|
|
|
937
835
|
| postfix | `ReactNode` | - | Произвольный постфикс для поля |
|
|
938
836
|
| button | `Button` | - | Кнопка действия внутри поля |
|
|
939
837
|
| type | "text" \| "tel" \| "email" | text | |
|
|
940
|
-
| value | `string` | - | Значение input |
|
|
941
838
|
| onChange | `(value: string, e?: ChangeEvent<HTMLInputElement>) => void` | - | Колбек смены значения |
|
|
942
|
-
|
|
|
839
|
+
| value | `string` | - | Значение input |
|
|
840
|
+
| inputMode | enum InputMode: `"none"`, `"text"`, `"search"`, `"tel"`, `"email"`, `"decimal"`, `"numeric"`, `"url"` | - | Режим работы экранной клавиатуры |
|
|
943
841
|
| id | `string` | - | Значение html-атрибута id |
|
|
944
842
|
| name | `string` | - | Значение html-атрибута name |
|
|
945
|
-
| placeholder | `string` | - | Значение плейсхолдера |
|
|
946
843
|
| disabled | `boolean` | - | Является ли поле деактивированным |
|
|
947
844
|
| readonly | `boolean` | - | Является ли поле доступным только для чтения |
|
|
948
845
|
| onFocus | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки получения фокуса |
|
|
949
846
|
| onBlur | `FocusEventHandler<HTMLInputElement>` | - | Колбек обработки потери фокуса |
|
|
950
|
-
|
|
|
847
|
+
| placeholder | `string` | - | Значение плейсхолдера |
|
|
951
848
|
| autoFocus | `boolean` | false | Включен ли авто-фокус для поля |
|
|
952
849
|
| maxLength | `number` | - | Максимальная длина вводимого значения |
|
|
953
850
|
| autoComplete | `string \| boolean` | false | Включен ли автокомплит для поля |
|
|
954
851
|
| spellCheck | `boolean` | true | Значение атрибута spellcheck (проверка орфографии) |
|
|
955
852
|
| pattern | `string` | - | Регулярное выражение валидного инпута |
|
|
853
|
+
| onKeyDown | `KeyboardEventHandler<HTMLInputElement>` | - | Колбек обработки начала нажатия клавиши клавиатуры |
|
|
956
854
|
| onPaste | `ClipboardEventHandler<HTMLInputElement>` | - | Колбек обработки вставки значения |
|
|
957
855
|
| className | `string` | - | CSS-класс |
|
|
958
856
|
| label | `string` | - | Лейбл |
|
|
@@ -983,16 +881,16 @@ FieldStepper в основном предназначен для работы с
|
|
|
983
881
|
| value | `string` | - | HTML-аттрибут value |
|
|
984
882
|
| id | `string` | - | HTML-аттрибут id |
|
|
985
883
|
| name | `string` | - | HTML-аттрибут name |
|
|
986
|
-
| placeholder | `string` | - | Плейсхолдер |
|
|
987
884
|
| disabled | `boolean` | - | Является ли поле деактивированным |
|
|
988
885
|
| readonly | `boolean` | - | Является ли поле доступным только на чтение |
|
|
989
886
|
| onFocus | `FocusEventHandler<HTMLTextAreaElement>` | - | Колбек получения фокуса |
|
|
990
887
|
| onBlur | `FocusEventHandler<HTMLTextAreaElement>` | - | Колбек потери фокуса |
|
|
991
|
-
|
|
|
888
|
+
| placeholder | `string` | - | Плейсхолдер |
|
|
992
889
|
| autoFocus | `boolean` | - | Включен ли авто-фокус |
|
|
993
890
|
| maxLength | `number` | - | Максимальное кол-во символов |
|
|
994
|
-
| inputMode | enum InputMode: `"
|
|
891
|
+
| inputMode | enum InputMode: `"none"`, `"text"`, `"search"`, `"tel"`, `"email"`, `"decimal"`, `"numeric"`, `"url"` | - | Режим работы экранной клавиатуры |
|
|
995
892
|
| spellCheck | `boolean` | true | Включение проверки орфографии |
|
|
893
|
+
| onKeyDown | `KeyboardEventHandler<HTMLTextAreaElement>` | - | Колбек нажатия клавиши клавиатуры |
|
|
996
894
|
| className | `string` | - | CSS-класс |
|
|
997
895
|
| label | `string` | - | Лейбл |
|
|
998
896
|
| labelTooltip | `ReactNode` | - | Всплывающая подсказка лейбла |
|
|
@@ -1042,8 +940,8 @@ FieldStepper в основном предназначен для работы с
|
|
|
1042
940
|
### Props
|
|
1043
941
|
| name | type | default value | description |
|
|
1044
942
|
|------|------|---------------|-------------|
|
|
1045
|
-
| __@metadata@
|
|
1046
|
-
| __@hasInstance@
|
|
943
|
+
| __@metadata@1004* | `DecoratorMetadataObject` | - | |
|
|
944
|
+
| __@hasInstance@1002* | `(value: any) => boolean` | - | Determines whether the given value inherits from this function if this function was used as a constructor function. A constructor function can control which objects are recognized as its instances by 'instanceof' by overriding this method. |
|
|
1047
945
|
| name* | `string` | - | Returns the name of the function. Function names are read-only and can not be changed. |
|
|
1048
946
|
| caller* | `Function` | - | |
|
|
1049
947
|
| arguments* | `any` | - | |
|
|
@@ -23,5 +23,5 @@ type FieldSecureOwnProps = {
|
|
|
23
23
|
export type FieldSecureProps = WithSupportProps<FieldSecureOwnProps & InputProps & WrapperProps>;
|
|
24
24
|
export declare const FieldSecure: import("react").ForwardRefExoticComponent<{
|
|
25
25
|
'data-test-id'?: string;
|
|
26
|
-
} & import("react").AriaAttributes & FieldSecureOwnProps & Pick<Partial<InputPrivateProps>, "onChange" | "value"> & Pick<InputPrivateProps, "id" | "name" | "onFocus" | "onBlur" | "disabled" | "
|
|
26
|
+
} & import("react").AriaAttributes & FieldSecureOwnProps & Pick<Partial<InputPrivateProps>, "onChange" | "value"> & Pick<InputPrivateProps, "id" | "name" | "onFocus" | "onBlur" | "disabled" | "readonly" | "placeholder" | "autoFocus" | "autoComplete" | "maxLength"> & WrapperProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
27
27
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SelectedOptionFormatter } from './types';
|
|
1
|
+
import { FieldSelectAddCustomOptionTrigger, SelectedOptionFormatter } from './types';
|
|
2
2
|
export declare const FieldSelectMultiple: import("react").ForwardRefExoticComponent<import("./types").InputProps & import("./types").WrapperProps & {
|
|
3
3
|
options: import("./types").OptionProps[];
|
|
4
4
|
loading?: boolean;
|
|
@@ -28,4 +28,6 @@ export declare const FieldSelectMultiple: import("react").ForwardRefExoticCompon
|
|
|
28
28
|
resetSearchOnOptionSelection?: boolean;
|
|
29
29
|
onOpenChange?(open: boolean): void;
|
|
30
30
|
selectedOptionFormatter?: SelectedOptionFormatter;
|
|
31
|
-
} & Pick<import("@snack-uikit/list").DroplistProps, "onScroll" | "scrollRef" | "scrollContainerRef" | "untouchableScrollbars" | "dataError" | "dataFiltered" | "scrollToSelectedItem" | "virtualized" | "noDataState" | "noResultsState" | "errorDataState">, "showCopyButton" | "onCopyButtonClick"> &
|
|
31
|
+
} & Pick<import("@snack-uikit/list").DroplistProps, "onScroll" | "scrollRef" | "scrollContainerRef" | "untouchableScrollbars" | "dataError" | "dataFiltered" | "scrollToSelectedItem" | "virtualized" | "noDataState" | "noResultsState" | "errorDataState">, "showCopyButton" | "onCopyButtonClick"> & {
|
|
32
|
+
addCustomOptionTriggers?: FieldSelectAddCustomOptionTrigger[];
|
|
33
|
+
} & import("react").RefAttributes<HTMLInputElement>>;
|
|
@@ -62,6 +62,7 @@ exports.FieldSelectMultiple = (0, react_1.forwardRef)((props, ref) => {
|
|
|
62
62
|
postfix,
|
|
63
63
|
removeByBackspace = false,
|
|
64
64
|
addOptionByEnter = false,
|
|
65
|
+
addCustomOptionTriggers,
|
|
65
66
|
untouchableScrollbars = false,
|
|
66
67
|
open: openProp,
|
|
67
68
|
enableFuzzySearch = true,
|
|
@@ -70,7 +71,7 @@ exports.FieldSelectMultiple = (0, react_1.forwardRef)((props, ref) => {
|
|
|
70
71
|
selectedOptionFormatter = defaultSelectedOptionFormatter,
|
|
71
72
|
autoFocus
|
|
72
73
|
} = props,
|
|
73
|
-
rest = __rest(props, ["id", "name", "placeholder", "size", "options", "value", "defaultValue", "onChange", "disabled", "readonly", "searchable", "showClearButton", "onKeyDown", "validationState", "search", "autocomplete", "prefixIcon", "prefix", "postfix", "removeByBackspace", "addOptionByEnter", "untouchableScrollbars", "open", "enableFuzzySearch", "resetSearchOnOptionSelection", "onOpenChange", "selectedOptionFormatter", "autoFocus"]);
|
|
74
|
+
rest = __rest(props, ["id", "name", "placeholder", "size", "options", "value", "defaultValue", "onChange", "disabled", "readonly", "searchable", "showClearButton", "onKeyDown", "validationState", "search", "autocomplete", "prefixIcon", "prefix", "postfix", "removeByBackspace", "addOptionByEnter", "addCustomOptionTriggers", "untouchableScrollbars", "open", "enableFuzzySearch", "resetSearchOnOptionSelection", "onOpenChange", "selectedOptionFormatter", "autoFocus"]);
|
|
74
75
|
const localRef = (0, react_1.useRef)(null);
|
|
75
76
|
const inputPlugRef = (0, react_1.useRef)(null);
|
|
76
77
|
const contentRef = (0, react_1.useRef)(null);
|
|
@@ -102,6 +103,19 @@ exports.FieldSelectMultiple = (0, react_1.forwardRef)((props, ref) => {
|
|
|
102
103
|
selectedOptionFormatter,
|
|
103
104
|
resetSearchOnOptionSelection
|
|
104
105
|
}));
|
|
106
|
+
const resolvedAddCustomOptionTriggers = (0, hooks_2.useResolvedAddCustomOptionTriggers)({
|
|
107
|
+
addCustomOptionTriggers,
|
|
108
|
+
addOptionByEnter
|
|
109
|
+
});
|
|
110
|
+
const tryCommitCustomOptionFromInput = (0, react_1.useCallback)(trigger => {
|
|
111
|
+
if (!resolvedAddCustomOptionTriggers.includes(trigger) || inputValue === '') {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (!(value !== null && value !== void 0 ? value : []).includes(inputValue)) {
|
|
115
|
+
setValue(prev => (prev !== null && prev !== void 0 ? prev : []).concat(inputValue));
|
|
116
|
+
updateInputValue();
|
|
117
|
+
}
|
|
118
|
+
}, [resolvedAddCustomOptionTriggers, inputValue, value, setValue, updateInputValue]);
|
|
105
119
|
const prefixSettings = (0, hooks_1.usePrefix)({
|
|
106
120
|
prefix,
|
|
107
121
|
disabled
|
|
@@ -155,6 +169,12 @@ exports.FieldSelectMultiple = (0, react_1.forwardRef)((props, ref) => {
|
|
|
155
169
|
setOpen
|
|
156
170
|
});
|
|
157
171
|
const handleItemDelete = (0, hooks_2.useHandleDeleteItem)(setValue);
|
|
172
|
+
const handleTagDelete = (0, react_1.useCallback)(option => () => {
|
|
173
|
+
var _a;
|
|
174
|
+
const deleteItemHandler = handleItemDelete(option);
|
|
175
|
+
deleteItemHandler();
|
|
176
|
+
(_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
177
|
+
}, [handleItemDelete]);
|
|
158
178
|
const handleOnKeyDown = onKeyDown => e => {
|
|
159
179
|
if (removeByBackspace && e.code === 'Backspace' && inputValue === '') {
|
|
160
180
|
if ((selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) && !selectedItems.slice(-1)[0].disabled) {
|
|
@@ -164,11 +184,13 @@ exports.FieldSelectMultiple = (0, react_1.forwardRef)((props, ref) => {
|
|
|
164
184
|
if (e.code === 'Enter') {
|
|
165
185
|
e.stopPropagation();
|
|
166
186
|
e.preventDefault();
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
187
|
+
tryCommitCustomOptionFromInput('enter');
|
|
188
|
+
} else {
|
|
189
|
+
const customOptionTrigger = (0, utils_3.getCustomOptionTriggerByCode)(e.code);
|
|
190
|
+
if ((0, utils_3.shouldHandleCustomOptionTrigger)(customOptionTrigger, resolvedAddCustomOptionTriggers)) {
|
|
191
|
+
e.stopPropagation();
|
|
192
|
+
e.preventDefault();
|
|
193
|
+
tryCommitCustomOptionFromInput(customOptionTrigger);
|
|
172
194
|
}
|
|
173
195
|
}
|
|
174
196
|
if (!open && prevInputValue.current !== inputValue) {
|
|
@@ -194,6 +216,7 @@ exports.FieldSelectMultiple = (0, react_1.forwardRef)((props, ref) => {
|
|
|
194
216
|
const handleBlur = e => {
|
|
195
217
|
var _a;
|
|
196
218
|
if (!open && !buttonsRefs.filter(Boolean).includes(e.relatedTarget)) {
|
|
219
|
+
tryCommitCustomOptionFromInput('blur');
|
|
197
220
|
updateInputValue();
|
|
198
221
|
(_a = rest === null || rest === void 0 ? void 0 : rest.onBlur) === null || _a === void 0 ? void 0 : _a.call(rest, e);
|
|
199
222
|
}
|
|
@@ -278,7 +301,7 @@ exports.FieldSelectMultiple = (0, react_1.forwardRef)((props, ref) => {
|
|
|
278
301
|
tabIndex: -1,
|
|
279
302
|
label: selectedOptionFormatter(option),
|
|
280
303
|
appearance: (_a = option.appearance) !== null && _a !== void 0 ? _a : 'neutral',
|
|
281
|
-
onDelete: !option.disabled && !disabled && !readonly ?
|
|
304
|
+
onDelete: !option.disabled && !disabled && !readonly ? handleTagDelete(option) : undefined,
|
|
282
305
|
className: styles_module_scss_1.default.tag,
|
|
283
306
|
"data-disabled": disabled || undefined
|
|
284
307
|
}, option.id);
|
|
@@ -26,4 +26,6 @@ export declare const FieldSelectSingle: import("react").ForwardRefExoticComponen
|
|
|
26
26
|
resetSearchOnOptionSelection?: boolean;
|
|
27
27
|
onOpenChange?(open: boolean): void;
|
|
28
28
|
selectedOptionFormatter?: SelectedOptionFormatter;
|
|
29
|
-
} & Pick<import("@snack-uikit/list").DroplistProps, "onScroll" | "scrollRef" | "scrollContainerRef" | "untouchableScrollbars" | "dataError" | "dataFiltered" | "scrollToSelectedItem" | "virtualized" | "noDataState" | "noResultsState" | "errorDataState"> &
|
|
29
|
+
} & Pick<import("@snack-uikit/list").DroplistProps, "onScroll" | "scrollRef" | "scrollContainerRef" | "untouchableScrollbars" | "dataError" | "dataFiltered" | "scrollToSelectedItem" | "virtualized" | "noDataState" | "noResultsState" | "errorDataState"> & {
|
|
30
|
+
addCustomOptionTriggers?: import("./types").FieldSelectSingleAddCustomOptionTrigger[];
|
|
31
|
+
} & import("react").RefAttributes<HTMLInputElement>>;
|
|
@@ -60,6 +60,7 @@ exports.FieldSelectSingle = (0, react_1.forwardRef)((props, ref) => {
|
|
|
60
60
|
prefix,
|
|
61
61
|
postfix,
|
|
62
62
|
addOptionByEnter = false,
|
|
63
|
+
addCustomOptionTriggers: addCustomOptionTriggersProp,
|
|
63
64
|
untouchableScrollbars = false,
|
|
64
65
|
open: openProp,
|
|
65
66
|
onOpenChange,
|
|
@@ -69,7 +70,7 @@ exports.FieldSelectSingle = (0, react_1.forwardRef)((props, ref) => {
|
|
|
69
70
|
onCopyButtonClick,
|
|
70
71
|
autoFocus
|
|
71
72
|
} = props,
|
|
72
|
-
rest = __rest(props, ["id", "name", "placeholder", "size", "options", "value", "defaultValue", "onChange", "disabled", "readonly", "searchable", "showCopyButton", "showClearButton", "onKeyDown", "required", "validationState", "search", "autocomplete", "prefixIcon", "prefix", "postfix", "addOptionByEnter", "untouchableScrollbars", "open", "onOpenChange", "selectedOptionFormatter", "enableFuzzySearch", "resetSearchOnOptionSelection", "onCopyButtonClick", "autoFocus"]);
|
|
73
|
+
rest = __rest(props, ["id", "name", "placeholder", "size", "options", "value", "defaultValue", "onChange", "disabled", "readonly", "searchable", "showCopyButton", "showClearButton", "onKeyDown", "required", "validationState", "search", "autocomplete", "prefixIcon", "prefix", "postfix", "addOptionByEnter", "addCustomOptionTriggers", "untouchableScrollbars", "open", "onOpenChange", "selectedOptionFormatter", "enableFuzzySearch", "resetSearchOnOptionSelection", "onCopyButtonClick", "autoFocus"]);
|
|
73
74
|
const localRef = (0, react_1.useRef)(null);
|
|
74
75
|
const [open = false, setOpen] = (0, hooks_1.useValueControl)({
|
|
75
76
|
value: openProp,
|
|
@@ -99,6 +100,10 @@ exports.FieldSelectSingle = (0, react_1.forwardRef)((props, ref) => {
|
|
|
99
100
|
resetSearchOnOptionSelection,
|
|
100
101
|
selectedOptionFormatter
|
|
101
102
|
}));
|
|
103
|
+
const resolvedAddCustomOptionTriggers = (0, hooks_2.useResolvedAddCustomOptionTriggers)({
|
|
104
|
+
addCustomOptionTriggers: addCustomOptionTriggersProp,
|
|
105
|
+
addOptionByEnter
|
|
106
|
+
});
|
|
102
107
|
const prevSelectedItem = (0, react_1.useRef)(selectedItem);
|
|
103
108
|
const prefixSettings = (0, hooks_1.usePrefix)({
|
|
104
109
|
prefix,
|
|
@@ -160,13 +165,6 @@ exports.FieldSelectSingle = (0, react_1.forwardRef)((props, ref) => {
|
|
|
160
165
|
onCopyButtonClick,
|
|
161
166
|
valueToCopy: selectedOptionFormatter(selectedItem)
|
|
162
167
|
});
|
|
163
|
-
const handleBlur = e => {
|
|
164
|
-
var _a;
|
|
165
|
-
if (!open && !buttonsRefs.filter(Boolean).includes(e.relatedTarget)) {
|
|
166
|
-
updateInputValue(selectedItem);
|
|
167
|
-
(_a = rest === null || rest === void 0 ? void 0 : rest.onBlur) === null || _a === void 0 ? void 0 : _a.call(rest, e);
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
168
|
const commonHandleOnKeyDown = (0, hooks_2.useHandleOnKeyDown)({
|
|
171
169
|
inputKeyDownNavigationHandler,
|
|
172
170
|
onInputKeyDownProp,
|
|
@@ -180,6 +178,24 @@ exports.FieldSelectSingle = (0, react_1.forwardRef)((props, ref) => {
|
|
|
180
178
|
setValue(newValue);
|
|
181
179
|
}
|
|
182
180
|
}, [setOpen, setValue]);
|
|
181
|
+
const tryCommitCustomOptionFromInput = (0, react_1.useCallback)(trigger => {
|
|
182
|
+
if (!resolvedAddCustomOptionTriggers.includes(trigger) || inputValue === '') {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
handleSelectionChange(inputValue);
|
|
186
|
+
}, [resolvedAddCustomOptionTriggers, inputValue, handleSelectionChange]);
|
|
187
|
+
const handleBlur = e => {
|
|
188
|
+
var _a;
|
|
189
|
+
if (!open && !buttonsRefs.filter(Boolean).includes(e.relatedTarget)) {
|
|
190
|
+
const commitOnBlur = (0, utils_3.shouldHandleCustomOptionTrigger)('blur', resolvedAddCustomOptionTriggers) && inputValue !== '';
|
|
191
|
+
if (commitOnBlur) {
|
|
192
|
+
tryCommitCustomOptionFromInput('blur');
|
|
193
|
+
} else {
|
|
194
|
+
updateInputValue(selectedItem);
|
|
195
|
+
}
|
|
196
|
+
(_a = rest === null || rest === void 0 ? void 0 : rest.onBlur) === null || _a === void 0 ? void 0 : _a.call(rest, e);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
183
199
|
const handleOnKeyDown = onKeyDown => e => {
|
|
184
200
|
if (!open && prevInputValue.current !== inputValue) {
|
|
185
201
|
setOpen(true);
|
|
@@ -187,16 +203,14 @@ exports.FieldSelectSingle = (0, react_1.forwardRef)((props, ref) => {
|
|
|
187
203
|
if (e.code === 'Enter') {
|
|
188
204
|
e.stopPropagation();
|
|
189
205
|
e.preventDefault();
|
|
190
|
-
|
|
191
|
-
if (addOptionByEnter && e.code === 'Enter' && inputValue !== '') {
|
|
192
|
-
handleSelectionChange(inputValue);
|
|
206
|
+
tryCommitCustomOptionFromInput('enter');
|
|
193
207
|
}
|
|
194
208
|
commonHandleOnKeyDown(onKeyDown)(e);
|
|
195
209
|
};
|
|
196
210
|
const handleOpenChange = open => {
|
|
197
211
|
if ((0, utils_1.isBrowser)() && !readonly && !disabled && !buttonsRefs.includes(document.activeElement)) {
|
|
198
212
|
setOpen(open);
|
|
199
|
-
if (!open) {
|
|
213
|
+
if (!open && !(0, utils_3.shouldHandleCustomOptionTrigger)('blur', resolvedAddCustomOptionTriggers)) {
|
|
200
214
|
updateInputValue(selectedItem);
|
|
201
215
|
}
|
|
202
216
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { KeyboardEvent, KeyboardEventHandler, MouseEvent, RefObject } from 'react';
|
|
2
2
|
import { Handler } from 'uncontrollable';
|
|
3
3
|
import { ItemProps } from '@snack-uikit/list';
|
|
4
|
-
import { ItemWithId, SearchState, SelectedOptionFormatter } from './types';
|
|
4
|
+
import { FieldSelectAddCustomOptionTrigger, ItemWithId, SearchState, SelectedOptionFormatter } from './types';
|
|
5
5
|
type UseHandleOnKeyDownProps = {
|
|
6
6
|
inputKeyDownNavigationHandler: KeyboardEventHandler<HTMLInputElement>;
|
|
7
7
|
onInputKeyDownProp: KeyboardEventHandler<HTMLInputElement> | undefined;
|
|
@@ -38,4 +38,9 @@ export declare function useHandleDeleteItem(setValue: Handler): (item?: ItemWith
|
|
|
38
38
|
* Четкий и нечеткий поиск среди айтемов по полям 'content.option', 'content.caption', 'content.description', 'label'
|
|
39
39
|
*/
|
|
40
40
|
export declare function useSearch(items: ItemProps[], enableFuzzySearch?: boolean): (search: string) => import("@snack-uikit/list/dist/esm/components/Items").Item[];
|
|
41
|
+
type UseResolvedAddCustomOptionTriggersProps = {
|
|
42
|
+
addCustomOptionTriggers?: FieldSelectAddCustomOptionTrigger[];
|
|
43
|
+
addOptionByEnter: boolean;
|
|
44
|
+
};
|
|
45
|
+
export declare function useResolvedAddCustomOptionTriggers({ addCustomOptionTriggers, addOptionByEnter, }: UseResolvedAddCustomOptionTriggersProps): FieldSelectAddCustomOptionTrigger[];
|
|
41
46
|
export {};
|
|
@@ -13,6 +13,7 @@ exports.useButtons = useButtons;
|
|
|
13
13
|
exports.useSearchInput = useSearchInput;
|
|
14
14
|
exports.useHandleDeleteItem = useHandleDeleteItem;
|
|
15
15
|
exports.useSearch = useSearch;
|
|
16
|
+
exports.useResolvedAddCustomOptionTriggers = useResolvedAddCustomOptionTriggers;
|
|
16
17
|
const fuzzy_search_1 = __importDefault(require("fuzzy-search"));
|
|
17
18
|
const react_1 = require("react");
|
|
18
19
|
const input_private_1 = require("@snack-uikit/input-private");
|
|
@@ -176,4 +177,16 @@ function useSearch(items) {
|
|
|
176
177
|
return (0, filterItemsByFlattenIds_1.filterItemsByFlattenIds)(items, filteredIds);
|
|
177
178
|
}, [filterFlattenFunction, items]);
|
|
178
179
|
return (0, react_1.useCallback)(search => search.length >= DEFAULT_MIN_SEARCH_INPUT_LENGTH ? filterFunction(search) : items, [filterFunction, items]);
|
|
180
|
+
}
|
|
181
|
+
function useResolvedAddCustomOptionTriggers(_ref4) {
|
|
182
|
+
let {
|
|
183
|
+
addCustomOptionTriggers,
|
|
184
|
+
addOptionByEnter
|
|
185
|
+
} = _ref4;
|
|
186
|
+
return (0, react_1.useMemo)(() => {
|
|
187
|
+
if (addCustomOptionTriggers !== undefined) {
|
|
188
|
+
return addCustomOptionTriggers;
|
|
189
|
+
}
|
|
190
|
+
return addOptionByEnter ? ['enter'] : [];
|
|
191
|
+
}, [addCustomOptionTriggers, addOptionByEnter]);
|
|
179
192
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { FieldSelect } from './FieldSelect';
|
|
2
|
-
export type { FieldSelectSingleProps, FieldSelectMultipleProps, FieldSelectProps, OptionProps, BaseOptionProps, AccordionOptionProps, NestListOptionProps, GroupOptionProps, SelectedOptionFormatter, } from './types';
|
|
2
|
+
export type { FieldSelectAddCustomOptionTrigger, FieldSelectSingleAddCustomOptionTrigger, FieldSelectSingleProps, FieldSelectMultipleProps, FieldSelectProps, OptionProps, BaseOptionProps, AccordionOptionProps, NestListOptionProps, GroupOptionProps, SelectedOptionFormatter, } from './types';
|
|
@@ -31,9 +31,11 @@ export type SearchState = {
|
|
|
31
31
|
defaultValue?: string;
|
|
32
32
|
onChange?(value: string): void;
|
|
33
33
|
};
|
|
34
|
+
/** События, по которым произвольное значение из строки поиска фиксируется в значении поля */
|
|
35
|
+
export type FieldSelectAddCustomOptionTrigger = 'enter' | 'blur' | 'space' | 'comma';
|
|
36
|
+
export type FieldSelectSingleAddCustomOptionTrigger = Extract<FieldSelectAddCustomOptionTrigger, 'enter' | 'blur'>;
|
|
34
37
|
export type FieldSelectPrivateProps = InputProps & WrapperProps & {
|
|
35
38
|
options: OptionProps[];
|
|
36
|
-
/** Отображать ли состояние загрузки данных в поле и списке */
|
|
37
39
|
loading?: boolean;
|
|
38
40
|
/** Произвольный префикс для поля */
|
|
39
41
|
prefix?: ReactNode;
|
|
@@ -65,6 +67,9 @@ type FiledSelectCommonProps = WithSupportProps<{
|
|
|
65
67
|
widthStrategy?: DroplistProps['widthStrategy'];
|
|
66
68
|
search?: SearchState;
|
|
67
69
|
autocomplete?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* @deprecated Используйте `addCustomOptionTriggers`
|
|
72
|
+
*/
|
|
68
73
|
addOptionByEnter?: boolean;
|
|
69
74
|
open?: boolean;
|
|
70
75
|
/** Включить нечеткий поиск */
|
|
@@ -76,10 +81,22 @@ type FiledSelectCommonProps = WithSupportProps<{
|
|
|
76
81
|
onOpenChange?(open: boolean): void;
|
|
77
82
|
selectedOptionFormatter?: SelectedOptionFormatter;
|
|
78
83
|
}> & Pick<DroplistProps, 'dataError' | 'noDataState' | 'noResultsState' | 'errorDataState' | 'dataFiltered' | 'untouchableScrollbars' | 'scrollToSelectedItem' | 'virtualized' | 'scrollRef' | 'scrollContainerRef' | 'onScroll'>;
|
|
79
|
-
export type FieldSelectSingleProps = FieldSelectPrivateProps & Omit<SelectionSingleState, 'mode'> & WrapperProps & FiledSelectCommonProps
|
|
84
|
+
export type FieldSelectSingleProps = FieldSelectPrivateProps & Omit<SelectionSingleState, 'mode'> & WrapperProps & FiledSelectCommonProps & {
|
|
85
|
+
/**
|
|
86
|
+
* Триггеры фиксации произвольного значения из строки поиска в режиме `single`.
|
|
87
|
+
* Если передан, имеет приоритет над устаревшим `addOptionByEnter`.
|
|
88
|
+
*/
|
|
89
|
+
addCustomOptionTriggers?: FieldSelectSingleAddCustomOptionTrigger[];
|
|
90
|
+
};
|
|
80
91
|
export type FieldSelectMultipleProps = FieldSelectPrivateProps & {
|
|
81
92
|
removeByBackspace?: boolean;
|
|
82
|
-
} & Omit<SelectionMultipleState, 'mode'> & Omit<FiledSelectCommonProps, 'showCopyButton' | 'onCopyButtonClick'
|
|
93
|
+
} & Omit<SelectionMultipleState, 'mode'> & Omit<FiledSelectCommonProps, 'showCopyButton' | 'onCopyButtonClick'> & {
|
|
94
|
+
/**
|
|
95
|
+
* Триггеры фиксации произвольного значения из строки поиска в режиме `multiple`.
|
|
96
|
+
* Если передан, имеет приоритет над устаревшим `addOptionByEnter`.
|
|
97
|
+
*/
|
|
98
|
+
addCustomOptionTriggers?: FieldSelectAddCustomOptionTrigger[];
|
|
99
|
+
};
|
|
83
100
|
export type FieldSelectProps = (FieldSelectSingleProps & {
|
|
84
101
|
selection?: 'single';
|
|
85
102
|
}) | (FieldSelectMultipleProps & {
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { KeyboardEvent } from 'react';
|
|
2
|
+
import { FieldSelectAddCustomOptionTrigger } from '../types';
|
|
3
|
+
export declare const getCustomOptionTriggerByCode: (code: KeyboardEvent<HTMLInputElement>["code"]) => FieldSelectAddCustomOptionTrigger | undefined;
|
|
4
|
+
export declare const shouldHandleCustomOptionTrigger: (trigger: FieldSelectAddCustomOptionTrigger | undefined, availableTriggers: FieldSelectAddCustomOptionTrigger[]) => trigger is FieldSelectAddCustomOptionTrigger;
|