@payfit/unity-components 0.0.0-alpha.7 → 0.0.0-alpha.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.
- package/dist/cjs/components/alert/Alert.js +1 -1
- package/dist/cjs/components/avatar/parts/AvatarPair.js +1 -1
- package/dist/cjs/components/badge/Badge.d.ts +3 -0
- package/dist/cjs/components/badge/Badge.js +1 -1
- package/dist/cjs/components/breadcrumbs/parts/Breadcrumb.js +1 -1
- package/dist/cjs/components/checkbox/parts/CheckboxIndicator.js +1 -1
- package/dist/cjs/components/collapsible/Collapsible.d.ts +33 -0
- package/dist/cjs/components/collapsible/parts/CollapsibleContent.d.ts +36 -0
- package/dist/cjs/components/collapsible/parts/CollapsibleTitle.d.ts +39 -0
- package/dist/cjs/components/date-picker/DatePicker.js +1 -1
- package/dist/cjs/components/date-picker/parts/DateInput.js +1 -1
- package/dist/cjs/components/fieldset/Fieldset.d.ts +150 -0
- package/dist/cjs/components/fieldset/Fieldset.js +1 -0
- package/dist/cjs/components/fieldset/parts/FieldGroup.d.ts +27 -0
- package/dist/cjs/components/fieldset/parts/FieldGroup.js +1 -0
- package/dist/cjs/components/form-field/parts/FormControl.d.ts +23 -0
- package/dist/cjs/components/icon-button/CircularIconButton.js +1 -1
- package/dist/cjs/components/icon-button/IconButton.variants.js +1 -1
- package/dist/cjs/components/input/Input.js +1 -1
- package/dist/cjs/components/menu/parts/MenuContent.js +1 -1
- package/dist/cjs/components/multi-select/MultiSelect.d.ts +62 -0
- package/dist/cjs/components/multi-select/MultiSelect.js +1 -0
- package/dist/cjs/components/multi-select/Multiselect.context.d.ts +7 -0
- package/dist/cjs/components/multi-select/Multiselect.context.js +1 -0
- package/dist/cjs/components/multi-select/Multiselect.types.d.ts +109 -0
- package/dist/cjs/components/multi-select/hooks/use-combobox-filter.d.ts +12 -0
- package/dist/cjs/components/multi-select/hooks/use-combobox-filter.js +1 -0
- package/dist/cjs/components/multi-select/hooks/use-multiselection-state.d.ts +14 -0
- package/dist/cjs/components/multi-select/hooks/use-multiselection-state.js +1 -0
- package/dist/cjs/components/multi-select/parts/MultiSelectButton.d.ts +16 -0
- package/dist/cjs/components/multi-select/parts/MultiSelectButton.js +1 -0
- package/dist/cjs/components/multi-select/parts/MultiSelectOptGroup.d.ts +69 -0
- package/dist/cjs/components/multi-select/parts/MultiSelectOptGroup.js +1 -0
- package/dist/cjs/components/multi-select/parts/MultiSelectOption.d.ts +20 -0
- package/dist/cjs/components/multi-select/parts/MultiSelectOption.js +1 -0
- package/dist/cjs/components/multi-select/parts/MultiSelectPopover.d.ts +7 -0
- package/dist/cjs/components/multi-select/parts/MultiSelectPopover.js +1 -0
- package/dist/cjs/components/multi-select-field/MultiSelectField.d.ts +59 -0
- package/dist/cjs/components/multi-select-field/MultiSelectField.js +1 -0
- package/dist/cjs/components/segmented-button-group/SegmentedButtonGroup.d.ts +43 -0
- package/dist/cjs/components/segmented-button-group/SegmentedButtonGroups.context.d.ts +8 -0
- package/dist/cjs/components/segmented-button-group/parts/ToggleButton.d.ts +47 -0
- package/dist/cjs/components/select/Select.js +1 -1
- package/dist/cjs/components/select/parts/SearchInput.js +1 -1
- package/dist/cjs/components/selectable-button-group/SelectableButtonGroup.context.d.ts +2 -0
- package/dist/cjs/components/selectable-button-group/SelectableButtonGroup.context.js +1 -0
- package/dist/cjs/components/selectable-button-group/SelectableButtonGroup.d.ts +59 -0
- package/dist/cjs/components/selectable-button-group/SelectableButtonGroup.js +1 -0
- package/dist/cjs/components/selectable-button-group/parts/SelectableButton.d.ts +127 -0
- package/dist/cjs/components/selectable-button-group/parts/SelectableButton.js +1 -0
- package/dist/cjs/components/tabs/parts/TabList.js +1 -1
- package/dist/cjs/components/text-area/TextArea.js +1 -1
- package/dist/cjs/components/toast/UnityToast.d.ts +2 -2
- package/dist/cjs/components/toast/UnityToast.js +1 -1
- package/dist/cjs/components/tooltip/Tooltip.js +1 -1
- package/dist/cjs/index.d.ts +10 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/types/utils.d.ts +1 -0
- package/dist/esm/components/alert/Alert.mjs +1 -1
- package/dist/esm/components/app-menu/parts/AppMenuFooter.mjs +3 -3
- package/dist/esm/components/avatar/parts/AvatarPair.mjs +10 -10
- package/dist/esm/components/badge/Badge.d.mts +3 -0
- package/dist/esm/components/badge/Badge.mjs +12 -10
- package/dist/esm/components/breadcrumbs/parts/Breadcrumb.mjs +10 -10
- package/dist/esm/components/checkbox/parts/CheckboxIndicator.mjs +1 -1
- package/dist/esm/components/collapsible/Collapsible.d.mts +33 -0
- package/dist/esm/components/collapsible/parts/CollapsibleContent.d.mts +36 -0
- package/dist/esm/components/collapsible/parts/CollapsibleTitle.d.mts +39 -0
- package/dist/esm/components/date-picker/DatePicker.mjs +1 -1
- package/dist/esm/components/date-picker/parts/DateInput.mjs +7 -7
- package/dist/esm/components/fieldset/Fieldset.d.mts +150 -0
- package/dist/esm/components/fieldset/Fieldset.mjs +65 -0
- package/dist/esm/components/fieldset/parts/FieldGroup.d.mts +27 -0
- package/dist/esm/components/fieldset/parts/FieldGroup.mjs +18 -0
- package/dist/esm/components/form/Form.mjs +5 -5
- package/dist/esm/components/form-field/parts/FormControl.d.mts +23 -0
- package/dist/esm/components/icon-button/CircularIconButton.mjs +10 -11
- package/dist/esm/components/icon-button/IconButton.variants.mjs +9 -9
- package/dist/esm/components/input/Input.mjs +30 -30
- package/dist/esm/components/menu/parts/MenuContent.mjs +1 -1
- package/dist/esm/components/multi-select/MultiSelect.d.mts +62 -0
- package/dist/esm/components/multi-select/MultiSelect.mjs +230 -0
- package/dist/esm/components/multi-select/Multiselect.context.d.mts +7 -0
- package/dist/esm/components/multi-select/Multiselect.context.mjs +8 -0
- package/dist/esm/components/multi-select/Multiselect.types.d.mts +109 -0
- package/dist/esm/components/multi-select/hooks/use-combobox-filter.d.mts +12 -0
- package/dist/esm/components/multi-select/hooks/use-combobox-filter.mjs +22 -0
- package/dist/esm/components/multi-select/hooks/use-multiselection-state.d.mts +14 -0
- package/dist/esm/components/multi-select/hooks/use-multiselection-state.mjs +47 -0
- package/dist/esm/components/multi-select/parts/MultiSelectButton.d.mts +16 -0
- package/dist/esm/components/multi-select/parts/MultiSelectButton.mjs +160 -0
- package/dist/esm/components/multi-select/parts/MultiSelectOptGroup.d.mts +69 -0
- package/dist/esm/components/multi-select/parts/MultiSelectOptGroup.mjs +34 -0
- package/dist/esm/components/multi-select/parts/MultiSelectOption.d.mts +20 -0
- package/dist/esm/components/multi-select/parts/MultiSelectOption.mjs +85 -0
- package/dist/esm/components/multi-select/parts/MultiSelectPopover.d.mts +7 -0
- package/dist/esm/components/multi-select/parts/MultiSelectPopover.mjs +65 -0
- package/dist/esm/components/multi-select-field/MultiSelectField.d.mts +59 -0
- package/dist/esm/components/multi-select-field/MultiSelectField.mjs +81 -0
- package/dist/esm/components/segmented-button-group/SegmentedButtonGroup.d.mts +43 -0
- package/dist/esm/components/segmented-button-group/SegmentedButtonGroups.context.d.mts +8 -0
- package/dist/esm/components/segmented-button-group/parts/ToggleButton.d.mts +47 -0
- package/dist/esm/components/select/Select.mjs +19 -19
- package/dist/esm/components/select/parts/SearchInput.mjs +7 -7
- package/dist/esm/components/selectable-button-group/SelectableButtonGroup.context.d.mts +2 -0
- package/dist/esm/components/selectable-button-group/SelectableButtonGroup.context.mjs +5 -0
- package/dist/esm/components/selectable-button-group/SelectableButtonGroup.d.mts +59 -0
- package/dist/esm/components/selectable-button-group/SelectableButtonGroup.mjs +25 -0
- package/dist/esm/components/selectable-button-group/parts/SelectableButton.d.mts +127 -0
- package/dist/esm/components/selectable-button-group/parts/SelectableButton.mjs +98 -0
- package/dist/esm/components/tabs/parts/TabList.mjs +47 -25
- package/dist/esm/components/text-area/TextArea.mjs +28 -30
- package/dist/esm/components/toast/UnityToast.d.mts +2 -2
- package/dist/esm/components/toast/UnityToast.mjs +5 -5
- package/dist/esm/components/tooltip/Tooltip.mjs +11 -17
- package/dist/esm/index.d.mts +10 -0
- package/dist/esm/index.mjs +176 -155
- package/dist/esm/providers/router/RouterProvider.mjs +3 -3
- package/dist/esm/types/utils.d.mts +1 -0
- package/i18n/en-GB.json +1 -0
- package/i18n/es-ES.json +1 -0
- package/i18n/fr-FR.json +1 -0
- package/package.json +20 -18
- package/dist/cjs/components/index.d.ts +0 -4
- package/dist/esm/components/index.d.mts +0 -4
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { MultiSelectComponent, MultiSelectProps } from './Multiselect.types.mjs';
|
|
2
|
+
declare const MultiSelectComponent: <TItem extends Record<string | number, unknown>, TItemKey extends keyof TItem, TKeyType extends TItem[TItemKey] & (string | number)>(props: MultiSelectProps<TItem, TItemKey, TKeyType>, ref: React.ForwardedRef<HTMLButtonElement>) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
/**
|
|
4
|
+
* The MultiSelect component allows users to select multiple items from a dropdown list.
|
|
5
|
+
* The component provides two different APIs:
|
|
6
|
+
* 1. Static API - For simple cases where options are defined as direct children and use primitive values as keys (strings or numbers)
|
|
7
|
+
* 2. Dynamic API - For data-driven cases where options are generated from a dynamic collection with typed objects
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* import { MultiSelect, MultiSelectOption, MultiSelectOptGroup } from '@payfit/unity-components'
|
|
11
|
+
*
|
|
12
|
+
* // Static API - Options defined as direct children
|
|
13
|
+
* <MultiSelect
|
|
14
|
+
* placeholder="Select fruits..."
|
|
15
|
+
* onChange={(selected) => console.log(selected)}
|
|
16
|
+
* >
|
|
17
|
+
* <MultiSelectOptGroup label="Citrus" withSeparator>
|
|
18
|
+
* <MultiSelectOption value="orange">Orange</MultiSelectOption>
|
|
19
|
+
* <MultiSelectOption value="lemon">Lemon</MultiSelectOption>
|
|
20
|
+
* </MultiSelectOptGroup>
|
|
21
|
+
* <MultiSelectOption value="apple">Apple</MultiSelectOption>
|
|
22
|
+
* </MultiSelect>
|
|
23
|
+
*
|
|
24
|
+
* // Dynamic API - Options generated from a collection with typed objects
|
|
25
|
+
* interface Fruit {
|
|
26
|
+
* id: string;
|
|
27
|
+
* name: string;
|
|
28
|
+
* category: string;
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* const fruits: Set<Fruit> = new Set([
|
|
32
|
+
* { id: 'apple-1', name: 'Apple', category: 'Core' },
|
|
33
|
+
* { id: 'orange-1', name: 'Orange', category: 'Citrus' }
|
|
34
|
+
* ]);
|
|
35
|
+
*
|
|
36
|
+
* <MultiSelect
|
|
37
|
+
* items={fruits}
|
|
38
|
+
* placeholder="Select fruits..."
|
|
39
|
+
* value={new Set(['apple-1'])}
|
|
40
|
+
* getItemValue={item => item.id}
|
|
41
|
+
* renderValue={(items) =>
|
|
42
|
+
* Array.from(items)
|
|
43
|
+
* .map(item => item.name)
|
|
44
|
+
* .join(', ')
|
|
45
|
+
* }
|
|
46
|
+
* >
|
|
47
|
+
* {(item) => (
|
|
48
|
+
* <MultiSelectOption value={item.id}>
|
|
49
|
+
* {item.name}
|
|
50
|
+
* </MultiSelectOption>
|
|
51
|
+
* )}
|
|
52
|
+
* </MultiSelect>
|
|
53
|
+
* ```
|
|
54
|
+
* @component
|
|
55
|
+
* @template TItem - The type of items in the collection. When using the dynamic API, it must be a Record or an object. For the static API, it defaults to a string or number.
|
|
56
|
+
* @template TItemKey - The key name within TItem used as the selection value (must be a key of TItem). Applies only to the dynamic API.
|
|
57
|
+
* @template TKeyType - The type of the property at TItem[TItemKey] (must be string or number). Applies only to the dynamic API.
|
|
58
|
+
* @remarks
|
|
59
|
+
* [API & Docs](https://unity-components.payfit.io/?path=/docs/inputs-multiselect--docs) • [Design Guidelines](https://www.payfit.design/24f360409/p/928776-multiselect)
|
|
60
|
+
*/
|
|
61
|
+
export declare const MultiSelect: MultiSelectComponent;
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { jsx as u, jsxs as q } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as ye, useMemo as S, useCallback as d } from "react";
|
|
3
|
+
import { ComboboxProvider as Se, SelectProvider as z } from "@ariakit/react";
|
|
4
|
+
import { useComboboxFilter as pe } from "./hooks/use-combobox-filter.mjs";
|
|
5
|
+
import { useMultiSelectionState as he } from "./hooks/use-multiselection-state.mjs";
|
|
6
|
+
import { MultiSelectContext as J } from "./Multiselect.context.mjs";
|
|
7
|
+
import { MultiSelectButton as U } from "./parts/MultiSelectButton.mjs";
|
|
8
|
+
import { MultiSelectPopover as W } from "./parts/MultiSelectPopover.mjs";
|
|
9
|
+
function X(t) {
|
|
10
|
+
return t instanceof Map;
|
|
11
|
+
}
|
|
12
|
+
function ve(t) {
|
|
13
|
+
return !Object.prototype.hasOwnProperty.call(t, "items");
|
|
14
|
+
}
|
|
15
|
+
function a(t) {
|
|
16
|
+
return String(t);
|
|
17
|
+
}
|
|
18
|
+
function p(t) {
|
|
19
|
+
return isNaN(Number(t)) ? t : Number(t);
|
|
20
|
+
}
|
|
21
|
+
function Z(t) {
|
|
22
|
+
return Array.from(t, a);
|
|
23
|
+
}
|
|
24
|
+
function Y(t) {
|
|
25
|
+
return new Set(Z(t));
|
|
26
|
+
}
|
|
27
|
+
const $ = (t, w) => {
|
|
28
|
+
const o = ve(t), C = (e) => {
|
|
29
|
+
if (Object.hasOwnProperty.call(e, "value"))
|
|
30
|
+
return e.value;
|
|
31
|
+
if (Object.prototype.hasOwnProperty.call(e, "id"))
|
|
32
|
+
return e.id;
|
|
33
|
+
if (typeof e == "string")
|
|
34
|
+
return e;
|
|
35
|
+
const n = Object.keys(e)[0];
|
|
36
|
+
return e[n];
|
|
37
|
+
}, ee = o ? (e) => Array.from(e).map(String).join(", ") : (e) => Array.from(e).map((n) => C(n)).join(", "), m = t, O = t, c = S(
|
|
38
|
+
() => o ? void 0 : m.items,
|
|
39
|
+
[o, m.items]
|
|
40
|
+
), r = o ? void 0 : m.getItemValue ?? C, te = t.renderValue ?? ee, { children: v } = o ? O : m, re = o ? void 0 : m.searchOptions, { children: g } = O, {
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
42
|
+
children: Ke,
|
|
43
|
+
value: V,
|
|
44
|
+
defaultValue: f,
|
|
45
|
+
onChange: b,
|
|
46
|
+
onBlur: M,
|
|
47
|
+
isDisabled: x,
|
|
48
|
+
isInvalid: j,
|
|
49
|
+
isLoading: D,
|
|
50
|
+
isReadOnly: R,
|
|
51
|
+
isSearchable: h,
|
|
52
|
+
placeholder: I,
|
|
53
|
+
onClearButtonPress: F,
|
|
54
|
+
maxVisibleItems: N = 7,
|
|
55
|
+
...B
|
|
56
|
+
} = t, y = d(() => o || !c ? [] : X(c) ? Array.from(c.values()).flat() : Array.from(c), [c, o]), ne = d(() => {
|
|
57
|
+
if ("value" in t)
|
|
58
|
+
return V ? Y(V) : /* @__PURE__ */ new Set();
|
|
59
|
+
}, [t, V]), oe = d(() => f ? Y(f) : /* @__PURE__ */ new Set(), [f]), se = d(
|
|
60
|
+
(e) => {
|
|
61
|
+
if (!b) return;
|
|
62
|
+
const n = new Set(
|
|
63
|
+
Array.from(e).map((l) => p(l))
|
|
64
|
+
);
|
|
65
|
+
b(n);
|
|
66
|
+
},
|
|
67
|
+
[b]
|
|
68
|
+
), {
|
|
69
|
+
selectedKeys: i,
|
|
70
|
+
selectKey: L,
|
|
71
|
+
unselectKey: T
|
|
72
|
+
} = he({
|
|
73
|
+
selectedKeys: ne(),
|
|
74
|
+
defaultSelectedKeys: oe(),
|
|
75
|
+
onSelectionChange: se
|
|
76
|
+
}), le = d(
|
|
77
|
+
(e) => {
|
|
78
|
+
L(a(e));
|
|
79
|
+
},
|
|
80
|
+
[L]
|
|
81
|
+
), ae = d(
|
|
82
|
+
(e) => {
|
|
83
|
+
T(a(e));
|
|
84
|
+
},
|
|
85
|
+
[T]
|
|
86
|
+
), { setSearchQuery: ce, matchingItems: K } = pe({
|
|
87
|
+
items: y(),
|
|
88
|
+
extractSearchableText: (e) => o ? [""] : [
|
|
89
|
+
a(
|
|
90
|
+
(r == null ? void 0 : r(e)) || ""
|
|
91
|
+
)
|
|
92
|
+
],
|
|
93
|
+
enabled: h,
|
|
94
|
+
searchOptions: re
|
|
95
|
+
}), ie = () => {
|
|
96
|
+
if (o) return Array.from(i);
|
|
97
|
+
const e = y();
|
|
98
|
+
return Array.from(i).map((n) => {
|
|
99
|
+
const l = e.find(
|
|
100
|
+
(s) => a(
|
|
101
|
+
(r == null ? void 0 : r(s)) || ""
|
|
102
|
+
) === n
|
|
103
|
+
);
|
|
104
|
+
return l && r ? r(l) : p(n);
|
|
105
|
+
});
|
|
106
|
+
}, ue = () => {
|
|
107
|
+
if (o)
|
|
108
|
+
return new Set(
|
|
109
|
+
Array.from(i).map((l) => p(l))
|
|
110
|
+
);
|
|
111
|
+
const e = y(), n = /* @__PURE__ */ new Set();
|
|
112
|
+
return Array.from(i).forEach((l) => {
|
|
113
|
+
const s = e.find(
|
|
114
|
+
(A) => a(
|
|
115
|
+
(r == null ? void 0 : r(A)) || ""
|
|
116
|
+
) === l
|
|
117
|
+
);
|
|
118
|
+
s && n.add(s);
|
|
119
|
+
}), n;
|
|
120
|
+
}, de = () => {
|
|
121
|
+
if (f)
|
|
122
|
+
return Z(f);
|
|
123
|
+
}, P = S(ie, [
|
|
124
|
+
i,
|
|
125
|
+
o,
|
|
126
|
+
r,
|
|
127
|
+
y
|
|
128
|
+
]), G = S(ue, [
|
|
129
|
+
i,
|
|
130
|
+
o,
|
|
131
|
+
r,
|
|
132
|
+
y
|
|
133
|
+
]), k = S(de, [f]), E = (e) => {
|
|
134
|
+
const n = new Set(e), l = new Set(
|
|
135
|
+
P.map((s) => a(s))
|
|
136
|
+
);
|
|
137
|
+
for (const s of n)
|
|
138
|
+
l.has(s) || le(p(s));
|
|
139
|
+
for (const s of l)
|
|
140
|
+
n.has(s) || ae(p(s));
|
|
141
|
+
}, H = d(() => o ? g : c ? X(c) ? Array.from(c.entries()).map(([e, n]) => {
|
|
142
|
+
const l = n.filter(
|
|
143
|
+
(s) => K.some((A) => {
|
|
144
|
+
const fe = (r == null ? void 0 : r(s)) || "", me = (r == null ? void 0 : r(A)) || "";
|
|
145
|
+
return a(me) === a(fe);
|
|
146
|
+
})
|
|
147
|
+
);
|
|
148
|
+
return v(e, l);
|
|
149
|
+
}) : K.map(
|
|
150
|
+
(e) => v(
|
|
151
|
+
e
|
|
152
|
+
)
|
|
153
|
+
) : null, [v, c, K, g, r, o]), Q = S(() => H(), [H]), _ = te;
|
|
154
|
+
return h ? /* @__PURE__ */ u(Se, { resetValueOnHide: !0, setValue: ce, children: /* @__PURE__ */ u(
|
|
155
|
+
z,
|
|
156
|
+
{
|
|
157
|
+
value: P.map(
|
|
158
|
+
(e) => a(e)
|
|
159
|
+
),
|
|
160
|
+
defaultValue: k,
|
|
161
|
+
setValue: E,
|
|
162
|
+
focusLoop: !0,
|
|
163
|
+
children: /* @__PURE__ */ q(
|
|
164
|
+
J.Provider,
|
|
165
|
+
{
|
|
166
|
+
value: { isSearchable: h, maxVisibleItems: N, selectedKeys: i },
|
|
167
|
+
children: [
|
|
168
|
+
/* @__PURE__ */ u(
|
|
169
|
+
U,
|
|
170
|
+
{
|
|
171
|
+
ref: w,
|
|
172
|
+
placeholder: I,
|
|
173
|
+
isDisabled: x,
|
|
174
|
+
isReadOnly: R,
|
|
175
|
+
isLoading: D,
|
|
176
|
+
isInvalid: j,
|
|
177
|
+
renderValue: _,
|
|
178
|
+
selectedItems: G,
|
|
179
|
+
onClearButtonPress: F,
|
|
180
|
+
...B
|
|
181
|
+
}
|
|
182
|
+
),
|
|
183
|
+
/* @__PURE__ */ u(W, { onBlur: M, children: Q })
|
|
184
|
+
]
|
|
185
|
+
}
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
) }) : /* @__PURE__ */ u(
|
|
189
|
+
z,
|
|
190
|
+
{
|
|
191
|
+
value: P.map(
|
|
192
|
+
(e) => a(e)
|
|
193
|
+
),
|
|
194
|
+
defaultValue: k,
|
|
195
|
+
setValue: E,
|
|
196
|
+
focusLoop: !0,
|
|
197
|
+
children: /* @__PURE__ */ q(
|
|
198
|
+
J.Provider,
|
|
199
|
+
{
|
|
200
|
+
value: { isSearchable: h, maxVisibleItems: N, selectedKeys: i },
|
|
201
|
+
children: [
|
|
202
|
+
/* @__PURE__ */ u(
|
|
203
|
+
U,
|
|
204
|
+
{
|
|
205
|
+
ref: w,
|
|
206
|
+
placeholder: I,
|
|
207
|
+
isDisabled: x,
|
|
208
|
+
isReadOnly: R,
|
|
209
|
+
isLoading: D,
|
|
210
|
+
isInvalid: j,
|
|
211
|
+
renderValue: _,
|
|
212
|
+
selectedItems: G,
|
|
213
|
+
onClearButtonPress: F,
|
|
214
|
+
...B
|
|
215
|
+
}
|
|
216
|
+
),
|
|
217
|
+
/* @__PURE__ */ u(W, { onBlur: M, children: Q })
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
)
|
|
221
|
+
}
|
|
222
|
+
);
|
|
223
|
+
};
|
|
224
|
+
$.displayName = "MultiSelect";
|
|
225
|
+
const je = ye(
|
|
226
|
+
$
|
|
227
|
+
);
|
|
228
|
+
export {
|
|
229
|
+
je as MultiSelect
|
|
230
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { UseComboboxFilterProps } from './hooks/use-combobox-filter.mjs';
|
|
3
|
+
type Key = string | number;
|
|
4
|
+
export interface MultiSelectBaseProps {
|
|
5
|
+
/** Default content when no value is selected */
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
/** Whether the select is searchable and shows a search input on top of the options */
|
|
8
|
+
isSearchable?: boolean;
|
|
9
|
+
/** Whether the select is disabled */
|
|
10
|
+
isDisabled?: boolean;
|
|
11
|
+
/** Whether the select is invalid */
|
|
12
|
+
isInvalid?: boolean;
|
|
13
|
+
/** Whether the select is read only */
|
|
14
|
+
isReadOnly?: boolean;
|
|
15
|
+
/** Whether the select is in a loading state */
|
|
16
|
+
isLoading?: boolean;
|
|
17
|
+
/** Callback when the clear button is pressed */
|
|
18
|
+
onClearButtonPress?: () => void;
|
|
19
|
+
/** Maximum number of items to show in the select button before showing a counter badge */
|
|
20
|
+
maxVisibleItems?: number;
|
|
21
|
+
/** Callback when the select is focused */
|
|
22
|
+
onFocus?: () => void;
|
|
23
|
+
/** Callback when the select is blurred */
|
|
24
|
+
onBlur?: () => void;
|
|
25
|
+
/** The ID of the element that labels this select when no visible label is provided */
|
|
26
|
+
'aria-labelledby'?: string;
|
|
27
|
+
/** The ID of the element that labels this select when no visible label is provided */
|
|
28
|
+
'aria-label'?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface FlatSelectProps<TItem, // Item type
|
|
31
|
+
TItemKey extends keyof TItem, // key name of the item
|
|
32
|
+
TKeyType extends TItem[TItemKey] & Key> extends MultiSelectBaseProps {
|
|
33
|
+
/** The items to display in the select */
|
|
34
|
+
items: Set<TItem>;
|
|
35
|
+
/** The currently selected values (controlled mode) */
|
|
36
|
+
value?: Set<TKeyType>;
|
|
37
|
+
/** The default selected values (uncontrolled mode) */
|
|
38
|
+
defaultValue?: Set<TKeyType>;
|
|
39
|
+
/** Callback when selection changes */
|
|
40
|
+
onChange?: (value: Set<TKeyType>) => void;
|
|
41
|
+
/** Function to get the value from an item, defaults to String(item) */
|
|
42
|
+
getItemValue?: (item: TItem) => TKeyType;
|
|
43
|
+
/** Function to render the selected value(s) in the button */
|
|
44
|
+
renderValue?: (value: Set<TItem>) => string;
|
|
45
|
+
/** Children must be a render function that returns Option components */
|
|
46
|
+
children: (item: TItem) => React.JSX.Element;
|
|
47
|
+
}
|
|
48
|
+
export interface GroupedSelectProps<TItem, // Item type
|
|
49
|
+
TItemKey extends keyof TItem, // key name of the item
|
|
50
|
+
TKeyType extends TItem[TItemKey] & Key> extends MultiSelectBaseProps {
|
|
51
|
+
/** The items to display in the select, grouped by category */
|
|
52
|
+
items: Map<string, TItem[]>;
|
|
53
|
+
/** The currently selected values (controlled mode) */
|
|
54
|
+
value?: Set<TKeyType>;
|
|
55
|
+
/** The default selected values (uncontrolled mode) */
|
|
56
|
+
defaultValue?: Set<TKeyType>;
|
|
57
|
+
/** Callback when selection changes */
|
|
58
|
+
onChange?: (value: Set<TKeyType>) => void;
|
|
59
|
+
/** Function to get the value from an item, defaults to String(item) */
|
|
60
|
+
getItemValue?: (item: TItem) => TKeyType;
|
|
61
|
+
/** Function to render the selected value(s) in the button */
|
|
62
|
+
renderValue?: (value: Set<TItem>) => string;
|
|
63
|
+
/** Children must be a render function that returns OptGroup components */
|
|
64
|
+
children: (groupKey: string, items: TItem[]) => React.JSX.Element;
|
|
65
|
+
}
|
|
66
|
+
export interface StaticItemsProps<TItem = Key> extends MultiSelectBaseProps {
|
|
67
|
+
/** The items to display in the select (for dynamic API) */
|
|
68
|
+
items?: never;
|
|
69
|
+
/** The currently selected values (controlled mode) */
|
|
70
|
+
value?: Set<TItem>;
|
|
71
|
+
/** The default selected values (uncontrolled mode) */
|
|
72
|
+
defaultValue?: Set<TItem>;
|
|
73
|
+
/** Callback when selection changes */
|
|
74
|
+
onChange?: (value: Set<TItem>) => void;
|
|
75
|
+
/** Function to render the selected value(s) in the button */
|
|
76
|
+
renderValue?: (value: Set<TItem>) => string;
|
|
77
|
+
/** Children must be Option components */
|
|
78
|
+
children: ReactNode;
|
|
79
|
+
getItemValue?: never;
|
|
80
|
+
}
|
|
81
|
+
export type DynamicMultiSelectProps<TItem, // Item type
|
|
82
|
+
TItemKey extends keyof TItem, // key name of the item
|
|
83
|
+
TKeyType extends TItem[TItemKey] & Key> = TItem extends unknown ? (Omit<FlatSelectProps<TItem, TItemKey, TKeyType>, 'items'> & {
|
|
84
|
+
items: Set<TItem>;
|
|
85
|
+
children: (item: TItem) => React.JSX.Element;
|
|
86
|
+
getItemValue?: (item: TItem) => TKeyType;
|
|
87
|
+
renderValue?: (value: Set<TItem>) => string;
|
|
88
|
+
isSearchable?: boolean;
|
|
89
|
+
searchOptions?: UseComboboxFilterProps<TItem>['searchOptions'];
|
|
90
|
+
}) | (Omit<GroupedSelectProps<TItem, TItemKey, TKeyType>, 'items'> & {
|
|
91
|
+
items: Map<string, TItem[]>;
|
|
92
|
+
children: (groupKey: string, items: TItem[]) => React.JSX.Element;
|
|
93
|
+
getItemValue?: (item: TItem) => TKeyType;
|
|
94
|
+
renderValue?: (value: Set<TItem>) => string;
|
|
95
|
+
isSearchable?: boolean;
|
|
96
|
+
searchOptions?: UseComboboxFilterProps<TItem>['searchOptions'];
|
|
97
|
+
}) : never;
|
|
98
|
+
export type MultiSelectProps<TItem, // Item type
|
|
99
|
+
TItemKey extends keyof TItem, // key name of the item
|
|
100
|
+
TKeyType extends TItem[TItemKey] & Key> = TItem extends unknown ? DynamicMultiSelectProps<TItem, TItemKey, TKeyType> | StaticItemsProps : never;
|
|
101
|
+
export type MultiSelectComponent = {
|
|
102
|
+
<TItem, // Item type
|
|
103
|
+
TItemKey extends keyof TItem, // key name of the item
|
|
104
|
+
TKeyType extends TItem[TItemKey] & Key>(props: MultiSelectProps<TItem, TItemKey, TKeyType> & {
|
|
105
|
+
ref?: React.ForwardedRef<HTMLButtonElement>;
|
|
106
|
+
}): React.JSX.Element;
|
|
107
|
+
displayName?: string;
|
|
108
|
+
};
|
|
109
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface UseComboboxFilterProps<T> {
|
|
2
|
+
items?: T[];
|
|
3
|
+
extractSearchableText?: (item: T) => string[];
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
searchOptions?: Intl.CollatorOptions;
|
|
6
|
+
}
|
|
7
|
+
export interface UseComboboxFilterReturn<T> {
|
|
8
|
+
searchQuery: string;
|
|
9
|
+
setSearchQuery: (value: string) => void;
|
|
10
|
+
matchingItems: T[];
|
|
11
|
+
}
|
|
12
|
+
export declare function useComboboxFilter<T>({ items, extractSearchableText, enabled, searchOptions, }: UseComboboxFilterProps<T>): UseComboboxFilterReturn<T>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useState as m, useMemo as l, startTransition as y } from "react";
|
|
2
|
+
import { useFilter as b } from "react-aria-components";
|
|
3
|
+
function p({
|
|
4
|
+
items: e = [],
|
|
5
|
+
extractSearchableText: s = (t) => [String(t)],
|
|
6
|
+
enabled: n = !1,
|
|
7
|
+
searchOptions: c = { sensitivity: "base" }
|
|
8
|
+
}) {
|
|
9
|
+
const [t, a] = m(""), o = b(c), i = o.contains.bind(o), u = (r) => {
|
|
10
|
+
y(() => {
|
|
11
|
+
a(r);
|
|
12
|
+
});
|
|
13
|
+
}, h = l(() => !n || t.length === 0 ? e : e.filter((r) => s(r).some((f) => i(f, t))), [n, e, t, s, i]);
|
|
14
|
+
return {
|
|
15
|
+
searchQuery: t,
|
|
16
|
+
setSearchQuery: u,
|
|
17
|
+
matchingItems: h
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
p as useComboboxFilter
|
|
22
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface UseMultiSelectionStateProps<V extends string | number = string> {
|
|
2
|
+
selectedKeys?: Set<V>;
|
|
3
|
+
defaultSelectedKeys?: Set<V>;
|
|
4
|
+
onSelectionChange?: (keys: Set<V>) => void;
|
|
5
|
+
}
|
|
6
|
+
interface UseMultiSelectionStateReturn<V extends string | number = string> {
|
|
7
|
+
selectedKeys: Set<V>;
|
|
8
|
+
isSelected: (key: V) => boolean;
|
|
9
|
+
selectKey: (key: V) => void;
|
|
10
|
+
unselectKey: (key: V) => void;
|
|
11
|
+
toggleKey: (key: V) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function useMultiSelectionState<V extends string | number = string>({ selectedKeys: controlledKeys, defaultSelectedKeys, onSelectionChange, }: UseMultiSelectionStateProps<V>): UseMultiSelectionStateReturn<V>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { useState as l } from "react";
|
|
2
|
+
function I({
|
|
3
|
+
selectedKeys: w,
|
|
4
|
+
defaultSelectedKeys: y,
|
|
5
|
+
onSelectionChange: t
|
|
6
|
+
}) {
|
|
7
|
+
const [f, u] = l(
|
|
8
|
+
() => y ?? /* @__PURE__ */ new Set()
|
|
9
|
+
), K = w !== void 0, r = K ? w : f;
|
|
10
|
+
return {
|
|
11
|
+
selectedKeys: r,
|
|
12
|
+
isSelected: (e) => r.has(e),
|
|
13
|
+
selectKey: (e) => {
|
|
14
|
+
if (K && t) {
|
|
15
|
+
const s = new Set(r);
|
|
16
|
+
s.add(e), t(s);
|
|
17
|
+
} else
|
|
18
|
+
u((s) => {
|
|
19
|
+
const d = new Set(s);
|
|
20
|
+
return d.add(e), t == null || t(d), d;
|
|
21
|
+
});
|
|
22
|
+
},
|
|
23
|
+
unselectKey: (e) => {
|
|
24
|
+
if (K && t) {
|
|
25
|
+
const s = new Set(r);
|
|
26
|
+
s.delete(e), t(s);
|
|
27
|
+
} else
|
|
28
|
+
u((s) => {
|
|
29
|
+
const d = new Set(s);
|
|
30
|
+
return d.delete(e), t == null || t(d), d;
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
toggleKey: (e) => {
|
|
34
|
+
if (K && t) {
|
|
35
|
+
const s = new Set(r);
|
|
36
|
+
s.has(e) ? s.delete(e) : s.add(e), t(s);
|
|
37
|
+
} else
|
|
38
|
+
u((s) => {
|
|
39
|
+
const d = new Set(s);
|
|
40
|
+
return d.has(e) ? d.delete(e) : d.add(e), t == null || t(d), d;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
I as useMultiSelectionState
|
|
47
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ForwardedRef, ReactElement } from 'react';
|
|
2
|
+
export interface MultiSelectButtonProps<TItem> {
|
|
3
|
+
placeholder?: string;
|
|
4
|
+
isDisabled?: boolean;
|
|
5
|
+
isReadOnly?: boolean;
|
|
6
|
+
isLoading?: boolean;
|
|
7
|
+
isInvalid?: boolean;
|
|
8
|
+
/** The selected items to show in the button */
|
|
9
|
+
selectedItems: Set<TItem>;
|
|
10
|
+
/** Function to render the selected items */
|
|
11
|
+
renderValue: (values: Set<TItem>) => string;
|
|
12
|
+
onClearButtonPress?: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare const MultiSelectButton: <TItem>(props: MultiSelectButtonProps<TItem> & {
|
|
15
|
+
ref?: ForwardedRef<HTMLButtonElement>;
|
|
16
|
+
}) => ReactElement;
|