@entur/dropdown 7.3.9-beta.0 → 7.3.9
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/dist/MultiSelect.d.ts +2 -2
- package/dist/SearchableDropdown.d.ts +2 -2
- package/dist/components/DropdownList.d.ts +5 -4
- package/dist/dropdown.cjs.js +142 -138
- package/dist/dropdown.cjs.js.map +1 -1
- package/dist/dropdown.esm.js +143 -139
- package/dist/dropdown.esm.js.map +1 -1
- package/dist/styles.css +1 -4
- package/dist/utils.d.ts +1 -1
- package/package.json +7 -7
package/dist/MultiSelect.d.ts
CHANGED
|
@@ -55,7 +55,7 @@ export type MultiSelectProps<ValueType> = Omit<DropdownProps<ValueType>, 'select
|
|
|
55
55
|
/** Callback som kalles når brukeren går ut av input-feltet */
|
|
56
56
|
onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
|
|
57
57
|
/** Callback når komponenten klikkes */
|
|
58
|
-
onClick?: (event: React.MouseEvent<
|
|
58
|
+
onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
|
|
59
59
|
/** Callback når en tast trykkes */
|
|
60
60
|
onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
|
|
61
61
|
/** Callback når komponenten får fokus */
|
|
@@ -115,7 +115,7 @@ export declare const MultiSelect: <ValueType extends unknown>(props: Omit<Dropdo
|
|
|
115
115
|
/** Callback som kalles når brukeren går ut av input-feltet */
|
|
116
116
|
onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
|
|
117
117
|
/** Callback når komponenten klikkes */
|
|
118
|
-
onClick?: (event: React.MouseEvent<
|
|
118
|
+
onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
|
|
119
119
|
/** Callback når en tast trykkes */
|
|
120
120
|
onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
|
|
121
121
|
/** Callback når komponenten får fokus */
|
|
@@ -17,7 +17,7 @@ export type SearchableDropdownProps<ValueType> = DropdownProps<ValueType> & {
|
|
|
17
17
|
/** Callback som kalles når brukeren går ut av input-feltet */
|
|
18
18
|
onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
|
|
19
19
|
/** Callback når komponenten klikkes */
|
|
20
|
-
onClick?: (event: React.MouseEvent<
|
|
20
|
+
onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
|
|
21
21
|
/** Callback når en tast trykkes */
|
|
22
22
|
onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
|
|
23
23
|
/** Callback når komponenten får fokus */
|
|
@@ -39,7 +39,7 @@ export declare const SearchableDropdown: <ValueType extends unknown>(props: Drop
|
|
|
39
39
|
/** Callback som kalles når brukeren går ut av input-feltet */
|
|
40
40
|
onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
|
|
41
41
|
/** Callback når komponenten klikkes */
|
|
42
|
-
onClick?: (event: React.MouseEvent<
|
|
42
|
+
onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
|
|
43
43
|
/** Callback når en tast trykkes */
|
|
44
44
|
onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
|
|
45
45
|
/** Callback når komponenten får fokus */
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { default as React
|
|
1
|
+
import { default as React } from 'react';
|
|
2
2
|
import { UseComboboxPropGetters, UseSelectPropGetters } from 'downshift';
|
|
3
3
|
import { NormalizedDropdownItemType } from '../types';
|
|
4
4
|
type DropdownListProps<ValueType> = {
|
|
5
5
|
ariaLabelChosenSingular?: string;
|
|
6
6
|
ariaLabelSelectedItem?: string;
|
|
7
|
+
getMenuProps: UseComboboxPropGetters<ValueType>['getMenuProps'] | UseSelectPropGetters<ValueType>['getMenuProps'];
|
|
7
8
|
getItemProps: UseComboboxPropGetters<ValueType>['getItemProps'] | UseSelectPropGetters<ValueType>['getItemProps'];
|
|
8
9
|
highlightedIndex: number;
|
|
9
10
|
isOpen: boolean;
|
|
@@ -11,15 +12,15 @@ type DropdownListProps<ValueType> = {
|
|
|
11
12
|
floatingStyles: {
|
|
12
13
|
[key: string]: any;
|
|
13
14
|
} | undefined;
|
|
14
|
-
|
|
15
|
+
setListRef: (node: HTMLElement | null) => void;
|
|
15
16
|
loading?: boolean;
|
|
16
17
|
loadingText?: string;
|
|
17
18
|
noMatchesText?: string;
|
|
18
|
-
selectAllCheckboxState?: boolean | 'indeterminate';
|
|
19
|
+
selectAllCheckboxState?: () => boolean | 'indeterminate';
|
|
19
20
|
selectAllItem?: NormalizedDropdownItemType<string>;
|
|
20
21
|
selectedItems: NormalizedDropdownItemType<ValueType>[];
|
|
21
22
|
style?: React.CSSProperties;
|
|
22
23
|
readOnly?: boolean;
|
|
23
24
|
};
|
|
24
|
-
export declare const DropdownList: <ValueType extends unknown>({ ariaLabelChosenSingular, ariaLabelSelectedItem, getItemProps, isOpen, highlightedIndex, listItems, floatingStyles,
|
|
25
|
+
export declare const DropdownList: <ValueType extends unknown>({ ariaLabelChosenSingular, ariaLabelSelectedItem, getItemProps, getMenuProps, isOpen, highlightedIndex, listItems, floatingStyles, setListRef, loading, loadingText, noMatchesText, selectAllCheckboxState, selectAllItem, selectedItems, readOnly, ...rest }: DropdownListProps<ValueType>) => React.JSX.Element;
|
|
25
26
|
export {};
|
package/dist/dropdown.cjs.js
CHANGED
|
@@ -18,19 +18,19 @@ const DropdownList = ({
|
|
|
18
18
|
ariaLabelChosenSingular = "valgt",
|
|
19
19
|
ariaLabelSelectedItem = ", valgt element, trykk for å fjerne",
|
|
20
20
|
getItemProps,
|
|
21
|
+
getMenuProps,
|
|
21
22
|
isOpen,
|
|
22
23
|
highlightedIndex,
|
|
23
24
|
listItems,
|
|
24
25
|
floatingStyles,
|
|
25
|
-
|
|
26
|
+
setListRef,
|
|
26
27
|
loading = false,
|
|
27
28
|
loadingText = "Laster inn …",
|
|
28
29
|
noMatchesText = "Ingen treff for søket",
|
|
29
|
-
readOnly = false,
|
|
30
30
|
selectAllCheckboxState,
|
|
31
31
|
selectAllItem,
|
|
32
32
|
selectedItems,
|
|
33
|
-
|
|
33
|
+
readOnly = false,
|
|
34
34
|
...rest
|
|
35
35
|
}) => {
|
|
36
36
|
const isMultiselect = selectAllItem !== void 0;
|
|
@@ -43,7 +43,7 @@ const DropdownList = ({
|
|
|
43
43
|
return true;
|
|
44
44
|
});
|
|
45
45
|
const ariaValuesSelectAll = () => {
|
|
46
|
-
switch (selectAllCheckboxState) {
|
|
46
|
+
switch (selectAllCheckboxState?.()) {
|
|
47
47
|
case "indeterminate": {
|
|
48
48
|
return {
|
|
49
49
|
label: `${selectAllItem?.label}, delvis valgt`,
|
|
@@ -66,7 +66,7 @@ const DropdownList = ({
|
|
|
66
66
|
form.Checkbox,
|
|
67
67
|
{
|
|
68
68
|
"aria-hidden": "true",
|
|
69
|
-
checked: selectAllCheckboxState,
|
|
69
|
+
checked: selectAllCheckboxState?.(),
|
|
70
70
|
className: "eds-dropdown__list__item__checkbox",
|
|
71
71
|
tabIndex: -1,
|
|
72
72
|
onChange: () => void 0
|
|
@@ -113,68 +113,75 @@ const DropdownList = ({
|
|
|
113
113
|
}) : null
|
|
114
114
|
] });
|
|
115
115
|
};
|
|
116
|
-
return
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
116
|
+
return (
|
|
117
|
+
// use popover from @entur/tooltip when that package upgrades to floating-ui
|
|
118
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
119
|
+
"ul",
|
|
120
|
+
{
|
|
121
|
+
...getMenuProps({
|
|
122
|
+
"aria-multiselectable": isMultiselect,
|
|
123
|
+
ref: setListRef,
|
|
124
|
+
className: "eds-dropdown__list",
|
|
125
|
+
style: {
|
|
126
|
+
...floatingStyles,
|
|
127
|
+
display: isOpen && !readOnly ? void 0 : "none",
|
|
128
|
+
...rest.style
|
|
129
|
+
}
|
|
130
|
+
}),
|
|
131
|
+
children: (() => {
|
|
132
|
+
if (!isOpen || readOnly) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
if (loading) {
|
|
136
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
137
|
+
"li",
|
|
138
|
+
{
|
|
139
|
+
className: "eds-dropdown__list__item",
|
|
140
|
+
children: loadingText
|
|
141
|
+
},
|
|
142
|
+
"dropdown-list-loading"
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
if (isNoMatches) {
|
|
146
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
147
|
+
"li",
|
|
148
|
+
{
|
|
149
|
+
className: "eds-dropdown__list__item",
|
|
150
|
+
children: noMatchesText
|
|
151
|
+
},
|
|
152
|
+
"dropdown-list-no-match"
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
return listItems.map((item, index) => {
|
|
156
|
+
const key = item.itemKey ?? `${item.label ?? ""}-${item.value ?? ""}-${(item.icons ?? []).map((icon) => icon?.displayName ?? icon?.name ?? "unknown").join("-")}`;
|
|
157
|
+
const itemIsSelectAll = item.value === selectAllItem?.value;
|
|
158
|
+
if (itemIsSelectAll && listItems.length <= 2) return null;
|
|
159
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
160
|
+
"li",
|
|
161
|
+
{
|
|
162
|
+
className: classNames("eds-dropdown__list__item", {
|
|
163
|
+
"eds-dropdown__list__item--select-all": itemIsSelectAll,
|
|
164
|
+
"eds-dropdown__list__item--highlighted": highlightedIndex === index,
|
|
165
|
+
"eds-dropdown__list__item--selected": !isMultiselect && isItemSelected(item)
|
|
166
|
+
}),
|
|
167
|
+
...getItemProps({
|
|
168
|
+
// @ts-expect-error Since getItemProps expects the same item type
|
|
169
|
+
// here as items, it throws error when selectAllItem is a string.
|
|
170
|
+
// This does, however, not cause any functional issues.
|
|
171
|
+
item,
|
|
172
|
+
index,
|
|
173
|
+
"aria-selected": itemIsSelectAll ? ariaValuesSelectAll().selected : isItemSelected(item)
|
|
174
|
+
}),
|
|
175
|
+
children: itemIsSelectAll ? selectAllListItemContent() : listItemContent(
|
|
176
|
+
item
|
|
177
|
+
)
|
|
178
|
+
},
|
|
179
|
+
key
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
})()
|
|
183
|
+
}
|
|
184
|
+
)
|
|
178
185
|
);
|
|
179
186
|
};
|
|
180
187
|
const SelectedItemTag = ({
|
|
@@ -450,11 +457,11 @@ const useMultiselectUtils = ({
|
|
|
450
457
|
(selectedItem) => selectedItem.value !== clickedItem.value
|
|
451
458
|
)
|
|
452
459
|
);
|
|
453
|
-
const selectAllCheckboxState =
|
|
460
|
+
const selectAllCheckboxState = () => {
|
|
454
461
|
if (allListItemsAreSelected) return true;
|
|
455
462
|
if (someListItemsAreSelected) return "indeterminate";
|
|
456
463
|
return false;
|
|
457
|
-
}
|
|
464
|
+
};
|
|
458
465
|
const selectAllUnselectedItemsInListItems = (onChange) => {
|
|
459
466
|
onChange([...selectedItems, ...unselectedItemsInListItems]);
|
|
460
467
|
};
|
|
@@ -548,6 +555,7 @@ const SearchableDropdown = React.forwardRef(
|
|
|
548
555
|
const resetInputState = ({
|
|
549
556
|
changes
|
|
550
557
|
}) => {
|
|
558
|
+
updateListItems({ inputValue: EMPTY_INPUT });
|
|
551
559
|
return {
|
|
552
560
|
...changes,
|
|
553
561
|
inputValue: EMPTY_INPUT
|
|
@@ -576,12 +584,11 @@ const SearchableDropdown = React.forwardRef(
|
|
|
576
584
|
// empty input to show selected item and reset dropdown list on item selection
|
|
577
585
|
case downshift.useCombobox.stateChangeTypes.ItemClick:
|
|
578
586
|
case downshift.useCombobox.stateChangeTypes.InputKeyDownEnter:
|
|
579
|
-
return resetInputState({ changes });
|
|
580
587
|
case downshift.useCombobox.stateChangeTypes.InputBlur:
|
|
581
|
-
return resetInputState({
|
|
582
|
-
changes: { ...changes, selectedItem: value }
|
|
583
|
-
});
|
|
588
|
+
return resetInputState({ changes });
|
|
584
589
|
case downshift.useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
|
|
590
|
+
if (changes.selectedItem !== null && !inputHasFocus)
|
|
591
|
+
setShowSelectedItem(true);
|
|
585
592
|
return resetInputState({ changes });
|
|
586
593
|
// remove leading whitespace, select element with spacebar on empty input
|
|
587
594
|
case downshift.useCombobox.stateChangeTypes.InputChange: {
|
|
@@ -652,17 +659,19 @@ const SearchableDropdown = React.forwardRef(
|
|
|
652
659
|
reactDom.offset(tokens.space.extraSmall2),
|
|
653
660
|
reactDom.shift({ padding: tokens.space.extraSmall }),
|
|
654
661
|
reactDom.size({
|
|
655
|
-
apply({ elements, availableHeight }) {
|
|
656
|
-
elements.floating.style
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
662
|
+
apply({ rects, elements, availableHeight }) {
|
|
663
|
+
Object.assign(elements.floating.style, {
|
|
664
|
+
width: `${rects.reference.width}px`,
|
|
665
|
+
// Floating will flip when smaller than 10*16 px
|
|
666
|
+
// and never exceed 20*16 px.
|
|
667
|
+
maxHeight: `${clamp(10 * 16, availableHeight, 20 * 16)}px`
|
|
668
|
+
});
|
|
660
669
|
}
|
|
661
670
|
}),
|
|
662
671
|
reactDom.flip({ fallbackStrategy: "initialPlacement" })
|
|
663
672
|
]
|
|
664
673
|
});
|
|
665
|
-
React.
|
|
674
|
+
React.useEffect(() => {
|
|
666
675
|
if (isOpen && refs.reference.current && refs.floating.current) {
|
|
667
676
|
return reactDom.autoUpdate(
|
|
668
677
|
refs.reference.current,
|
|
@@ -693,7 +702,9 @@ const SearchableDropdown = React.forwardRef(
|
|
|
693
702
|
labelProps: getLabelProps(),
|
|
694
703
|
labelTooltip,
|
|
695
704
|
onClick: (e) => {
|
|
696
|
-
if (e.target === e.currentTarget)
|
|
705
|
+
if (e.target === e.currentTarget) {
|
|
706
|
+
getInputProps()?.onClick?.(e);
|
|
707
|
+
}
|
|
697
708
|
onClick?.(e);
|
|
698
709
|
},
|
|
699
710
|
onKeyDown,
|
|
@@ -711,19 +722,17 @@ const SearchableDropdown = React.forwardRef(
|
|
|
711
722
|
ariaLabelSelectedItem,
|
|
712
723
|
floatingStyles,
|
|
713
724
|
getItemProps,
|
|
725
|
+
getMenuProps,
|
|
714
726
|
highlightedIndex,
|
|
715
727
|
isOpen,
|
|
716
728
|
listItems,
|
|
729
|
+
style: listStyle,
|
|
730
|
+
setListRef: refs.setFloating,
|
|
717
731
|
loading: loading ?? resolvedItemsLoading,
|
|
718
732
|
loadingText,
|
|
719
733
|
noMatchesText,
|
|
720
734
|
selectedItems: selectedItem !== null ? [selectedItem] : [],
|
|
721
|
-
readOnly
|
|
722
|
-
...getMenuProps({
|
|
723
|
-
refKey: "innerRef",
|
|
724
|
-
ref: refs.setFloating,
|
|
725
|
-
style: listStyle
|
|
726
|
-
})
|
|
735
|
+
readOnly
|
|
727
736
|
}
|
|
728
737
|
),
|
|
729
738
|
...rest,
|
|
@@ -755,9 +764,8 @@ const SearchableDropdown = React.forwardRef(
|
|
|
755
764
|
onKeyDown(e) {
|
|
756
765
|
if (isOpen && e.key === "Tab") {
|
|
757
766
|
const highlitedItem = listItems[highlightedIndex];
|
|
758
|
-
if ((selectOnTab || selectOnBlur) && highlitedItem) {
|
|
767
|
+
if ((selectOnTab || selectOnBlur) && highlitedItem && highlitedItem !== selectedItem) {
|
|
759
768
|
selectItem(highlitedItem);
|
|
760
|
-
setShowSelectedItem(true);
|
|
761
769
|
}
|
|
762
770
|
}
|
|
763
771
|
},
|
|
@@ -879,21 +887,15 @@ const MultiSelect = React.forwardRef(
|
|
|
879
887
|
...!hideSelectAll ? [selectAll] : [],
|
|
880
888
|
...normalizedItems
|
|
881
889
|
]);
|
|
882
|
-
const filterListItems =
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
|
|
892
|
-
if (shouldRefetchItems) fetchItems(inputValue2 ?? EMPTY_INPUT);
|
|
893
|
-
filterListItems({ inputValue: inputValue2 ?? EMPTY_INPUT });
|
|
894
|
-
},
|
|
895
|
-
[filterListItems, initialItems, fetchItems]
|
|
896
|
-
);
|
|
890
|
+
const filterListItems = ({ inputValue: inputValue2 }) => setListItems([
|
|
891
|
+
...!hideSelectAll ? [selectAll] : [],
|
|
892
|
+
...normalizedItems.filter((item) => itemFilter(item, inputValue2))
|
|
893
|
+
]);
|
|
894
|
+
const updateListItems = ({ inputValue: inputValue2 }) => {
|
|
895
|
+
const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
|
|
896
|
+
if (shouldRefetchItems) fetchItems(inputValue2 ?? EMPTY_INPUT);
|
|
897
|
+
filterListItems({ inputValue: inputValue2 ?? EMPTY_INPUT });
|
|
898
|
+
};
|
|
897
899
|
React.useEffect(() => {
|
|
898
900
|
filterListItems({ inputValue });
|
|
899
901
|
}, [normalizedItems]);
|
|
@@ -958,8 +960,6 @@ const MultiSelect = React.forwardRef(
|
|
|
958
960
|
case downshift.useCombobox.stateChangeTypes.InputChange: {
|
|
959
961
|
const leadingWhitespaceTest = /^\s+/g;
|
|
960
962
|
const isSpacePressedOnEmptyInput = changes.inputValue === " ";
|
|
961
|
-
if (!isSpacePressedOnEmptyInput)
|
|
962
|
-
setLastHighlightedIndex(hideSelectAll ? 0 : 1);
|
|
963
963
|
if (changes.inputValue?.match(leadingWhitespaceTest)) {
|
|
964
964
|
const sanitizedInputValue = changes.inputValue.replace(
|
|
965
965
|
leadingWhitespaceTest,
|
|
@@ -981,13 +981,13 @@ const MultiSelect = React.forwardRef(
|
|
|
981
981
|
}
|
|
982
982
|
}
|
|
983
983
|
}
|
|
984
|
-
return
|
|
984
|
+
return changes;
|
|
985
985
|
}
|
|
986
986
|
default:
|
|
987
987
|
return changes;
|
|
988
988
|
}
|
|
989
989
|
},
|
|
990
|
-
[hideSelectAll, normalizedItems, initialItems]
|
|
990
|
+
[hideSelectAll, normalizedItems, filterListItems, initialItems]
|
|
991
991
|
);
|
|
992
992
|
const {
|
|
993
993
|
getInputProps,
|
|
@@ -996,6 +996,7 @@ const MultiSelect = React.forwardRef(
|
|
|
996
996
|
getMenuProps,
|
|
997
997
|
getToggleButtonProps,
|
|
998
998
|
highlightedIndex,
|
|
999
|
+
setHighlightedIndex,
|
|
999
1000
|
inputValue,
|
|
1000
1001
|
isOpen,
|
|
1001
1002
|
setInputValue
|
|
@@ -1008,6 +1009,8 @@ const MultiSelect = React.forwardRef(
|
|
|
1008
1009
|
stateReducer,
|
|
1009
1010
|
onInputValueChange(changes) {
|
|
1010
1011
|
updateListItems({ inputValue: changes.inputValue });
|
|
1012
|
+
setHighlightedIndex(hideSelectAll ? 0 : 1);
|
|
1013
|
+
setLastHighlightedIndex(hideSelectAll ? 0 : 1);
|
|
1011
1014
|
},
|
|
1012
1015
|
onSelectedItemChange({ selectedItem: clickedItem }) {
|
|
1013
1016
|
if (!clickedItem) return;
|
|
@@ -1031,17 +1034,19 @@ const MultiSelect = React.forwardRef(
|
|
|
1031
1034
|
reactDom.offset(tokens.space.extraSmall2),
|
|
1032
1035
|
reactDom.shift({ padding: tokens.space.extraSmall }),
|
|
1033
1036
|
reactDom.size({
|
|
1034
|
-
apply({ elements, availableHeight }) {
|
|
1035
|
-
elements.floating.style
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1037
|
+
apply({ rects, elements, availableHeight }) {
|
|
1038
|
+
Object.assign(elements.floating.style, {
|
|
1039
|
+
width: `${rects.reference.width}px`,
|
|
1040
|
+
// Floating will flip when smaller than 10*16 px
|
|
1041
|
+
// and never exceed 20*16 px.
|
|
1042
|
+
maxHeight: `${clamp(10 * 16, availableHeight, 20 * 16)}px`
|
|
1043
|
+
});
|
|
1039
1044
|
}
|
|
1040
1045
|
}),
|
|
1041
1046
|
reactDom.flip({ fallbackStrategy: "initialPlacement" })
|
|
1042
1047
|
]
|
|
1043
1048
|
});
|
|
1044
|
-
React.
|
|
1049
|
+
React.useEffect(() => {
|
|
1045
1050
|
if (isOpen && refs.reference.current && refs.floating.current) {
|
|
1046
1051
|
return reactDom.autoUpdate(
|
|
1047
1052
|
refs.reference.current,
|
|
@@ -1071,8 +1076,14 @@ const MultiSelect = React.forwardRef(
|
|
|
1071
1076
|
labelId: getLabelProps().id,
|
|
1072
1077
|
labelProps: getLabelProps(),
|
|
1073
1078
|
labelTooltip,
|
|
1079
|
+
onBlur: (e) => {
|
|
1080
|
+
setInputValue("");
|
|
1081
|
+
onBlur?.(e);
|
|
1082
|
+
},
|
|
1074
1083
|
onClick: (e) => {
|
|
1075
|
-
if (e.target === e.currentTarget)
|
|
1084
|
+
if (e.target === e.currentTarget) {
|
|
1085
|
+
getInputProps()?.onClick?.(e);
|
|
1086
|
+
}
|
|
1076
1087
|
onClick?.(e);
|
|
1077
1088
|
},
|
|
1078
1089
|
onKeyDown,
|
|
@@ -1088,22 +1099,19 @@ const MultiSelect = React.forwardRef(
|
|
|
1088
1099
|
ariaLabelSelectedItem,
|
|
1089
1100
|
floatingStyles,
|
|
1090
1101
|
getItemProps,
|
|
1102
|
+
getMenuProps,
|
|
1091
1103
|
highlightedIndex,
|
|
1092
1104
|
isOpen,
|
|
1093
1105
|
listItems,
|
|
1106
|
+
style: listStyle,
|
|
1107
|
+
setListRef: refs.setFloating,
|
|
1094
1108
|
loading: loading ?? resolvedItemsLoading,
|
|
1095
1109
|
loadingText,
|
|
1096
1110
|
noMatchesText,
|
|
1097
1111
|
selectAllCheckboxState,
|
|
1098
1112
|
selectAllItem: selectAll,
|
|
1099
1113
|
selectedItems,
|
|
1100
|
-
readOnly
|
|
1101
|
-
...getMenuProps({
|
|
1102
|
-
"aria-multiselectable": true,
|
|
1103
|
-
refKey: "innerRef",
|
|
1104
|
-
ref: refs.setFloating,
|
|
1105
|
-
style: listStyle
|
|
1106
|
-
})
|
|
1114
|
+
readOnly
|
|
1107
1115
|
}
|
|
1108
1116
|
),
|
|
1109
1117
|
...rest,
|
|
@@ -1162,10 +1170,6 @@ const MultiSelect = React.forwardRef(
|
|
|
1162
1170
|
});
|
|
1163
1171
|
}
|
|
1164
1172
|
},
|
|
1165
|
-
onBlur: (e) => {
|
|
1166
|
-
setInputValue("");
|
|
1167
|
-
onBlur?.(e);
|
|
1168
|
-
},
|
|
1169
1173
|
...getDropdownProps({
|
|
1170
1174
|
preventKeyAction: isOpen,
|
|
1171
1175
|
value: inputValue ?? EMPTY_INPUT,
|
|
@@ -1276,17 +1280,19 @@ const Dropdown = React.forwardRef(
|
|
|
1276
1280
|
reactDom.offset(tokens.space.extraSmall2),
|
|
1277
1281
|
reactDom.shift({ padding: tokens.space.extraSmall }),
|
|
1278
1282
|
reactDom.size({
|
|
1279
|
-
apply({ elements, availableHeight }) {
|
|
1280
|
-
elements.floating.style
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1283
|
+
apply({ rects, elements, availableHeight }) {
|
|
1284
|
+
Object.assign(elements.floating.style, {
|
|
1285
|
+
width: `${rects.reference.width}px`,
|
|
1286
|
+
// Floating will flip when smaller than 10*16 px
|
|
1287
|
+
// and never exceed 20*16 px.
|
|
1288
|
+
maxHeight: `${clamp(10 * 16, availableHeight, 20 * 16)}px`
|
|
1289
|
+
});
|
|
1284
1290
|
}
|
|
1285
1291
|
}),
|
|
1286
1292
|
reactDom.flip({ fallbackStrategy: "initialPlacement" })
|
|
1287
1293
|
]
|
|
1288
1294
|
});
|
|
1289
|
-
React.
|
|
1295
|
+
React.useEffect(() => {
|
|
1290
1296
|
if (isOpen && refs.reference.current && refs.floating.current) {
|
|
1291
1297
|
return reactDom.autoUpdate(
|
|
1292
1298
|
refs.reference.current,
|
|
@@ -1339,19 +1345,17 @@ const Dropdown = React.forwardRef(
|
|
|
1339
1345
|
ariaLabelSelectedItem,
|
|
1340
1346
|
floatingStyles,
|
|
1341
1347
|
getItemProps,
|
|
1348
|
+
getMenuProps,
|
|
1342
1349
|
highlightedIndex,
|
|
1343
1350
|
isOpen,
|
|
1344
1351
|
listItems: normalizedItems,
|
|
1352
|
+
noMatchesText,
|
|
1353
|
+
style: listStyle,
|
|
1354
|
+
setListRef: refs.setFloating,
|
|
1345
1355
|
loading: loading ?? resolvedItemsLoading,
|
|
1346
1356
|
loadingText,
|
|
1347
|
-
noMatchesText,
|
|
1348
1357
|
selectedItems: selectedItem !== null ? [selectedItem] : [],
|
|
1349
|
-
readOnly
|
|
1350
|
-
...getMenuProps({
|
|
1351
|
-
refKey: "innerRef",
|
|
1352
|
-
ref: refs.setFloating,
|
|
1353
|
-
style: listStyle
|
|
1354
|
-
})
|
|
1358
|
+
readOnly
|
|
1355
1359
|
}
|
|
1356
1360
|
),
|
|
1357
1361
|
...rest,
|