@qoretechnologies/reqore 0.30.4 → 0.30.6

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 (214) hide show
  1. package/CODE_OF_CONDUCT.md +105 -0
  2. package/CONTRIBUTING.MD +78 -0
  3. package/LICENSE +1 -1
  4. package/README.md +44 -2
  5. package/SECURITY.md +5 -0
  6. package/__tests__/collection.test.tsx +1 -1
  7. package/__tests__/{control_group.test.tsx → control_group.text.tsx} +2 -4
  8. package/__tests__/modal.test.tsx +2 -74
  9. package/__tests__/panel.test.tsx +24 -96
  10. package/__tests__/popover.test.tsx +2 -24
  11. package/__tests__/tabs.test.tsx +0 -75
  12. package/dist/components/Button/index.d.ts +1 -4
  13. package/dist/components/Button/index.d.ts.map +1 -1
  14. package/dist/components/Button/index.js +7 -10
  15. package/dist/components/Button/index.js.map +1 -1
  16. package/dist/components/Checkbox/index.js +1 -1
  17. package/dist/components/Collection/index.d.ts +2 -7
  18. package/dist/components/Collection/index.d.ts.map +1 -1
  19. package/dist/components/Collection/index.js +53 -57
  20. package/dist/components/Collection/index.js.map +1 -1
  21. package/dist/components/Collection/item.d.ts +5 -5
  22. package/dist/components/Collection/item.d.ts.map +1 -1
  23. package/dist/components/Collection/item.js +4 -15
  24. package/dist/components/Collection/item.js.map +1 -1
  25. package/dist/components/Columns/column.d.ts.map +1 -1
  26. package/dist/components/Columns/column.js +1 -1
  27. package/dist/components/Columns/column.js.map +1 -1
  28. package/dist/components/ControlGroup/index.d.ts +4 -20
  29. package/dist/components/ControlGroup/index.d.ts.map +1 -1
  30. package/dist/components/ControlGroup/index.js +55 -241
  31. package/dist/components/ControlGroup/index.js.map +1 -1
  32. package/dist/components/Drawer/index.d.ts +3 -3
  33. package/dist/components/Drawer/index.d.ts.map +1 -1
  34. package/dist/components/Drawer/index.js +16 -27
  35. package/dist/components/Drawer/index.js.map +1 -1
  36. package/dist/components/Dropdown/index.d.ts +0 -1
  37. package/dist/components/Dropdown/index.d.ts.map +1 -1
  38. package/dist/components/Dropdown/index.js +2 -2
  39. package/dist/components/Dropdown/index.js.map +1 -1
  40. package/dist/components/Dropdown/list.d.ts +3 -3
  41. package/dist/components/Dropdown/list.d.ts.map +1 -1
  42. package/dist/components/Effect/index.d.ts +9 -9
  43. package/dist/components/Effect/index.d.ts.map +1 -1
  44. package/dist/components/Effect/index.js +1 -1
  45. package/dist/components/Effect/index.js.map +1 -1
  46. package/dist/components/Icon/index.d.ts +6 -5
  47. package/dist/components/Icon/index.d.ts.map +1 -1
  48. package/dist/components/Icon/index.js +7 -14
  49. package/dist/components/Icon/index.js.map +1 -1
  50. package/dist/components/Input/index.d.ts +0 -2
  51. package/dist/components/Input/index.d.ts.map +1 -1
  52. package/dist/components/Input/index.js +6 -9
  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 +10 -12
  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 +0 -2
  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 +2 -2
  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/Notifications/index.d.ts +1 -1
  69. package/dist/components/Notifications/index.d.ts.map +1 -1
  70. package/dist/components/Notifications/notification.d.ts +1 -1
  71. package/dist/components/Notifications/notification.d.ts.map +1 -1
  72. package/dist/components/Panel/index.d.ts +6 -13
  73. package/dist/components/Panel/index.d.ts.map +1 -1
  74. package/dist/components/Panel/index.js +44 -78
  75. package/dist/components/Panel/index.js.map +1 -1
  76. package/dist/components/Popover/index.d.ts +2 -1
  77. package/dist/components/Popover/index.d.ts.map +1 -1
  78. package/dist/components/Popover/index.js +2 -2
  79. package/dist/components/Popover/index.js.map +1 -1
  80. package/dist/components/Spacer/index.d.ts +0 -2
  81. package/dist/components/Spacer/index.d.ts.map +1 -1
  82. package/dist/components/Spacer/index.js +7 -29
  83. package/dist/components/Spacer/index.js.map +1 -1
  84. package/dist/components/Table/helpers.d.ts +2 -3
  85. package/dist/components/Table/helpers.d.ts.map +1 -1
  86. package/dist/components/Table/helpers.js +3 -6
  87. package/dist/components/Table/helpers.js.map +1 -1
  88. package/dist/components/Table/index.d.ts +3 -4
  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/Tabs/content.d.ts +1 -3
  92. package/dist/components/Tabs/content.d.ts.map +1 -1
  93. package/dist/components/Tabs/content.js +3 -8
  94. package/dist/components/Tabs/content.js.map +1 -1
  95. package/dist/components/Tabs/index.d.ts +1 -4
  96. package/dist/components/Tabs/index.d.ts.map +1 -1
  97. package/dist/components/Tabs/index.js +4 -12
  98. package/dist/components/Tabs/index.js.map +1 -1
  99. package/dist/components/Tabs/item.d.ts +0 -1
  100. package/dist/components/Tabs/item.d.ts.map +1 -1
  101. package/dist/components/Tabs/item.js +7 -7
  102. package/dist/components/Tabs/item.js.map +1 -1
  103. package/dist/components/Tabs/list.d.ts +1 -1
  104. package/dist/components/Tabs/list.d.ts.map +1 -1
  105. package/dist/components/Tabs/list.js +3 -4
  106. package/dist/components/Tabs/list.js.map +1 -1
  107. package/dist/components/Tag/group.d.ts +2 -2
  108. package/dist/components/Tag/group.d.ts.map +1 -1
  109. package/dist/components/Tag/group.js +8 -7
  110. package/dist/components/Tag/group.js.map +1 -1
  111. package/dist/components/Tag/index.d.ts +2 -6
  112. package/dist/components/Tag/index.d.ts.map +1 -1
  113. package/dist/components/Tag/index.js +12 -20
  114. package/dist/components/Tag/index.js.map +1 -1
  115. package/dist/components/Tree/index.js +1 -1
  116. package/dist/components/Tree/index.js.map +1 -1
  117. package/dist/constants/animations.js +1 -1
  118. package/dist/constants/sizes.d.ts +2 -2
  119. package/dist/constants/sizes.d.ts.map +1 -1
  120. package/dist/constants/sizes.js +10 -10
  121. package/dist/constants/sizes.js.map +1 -1
  122. package/dist/constants/theme.d.ts +1 -1
  123. package/dist/constants/theme.d.ts.map +1 -1
  124. package/dist/containers/PopoverProvider.d.ts.map +1 -1
  125. package/dist/containers/PopoverProvider.js +8 -10
  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 +2 -4
  129. package/dist/containers/ReqoreProvider.js.map +1 -1
  130. package/dist/containers/UIProvider.d.ts +0 -7
  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 +0 -2
  134. package/dist/context/ReqoreContext.d.ts.map +1 -1
  135. package/dist/context/ReqoreContext.js.map +1 -1
  136. package/dist/helpers/utils.d.ts +0 -2
  137. package/dist/helpers/utils.d.ts.map +1 -1
  138. package/dist/helpers/utils.js +2 -4
  139. package/dist/helpers/utils.js.map +1 -1
  140. package/dist/hooks/useLatestZIndex.js +2 -2
  141. package/dist/hooks/useLatestZIndex.js.map +1 -1
  142. package/dist/hooks/usePopover.d.ts +0 -1
  143. package/dist/hooks/usePopover.d.ts.map +1 -1
  144. package/dist/hooks/usePopover.js +6 -8
  145. package/dist/hooks/usePopover.js.map +1 -1
  146. package/dist/styles.d.ts +0 -1
  147. package/dist/styles.d.ts.map +1 -1
  148. package/dist/styles.js +5 -6
  149. package/dist/styles.js.map +1 -1
  150. package/dist/types/global.d.ts +1 -27
  151. package/dist/types/global.d.ts.map +1 -1
  152. package/dist/types/icons.d.ts +1 -1
  153. package/dist/types/icons.d.ts.map +1 -1
  154. package/package.json +1 -1
  155. package/public/logo-dark.png +0 -0
  156. package/public/logo.png +0 -0
  157. package/public/q-symbol.png +0 -0
  158. package/public/qoreLogo-dark.png +0 -0
  159. package/public/qoreLogo.png +0 -0
  160. package/src/components/Button/index.tsx +5 -17
  161. package/src/components/Checkbox/index.tsx +1 -1
  162. package/src/components/Collection/index.tsx +60 -93
  163. package/src/components/Collection/item.tsx +9 -29
  164. package/src/components/Columns/column.tsx +0 -1
  165. package/src/components/ControlGroup/index.tsx +103 -426
  166. package/src/components/Drawer/index.tsx +27 -28
  167. package/src/components/Dropdown/index.tsx +1 -3
  168. package/src/components/Effect/index.tsx +0 -1
  169. package/src/components/Icon/index.tsx +62 -81
  170. package/src/components/Input/index.tsx +4 -8
  171. package/src/components/InternalPopover/index.tsx +126 -131
  172. package/src/components/Menu/index.tsx +1 -7
  173. package/src/components/Message/index.tsx +1 -9
  174. package/src/components/MultiSelect/index.tsx +188 -180
  175. package/src/components/Panel/index.tsx +100 -227
  176. package/src/components/Popover/index.tsx +3 -1
  177. package/src/components/Spacer/index.tsx +14 -63
  178. package/src/components/Table/helpers.ts +6 -12
  179. package/src/components/Table/index.tsx +0 -1
  180. package/src/components/Tabs/content.tsx +3 -11
  181. package/src/components/Tabs/index.tsx +3 -14
  182. package/src/components/Tabs/item.tsx +5 -28
  183. package/src/components/Tabs/list.tsx +0 -4
  184. package/src/components/Tag/group.tsx +12 -6
  185. package/src/components/Tag/index.tsx +35 -67
  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 +8 -11
  190. package/src/containers/ReqoreProvider.tsx +35 -40
  191. package/src/containers/UIProvider.tsx +0 -7
  192. package/src/context/ReqoreContext.tsx +0 -2
  193. package/src/helpers/utils.ts +0 -3
  194. package/src/hooks/useLatestZIndex.ts +2 -2
  195. package/src/hooks/usePopover.tsx +6 -9
  196. package/src/mock/collectionData.tsx +2 -33
  197. package/src/stories/Button/Button.stories.tsx +6 -14
  198. package/src/stories/Checkbox/Checkbox.stories.tsx +3 -6
  199. package/src/stories/Collection/Collection.stories.tsx +2 -18
  200. package/src/stories/ControlGroup/ControlGroup.stories.tsx +34 -220
  201. package/src/stories/Drawer/Drawer.stories.tsx +3 -70
  202. package/src/stories/Dropdown/Dropdown.stories.tsx +3 -13
  203. package/src/stories/Icon/Icon.stories.tsx +0 -1
  204. package/src/stories/Input/Input.stories.tsx +3 -5
  205. package/src/stories/Menu/Menu.stories.tsx +0 -2
  206. package/src/stories/Message/Message.stories.tsx +0 -7
  207. package/src/stories/Panel/Panel.stories.tsx +13 -147
  208. package/src/stories/Popover/Popover.stories.tsx +82 -88
  209. package/src/stories/Tabs/Tabs.stories.tsx +15 -32
  210. package/src/stories/Tag/Tag.stories.tsx +3 -23
  211. package/src/stories/TextArea/TextArea.stories.tsx +3 -3
  212. package/src/styles.ts +0 -6
  213. package/src/types/global.ts +0 -28
  214. package/tests.json +1 -1
@@ -74,13 +74,7 @@ const ReqoreMenu = forwardRef<HTMLDivElement, IReqoreMenuProps>(
74
74
 
75
75
  return (
76
76
  <ReqoreThemeProvider theme={theme}>
77
- <StyledReqoreMenu
78
- {...rest}
79
- position={position}
80
- ref={ref}
81
- theme={theme}
82
- className={`${rest.className || ''} reqore-menu`}
83
- >
77
+ <StyledReqoreMenu {...rest} position={position} ref={ref} theme={theme}>
84
78
  {React.Children.map(children, (child) => {
85
79
  return child
86
80
  ? // @ts-ignore
@@ -14,7 +14,6 @@ import {
14
14
  IWithReqoreSize,
15
15
  } from '../../types/global';
16
16
  import { IReqoreIconName } from '../../types/icons';
17
- import { TReqoreEffectColor } from '../Effect';
18
17
  import { ReqoreHeading } from '../Header';
19
18
  import ReqoreIcon from '../Icon';
20
19
  import {
@@ -36,7 +35,6 @@ export interface IReqoreMessageProps
36
35
  title?: string;
37
36
  children: any;
38
37
  icon?: IReqoreIconName;
39
- iconColor?: TReqoreEffectColor;
40
38
  onClose?: () => any;
41
39
  onClick?: () => any;
42
40
  duration?: number;
@@ -66,7 +64,6 @@ const ReqoreMessage = forwardRef<HTMLDivElement, IReqoreMessageProps>(
66
64
  minimal,
67
65
  size = 'normal',
68
66
  customTheme,
69
- iconColor,
70
67
  ...rest
71
68
  },
72
69
  ref: any
@@ -131,12 +128,7 @@ const ReqoreMessage = forwardRef<HTMLDivElement, IReqoreMessageProps>(
131
128
  >
132
129
  {leftIcon ? (
133
130
  <StyledIconWrapper intent={intent} size={size} theme={theme}>
134
- <ReqoreIcon
135
- icon={leftIcon}
136
- margin={flat && minimal ? 'right' : 'both'}
137
- size={size}
138
- color={iconColor}
139
- />
131
+ <ReqoreIcon icon={leftIcon} margin={flat && minimal ? 'right' : 'both'} size={size} />
140
132
  </StyledIconWrapper>
141
133
  ) : null}
142
134
  <StyledNotificationContentWrapper size={size} theme={theme}>
@@ -1,5 +1,5 @@
1
1
  import { omit, size } from 'lodash';
2
- import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { forwardRef, 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,209 +74,217 @@ export const ReqoreMultiSelectItem = memo(
74
74
  }
75
75
  );
76
76
 
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);
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);
96
100
 
97
- useEffect(() => {
98
- if (query && !popoverData.current?.isOpen()) {
99
- popoverData.current?.open();
100
- }
101
- }, [query]);
101
+ useEffect(() => {
102
+ if (query && !popoverData.current?.isOpen()) {
103
+ popoverData.current?.open();
104
+ }
105
+ }, [query]);
102
106
 
103
- useEffect(() => {
104
- if (enterKeySelects) {
105
- document.addEventListener('keydown', handleKeyDown);
106
- }
107
+ useEffect(() => {
108
+ if (enterKeySelects) {
109
+ document.addEventListener('keydown', handleKeyDown);
110
+ }
107
111
 
108
- return () => {
109
- document.removeEventListener('keydown', handleKeyDown);
110
- };
111
- });
112
+ return () => {
113
+ document.removeEventListener('keydown', handleKeyDown);
114
+ };
115
+ });
112
116
 
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
- );
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
+ );
123
127
 
124
- const handleItemSelect = useCallback(
125
- (item: Partial<TReqoreMultiSelectItem>) => {
126
- addRemoveItem(item);
128
+ const handleItemSelect = useCallback(
129
+ (item: Partial<TReqoreMultiSelectItem>) => {
130
+ addRemoveItem(item);
127
131
 
128
- if (item.isNew) {
129
- setCreatedItems([
130
- ...createdItems,
131
- {
132
- value: item.value,
133
- },
134
- ]);
135
- }
132
+ if (item.isNew) {
133
+ setCreatedItems([
134
+ ...createdItems,
135
+ {
136
+ value: item.value,
137
+ },
138
+ ]);
139
+ }
136
140
 
137
- setQuery('');
138
- },
139
- [createdItems, value]
140
- );
141
+ setQuery('');
142
+ },
143
+ [createdItems, value]
144
+ );
141
145
 
142
- /*
146
+ /*
143
147
  This code creates a list of all items that are available
144
148
  for selection in the dropdown. It will include the items
145
149
  that are passed in as props, as well as any items that the
146
150
  user has created.
147
151
  */
148
- const allItems: TReqoreMultiSelectItem[] = useMemo(() => {
149
- const customItems: TReqoreMultiSelectItem[] = size(createdItems)
150
- ? [{ divider: true, label: 'Custom Items' }, ...createdItems]
151
- : [];
152
+ const allItems: TReqoreMultiSelectItem[] = useMemo(() => {
153
+ const customItems: TReqoreMultiSelectItem[] = size(createdItems)
154
+ ? [{ divider: true, label: 'Custom Items' }, ...createdItems]
155
+ : [];
152
156
 
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
- );
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
+ );
160
165
 
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
- }));
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
+ }));
166
171
 
167
- if (query && !size(filteredItems)) {
168
- filteredItems = [
169
- { label: 'No existing items found', readOnly: true, minimal: true, icon: 'ForbidLine' },
170
- ];
171
- }
172
+ if (query && !size(filteredItems)) {
173
+ filteredItems = [
174
+ { label: 'No existing items found', readOnly: true, minimal: true, icon: 'ForbidLine' },
175
+ ];
176
+ }
172
177
 
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',
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
+ },
193
199
  },
194
200
  },
195
201
  },
196
- },
197
- { divider: true, label: 'Items matching your query' },
198
- ...filteredItems,
199
- ];
200
- }
202
+ { divider: true, label: 'Items matching your query' },
203
+ ...filteredItems,
204
+ ];
205
+ }
201
206
 
202
- return filteredItems;
203
- }, [items, createdItems, query, value]);
207
+ return filteredItems;
208
+ }, [items, createdItems, query, value]);
204
209
 
205
- const handleKeyDown = useCallback(
206
- (e: KeyboardEvent) => {
207
- if (e.key === 'Enter' && focused) {
208
- const item = [...items, ...createdItems].find((item) => item.value === query);
210
+ const handleKeyDown = useCallback(
211
+ (e: KeyboardEvent) => {
212
+ if (e.key === 'Enter' && focused) {
213
+ const item = [...items, ...createdItems].find((item) => item.value === query);
209
214
 
210
- if (item) {
211
- handleItemSelect(item);
212
- } else if (canCreateItems && query) {
213
- handleItemSelect({
214
- value: query,
215
- isNew: true,
216
- });
215
+ if (item) {
216
+ handleItemSelect(item);
217
+ } else if (canCreateItems && query) {
218
+ handleItemSelect({
219
+ value: query,
220
+ isNew: true,
221
+ });
222
+ }
217
223
  }
218
- }
219
- },
220
- [items, createdItems, query, canCreateItems, focused]
221
- );
224
+ },
225
+ [items, createdItems, query, canCreateItems, focused]
226
+ );
222
227
 
223
- const getItemByValue = useCallback(
224
- (value: string): TReqoreMultiSelectItem => {
225
- return [...items, ...createdItems].find((item) => item.value === value);
226
- },
227
- [items, createdItems, value]
228
- );
228
+ const getItemByValue = useCallback(
229
+ (value: string): TReqoreMultiSelectItem => {
230
+ return [...items, ...createdItems].find((item) => item.value === value);
231
+ },
232
+ [items, createdItems, value]
233
+ );
229
234
 
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
- />
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>
279
287
  </ReqoreControlGroup>
280
- </ReqoreControlGroup>
281
- );
282
- };
288
+ );
289
+ }
290
+ );