@snack-uikit/chips 0.22.6-preview-d736f028.0 → 0.23.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.
Files changed (24) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +6 -2
  3. package/dist/cjs/components/ChipChoice/components/ChipChoiceBase/styles.module.css +18 -18
  4. package/dist/cjs/components/ChipChoice/components/ChipChoiceMultiple.d.ts +1 -1
  5. package/dist/cjs/components/ChipChoice/components/ChipChoiceMultiple.js +10 -2
  6. package/dist/cjs/components/ChipChoice/components/ChipChoiceSingle.d.ts +1 -1
  7. package/dist/cjs/components/ChipChoice/components/ChipChoiceSingle.js +10 -2
  8. package/dist/cjs/components/ChipChoice/hooks.js +19 -22
  9. package/dist/cjs/components/ChipChoice/styles.module.css +18 -18
  10. package/dist/cjs/components/ChipChoice/types.d.ts +6 -4
  11. package/dist/esm/components/ChipChoice/components/ChipChoiceBase/styles.module.css +18 -18
  12. package/dist/esm/components/ChipChoice/components/ChipChoiceMultiple.d.ts +1 -1
  13. package/dist/esm/components/ChipChoice/components/ChipChoiceMultiple.js +7 -1
  14. package/dist/esm/components/ChipChoice/components/ChipChoiceSingle.d.ts +1 -1
  15. package/dist/esm/components/ChipChoice/components/ChipChoiceSingle.js +7 -1
  16. package/dist/esm/components/ChipChoice/hooks.js +2 -7
  17. package/dist/esm/components/ChipChoice/styles.module.css +18 -18
  18. package/dist/esm/components/ChipChoice/types.d.ts +6 -4
  19. package/package.json +2 -2
  20. package/src/components/ChipChoice/components/ChipChoiceMultiple.tsx +11 -0
  21. package/src/components/ChipChoice/components/ChipChoiceSingle.tsx +11 -0
  22. package/src/components/ChipChoice/hooks.tsx +19 -24
  23. package/src/components/ChipChoice/styles.module.scss +12 -12
  24. package/src/components/ChipChoice/types.ts +7 -4
package/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
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.23.0 (2024-12-25)
7
+
8
+
9
+ ### Features
10
+
11
+ * **PDS-540:** add autoApply flag for multiple and single ChipChoice ([62f298d](https://github.com/cloud-ru-tech/snack-uikit/commit/62f298d27763f3c67b14ec1a03d3bb660b2468af))
12
+
13
+
14
+
15
+
16
+
6
17
  ## 0.22.5 (2024-12-18)
7
18
 
8
19
  ### Only dependencies have been changed
package/README.md CHANGED
@@ -152,6 +152,9 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
152
152
  | contentRender | `(option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => ReactNode` | - | |
153
153
  | filterFn | `(option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => boolean` | - | |
154
154
  | searchable | `boolean` | - | |
155
+ | autoApply | `boolean` | - | Флаг, отвечающий за применение выбранного значения по умолчанию |
156
+ | onApprove | `() => void` | - | Колбек основной кнопки |
157
+ | onCancel | `() => void` | - | Колбек кнопки отмены |
155
158
  | footer | `ReactNode ;` | - | Кастомизируемый элемент в конце списка |
156
159
  | footerActiveElementsRefs | `RefObject<HTMLElement>[]` | - | Список ссылок на кастомные элементы, помещенные в специальную секцию внизу списка |
157
160
  | scrollToSelectedItem | `boolean` | - | Флаг, отвещающий за прокручивание до выбранного элемента |
@@ -167,7 +170,6 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
167
170
  | value | `ItemId` | - | Controlled состояние |
168
171
  | defaultValue | `ItemId` | - | Начальное состояние |
169
172
  | valueRender | `(option?: BaseOption<T>) => ReactNode` | - | Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label |
170
- | autoApply | `boolean` | - | Флаг, отвечающий за применение выбранного значения по умолчанию |
171
173
  ## ChipChoice.Multiple
172
174
  ### Props
173
175
  | name | type | default value | description |
@@ -188,6 +190,9 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
188
190
  | contentRender | `(option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => ReactNode` | - | |
189
191
  | filterFn | `(option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => boolean` | - | |
190
192
  | searchable | `boolean` | - | |
193
+ | autoApply | `boolean` | - | Флаг, отвечающий за применение выбранного значения по умолчанию |
194
+ | onApprove | `() => void` | - | Колбек основной кнопки |
195
+ | onCancel | `() => void` | - | Колбек кнопки отмены |
191
196
  | footer | `ReactNode ;` | - | Кастомизируемый элемент в конце списка |
192
197
  | footerActiveElementsRefs | `RefObject<HTMLElement>[]` | - | Список ссылок на кастомные элементы, помещенные в специальную секцию внизу списка |
193
198
  | scrollToSelectedItem | `boolean` | - | Флаг, отвещающий за прокручивание до выбранного элемента |
@@ -203,7 +208,6 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
203
208
  | value | `ItemId[]` | - | Controlled состояние |
204
209
  | defaultValue | `ItemId[]` | - | Начальное состояние |
205
210
  | valueRender | `(option?: BaseOption<T>[]) => ReactNode` | - | Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label |
206
- | autoApply | `boolean` | - | Флаг, отвечающий за применение выбранного значения по умолчанию |
207
211
  ## ChipChoice.Date
208
212
  ### Props
209
213
  | name | type | default value | description |
@@ -4,24 +4,6 @@
4
4
  align-items:center;
5
5
  }
6
6
 
7
- .choiceChipFooter{
8
- display:flex;
9
- align-items:center;
10
- justify-content:space-between;
11
- }
12
- .choiceChipFooter[data-size=xs]{
13
- gap:var(--space-calendar-footer-elements-s, 8px);
14
- }
15
- .choiceChipFooter[data-size=s]{
16
- gap:var(--space-calendar-footer-elements-s, 8px);
17
- }
18
- .choiceChipFooter[data-size=m]{
19
- gap:var(--space-calendar-footer-elements-m, 8px);
20
- }
21
- .choiceChipFooter[data-size=l]{
22
- gap:var(--space-calendar-footer-elements-l, 8px);
23
- }
24
-
25
7
  .choiceChip{
26
8
  cursor:pointer;
27
9
  position:relative;
@@ -216,6 +198,24 @@
216
198
  color:var(--sys-neutral-text-support, #6d707f);
217
199
  }
218
200
 
201
+ .choiceChipFooter{
202
+ display:flex;
203
+ align-items:center;
204
+ justify-content:space-between;
205
+ }
206
+ .choiceChipFooter[data-size=xs]{
207
+ gap:var(--space-calendar-footer-elements-s, 8px);
208
+ }
209
+ .choiceChipFooter[data-size=s]{
210
+ gap:var(--space-calendar-footer-elements-s, 8px);
211
+ }
212
+ .choiceChipFooter[data-size=m]{
213
+ gap:var(--space-calendar-footer-elements-m, 8px);
214
+ }
215
+ .choiceChipFooter[data-size=l]{
216
+ gap:var(--space-calendar-footer-elements-l, 8px);
217
+ }
218
+
219
219
  .triggerClassName{
220
220
  --offset:var(--space-drop-list-drop-offset, 4px);
221
221
  }
@@ -5,4 +5,4 @@ export type ChipChoiceMultipleValueFormatterProps<T extends ContentRenderProps =
5
5
  total: number;
6
6
  allLabel: string;
7
7
  };
8
- export declare function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, showClearButton, autoApply, ...rest }: ChipChoiceMultipleProps<T>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, showClearButton, autoApply, onApprove, onCancel, ...rest }: ChipChoiceMultipleProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -51,9 +51,11 @@ function ChipChoiceMultiple(_a) {
51
51
  contentRender,
52
52
  dropDownClassName,
53
53
  showClearButton = true,
54
- autoApply = true
54
+ autoApply = true,
55
+ onApprove,
56
+ onCancel
55
57
  } = _a,
56
- rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "showClearButton", "autoApply"]);
58
+ rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "showClearButton", "autoApply", "onApprove", "onCancel"]);
57
59
  const [value, setValue] = (0, utils_1.useValueControl)({
58
60
  value: valueProp,
59
61
  defaultValue,
@@ -109,10 +111,12 @@ function ChipChoiceMultiple(_a) {
109
111
  }
110
112
  }, [autoApply, searchValue, setValue, setDeferredValue]);
111
113
  const handleOnCancelClick = () => {
114
+ onCancel && onCancel();
112
115
  setDeferredValue(value);
113
116
  setOpen(false);
114
117
  };
115
118
  const handleOnApproveClick = () => {
119
+ onApprove && onApprove();
116
120
  setValue(deferredValue);
117
121
  setOpen(false);
118
122
  };
@@ -127,6 +131,10 @@ function ChipChoiceMultiple(_a) {
127
131
  setSearchValue('');
128
132
  }
129
133
  }, [searchable, open, searchValue]);
134
+ (0, react_1.useEffect)(() => {
135
+ setDeferredValue(value);
136
+ // eslint-disable-next-line react-hooks/exhaustive-deps
137
+ }, [value]);
130
138
  return (0, jsx_runtime_1.jsx)(list_1.Droplist, Object.assign({}, rest, {
131
139
  items: items,
132
140
  selection: {
@@ -5,4 +5,4 @@ export type ChipChoiceSingleValueFormatterProps = {
5
5
  allLabel?: string;
6
6
  };
7
7
  export declare function defaultSingleValueFormatter({ label, allLabel }: ChipChoiceSingleValueFormatterProps): ItemId | undefined;
8
- export declare function ChipChoiceSingle<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, autoApply, ...rest }: ChipChoiceSingleProps<T>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function ChipChoiceSingle<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, autoApply, onApprove, onCancel, ...rest }: ChipChoiceSingleProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -43,9 +43,11 @@ function ChipChoiceSingle(_a) {
43
43
  searchable,
44
44
  contentRender,
45
45
  dropDownClassName,
46
- autoApply = true
46
+ autoApply = true,
47
+ onApprove,
48
+ onCancel
47
49
  } = _a,
48
- rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "autoApply"]);
50
+ rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "autoApply", "onApprove", "onCancel"]);
49
51
  const [value, setValue] = (0, utils_1.useValueControl)({
50
52
  value: valueProp,
51
53
  defaultValue,
@@ -99,10 +101,12 @@ function ChipChoiceSingle(_a) {
99
101
  }
100
102
  }, [autoApply, setValue, setDeferredValue]);
101
103
  const handleOnCancelClick = () => {
104
+ onCancel && onCancel();
102
105
  setDeferredValue(value);
103
106
  setOpen(false);
104
107
  };
105
108
  const handleOnApproveClick = () => {
109
+ onApprove && onApprove();
106
110
  setValue(deferredValue);
107
111
  setOpen(false);
108
112
  };
@@ -117,6 +121,10 @@ function ChipChoiceSingle(_a) {
117
121
  setSearchValue('');
118
122
  }
119
123
  }, [searchable, open, searchValue]);
124
+ (0, react_1.useEffect)(() => {
125
+ setDeferredValue(value);
126
+ // eslint-disable-next-line react-hooks/exhaustive-deps
127
+ }, [value]);
120
128
  return (0, jsx_runtime_1.jsx)(list_1.Droplist, Object.assign({}, rest, {
121
129
  items: items,
122
130
  selection: {
@@ -67,28 +67,25 @@ function useAutoApply(_ref2) {
67
67
  return;
68
68
  }
69
69
  return [{
70
- type: 'group',
71
- items: [{
72
- content: (0, jsx_runtime_1.jsxs)("div", {
73
- className: styles_module_scss_1.default.choiceChipFooter,
74
- "data-size": size,
75
- "data-test-id": constants_1.CHIP_CHOICE_TEST_IDS.footer,
76
- children: [(0, jsx_runtime_1.jsx)(button_1.ButtonFunction, {
77
- size: constants_2.DROPLIST_FOOTER_SIZE_MAP[size],
78
- appearance: 'neutral',
79
- label: t('cancel'),
80
- onClick: onCancel,
81
- "data-test-id": constants_1.CHIP_CHOICE_TEST_IDS.cancelButton
82
- }), (0, jsx_runtime_1.jsx)(button_1.ButtonFilled, {
83
- size: constants_2.DROPLIST_FOOTER_SIZE_MAP[size],
84
- appearance: 'primary',
85
- label: t('apply'),
86
- onClick: onApprove,
87
- "data-test-id": constants_1.CHIP_CHOICE_TEST_IDS.approveButton
88
- })]
89
- }),
90
- inactive: true
91
- }]
70
+ content: (0, jsx_runtime_1.jsxs)("div", {
71
+ className: styles_module_scss_1.default.choiceChipFooter,
72
+ "data-size": size,
73
+ "data-test-id": constants_1.CHIP_CHOICE_TEST_IDS.footer,
74
+ children: [(0, jsx_runtime_1.jsx)(button_1.ButtonFunction, {
75
+ size: constants_2.DROPLIST_FOOTER_SIZE_MAP[size],
76
+ appearance: 'neutral',
77
+ label: t('cancel'),
78
+ onClick: onCancel,
79
+ "data-test-id": constants_1.CHIP_CHOICE_TEST_IDS.cancelButton
80
+ }), (0, jsx_runtime_1.jsx)(button_1.ButtonFilled, {
81
+ size: constants_2.DROPLIST_FOOTER_SIZE_MAP[size],
82
+ appearance: 'primary',
83
+ label: t('apply'),
84
+ onClick: onApprove,
85
+ "data-test-id": constants_1.CHIP_CHOICE_TEST_IDS.approveButton
86
+ })]
87
+ }),
88
+ inactive: true
92
89
  }];
93
90
  }, [t, autoApply, size, onApprove, onCancel]);
94
91
  }
@@ -4,24 +4,6 @@
4
4
  align-items:center;
5
5
  }
6
6
 
7
- .choiceChipFooter{
8
- display:flex;
9
- align-items:center;
10
- justify-content:space-between;
11
- }
12
- .choiceChipFooter[data-size=xs]{
13
- gap:var(--space-calendar-footer-elements-s, 8px);
14
- }
15
- .choiceChipFooter[data-size=s]{
16
- gap:var(--space-calendar-footer-elements-s, 8px);
17
- }
18
- .choiceChipFooter[data-size=m]{
19
- gap:var(--space-calendar-footer-elements-m, 8px);
20
- }
21
- .choiceChipFooter[data-size=l]{
22
- gap:var(--space-calendar-footer-elements-l, 8px);
23
- }
24
-
25
7
  .choiceChip{
26
8
  cursor:pointer;
27
9
  position:relative;
@@ -216,6 +198,24 @@
216
198
  color:var(--sys-neutral-text-support, #6d707f);
217
199
  }
218
200
 
201
+ .choiceChipFooter{
202
+ display:flex;
203
+ align-items:center;
204
+ justify-content:space-between;
205
+ }
206
+ .choiceChipFooter[data-size=xs]{
207
+ gap:var(--space-calendar-footer-elements-s, 8px);
208
+ }
209
+ .choiceChipFooter[data-size=s]{
210
+ gap:var(--space-calendar-footer-elements-s, 8px);
211
+ }
212
+ .choiceChipFooter[data-size=m]{
213
+ gap:var(--space-calendar-footer-elements-m, 8px);
214
+ }
215
+ .choiceChipFooter[data-size=l]{
216
+ gap:var(--space-calendar-footer-elements-l, 8px);
217
+ }
218
+
219
219
  .triggerClassName{
220
220
  --offset:var(--space-drop-list-drop-offset, 4px);
221
221
  }
@@ -59,20 +59,22 @@ export type ChipChoiceSelectCommonProps<T extends ContentRenderProps = ContentRe
59
59
  contentRenderProps?: T;
60
60
  }): boolean;
61
61
  searchable?: boolean;
62
+ /** Флаг, отвечающий за применение выбранного значения по умолчанию */
63
+ autoApply?: boolean;
64
+ /** Колбек основной кнопки */
65
+ onApprove?: () => void;
66
+ /** Колбек кнопки отмены */
67
+ onCancel?: () => void;
62
68
  } & Pick<DroplistProps, 'selection' | 'scrollRef' | 'scrollContainerRef' | 'noDataState' | 'footer' | 'footerActiveElementsRefs' | 'dataError' | 'errorDataState' | 'dataFiltered' | 'noResultsState' | 'loading' | 'scrollToSelectedItem'>;
63
69
  export type ChipChoiceSingleProps<T extends ContentRenderProps = ContentRenderProps> = ChipChoiceSelectCommonProps<T> & Omit<SelectionSingleState, 'mode'> & {
64
70
  /** Массив опций */
65
71
  options: FilterOption<T>[];
66
72
  /** Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label */
67
73
  valueRender?(option?: BaseOption<T>): ReactNode;
68
- /** Флаг, отвечающий за применение выбранного значения по умолчанию */
69
- autoApply?: boolean;
70
74
  };
71
75
  export type ChipChoiceMultipleProps<T extends ContentRenderProps = ContentRenderProps> = ChipChoiceSelectCommonProps<T> & Omit<SelectionMultipleState, 'mode'> & {
72
76
  /** Массив опций */
73
77
  options: FilterOption<T>[];
74
78
  /** Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label */
75
79
  valueRender?(option?: BaseOption<T>[]): ReactNode;
76
- /** Флаг, отвечающий за применение выбранного значения по умолчанию */
77
- autoApply?: boolean;
78
80
  };
@@ -4,24 +4,6 @@
4
4
  align-items:center;
5
5
  }
6
6
 
7
- .choiceChipFooter{
8
- display:flex;
9
- align-items:center;
10
- justify-content:space-between;
11
- }
12
- .choiceChipFooter[data-size=xs]{
13
- gap:var(--space-calendar-footer-elements-s, 8px);
14
- }
15
- .choiceChipFooter[data-size=s]{
16
- gap:var(--space-calendar-footer-elements-s, 8px);
17
- }
18
- .choiceChipFooter[data-size=m]{
19
- gap:var(--space-calendar-footer-elements-m, 8px);
20
- }
21
- .choiceChipFooter[data-size=l]{
22
- gap:var(--space-calendar-footer-elements-l, 8px);
23
- }
24
-
25
7
  .choiceChip{
26
8
  cursor:pointer;
27
9
  position:relative;
@@ -216,6 +198,24 @@
216
198
  color:var(--sys-neutral-text-support, #6d707f);
217
199
  }
218
200
 
201
+ .choiceChipFooter{
202
+ display:flex;
203
+ align-items:center;
204
+ justify-content:space-between;
205
+ }
206
+ .choiceChipFooter[data-size=xs]{
207
+ gap:var(--space-calendar-footer-elements-s, 8px);
208
+ }
209
+ .choiceChipFooter[data-size=s]{
210
+ gap:var(--space-calendar-footer-elements-s, 8px);
211
+ }
212
+ .choiceChipFooter[data-size=m]{
213
+ gap:var(--space-calendar-footer-elements-m, 8px);
214
+ }
215
+ .choiceChipFooter[data-size=l]{
216
+ gap:var(--space-calendar-footer-elements-l, 8px);
217
+ }
218
+
219
219
  .triggerClassName{
220
220
  --offset:var(--space-drop-list-drop-offset, 4px);
221
221
  }
@@ -5,4 +5,4 @@ export type ChipChoiceMultipleValueFormatterProps<T extends ContentRenderProps =
5
5
  total: number;
6
6
  allLabel: string;
7
7
  };
8
- export declare function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, showClearButton, autoApply, ...rest }: ChipChoiceMultipleProps<T>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, showClearButton, autoApply, onApprove, onCancel, ...rest }: ChipChoiceMultipleProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -31,7 +31,7 @@ const defaultMultiValueLabelFormatter = ({ value, total, allLabel }) => {
31
31
  return `${len.toString()}/${total}`;
32
32
  };
33
33
  export function ChipChoiceMultiple(_a) {
34
- var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName, showClearButton = true, autoApply = true } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "showClearButton", "autoApply"]);
34
+ var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName, showClearButton = true, autoApply = true, onApprove, onCancel } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "showClearButton", "autoApply", "onApprove", "onCancel"]);
35
35
  const [value, setValue] = useValueControl({
36
36
  value: valueProp,
37
37
  defaultValue,
@@ -82,10 +82,12 @@ export function ChipChoiceMultiple(_a) {
82
82
  }
83
83
  }, [autoApply, searchValue, setValue, setDeferredValue]);
84
84
  const handleOnCancelClick = () => {
85
+ onCancel && onCancel();
85
86
  setDeferredValue(value);
86
87
  setOpen(false);
87
88
  };
88
89
  const handleOnApproveClick = () => {
90
+ onApprove && onApprove();
89
91
  setValue(deferredValue);
90
92
  setOpen(false);
91
93
  };
@@ -100,6 +102,10 @@ export function ChipChoiceMultiple(_a) {
100
102
  setSearchValue('');
101
103
  }
102
104
  }, [searchable, open, searchValue]);
105
+ useEffect(() => {
106
+ setDeferredValue(value);
107
+ // eslint-disable-next-line react-hooks/exhaustive-deps
108
+ }, [value]);
103
109
  return (_jsx(Droplist, Object.assign({}, rest, { items: items, selection: {
104
110
  value: dropListSelection,
105
111
  onChange: handleSelectionChange,
@@ -5,4 +5,4 @@ export type ChipChoiceSingleValueFormatterProps = {
5
5
  allLabel?: string;
6
6
  };
7
7
  export declare function defaultSingleValueFormatter({ label, allLabel }: ChipChoiceSingleValueFormatterProps): ItemId | undefined;
8
- export declare function ChipChoiceSingle<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, autoApply, ...rest }: ChipChoiceSingleProps<T>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function ChipChoiceSingle<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, autoApply, onApprove, onCancel, ...rest }: ChipChoiceSingleProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -24,7 +24,7 @@ export function defaultSingleValueFormatter({ label, allLabel }) {
24
24
  return label !== null && label !== void 0 ? label : allLabel;
25
25
  }
26
26
  export function ChipChoiceSingle(_a) {
27
- var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName, autoApply = true } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "autoApply"]);
27
+ var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName, autoApply = true, onApprove, onCancel } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "autoApply", "onApprove", "onCancel"]);
28
28
  const [value, setValue] = useValueControl({
29
29
  value: valueProp,
30
30
  defaultValue,
@@ -70,10 +70,12 @@ export function ChipChoiceSingle(_a) {
70
70
  }
71
71
  }, [autoApply, setValue, setDeferredValue]);
72
72
  const handleOnCancelClick = () => {
73
+ onCancel && onCancel();
73
74
  setDeferredValue(value);
74
75
  setOpen(false);
75
76
  };
76
77
  const handleOnApproveClick = () => {
78
+ onApprove && onApprove();
77
79
  setValue(deferredValue);
78
80
  setOpen(false);
79
81
  };
@@ -88,6 +90,10 @@ export function ChipChoiceSingle(_a) {
88
90
  setSearchValue('');
89
91
  }
90
92
  }, [searchable, open, searchValue]);
93
+ useEffect(() => {
94
+ setDeferredValue(value);
95
+ // eslint-disable-next-line react-hooks/exhaustive-deps
96
+ }, [value]);
91
97
  return (_jsx(Droplist, Object.assign({}, rest, { items: items, selection: {
92
98
  value: dropListSelection,
93
99
  onChange: handleSelectionChange,
@@ -47,13 +47,8 @@ export function useAutoApply({ autoApply, size, onApprove, onCancel, }) {
47
47
  }
48
48
  return [
49
49
  {
50
- type: 'group',
51
- items: [
52
- {
53
- content: (_jsxs("div", { className: styles.choiceChipFooter, "data-size": size, "data-test-id": CHIP_CHOICE_TEST_IDS.footer, children: [_jsx(ButtonFunction, { size: DROPLIST_FOOTER_SIZE_MAP[size], appearance: 'neutral', label: t('cancel'), onClick: onCancel, "data-test-id": CHIP_CHOICE_TEST_IDS.cancelButton }), _jsx(ButtonFilled, { size: DROPLIST_FOOTER_SIZE_MAP[size], appearance: 'primary', label: t('apply'), onClick: onApprove, "data-test-id": CHIP_CHOICE_TEST_IDS.approveButton })] })),
54
- inactive: true,
55
- },
56
- ],
50
+ content: (_jsxs("div", { className: styles.choiceChipFooter, "data-size": size, "data-test-id": CHIP_CHOICE_TEST_IDS.footer, children: [_jsx(ButtonFunction, { size: DROPLIST_FOOTER_SIZE_MAP[size], appearance: 'neutral', label: t('cancel'), onClick: onCancel, "data-test-id": CHIP_CHOICE_TEST_IDS.cancelButton }), _jsx(ButtonFilled, { size: DROPLIST_FOOTER_SIZE_MAP[size], appearance: 'primary', label: t('apply'), onClick: onApprove, "data-test-id": CHIP_CHOICE_TEST_IDS.approveButton })] })),
51
+ inactive: true,
57
52
  },
58
53
  ];
59
54
  }, [t, autoApply, size, onApprove, onCancel]);
@@ -4,24 +4,6 @@
4
4
  align-items:center;
5
5
  }
6
6
 
7
- .choiceChipFooter{
8
- display:flex;
9
- align-items:center;
10
- justify-content:space-between;
11
- }
12
- .choiceChipFooter[data-size=xs]{
13
- gap:var(--space-calendar-footer-elements-s, 8px);
14
- }
15
- .choiceChipFooter[data-size=s]{
16
- gap:var(--space-calendar-footer-elements-s, 8px);
17
- }
18
- .choiceChipFooter[data-size=m]{
19
- gap:var(--space-calendar-footer-elements-m, 8px);
20
- }
21
- .choiceChipFooter[data-size=l]{
22
- gap:var(--space-calendar-footer-elements-l, 8px);
23
- }
24
-
25
7
  .choiceChip{
26
8
  cursor:pointer;
27
9
  position:relative;
@@ -216,6 +198,24 @@
216
198
  color:var(--sys-neutral-text-support, #6d707f);
217
199
  }
218
200
 
201
+ .choiceChipFooter{
202
+ display:flex;
203
+ align-items:center;
204
+ justify-content:space-between;
205
+ }
206
+ .choiceChipFooter[data-size=xs]{
207
+ gap:var(--space-calendar-footer-elements-s, 8px);
208
+ }
209
+ .choiceChipFooter[data-size=s]{
210
+ gap:var(--space-calendar-footer-elements-s, 8px);
211
+ }
212
+ .choiceChipFooter[data-size=m]{
213
+ gap:var(--space-calendar-footer-elements-m, 8px);
214
+ }
215
+ .choiceChipFooter[data-size=l]{
216
+ gap:var(--space-calendar-footer-elements-l, 8px);
217
+ }
218
+
219
219
  .triggerClassName{
220
220
  --offset:var(--space-drop-list-drop-offset, 4px);
221
221
  }
@@ -59,20 +59,22 @@ export type ChipChoiceSelectCommonProps<T extends ContentRenderProps = ContentRe
59
59
  contentRenderProps?: T;
60
60
  }): boolean;
61
61
  searchable?: boolean;
62
+ /** Флаг, отвечающий за применение выбранного значения по умолчанию */
63
+ autoApply?: boolean;
64
+ /** Колбек основной кнопки */
65
+ onApprove?: () => void;
66
+ /** Колбек кнопки отмены */
67
+ onCancel?: () => void;
62
68
  } & Pick<DroplistProps, 'selection' | 'scrollRef' | 'scrollContainerRef' | 'noDataState' | 'footer' | 'footerActiveElementsRefs' | 'dataError' | 'errorDataState' | 'dataFiltered' | 'noResultsState' | 'loading' | 'scrollToSelectedItem'>;
63
69
  export type ChipChoiceSingleProps<T extends ContentRenderProps = ContentRenderProps> = ChipChoiceSelectCommonProps<T> & Omit<SelectionSingleState, 'mode'> & {
64
70
  /** Массив опций */
65
71
  options: FilterOption<T>[];
66
72
  /** Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label */
67
73
  valueRender?(option?: BaseOption<T>): ReactNode;
68
- /** Флаг, отвечающий за применение выбранного значения по умолчанию */
69
- autoApply?: boolean;
70
74
  };
71
75
  export type ChipChoiceMultipleProps<T extends ContentRenderProps = ContentRenderProps> = ChipChoiceSelectCommonProps<T> & Omit<SelectionMultipleState, 'mode'> & {
72
76
  /** Массив опций */
73
77
  options: FilterOption<T>[];
74
78
  /** Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label */
75
79
  valueRender?(option?: BaseOption<T>[]): ReactNode;
76
- /** Флаг, отвечающий за применение выбранного значения по умолчанию */
77
- autoApply?: boolean;
78
80
  };
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "Chips",
7
- "version": "0.22.6-preview-d736f028.0",
7
+ "version": "0.23.0",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -54,5 +54,5 @@
54
54
  "peerDependencies": {
55
55
  "@snack-uikit/locale": "*"
56
56
  },
57
- "gitHead": "687df0310b8d81e308f91b3c0e7c8cb4adcefc8d"
57
+ "gitHead": "fe19e90e45a2fd92928e591f3cb555695592c8cd"
58
58
  }
@@ -45,6 +45,8 @@ export function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderP
45
45
  dropDownClassName,
46
46
  showClearButton = true,
47
47
  autoApply = true,
48
+ onApprove,
49
+ onCancel,
48
50
  ...rest
49
51
  }: ChipChoiceMultipleProps<T>) {
50
52
  const [value, setValue] = useValueControl<SelectionSingleValueType[]>({
@@ -120,11 +122,15 @@ export function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderP
120
122
  );
121
123
 
122
124
  const handleOnCancelClick = () => {
125
+ onCancel && onCancel();
126
+
123
127
  setDeferredValue(value);
124
128
  setOpen(false);
125
129
  };
126
130
 
127
131
  const handleOnApproveClick = () => {
132
+ onApprove && onApprove();
133
+
128
134
  setValue(deferredValue);
129
135
  setOpen(false);
130
136
  };
@@ -142,6 +148,11 @@ export function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderP
142
148
  }
143
149
  }, [searchable, open, searchValue]);
144
150
 
151
+ useEffect(() => {
152
+ setDeferredValue(value);
153
+ // eslint-disable-next-line react-hooks/exhaustive-deps
154
+ }, [value]);
155
+
145
156
  return (
146
157
  <Droplist
147
158
  {...rest}
@@ -33,6 +33,8 @@ export function ChipChoiceSingle<T extends ContentRenderProps = ContentRenderPro
33
33
  contentRender,
34
34
  dropDownClassName,
35
35
  autoApply = true,
36
+ onApprove,
37
+ onCancel,
36
38
  ...rest
37
39
  }: ChipChoiceSingleProps<T>) {
38
40
  const [value, setValue] = useValueControl<SelectionSingleValueType>({
@@ -103,11 +105,15 @@ export function ChipChoiceSingle<T extends ContentRenderProps = ContentRenderPro
103
105
  );
104
106
 
105
107
  const handleOnCancelClick = () => {
108
+ onCancel && onCancel();
109
+
106
110
  setDeferredValue(value);
107
111
  setOpen(false);
108
112
  };
109
113
 
110
114
  const handleOnApproveClick = () => {
115
+ onApprove && onApprove();
116
+
111
117
  setValue(deferredValue);
112
118
  setOpen(false);
113
119
  };
@@ -125,6 +131,11 @@ export function ChipChoiceSingle<T extends ContentRenderProps = ContentRenderPro
125
131
  }
126
132
  }, [searchable, open, searchValue]);
127
133
 
134
+ useEffect(() => {
135
+ setDeferredValue(value);
136
+ // eslint-disable-next-line react-hooks/exhaustive-deps
137
+ }, [value]);
138
+
128
139
  return (
129
140
  <Droplist
130
141
  {...rest}
@@ -90,30 +90,25 @@ export function useAutoApply({
90
90
 
91
91
  return [
92
92
  {
93
- type: 'group',
94
- items: [
95
- {
96
- content: (
97
- <div className={styles.choiceChipFooter} data-size={size} data-test-id={CHIP_CHOICE_TEST_IDS.footer}>
98
- <ButtonFunction
99
- size={DROPLIST_FOOTER_SIZE_MAP[size]}
100
- appearance='neutral'
101
- label={t('cancel')}
102
- onClick={onCancel}
103
- data-test-id={CHIP_CHOICE_TEST_IDS.cancelButton}
104
- />
105
- <ButtonFilled
106
- size={DROPLIST_FOOTER_SIZE_MAP[size]}
107
- appearance='primary'
108
- label={t('apply')}
109
- onClick={onApprove}
110
- data-test-id={CHIP_CHOICE_TEST_IDS.approveButton}
111
- />
112
- </div>
113
- ),
114
- inactive: true,
115
- },
116
- ],
93
+ content: (
94
+ <div className={styles.choiceChipFooter} data-size={size} data-test-id={CHIP_CHOICE_TEST_IDS.footer}>
95
+ <ButtonFunction
96
+ size={DROPLIST_FOOTER_SIZE_MAP[size]}
97
+ appearance='neutral'
98
+ label={t('cancel')}
99
+ onClick={onCancel}
100
+ data-test-id={CHIP_CHOICE_TEST_IDS.cancelButton}
101
+ />
102
+ <ButtonFilled
103
+ size={DROPLIST_FOOTER_SIZE_MAP[size]}
104
+ appearance='primary'
105
+ label={t('apply')}
106
+ onClick={onApprove}
107
+ data-test-id={CHIP_CHOICE_TEST_IDS.approveButton}
108
+ />
109
+ </div>
110
+ ),
111
+ inactive: true,
117
112
  },
118
113
  ] as DroplistProps['pinBottom'];
119
114
  }, [t, autoApply, size, onApprove, onCancel]);
@@ -33,18 +33,6 @@ $footerGap: (
33
33
  align-items: center;
34
34
  }
35
35
 
36
- .choiceChipFooter {
37
- display: flex;
38
- align-items: center;
39
- justify-content: space-between;
40
-
41
- @each $size in $sizes {
42
- &[data-size='#{$size}'] {
43
- @include styles-tokens-calendar.composite-var($footerGap, $size);
44
- }
45
- }
46
- }
47
-
48
36
  .choiceChip {
49
37
  @include styles.chip-defaults;
50
38
  @include styles.chip-anatomy-styles(styles-tokens-chips-chipChoice.$chip-choice, $sizes, $labelTypography);
@@ -112,6 +100,18 @@ $footerGap: (
112
100
  }
113
101
  }
114
102
 
103
+ .choiceChipFooter {
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: space-between;
107
+
108
+ @each $size in $sizes {
109
+ &[data-size='#{$size}'] {
110
+ @include styles-tokens-calendar.composite-var($footerGap, $size);
111
+ }
112
+ }
113
+ }
114
+
115
115
  .triggerClassName {
116
116
  --offset: #{styles-tokens-chips-chipChoice.$space-drop-list-drop-offset};
117
117
  }
@@ -97,6 +97,13 @@ export type ChipChoiceSelectCommonProps<T extends ContentRenderProps = ContentRe
97
97
  filterFn?(option: { label: ItemId; value?: ItemId; contentRenderProps?: T }): boolean;
98
98
 
99
99
  searchable?: boolean;
100
+
101
+ /** Флаг, отвечающий за применение выбранного значения по умолчанию */
102
+ autoApply?: boolean;
103
+ /** Колбек основной кнопки */
104
+ onApprove?: () => void;
105
+ /** Колбек кнопки отмены */
106
+ onCancel?: () => void;
100
107
  } & Pick<
101
108
  DroplistProps,
102
109
  | 'selection'
@@ -119,8 +126,6 @@ export type ChipChoiceSingleProps<T extends ContentRenderProps = ContentRenderPr
119
126
  options: FilterOption<T>[];
120
127
  /** Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label */
121
128
  valueRender?(option?: BaseOption<T>): ReactNode;
122
- /** Флаг, отвечающий за применение выбранного значения по умолчанию */
123
- autoApply?: boolean;
124
129
  };
125
130
 
126
131
  export type ChipChoiceMultipleProps<T extends ContentRenderProps = ContentRenderProps> =
@@ -130,6 +135,4 @@ export type ChipChoiceMultipleProps<T extends ContentRenderProps = ContentRender
130
135
  options: FilterOption<T>[];
131
136
  /** Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label */
132
137
  valueRender?(option?: BaseOption<T>[]): ReactNode;
133
- /** Флаг, отвечающий за применение выбранного значения по умолчанию */
134
- autoApply?: boolean;
135
138
  };