@qoretechnologies/reqore 0.30.6 → 0.30.8

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 (215) hide show
  1. package/CODE_OF_CONDUCT.md +104 -104
  2. package/CONTRIBUTING.MD +78 -78
  3. package/LICENSE +1 -1
  4. package/README.md +1 -1
  5. package/SECURITY.md +5 -5
  6. package/__tests__/collection.test.tsx +1 -1
  7. package/__tests__/{control_group.text.tsx → control_group.test.tsx} +4 -2
  8. package/__tests__/modal.test.tsx +74 -2
  9. package/__tests__/panel.test.tsx +96 -24
  10. package/__tests__/popover.test.tsx +24 -2
  11. package/__tests__/tabs.test.tsx +75 -0
  12. package/dist/components/Button/index.d.ts +6 -1
  13. package/dist/components/Button/index.d.ts.map +1 -1
  14. package/dist/components/Button/index.js +30 -20
  15. package/dist/components/Button/index.js.map +1 -1
  16. package/dist/components/Checkbox/index.d.ts.map +1 -1
  17. package/dist/components/Checkbox/index.js +6 -3
  18. package/dist/components/Checkbox/index.js.map +1 -1
  19. package/dist/components/Collection/index.d.ts +7 -2
  20. package/dist/components/Collection/index.d.ts.map +1 -1
  21. package/dist/components/Collection/index.js +57 -53
  22. package/dist/components/Collection/index.js.map +1 -1
  23. package/dist/components/Collection/item.d.ts +5 -5
  24. package/dist/components/Collection/item.d.ts.map +1 -1
  25. package/dist/components/Collection/item.js +15 -4
  26. package/dist/components/Collection/item.js.map +1 -1
  27. package/dist/components/Columns/column.d.ts.map +1 -1
  28. package/dist/components/Columns/column.js +1 -1
  29. package/dist/components/Columns/column.js.map +1 -1
  30. package/dist/components/ControlGroup/index.d.ts +21 -4
  31. package/dist/components/ControlGroup/index.d.ts.map +1 -1
  32. package/dist/components/ControlGroup/index.js +250 -55
  33. package/dist/components/ControlGroup/index.js.map +1 -1
  34. package/dist/components/Drawer/index.d.ts +2 -2
  35. package/dist/components/Drawer/index.d.ts.map +1 -1
  36. package/dist/components/Drawer/index.js +27 -16
  37. package/dist/components/Drawer/index.js.map +1 -1
  38. package/dist/components/Dropdown/index.d.ts +1 -0
  39. package/dist/components/Dropdown/index.d.ts.map +1 -1
  40. package/dist/components/Dropdown/index.js +2 -2
  41. package/dist/components/Dropdown/index.js.map +1 -1
  42. package/dist/components/Effect/index.d.ts +1 -1
  43. package/dist/components/Effect/index.d.ts.map +1 -1
  44. package/dist/components/Effect/index.js +7 -6
  45. package/dist/components/Effect/index.js.map +1 -1
  46. package/dist/components/Icon/index.d.ts +5 -6
  47. package/dist/components/Icon/index.d.ts.map +1 -1
  48. package/dist/components/Icon/index.js +14 -7
  49. package/dist/components/Icon/index.js.map +1 -1
  50. package/dist/components/Input/index.d.ts +2 -0
  51. package/dist/components/Input/index.d.ts.map +1 -1
  52. package/dist/components/Input/index.js +10 -4
  53. package/dist/components/Input/index.js.map +1 -1
  54. package/dist/components/InternalPopover/index.d.ts.map +1 -1
  55. package/dist/components/InternalPopover/index.js +12 -10
  56. package/dist/components/InternalPopover/index.js.map +1 -1
  57. package/dist/components/Menu/index.d.ts.map +1 -1
  58. package/dist/components/Menu/index.js +1 -1
  59. package/dist/components/Menu/index.js.map +1 -1
  60. package/dist/components/Message/index.d.ts +2 -0
  61. package/dist/components/Message/index.d.ts.map +1 -1
  62. package/dist/components/Message/index.js +2 -2
  63. package/dist/components/Message/index.js.map +1 -1
  64. package/dist/components/MultiSelect/index.d.ts +1 -1
  65. package/dist/components/MultiSelect/index.d.ts.map +1 -1
  66. package/dist/components/MultiSelect/index.js +10 -10
  67. package/dist/components/MultiSelect/index.js.map +1 -1
  68. package/dist/components/Panel/index.d.ts +13 -6
  69. package/dist/components/Panel/index.d.ts.map +1 -1
  70. package/dist/components/Panel/index.js +78 -44
  71. package/dist/components/Panel/index.js.map +1 -1
  72. package/dist/components/Popover/index.d.ts +1 -2
  73. package/dist/components/Popover/index.d.ts.map +1 -1
  74. package/dist/components/Popover/index.js +2 -2
  75. package/dist/components/Popover/index.js.map +1 -1
  76. package/dist/components/Spacer/index.d.ts +2 -0
  77. package/dist/components/Spacer/index.d.ts.map +1 -1
  78. package/dist/components/Spacer/index.js +29 -7
  79. package/dist/components/Spacer/index.js.map +1 -1
  80. package/dist/components/Table/header.js +2 -2
  81. package/dist/components/Table/header.js.map +1 -1
  82. package/dist/components/Table/headerCell.js +2 -2
  83. package/dist/components/Table/headerCell.js.map +1 -1
  84. package/dist/components/Table/helpers.d.ts +3 -2
  85. package/dist/components/Table/helpers.d.ts.map +1 -1
  86. package/dist/components/Table/helpers.js +6 -3
  87. package/dist/components/Table/helpers.js.map +1 -1
  88. package/dist/components/Table/index.d.ts +1 -0
  89. package/dist/components/Table/index.d.ts.map +1 -1
  90. package/dist/components/Table/index.js.map +1 -1
  91. package/dist/components/Table/row.d.ts +0 -5
  92. package/dist/components/Table/row.d.ts.map +1 -1
  93. package/dist/components/Table/row.js +3 -7
  94. package/dist/components/Table/row.js.map +1 -1
  95. package/dist/components/Tabs/content.d.ts +3 -1
  96. package/dist/components/Tabs/content.d.ts.map +1 -1
  97. package/dist/components/Tabs/content.js +8 -3
  98. package/dist/components/Tabs/content.js.map +1 -1
  99. package/dist/components/Tabs/index.d.ts +4 -1
  100. package/dist/components/Tabs/index.d.ts.map +1 -1
  101. package/dist/components/Tabs/index.js +12 -4
  102. package/dist/components/Tabs/index.js.map +1 -1
  103. package/dist/components/Tabs/item.d.ts +1 -0
  104. package/dist/components/Tabs/item.d.ts.map +1 -1
  105. package/dist/components/Tabs/item.js +7 -7
  106. package/dist/components/Tabs/item.js.map +1 -1
  107. package/dist/components/Tabs/list.d.ts +1 -1
  108. package/dist/components/Tabs/list.d.ts.map +1 -1
  109. package/dist/components/Tabs/list.js +7 -6
  110. package/dist/components/Tabs/list.js.map +1 -1
  111. package/dist/components/Tag/group.d.ts +2 -2
  112. package/dist/components/Tag/group.d.ts.map +1 -1
  113. package/dist/components/Tag/group.js +7 -8
  114. package/dist/components/Tag/group.js.map +1 -1
  115. package/dist/components/Tag/index.d.ts +6 -2
  116. package/dist/components/Tag/index.d.ts.map +1 -1
  117. package/dist/components/Tag/index.js +24 -12
  118. package/dist/components/Tag/index.js.map +1 -1
  119. package/dist/components/Tree/index.js +1 -1
  120. package/dist/components/Tree/index.js.map +1 -1
  121. package/dist/constants/animations.js +1 -1
  122. package/dist/constants/sizes.js +10 -10
  123. package/dist/constants/sizes.js.map +1 -1
  124. package/dist/containers/PopoverProvider.d.ts.map +1 -1
  125. package/dist/containers/PopoverProvider.js +10 -8
  126. package/dist/containers/PopoverProvider.js.map +1 -1
  127. package/dist/containers/ReqoreProvider.d.ts.map +1 -1
  128. package/dist/containers/ReqoreProvider.js +4 -2
  129. package/dist/containers/ReqoreProvider.js.map +1 -1
  130. package/dist/containers/UIProvider.d.ts +7 -0
  131. package/dist/containers/UIProvider.d.ts.map +1 -1
  132. package/dist/containers/UIProvider.js.map +1 -1
  133. package/dist/context/ReqoreContext.d.ts +2 -0
  134. package/dist/context/ReqoreContext.d.ts.map +1 -1
  135. package/dist/context/ReqoreContext.js.map +1 -1
  136. package/dist/helpers/colors.d.ts +1 -1
  137. package/dist/helpers/colors.d.ts.map +1 -1
  138. package/dist/helpers/colors.js +6 -2
  139. package/dist/helpers/colors.js.map +1 -1
  140. package/dist/helpers/utils.d.ts +3 -0
  141. package/dist/helpers/utils.d.ts.map +1 -1
  142. package/dist/helpers/utils.js +16 -1
  143. package/dist/helpers/utils.js.map +1 -1
  144. package/dist/hooks/useLatestZIndex.js +2 -2
  145. package/dist/hooks/useLatestZIndex.js.map +1 -1
  146. package/dist/hooks/usePopover.d.ts +1 -0
  147. package/dist/hooks/usePopover.d.ts.map +1 -1
  148. package/dist/hooks/usePopover.js +8 -6
  149. package/dist/hooks/usePopover.js.map +1 -1
  150. package/dist/styles.d.ts +1 -0
  151. package/dist/styles.d.ts.map +1 -1
  152. package/dist/styles.js +6 -5
  153. package/dist/styles.js.map +1 -1
  154. package/dist/types/global.d.ts +26 -0
  155. package/dist/types/global.d.ts.map +1 -1
  156. package/package.json +1 -1
  157. package/src/components/Button/index.tsx +79 -34
  158. package/src/components/Checkbox/index.tsx +3 -2
  159. package/src/components/Collection/index.tsx +93 -60
  160. package/src/components/Collection/item.tsx +29 -9
  161. package/src/components/Columns/column.tsx +1 -0
  162. package/src/components/ControlGroup/index.tsx +449 -104
  163. package/src/components/Drawer/index.tsx +28 -27
  164. package/src/components/Dropdown/index.tsx +3 -1
  165. package/src/components/Effect/index.tsx +22 -14
  166. package/src/components/Icon/index.tsx +81 -62
  167. package/src/components/Input/index.tsx +8 -3
  168. package/src/components/InternalPopover/index.tsx +131 -126
  169. package/src/components/Menu/index.tsx +7 -1
  170. package/src/components/Message/index.tsx +9 -1
  171. package/src/components/MultiSelect/index.tsx +180 -188
  172. package/src/components/Panel/index.tsx +227 -100
  173. package/src/components/Popover/index.tsx +1 -3
  174. package/src/components/Spacer/index.tsx +63 -14
  175. package/src/components/Table/header.tsx +2 -2
  176. package/src/components/Table/headerCell.tsx +2 -2
  177. package/src/components/Table/helpers.ts +12 -6
  178. package/src/components/Table/index.tsx +1 -0
  179. package/src/components/Table/row.tsx +2 -7
  180. package/src/components/Tabs/content.tsx +11 -3
  181. package/src/components/Tabs/index.tsx +14 -3
  182. package/src/components/Tabs/item.tsx +28 -5
  183. package/src/components/Tabs/list.tsx +7 -3
  184. package/src/components/Tag/group.tsx +6 -12
  185. package/src/components/Tag/index.tsx +69 -35
  186. package/src/components/Tree/index.tsx +1 -1
  187. package/src/constants/animations.ts +1 -1
  188. package/src/constants/sizes.ts +10 -10
  189. package/src/containers/PopoverProvider.tsx +11 -8
  190. package/src/containers/ReqoreProvider.tsx +40 -35
  191. package/src/containers/UIProvider.tsx +7 -0
  192. package/src/context/ReqoreContext.tsx +2 -0
  193. package/src/helpers/colors.ts +8 -2
  194. package/src/helpers/utils.ts +18 -0
  195. package/src/hooks/useLatestZIndex.ts +2 -2
  196. package/src/hooks/usePopover.tsx +9 -6
  197. package/src/mock/collectionData.tsx +33 -2
  198. package/src/stories/Button/Button.stories.tsx +72 -7
  199. package/src/stories/Checkbox/Checkbox.stories.tsx +6 -3
  200. package/src/stories/Collection/Collection.stories.tsx +18 -2
  201. package/src/stories/ControlGroup/ControlGroup.stories.tsx +282 -33
  202. package/src/stories/Drawer/Drawer.stories.tsx +70 -3
  203. package/src/stories/Dropdown/Dropdown.stories.tsx +13 -3
  204. package/src/stories/Icon/Icon.stories.tsx +1 -0
  205. package/src/stories/Input/Input.stories.tsx +5 -3
  206. package/src/stories/Menu/Menu.stories.tsx +2 -0
  207. package/src/stories/Message/Message.stories.tsx +7 -0
  208. package/src/stories/Panel/Panel.stories.tsx +147 -13
  209. package/src/stories/Popover/Popover.stories.tsx +88 -82
  210. package/src/stories/Tabs/Tabs.stories.tsx +33 -15
  211. package/src/stories/Tag/Tag.stories.tsx +23 -3
  212. package/src/stories/TextArea/TextArea.stories.tsx +3 -3
  213. package/src/styles.ts +6 -0
  214. package/src/types/global.ts +28 -0
  215. package/tests.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { omit, size } from 'lodash';
2
- import { forwardRef, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { ReqoreDropdown, ReqoreInput } from '../..';
4
4
  import { TSizes } from '../../constants/sizes';
5
5
  import { IPopoverControls } from '../../hooks/usePopover';
@@ -74,217 +74,209 @@ export const ReqoreMultiSelectItem = memo(
74
74
  }
75
75
  );
76
76
 
77
- export const ReqoreMultiSelect = forwardRef<HTMLDivElement, IReqoreMultiSelectProps>(
78
- (
79
- {
80
- value = [],
81
- onValueChange,
82
- onItemClick,
83
- canRemoveItems,
84
- canCreateItems,
85
- items = [],
86
- selectedItemEffect,
87
- selectedItemSize,
88
- selectorProps,
89
- openOnMount,
90
- enterKeySelects,
91
- onItemClickIcon,
92
- ...rest
93
- }: IReqoreMultiSelectProps,
94
- ref
95
- ) => {
96
- const [createdItems, setCreatedItems] = useState<TReqoreMultiSelectItem[]>([]);
97
- const [query, setQuery] = useState<string>('');
98
- const popoverData = useRef<IPopoverControls>(undefined);
99
- const [focused, setFocused] = useState<boolean>(false);
77
+ export const ReqoreMultiSelect = ({
78
+ value = [],
79
+ onValueChange,
80
+ onItemClick,
81
+ canRemoveItems,
82
+ canCreateItems,
83
+ items = [],
84
+ selectedItemEffect,
85
+ selectedItemSize,
86
+ selectorProps,
87
+ openOnMount,
88
+ enterKeySelects,
89
+ onItemClickIcon,
90
+ ...rest
91
+ }: IReqoreMultiSelectProps) => {
92
+ const [createdItems, setCreatedItems] = useState<TReqoreMultiSelectItem[]>([]);
93
+ const [query, setQuery] = useState<string>('');
94
+ const popoverData = useRef<IPopoverControls>(undefined);
95
+ const [focused, setFocused] = useState<boolean>(false);
100
96
 
101
- useEffect(() => {
102
- if (query && !popoverData.current?.isOpen()) {
103
- popoverData.current?.open();
104
- }
105
- }, [query]);
97
+ useEffect(() => {
98
+ if (query && !popoverData.current?.isOpen()) {
99
+ popoverData.current?.open();
100
+ }
101
+ }, [query]);
106
102
 
107
- useEffect(() => {
108
- if (enterKeySelects) {
109
- document.addEventListener('keydown', handleKeyDown);
110
- }
103
+ useEffect(() => {
104
+ if (enterKeySelects) {
105
+ document.addEventListener('keydown', handleKeyDown);
106
+ }
111
107
 
112
- return () => {
113
- document.removeEventListener('keydown', handleKeyDown);
114
- };
115
- });
108
+ return () => {
109
+ document.removeEventListener('keydown', handleKeyDown);
110
+ };
111
+ });
116
112
 
117
- const addRemoveItem = useCallback(
118
- (item: TReqoreMultiSelectItem): void => {
119
- if (value.includes(item.value)) {
120
- onValueChange(value.filter((v) => v !== item.value));
121
- } else {
122
- onValueChange([...value, item.value]);
123
- }
124
- },
125
- [value]
126
- );
113
+ const addRemoveItem = useCallback(
114
+ (item: TReqoreMultiSelectItem): void => {
115
+ if (value.includes(item.value)) {
116
+ onValueChange(value.filter((v) => v !== item.value));
117
+ } else {
118
+ onValueChange([...value, item.value]);
119
+ }
120
+ },
121
+ [value]
122
+ );
127
123
 
128
- const handleItemSelect = useCallback(
129
- (item: Partial<TReqoreMultiSelectItem>) => {
130
- addRemoveItem(item);
124
+ const handleItemSelect = useCallback(
125
+ (item: Partial<TReqoreMultiSelectItem>) => {
126
+ addRemoveItem(item);
131
127
 
132
- if (item.isNew) {
133
- setCreatedItems([
134
- ...createdItems,
135
- {
136
- value: item.value,
137
- },
138
- ]);
139
- }
128
+ if (item.isNew) {
129
+ setCreatedItems([
130
+ ...createdItems,
131
+ {
132
+ value: item.value,
133
+ },
134
+ ]);
135
+ }
140
136
 
141
- setQuery('');
142
- },
143
- [createdItems, value]
144
- );
137
+ setQuery('');
138
+ },
139
+ [createdItems, value]
140
+ );
145
141
 
146
- /*
142
+ /*
147
143
  This code creates a list of all items that are available
148
144
  for selection in the dropdown. It will include the items
149
145
  that are passed in as props, as well as any items that the
150
146
  user has created.
151
147
  */
152
- const allItems: TReqoreMultiSelectItem[] = useMemo(() => {
153
- const customItems: TReqoreMultiSelectItem[] = size(createdItems)
154
- ? [{ divider: true, label: 'Custom Items' }, ...createdItems]
155
- : [];
148
+ const allItems: TReqoreMultiSelectItem[] = useMemo(() => {
149
+ const customItems: TReqoreMultiSelectItem[] = size(createdItems)
150
+ ? [{ divider: true, label: 'Custom Items' }, ...createdItems]
151
+ : [];
156
152
 
157
- let filteredItems: TReqoreMultiSelectItem[] = [...items, ...customItems].filter((item) =>
158
- query
159
- ? item.divider
160
- ? false
161
- : (item.label || item.value)?.toString().toLowerCase().indexOf(query.toLowerCase()) !==
162
- -1
163
- : true
164
- );
153
+ let filteredItems: TReqoreMultiSelectItem[] = [...items, ...customItems].filter((item) =>
154
+ query
155
+ ? item.divider
156
+ ? false
157
+ : (item.label || item.value)?.toString().toLowerCase().indexOf(query.toLowerCase()) !== -1
158
+ : true
159
+ );
165
160
 
166
- // Mark selected items as selected
167
- filteredItems = filteredItems.map((item: TReqoreMultiSelectItem) => ({
168
- ...omit(item, ['actions', 'asBadge', 'rightIcon']),
169
- selected: value.includes(item.value),
170
- }));
161
+ // Mark selected items as selected
162
+ filteredItems = filteredItems.map((item: TReqoreMultiSelectItem) => ({
163
+ ...omit(item, ['actions', 'asBadge', 'rightIcon']),
164
+ selected: value.includes(item.value),
165
+ }));
171
166
 
172
- if (query && !size(filteredItems)) {
173
- filteredItems = [
174
- { label: 'No existing items found', readOnly: true, minimal: true, icon: 'ForbidLine' },
175
- ];
176
- }
167
+ if (query && !size(filteredItems)) {
168
+ filteredItems = [
169
+ { label: 'No existing items found', readOnly: true, minimal: true, icon: 'ForbidLine' },
170
+ ];
171
+ }
177
172
 
178
- // If there is a query and there are filtered items
179
- // and there is no item that exactly matches the query, add it to the list
180
- if (
181
- query &&
182
- !filteredItems.some((item: TReqoreMultiSelectItem) => item.value === query) &&
183
- canCreateItems
184
- ) {
185
- filteredItems = [
186
- {
187
- label: `Create new "${query}"`,
188
- value: query,
189
- isNew: true,
190
- icon: 'AddCircleLine',
191
- minimal: true,
192
- flat: false,
193
- effect: {
194
- gradient: {
195
- colors: {
196
- 0: 'success',
197
- 100: 'success:darken:1',
198
- },
173
+ // If there is a query and there are filtered items
174
+ // and there is no item that exactly matches the query, add it to the list
175
+ if (
176
+ query &&
177
+ !filteredItems.some((item: TReqoreMultiSelectItem) => item.value === query) &&
178
+ canCreateItems
179
+ ) {
180
+ filteredItems = [
181
+ {
182
+ label: `Create new "${query}"`,
183
+ value: query,
184
+ isNew: true,
185
+ icon: 'AddCircleLine',
186
+ minimal: true,
187
+ flat: false,
188
+ effect: {
189
+ gradient: {
190
+ colors: {
191
+ 0: 'success',
192
+ 100: 'success:darken:1',
199
193
  },
200
194
  },
201
195
  },
202
- { divider: true, label: 'Items matching your query' },
203
- ...filteredItems,
204
- ];
205
- }
196
+ },
197
+ { divider: true, label: 'Items matching your query' },
198
+ ...filteredItems,
199
+ ];
200
+ }
206
201
 
207
- return filteredItems;
208
- }, [items, createdItems, query, value]);
202
+ return filteredItems;
203
+ }, [items, createdItems, query, value]);
209
204
 
210
- const handleKeyDown = useCallback(
211
- (e: KeyboardEvent) => {
212
- if (e.key === 'Enter' && focused) {
213
- const item = [...items, ...createdItems].find((item) => item.value === query);
205
+ const handleKeyDown = useCallback(
206
+ (e: KeyboardEvent) => {
207
+ if (e.key === 'Enter' && focused) {
208
+ const item = [...items, ...createdItems].find((item) => item.value === query);
214
209
 
215
- if (item) {
216
- handleItemSelect(item);
217
- } else if (canCreateItems && query) {
218
- handleItemSelect({
219
- value: query,
220
- isNew: true,
221
- });
222
- }
210
+ if (item) {
211
+ handleItemSelect(item);
212
+ } else if (canCreateItems && query) {
213
+ handleItemSelect({
214
+ value: query,
215
+ isNew: true,
216
+ });
223
217
  }
224
- },
225
- [items, createdItems, query, canCreateItems, focused]
226
- );
218
+ }
219
+ },
220
+ [items, createdItems, query, canCreateItems, focused]
221
+ );
227
222
 
228
- const getItemByValue = useCallback(
229
- (value: string): TReqoreMultiSelectItem => {
230
- return [...items, ...createdItems].find((item) => item.value === value);
231
- },
232
- [items, createdItems, value]
233
- );
223
+ const getItemByValue = useCallback(
224
+ (value: string): TReqoreMultiSelectItem => {
225
+ return [...items, ...createdItems].find((item) => item.value === value);
226
+ },
227
+ [items, createdItems, value]
228
+ );
234
229
 
235
- return (
236
- <ReqoreControlGroup vertical fluid {...rest} ref={ref}>
237
- <ReqoreTagGroup minimal={rest.minimal} size={rest.size}>
238
- {size(value) ? (
239
- value.map((v) => (
240
- <ReqoreMultiSelectItem
241
- key={v}
242
- item={getItemByValue(v)}
243
- onItemClickIcon={onItemClickIcon}
244
- onRemoveClick={canRemoveItems ? () => addRemoveItem(getItemByValue(v)) : undefined}
245
- onClick={
246
- onItemClick
247
- ? () => {
248
- onItemClick(getItemByValue(v));
249
- }
250
- : undefined
251
- }
252
- selectedItemEffect={selectedItemEffect}
253
- selectedItemSize={selectedItemSize}
254
- />
255
- ))
256
- ) : (
257
- <ReqoreTag color='transparent' icon='ForbidLine' label='No items selected' />
258
- )}
259
- </ReqoreTagGroup>
260
- <ReqoreControlGroup minimal={rest.minimal} flat={rest.flat} size={rest.size}>
261
- <ReqoreDropdown<IReqoreInputProps>
262
- {...selectorProps}
263
- multiSelect
264
- handler='focus'
265
- onFocus={() => setFocused(true)}
266
- onBlur={() => setFocused(false)}
267
- passPopoverData={(data) => (popoverData.current = data)}
268
- component={ReqoreInput}
269
- onClearClick={() => setQuery('')}
270
- value={query}
271
- isDefaultOpen={openOnMount}
272
- onItemSelect={handleItemSelect}
273
- placeholder={
274
- canCreateItems ? 'Type to search or create an item...' : 'Type to search...'
275
- }
276
- onChange={(e: any) => setQuery(e.target.value)}
277
- items={
278
- size(allItems)
279
- ? allItems
280
- : canCreateItems
281
- ? [{ label: 'No items exist', readOnly: true, minimal: true, icon: 'ForbidLine' }]
282
- : []
283
- }
284
- useTargetWidth
285
- />
286
- </ReqoreControlGroup>
230
+ return (
231
+ <ReqoreControlGroup vertical fluid {...rest}>
232
+ <ReqoreTagGroup minimal={rest.minimal} size={rest.size}>
233
+ {size(value) ? (
234
+ value.map((v) => (
235
+ <ReqoreMultiSelectItem
236
+ key={v}
237
+ item={getItemByValue(v)}
238
+ onItemClickIcon={onItemClickIcon}
239
+ onRemoveClick={canRemoveItems ? () => addRemoveItem(getItemByValue(v)) : undefined}
240
+ onClick={
241
+ onItemClick
242
+ ? () => {
243
+ onItemClick(getItemByValue(v));
244
+ }
245
+ : undefined
246
+ }
247
+ selectedItemEffect={selectedItemEffect}
248
+ selectedItemSize={selectedItemSize}
249
+ />
250
+ ))
251
+ ) : (
252
+ <ReqoreTag color='transparent' icon='ForbidLine' label='No items selected' />
253
+ )}
254
+ </ReqoreTagGroup>
255
+ <ReqoreControlGroup minimal={rest.minimal} flat={rest.flat} size={rest.size}>
256
+ <ReqoreDropdown<IReqoreInputProps>
257
+ {...selectorProps}
258
+ multiSelect
259
+ handler='focus'
260
+ onFocus={() => setFocused(true)}
261
+ onBlur={() => setFocused(false)}
262
+ passPopoverData={(data) => (popoverData.current = data)}
263
+ component={ReqoreInput}
264
+ onClearClick={() => setQuery('')}
265
+ value={query}
266
+ isDefaultOpen={openOnMount}
267
+ onItemSelect={handleItemSelect}
268
+ placeholder={canCreateItems ? 'Type to search or create an item...' : 'Type to search...'}
269
+ onChange={(e: any) => setQuery(e.target.value)}
270
+ items={
271
+ size(allItems)
272
+ ? allItems
273
+ : canCreateItems
274
+ ? [{ label: 'No items exist', readOnly: true, minimal: true, icon: 'ForbidLine' }]
275
+ : []
276
+ }
277
+ useTargetWidth
278
+ />
287
279
  </ReqoreControlGroup>
288
- );
289
- }
290
- );
280
+ </ReqoreControlGroup>
281
+ );
282
+ };