@sproutsocial/seeds-react-menu 1.6.2 → 1.6.4
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/.turbo/turbo-build.log +8 -8
- package/CHANGELOG.md +12 -0
- package/dist/esm/index.js +17 -21
- package/dist/esm/index.js.map +1 -1
- package/dist/index.js +17 -21
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/Autocomplete/Autocomplete.stories.tsx +60 -3
- package/src/Autocomplete/MultiAutocomplete.tsx +13 -20
package/package.json
CHANGED
|
@@ -20,6 +20,7 @@ import { TEST_BOOKS } from "../__fixtures__/menu-test-data";
|
|
|
20
20
|
import { Autocomplete } from "./Autocomplete";
|
|
21
21
|
import { AutocompleteInput } from "./AutocompleteInput";
|
|
22
22
|
import { AutocompleteTokenInput } from "./AutocompleteTokenInput";
|
|
23
|
+
import Button from "@sproutsocial/seeds-react-button";
|
|
23
24
|
|
|
24
25
|
type CustomAutocompleteArgs = React.ComponentProps<typeof Autocomplete>;
|
|
25
26
|
|
|
@@ -220,7 +221,6 @@ export const AutocompleteControlled: Story = {
|
|
|
220
221
|
};
|
|
221
222
|
|
|
222
223
|
const TestControlledMultiAutocomplete = (args: CustomAutocompleteArgs) => {
|
|
223
|
-
const [isOpen, setIsOpen] = React.useState<boolean>(false);
|
|
224
224
|
const [selectedItems, setSelectedItems] = React.useState<
|
|
225
225
|
TypeInternalItemProps[]
|
|
226
226
|
>([]);
|
|
@@ -228,8 +228,6 @@ const TestControlledMultiAutocomplete = (args: CustomAutocompleteArgs) => {
|
|
|
228
228
|
return (
|
|
229
229
|
<Autocomplete
|
|
230
230
|
multiSelect
|
|
231
|
-
isOpen={isOpen}
|
|
232
|
-
onIsOpenChange={({ isOpen }) => setIsOpen(isOpen)}
|
|
233
231
|
selectedItems={selectedItems}
|
|
234
232
|
onSelectedItemsChange={({ selectedItems: newSelectedItems }) =>
|
|
235
233
|
setSelectedItems(newSelectedItems)
|
|
@@ -259,9 +257,68 @@ const TestControlledMultiAutocomplete = (args: CustomAutocompleteArgs) => {
|
|
|
259
257
|
);
|
|
260
258
|
};
|
|
261
259
|
|
|
260
|
+
const TestControlledMultiAutocompleteWithExternalButton = () => {
|
|
261
|
+
const [isOpen, setIsOpen] = React.useState<boolean>(false);
|
|
262
|
+
const [selectedItems, setSelectedItems] = React.useState<
|
|
263
|
+
TypeInternalItemProps[]
|
|
264
|
+
>([]);
|
|
265
|
+
|
|
266
|
+
const handleSetSelectedItems = ({ selectedItems: newSelectedItems }) => {
|
|
267
|
+
setSelectedItems(newSelectedItems);
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
const handleAddRandom = () => {
|
|
271
|
+
const randomItem = {
|
|
272
|
+
id: "book-3",
|
|
273
|
+
index: 2,
|
|
274
|
+
menuItemProps: {
|
|
275
|
+
children: "The Idiot",
|
|
276
|
+
id: "book-3",
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
setSelectedItems((prev) => [...prev, randomItem]);
|
|
280
|
+
console.log("random thing");
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
return (
|
|
284
|
+
<>
|
|
285
|
+
<Autocomplete
|
|
286
|
+
multiSelect
|
|
287
|
+
isOpen={isOpen}
|
|
288
|
+
onIsOpenChange={({ isOpen }) => setIsOpen(isOpen)}
|
|
289
|
+
selectedItems={selectedItems}
|
|
290
|
+
onSelectedItemsChange={handleSetSelectedItems}
|
|
291
|
+
itemToString={(item) => (item ? TEST_BOOKS[item.index].title : "")}
|
|
292
|
+
menuToggleElement={
|
|
293
|
+
<>
|
|
294
|
+
<MenuLabel mb={300}>Choose a book</MenuLabel>
|
|
295
|
+
<AutocompleteTokenInput />
|
|
296
|
+
</>
|
|
297
|
+
}
|
|
298
|
+
>
|
|
299
|
+
<MenuContent>
|
|
300
|
+
<MenuGroup id="books">
|
|
301
|
+
{TEST_BOOKS.map(({ id, title }) => (
|
|
302
|
+
<MenuItem key={id} id={id}>
|
|
303
|
+
{title}
|
|
304
|
+
</MenuItem>
|
|
305
|
+
))}
|
|
306
|
+
</MenuGroup>
|
|
307
|
+
</MenuContent>
|
|
308
|
+
</Autocomplete>
|
|
309
|
+
<Button onClick={handleAddRandom}>Add Random thing</Button>
|
|
310
|
+
</>
|
|
311
|
+
);
|
|
312
|
+
};
|
|
313
|
+
|
|
262
314
|
export const MultiAutocompleteControlled: Story = {
|
|
263
315
|
name: "MultiAutocomplete Controlled State",
|
|
264
316
|
render: (args: CustomAutocompleteArgs) => (
|
|
265
317
|
<TestControlledMultiAutocomplete {...args} />
|
|
266
318
|
),
|
|
267
319
|
};
|
|
320
|
+
|
|
321
|
+
export const MultiAutocompleteControlledWithExternal: Story = {
|
|
322
|
+
name: "MultiAutocomplete Controlled State With External Button",
|
|
323
|
+
render: () => <TestControlledMultiAutocompleteWithExternalButton />,
|
|
324
|
+
};
|
|
@@ -38,6 +38,7 @@ export const MultiAutocomplete = <
|
|
|
38
38
|
onMultiSelectStateChange,
|
|
39
39
|
multiSelectStateReducer,
|
|
40
40
|
autoCloseOnEmpty = true,
|
|
41
|
+
selectedItems: selectedItemsProp,
|
|
41
42
|
...useComboboxProps
|
|
42
43
|
}: TypeMultiAutocompleteProps<I>) => {
|
|
43
44
|
/** Get a list of menuItems and children */
|
|
@@ -46,11 +47,16 @@ export const MultiAutocomplete = <
|
|
|
46
47
|
menuItems,
|
|
47
48
|
MenuItemComponent,
|
|
48
49
|
});
|
|
49
|
-
const [
|
|
50
|
+
const [selectedItemsState, setSelectedItemsState] =
|
|
50
51
|
React.useState(initialSelectedItems);
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
const selectedItems = React.useMemo(
|
|
53
|
+
() => selectedItemsProp || selectedItemsState,
|
|
54
|
+
[selectedItemsProp, selectedItemsState]
|
|
55
|
+
);
|
|
56
|
+
const selectedItemIds = React.useMemo(
|
|
57
|
+
() => getSelectedItemIds(selectedItems),
|
|
58
|
+
[selectedItems]
|
|
59
|
+
);
|
|
54
60
|
|
|
55
61
|
// function that checks that item should be visible based on the selected items
|
|
56
62
|
const getIsItemVisibleMulti = React.useCallback<typeof getIsItemVisible>(
|
|
@@ -109,10 +115,9 @@ export const MultiAutocomplete = <
|
|
|
109
115
|
const useMultipleSelectionReturnProps = useMultipleSelection({
|
|
110
116
|
...defaultDownshiftProps.multi,
|
|
111
117
|
itemToKey,
|
|
112
|
-
selectedItems,
|
|
118
|
+
selectedItems: selectedItemsProp || selectedItems,
|
|
113
119
|
onSelectedItemsChange: ({ selectedItems, ...changes }) => {
|
|
114
|
-
|
|
115
|
-
setSelectedItemIds(getSelectedItemIds(selectedItems));
|
|
120
|
+
setSelectedItemsState(selectedItems);
|
|
116
121
|
onSelectedItemsChange &&
|
|
117
122
|
onSelectedItemsChange({ selectedItems, ...changes });
|
|
118
123
|
},
|
|
@@ -139,11 +144,7 @@ export const MultiAutocomplete = <
|
|
|
139
144
|
case useCombobox.stateChangeTypes.ItemClick:
|
|
140
145
|
if (newSelectedItem) {
|
|
141
146
|
const newSelectedItems = [...selectedItems, newSelectedItem];
|
|
142
|
-
|
|
143
|
-
setSelectedItemIds({
|
|
144
|
-
...selectedItemIds,
|
|
145
|
-
[newSelectedItem.id]: true,
|
|
146
|
-
});
|
|
147
|
+
setSelectedItemsState(newSelectedItems);
|
|
147
148
|
onSelectedItemsChange &&
|
|
148
149
|
onSelectedItemsChange({
|
|
149
150
|
selectedItems: newSelectedItems,
|
|
@@ -162,16 +163,8 @@ export const MultiAutocomplete = <
|
|
|
162
163
|
...useComboboxProps,
|
|
163
164
|
});
|
|
164
165
|
|
|
165
|
-
const { isOpen, closeMenu, inputValue } = useComboboxReturnProps;
|
|
166
166
|
const { popoutProps: userPopoutProps } = useComboboxProps;
|
|
167
167
|
|
|
168
|
-
React.useEffect(() => {
|
|
169
|
-
if (!inputValue) return;
|
|
170
|
-
if (allMenuItems && hiddenItemsCount >= allMenuItems.length && isOpen) {
|
|
171
|
-
closeMenu?.();
|
|
172
|
-
}
|
|
173
|
-
}, [hiddenItemsCount, allMenuItems?.length, isOpen, inputValue]);
|
|
174
|
-
|
|
175
168
|
return (
|
|
176
169
|
<MenuRootComponent
|
|
177
170
|
{...{
|