@transferwise/components 0.0.0-experimental-bcfa03a → 0.0.0-experimental-5cd0315
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/build/dateInput/DateInput.js +3 -6
- package/build/dateInput/DateInput.js.map +1 -1
- package/build/dateInput/DateInput.mjs +2 -5
- package/build/dateInput/DateInput.mjs.map +1 -1
- package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js +3 -5
- package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js.map +1 -1
- package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs +1 -3
- package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs.map +1 -1
- package/build/index.js +3 -5
- package/build/index.js.map +1 -1
- package/build/index.mjs +1 -3
- package/build/index.mjs.map +1 -1
- package/build/inputs/SelectInput.js +840 -0
- package/build/inputs/SelectInput.js.map +1 -0
- package/build/inputs/SelectInput.messages.js.map +1 -0
- package/build/inputs/SelectInput.messages.mjs.map +1 -0
- package/build/inputs/SelectInput.mjs +832 -0
- package/build/inputs/SelectInput.mjs.map +1 -0
- package/build/main.css +70 -65
- package/build/moneyInput/MoneyInput.js +2 -5
- package/build/moneyInput/MoneyInput.js.map +1 -1
- package/build/moneyInput/MoneyInput.mjs +1 -4
- package/build/moneyInput/MoneyInput.mjs.map +1 -1
- package/build/phoneNumberInput/PhoneNumberInput.js +2 -5
- package/build/phoneNumberInput/PhoneNumberInput.js.map +1 -1
- package/build/phoneNumberInput/PhoneNumberInput.mjs +1 -4
- package/build/phoneNumberInput/PhoneNumberInput.mjs.map +1 -1
- package/build/styles/inputs/{SelectInput/SelectInput.css → SelectInput.css} +70 -65
- package/build/styles/main.css +70 -65
- package/build/types/inputs/{SelectInput/SelectInput.types.d.ts → SelectInput.d.ts} +7 -10
- package/build/types/inputs/SelectInput.d.ts.map +1 -0
- package/build/types/inputs/SelectInput.messages.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/inputs/{SelectInput/SelectInput.css → SelectInput.css} +70 -65
- package/src/inputs/{SelectInput/SelectInput.docs.mdx → SelectInput.docs.mdx} +1 -0
- package/src/inputs/SelectInput.less +219 -0
- package/src/inputs/{SelectInput/SelectInput.story.tsx → SelectInput.story.tsx} +7 -7
- package/src/inputs/SelectInput.tsx +1209 -0
- package/src/main.css +70 -65
- package/src/main.less +1 -1
- package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.js +0 -26
- package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.js.map +0 -1
- package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.mjs +0 -24
- package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.mjs.map +0 -1
- package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.js +0 -54
- package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.js.map +0 -1
- package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.mjs +0 -52
- package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.mjs.map +0 -1
- package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.js +0 -41
- package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.js.map +0 -1
- package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs +0 -38
- package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs.map +0 -1
- package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.js +0 -50
- package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.js.map +0 -1
- package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.mjs +0 -48
- package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.mjs.map +0 -1
- package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.js +0 -45
- package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.js.map +0 -1
- package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.mjs +0 -41
- package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.mjs.map +0 -1
- package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.js +0 -50
- package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.js.map +0 -1
- package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.mjs +0 -48
- package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.mjs.map +0 -1
- package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.js +0 -48
- package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.js.map +0 -1
- package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.mjs +0 -46
- package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.mjs.map +0 -1
- package/build/inputs/SelectInput/Options/SelectInputOptions.js +0 -270
- package/build/inputs/SelectInput/Options/SelectInputOptions.js.map +0 -1
- package/build/inputs/SelectInput/Options/SelectInputOptions.mjs +0 -268
- package/build/inputs/SelectInput/Options/SelectInputOptions.mjs.map +0 -1
- package/build/inputs/SelectInput/SelectInput.constants.js +0 -6
- package/build/inputs/SelectInput/SelectInput.constants.js.map +0 -1
- package/build/inputs/SelectInput/SelectInput.constants.mjs +0 -4
- package/build/inputs/SelectInput/SelectInput.constants.mjs.map +0 -1
- package/build/inputs/SelectInput/SelectInput.helpers.js +0 -115
- package/build/inputs/SelectInput/SelectInput.helpers.js.map +0 -1
- package/build/inputs/SelectInput/SelectInput.helpers.mjs +0 -109
- package/build/inputs/SelectInput/SelectInput.helpers.mjs.map +0 -1
- package/build/inputs/SelectInput/SelectInput.js +0 -216
- package/build/inputs/SelectInput/SelectInput.js.map +0 -1
- package/build/inputs/SelectInput/SelectInput.messages.js.map +0 -1
- package/build/inputs/SelectInput/SelectInput.messages.mjs.map +0 -1
- package/build/inputs/SelectInput/SelectInput.mjs +0 -210
- package/build/inputs/SelectInput/SelectInput.mjs.map +0 -1
- package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.js +0 -41
- package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.js.map +0 -1
- package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.mjs +0 -34
- package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.mjs.map +0 -1
- package/build/styles/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.css +0 -17
- package/build/styles/inputs/SelectInput/OptionContent/SelectInputOptionContent.css +0 -37
- package/build/styles/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.css +0 -33
- package/build/styles/inputs/SelectInput/Options/ItemView/SelectInputItemView.css +0 -44
- package/build/styles/inputs/SelectInput/Options/SelectInputOptions.css +0 -125
- package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.d.ts +0 -5
- package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/index.d.ts +0 -2
- package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/index.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.d.ts +0 -9
- package/build/types/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/DefaultTrigger/index.d.ts +0 -2
- package/build/types/inputs/SelectInput/DefaultTrigger/index.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts +0 -9
- package/build/types/inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/OptionContent/index.d.ts +0 -3
- package/build/types/inputs/SelectInput/OptionContent/index.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.d.ts +0 -3
- package/build/types/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/GroupItemView/index.d.ts +0 -2
- package/build/types/inputs/SelectInput/Options/GroupItemView/index.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.d.ts +0 -10
- package/build/types/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/ItemView/Option/index.d.ts +0 -2
- package/build/types/inputs/SelectInput/Options/ItemView/Option/index.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/ItemView/SelectInputItemView.d.ts +0 -3
- package/build/types/inputs/SelectInput/Options/ItemView/SelectInputItemView.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/ItemView/index.d.ts +0 -2
- package/build/types/inputs/SelectInput/Options/ItemView/index.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.d.ts +0 -6
- package/build/types/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/OptionsContainer/index.d.ts +0 -2
- package/build/types/inputs/SelectInput/Options/OptionsContainer/index.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/SelectInputOptions.d.ts +0 -15
- package/build/types/inputs/SelectInput/Options/SelectInputOptions.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/Options/index.d.ts +0 -2
- package/build/types/inputs/SelectInput/Options/index.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/SelectInput.constants.d.ts +0 -2
- package/build/types/inputs/SelectInput/SelectInput.constants.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/SelectInput.d.ts +0 -3
- package/build/types/inputs/SelectInput/SelectInput.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/SelectInput.helpers.d.ts +0 -28
- package/build/types/inputs/SelectInput/SelectInput.helpers.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/SelectInput.messages.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/SelectInput.types.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.d.ts +0 -15
- package/build/types/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/TriggerButton/index.d.ts +0 -3
- package/build/types/inputs/SelectInput/TriggerButton/index.d.ts.map +0 -1
- package/build/types/inputs/SelectInput/index.d.ts +0 -5
- package/build/types/inputs/SelectInput/index.d.ts.map +0 -1
- package/src/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.tsx +0 -25
- package/src/inputs/SelectInput/DefaultTrigger/ClearButton/index.ts +0 -1
- package/src/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.css +0 -17
- package/src/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.less +0 -15
- package/src/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.tsx +0 -56
- package/src/inputs/SelectInput/DefaultTrigger/index.ts +0 -1
- package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.css +0 -37
- package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.less +0 -38
- package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.tsx +0 -67
- package/src/inputs/SelectInput/OptionContent/index.ts +0 -5
- package/src/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.tsx +0 -53
- package/src/inputs/SelectInput/Options/GroupItemView/index.ts +0 -1
- package/src/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.css +0 -33
- package/src/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.less +0 -32
- package/src/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.tsx +0 -51
- package/src/inputs/SelectInput/Options/ItemView/Option/index.ts +0 -5
- package/src/inputs/SelectInput/Options/ItemView/SelectInputItemView.css +0 -44
- package/src/inputs/SelectInput/Options/ItemView/SelectInputItemView.less +0 -14
- package/src/inputs/SelectInput/Options/ItemView/SelectInputItemView.tsx +0 -37
- package/src/inputs/SelectInput/Options/ItemView/index.ts +0 -1
- package/src/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.tsx +0 -55
- package/src/inputs/SelectInput/Options/OptionsContainer/index.ts +0 -1
- package/src/inputs/SelectInput/Options/SelectInputOptions.css +0 -125
- package/src/inputs/SelectInput/Options/SelectInputOptions.less +0 -78
- package/src/inputs/SelectInput/Options/SelectInputOptions.tsx +0 -372
- package/src/inputs/SelectInput/Options/index.ts +0 -1
- package/src/inputs/SelectInput/SelectInput.constants.ts +0 -1
- package/src/inputs/SelectInput/SelectInput.helpers.ts +0 -152
- package/src/inputs/SelectInput/SelectInput.less +0 -40
- package/src/inputs/SelectInput/SelectInput.test.tsx +0 -606
- package/src/inputs/SelectInput/SelectInput.tsx +0 -247
- package/src/inputs/SelectInput/SelectInput.types.ts +0 -127
- package/src/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.tsx +0 -39
- package/src/inputs/SelectInput/TriggerButton/index.ts +0 -5
- package/src/inputs/SelectInput/index.ts +0 -13
- /package/build/inputs/{SelectInput/SelectInput.messages.js → SelectInput.messages.js} +0 -0
- /package/build/inputs/{SelectInput/SelectInput.messages.mjs → SelectInput.messages.mjs} +0 -0
- /package/build/types/inputs/{SelectInput/SelectInput.messages.d.ts → SelectInput.messages.d.ts} +0 -0
- /package/src/inputs/{SelectInput/SelectInput.messages.ts → SelectInput.messages.ts} +0 -0
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import { useRef, useState, useMemo, useEffect, useId } from 'react';
|
|
2
|
-
import { Virtualizer } from 'virtua';
|
|
3
|
-
import { ListboxOptions } from '@headlessui/react';
|
|
4
|
-
import { CrossCircle } from '@transferwise/icons';
|
|
5
|
-
import { useIntl } from 'react-intl';
|
|
6
|
-
import { clsx } from 'clsx';
|
|
7
|
-
import { SearchInput } from '../../SearchInput.mjs';
|
|
8
|
-
import messages from '../SelectInput.messages.mjs';
|
|
9
|
-
import { searchableString, filterSelectInputItems, dedupeSelectInputItems, sortSelectInputItems, selectInputOptionItemIncludesNeedle } from '../SelectInput.helpers.mjs';
|
|
10
|
-
import { SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION } from '../SelectInput.constants.mjs';
|
|
11
|
-
import { SelectInputOptionsContainer } from './OptionsContainer/SelectInputOptionsContainer.mjs';
|
|
12
|
-
import { SelectInputItemView } from './ItemView/SelectInputItemView.mjs';
|
|
13
|
-
import { SelectInputItemsCountContext, SelectInputItemPositionContext } from './ItemView/Option/SelectInputOption.mjs';
|
|
14
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
15
|
-
|
|
16
|
-
function SelectInputOptions({
|
|
17
|
-
id,
|
|
18
|
-
parentId,
|
|
19
|
-
items,
|
|
20
|
-
compareValues: compareValuesProp,
|
|
21
|
-
renderValue = String,
|
|
22
|
-
renderFooter,
|
|
23
|
-
filterable = false,
|
|
24
|
-
filterPlaceholder,
|
|
25
|
-
sortFilteredOptions,
|
|
26
|
-
searchInputRef,
|
|
27
|
-
listboxRef,
|
|
28
|
-
filterQuery,
|
|
29
|
-
onFilterChange,
|
|
30
|
-
listBoxLabel,
|
|
31
|
-
listBoxLabelledBy,
|
|
32
|
-
autocomplete,
|
|
33
|
-
name,
|
|
34
|
-
onAutocompleteSelect
|
|
35
|
-
}) {
|
|
36
|
-
const intl = useIntl();
|
|
37
|
-
const virtualiserHandlerRef = useRef(null);
|
|
38
|
-
const controllerRef = filterable ? searchInputRef : listboxRef;
|
|
39
|
-
const [initialRender, setInitialRender] = useState(true);
|
|
40
|
-
const needle = useMemo(() => {
|
|
41
|
-
if (filterable) {
|
|
42
|
-
return filterQuery ? searchableString(filterQuery) : null;
|
|
43
|
-
}
|
|
44
|
-
return undefined;
|
|
45
|
-
}, [filterQuery, filterable]);
|
|
46
|
-
useEffect(() => {
|
|
47
|
-
if (needle) {
|
|
48
|
-
// Ensure having an active option while filtering.
|
|
49
|
-
// Without `requestAnimationFrame` upon which React depends for scheduling
|
|
50
|
-
// updates, the active status would only show for a split second and then
|
|
51
|
-
// disappear inadvertently.
|
|
52
|
-
requestAnimationFrame(() => {
|
|
53
|
-
if (controllerRef.current != null && !controllerRef.current.hasAttribute('aria-activedescendant')) {
|
|
54
|
-
// Activate first option via synthetic key press
|
|
55
|
-
controllerRef.current.dispatchEvent(new KeyboardEvent('keydown', {
|
|
56
|
-
key: 'Home',
|
|
57
|
-
bubbles: true
|
|
58
|
-
}));
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}, [controllerRef, needle]);
|
|
63
|
-
const compareValues = useMemo(() => {
|
|
64
|
-
if (!compareValuesProp) {
|
|
65
|
-
return undefined;
|
|
66
|
-
}
|
|
67
|
-
if (typeof compareValuesProp === 'function') {
|
|
68
|
-
return (a, b) => compareValuesProp(a, b);
|
|
69
|
-
}
|
|
70
|
-
const key = compareValuesProp;
|
|
71
|
-
return (a, b) => {
|
|
72
|
-
if (typeof a === 'object' && a != null && typeof b === 'object' && b != null) {
|
|
73
|
-
return a[key] === b[key];
|
|
74
|
-
}
|
|
75
|
-
return a === b;
|
|
76
|
-
};
|
|
77
|
-
}, [compareValuesProp]);
|
|
78
|
-
const filteredItems = useMemo(() => {
|
|
79
|
-
if (needle == null) {
|
|
80
|
-
return items;
|
|
81
|
-
}
|
|
82
|
-
const filtered = filterSelectInputItems(dedupeSelectInputItems(items, compareValues), item => selectInputOptionItemIncludesNeedle(item, needle));
|
|
83
|
-
if (sortFilteredOptions) {
|
|
84
|
-
return sortSelectInputItems(filtered, sortFilteredOptions, filterQuery);
|
|
85
|
-
}
|
|
86
|
-
return filtered;
|
|
87
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
88
|
-
}, [needle, items, compareValues]);
|
|
89
|
-
const resultsEmpty = needle != null && filteredItems.length === 0;
|
|
90
|
-
const virtualized = filteredItems.length > SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION;
|
|
91
|
-
// Items shown once shall be kept mounted until the needle changes, otherwise
|
|
92
|
-
// the scroll position may jump around inadvertently. Pattern adopted from:
|
|
93
|
-
// https://inokawa.github.io/virtua/?path=/story/advanced-keep-offscreen-items--append-only
|
|
94
|
-
const [mountedIndexes, setMountedIndexes] = useState([]);
|
|
95
|
-
useEffect(() => {
|
|
96
|
-
// Ensure the 'End' key works as intended by keeping the last item mounted
|
|
97
|
-
setMountedIndexes(prevMountedIndexes => {
|
|
98
|
-
const indexes = new Set(prevMountedIndexes);
|
|
99
|
-
indexes.add(filteredItems.length - 1);
|
|
100
|
-
return [...indexes]; // Sorting is redundant by nature here
|
|
101
|
-
});
|
|
102
|
-
}, [needle,
|
|
103
|
-
// Needed as `filteredItems.length` may be equal between two updates
|
|
104
|
-
filteredItems.length]);
|
|
105
|
-
const listboxContainerRef = useRef(null);
|
|
106
|
-
useEffect(() => {
|
|
107
|
-
if (listboxContainerRef.current != null) {
|
|
108
|
-
listboxContainerRef.current.style.setProperty('--initial-height', `${listboxContainerRef.current.offsetHeight}px`);
|
|
109
|
-
}
|
|
110
|
-
}, []);
|
|
111
|
-
useEffect(() => {
|
|
112
|
-
setInitialRender(false);
|
|
113
|
-
}, []);
|
|
114
|
-
const showStatus = resultsEmpty;
|
|
115
|
-
const statusId = useId();
|
|
116
|
-
const listboxId = useId();
|
|
117
|
-
const getItemNode = index => {
|
|
118
|
-
const item = filteredItems[index];
|
|
119
|
-
return /*#__PURE__*/jsx(SelectInputItemView, {
|
|
120
|
-
item: item,
|
|
121
|
-
renderValue: renderValue,
|
|
122
|
-
needle: needle
|
|
123
|
-
}, index);
|
|
124
|
-
};
|
|
125
|
-
const findMatchingItem = autocompleteValue => {
|
|
126
|
-
const flatOptions = items.flatMap(item => item.type === 'group' ? item.options : item.type === 'option' ? [item] : []).filter(item => item.type === 'option' && item.value != null);
|
|
127
|
-
const exactMatch = flatOptions.find(option => String(option.value) === autocompleteValue || option.filterMatchers?.some(matcher => matcher === autocompleteValue));
|
|
128
|
-
if (exactMatch) {
|
|
129
|
-
return exactMatch.value;
|
|
130
|
-
}
|
|
131
|
-
const fuzzyMatch = flatOptions.find(option => option.filterMatchers?.some(matcher => matcher.toLowerCase().includes(autocompleteValue.toLowerCase())));
|
|
132
|
-
return fuzzyMatch ? fuzzyMatch.value : null;
|
|
133
|
-
};
|
|
134
|
-
return /*#__PURE__*/jsxs(ListboxOptions, {
|
|
135
|
-
modal: true,
|
|
136
|
-
as: SelectInputOptionsContainer,
|
|
137
|
-
static: true,
|
|
138
|
-
className: "np-select-input-options-container",
|
|
139
|
-
onAriaActiveDescendantChange: value => {
|
|
140
|
-
if (controllerRef.current != null) {
|
|
141
|
-
if (!initialRender && value != null) {
|
|
142
|
-
controllerRef.current.setAttribute('aria-activedescendant', value);
|
|
143
|
-
} else {
|
|
144
|
-
controllerRef.current.removeAttribute('aria-activedescendant');
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
},
|
|
148
|
-
children: [filterable ? /*#__PURE__*/jsx("div", {
|
|
149
|
-
className: "np-select-input-query-container",
|
|
150
|
-
children: /*#__PURE__*/jsx(SearchInput, {
|
|
151
|
-
ref: searchInputRef,
|
|
152
|
-
id: id,
|
|
153
|
-
name: name,
|
|
154
|
-
autoComplete: autocomplete,
|
|
155
|
-
role: "combobox",
|
|
156
|
-
shape: "rectangle",
|
|
157
|
-
placeholder: filterPlaceholder,
|
|
158
|
-
"aria-label": filterPlaceholder,
|
|
159
|
-
defaultValue: filterQuery,
|
|
160
|
-
"aria-autocomplete": "list",
|
|
161
|
-
"aria-expanded": true,
|
|
162
|
-
"aria-controls": listboxId,
|
|
163
|
-
"aria-describedby": showStatus ? statusId : undefined,
|
|
164
|
-
onKeyDown: event => {
|
|
165
|
-
// Prevent interfering with the matcher of Headless UI
|
|
166
|
-
// https://mathiasbynens.be/notes/javascript-unicode#regex
|
|
167
|
-
if (/^.$/u.test(event.key)) {
|
|
168
|
-
event.stopPropagation();
|
|
169
|
-
}
|
|
170
|
-
},
|
|
171
|
-
onChange: event => {
|
|
172
|
-
// Free up resources and ensure not to go out of bounds when the
|
|
173
|
-
// resulting item count is less than before
|
|
174
|
-
const inputValue = event.currentTarget.value;
|
|
175
|
-
// Free up resources and ensure not to go out of bounds
|
|
176
|
-
setMountedIndexes([]);
|
|
177
|
-
onFilterChange(inputValue);
|
|
178
|
-
},
|
|
179
|
-
onInput: event => {
|
|
180
|
-
const inputValue = event.currentTarget.value;
|
|
181
|
-
const inputElement = event.currentTarget;
|
|
182
|
-
if (autocomplete && onAutocompleteSelect && inputValue) {
|
|
183
|
-
setTimeout(() => {
|
|
184
|
-
if (inputElement.value === inputValue && inputValue.length > 2) {
|
|
185
|
-
const matchedValue = findMatchingItem(inputValue);
|
|
186
|
-
if (matchedValue !== null) {
|
|
187
|
-
onAutocompleteSelect(matchedValue);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}, 50);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
})
|
|
194
|
-
}) : null, /*#__PURE__*/jsxs("section", {
|
|
195
|
-
ref: listboxContainerRef,
|
|
196
|
-
tabIndex: -1,
|
|
197
|
-
className: clsx('np-select-input-listbox-container', virtualized && 'np-select-input-listbox-container--virtualized', needle == null &&
|
|
198
|
-
// Groups aren't shown when filtering
|
|
199
|
-
items.some(item => item.type === 'group') && 'np-select-input-listbox-container--has-group'),
|
|
200
|
-
"data-wds-parent": parentId ?? undefined,
|
|
201
|
-
children: [resultsEmpty ? /*#__PURE__*/jsxs("div", {
|
|
202
|
-
id: statusId,
|
|
203
|
-
className: "np-select-input-options-status",
|
|
204
|
-
children: [/*#__PURE__*/jsx(CrossCircle, {
|
|
205
|
-
size: 16,
|
|
206
|
-
className: "np-select-input-options-status-icon"
|
|
207
|
-
}), intl.formatMessage(messages.noResultsFound)]
|
|
208
|
-
}) : null, /*#__PURE__*/jsx("div", {
|
|
209
|
-
ref: listboxRef,
|
|
210
|
-
id: listboxId,
|
|
211
|
-
role: "listbox",
|
|
212
|
-
"aria-orientation": "vertical",
|
|
213
|
-
"aria-label": listBoxLabel,
|
|
214
|
-
"aria-labelledby": listBoxLabelledBy,
|
|
215
|
-
tabIndex: 0,
|
|
216
|
-
className: "np-select-input-listbox",
|
|
217
|
-
children: !virtualized ? filteredItems.map((_, index) => getItemNode(index)) : /*#__PURE__*/jsx(Virtualizer, {
|
|
218
|
-
ref: virtualiserHandlerRef,
|
|
219
|
-
data: filteredItems,
|
|
220
|
-
keepMounted: mountedIndexes,
|
|
221
|
-
scrollRef: listboxRef // `VList` doesn't expose this
|
|
222
|
-
,
|
|
223
|
-
onScroll: async () => {
|
|
224
|
-
if (!virtualiserHandlerRef.current) return;
|
|
225
|
-
const startIndex = virtualiserHandlerRef.current.findItemIndex(virtualiserHandlerRef.current.scrollOffset);
|
|
226
|
-
const endIndex = virtualiserHandlerRef.current.findItemIndex(virtualiserHandlerRef.current.scrollOffset + virtualiserHandlerRef.current.viewportSize);
|
|
227
|
-
setMountedIndexes(prevMountedIndexes => {
|
|
228
|
-
const indexes = new Set(prevMountedIndexes);
|
|
229
|
-
for (let index = startIndex; index <= endIndex; index += 1) {
|
|
230
|
-
indexes.add(index);
|
|
231
|
-
}
|
|
232
|
-
return [...indexes].sort((a, b) => a - b);
|
|
233
|
-
});
|
|
234
|
-
},
|
|
235
|
-
children: (item, index) =>
|
|
236
|
-
/*#__PURE__*/
|
|
237
|
-
// The position of each item can't be inferred by browsers when
|
|
238
|
-
// virtualizing, as some of the items may not be in the DOM
|
|
239
|
-
jsx(SelectInputItemsCountContext.Provider, {
|
|
240
|
-
value: filteredItems.length,
|
|
241
|
-
children: /*#__PURE__*/jsx(SelectInputItemPositionContext.Provider, {
|
|
242
|
-
value: index + 1,
|
|
243
|
-
children: getItemNode(index)
|
|
244
|
-
})
|
|
245
|
-
})
|
|
246
|
-
}, needle)
|
|
247
|
-
}), renderFooter != null ? /*#__PURE__*/jsx("footer", {
|
|
248
|
-
className: "np-select-input-footer",
|
|
249
|
-
children: /*#__PURE__*/jsx("div", {
|
|
250
|
-
role: "none",
|
|
251
|
-
onKeyDown: event => {
|
|
252
|
-
// Prevent interfering with Headless UI
|
|
253
|
-
if (event.key !== 'Escape') {
|
|
254
|
-
event.stopPropagation();
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
children: renderFooter({
|
|
258
|
-
resultsEmpty,
|
|
259
|
-
queryNormalized: needle
|
|
260
|
-
})
|
|
261
|
-
})
|
|
262
|
-
}) : null]
|
|
263
|
-
})]
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
export { SelectInputOptions };
|
|
268
|
-
//# sourceMappingURL=SelectInputOptions.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SelectInputOptions.mjs","sources":["../../../../src/inputs/SelectInput/Options/SelectInputOptions.tsx"],"sourcesContent":["import { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { Virtualizer, type VirtualizerHandle } from 'virtua';\nimport { ListboxOptions } from '@headlessui/react';\nimport { CrossCircle } from '@transferwise/icons';\nimport { useIntl } from 'react-intl';\nimport { clsx } from 'clsx';\n\nimport { SearchInput } from '../../SearchInput';\nimport messages from '../SelectInput.messages';\nimport type {\n SelectInputProps,\n SelectInputOptionItem,\n SelectInputItem,\n} from '../SelectInput.types';\nimport {\n searchableString,\n dedupeSelectInputItems,\n filterSelectInputItems,\n selectInputOptionItemIncludesNeedle,\n sortSelectInputItems,\n} from '../SelectInput.helpers';\nimport { SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION } from '../SelectInput.constants';\n\nimport { SelectInputOptionsContainer } from './OptionsContainer';\nimport { SelectInputItemView } from './ItemView';\nimport { SelectInputItemsCountContext, SelectInputItemPositionContext } from './ItemView/Option';\n\ninterface SelectInputOptionsProps<T = string> extends Pick<\n SelectInputProps<T>,\n | 'items'\n | 'renderValue'\n | 'renderFooter'\n | 'filterable'\n | 'filterPlaceholder'\n | 'id'\n | 'parentId'\n | 'compareValues'\n | 'sortFilteredOptions'\n> {\n searchInputRef: React.MutableRefObject<HTMLInputElement | null>;\n listboxRef: React.MutableRefObject<HTMLDivElement | null>;\n filterQuery: string;\n onFilterChange: (query: string) => void;\n listBoxLabel?: string;\n listBoxLabelledBy?: string;\n autocomplete?: string;\n name?: string;\n onAutocompleteSelect?: (value: T) => void;\n}\n\nexport function SelectInputOptions<T = string>({\n id,\n parentId,\n items,\n compareValues: compareValuesProp,\n renderValue = String,\n renderFooter,\n filterable = false,\n filterPlaceholder,\n sortFilteredOptions,\n searchInputRef,\n listboxRef,\n filterQuery,\n onFilterChange,\n listBoxLabel,\n listBoxLabelledBy,\n autocomplete,\n name,\n onAutocompleteSelect,\n}: SelectInputOptionsProps<T>) {\n const intl = useIntl();\n const virtualiserHandlerRef = useRef<VirtualizerHandle>(null);\n const controllerRef = filterable ? searchInputRef : listboxRef;\n const [initialRender, setInitialRender] = useState(true);\n\n const needle = useMemo(() => {\n if (filterable) {\n return filterQuery ? searchableString(filterQuery) : null;\n }\n return undefined;\n }, [filterQuery, filterable]);\n\n useEffect(() => {\n if (needle) {\n // Ensure having an active option while filtering.\n // Without `requestAnimationFrame` upon which React depends for scheduling\n // updates, the active status would only show for a split second and then\n // disappear inadvertently.\n requestAnimationFrame(() => {\n if (\n controllerRef.current != null &&\n !controllerRef.current.hasAttribute('aria-activedescendant')\n ) {\n // Activate first option via synthetic key press\n controllerRef.current.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Home', bubbles: true }),\n );\n }\n });\n }\n }, [controllerRef, needle]);\n\n const compareValues = useMemo(() => {\n if (!compareValuesProp) {\n return undefined;\n }\n\n if (typeof compareValuesProp === 'function') {\n return (a: NonNullable<T>, b: NonNullable<T>) => compareValuesProp(a, b);\n }\n\n const key = compareValuesProp;\n return (a: NonNullable<T>, b: NonNullable<T>) => {\n if (typeof a === 'object' && a != null && typeof b === 'object' && b != null) {\n return (a as Record<string, unknown>)[key] === (b as Record<string, unknown>)[key];\n }\n return a === b;\n };\n }, [compareValuesProp]);\n\n const filteredItems: readonly SelectInputItem<NonNullable<T> | undefined>[] = useMemo(() => {\n if (needle == null) {\n return items;\n }\n\n const filtered = filterSelectInputItems(dedupeSelectInputItems(items, compareValues), (item) =>\n selectInputOptionItemIncludesNeedle(item, needle),\n );\n\n if (sortFilteredOptions) {\n return sortSelectInputItems(filtered, sortFilteredOptions, filterQuery);\n }\n\n return filtered;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [needle, items, compareValues]);\n const resultsEmpty = needle != null && filteredItems.length === 0;\n\n const virtualized = filteredItems.length > SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION;\n\n // Items shown once shall be kept mounted until the needle changes, otherwise\n // the scroll position may jump around inadvertently. Pattern adopted from:\n // https://inokawa.github.io/virtua/?path=/story/advanced-keep-offscreen-items--append-only\n const [mountedIndexes, setMountedIndexes] = useState<number[]>([]);\n useEffect(() => {\n // Ensure the 'End' key works as intended by keeping the last item mounted\n setMountedIndexes((prevMountedIndexes) => {\n const indexes = new Set(prevMountedIndexes);\n indexes.add(filteredItems.length - 1);\n return [...indexes]; // Sorting is redundant by nature here\n });\n }, [\n needle, // Needed as `filteredItems.length` may be equal between two updates\n filteredItems.length,\n ]);\n\n const listboxContainerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (listboxContainerRef.current != null) {\n listboxContainerRef.current.style.setProperty(\n '--initial-height',\n `${listboxContainerRef.current.offsetHeight}px`,\n );\n }\n }, []);\n\n useEffect(() => {\n setInitialRender(false);\n }, []);\n\n const showStatus = resultsEmpty;\n const statusId = useId();\n const listboxId = useId();\n\n const getItemNode = (index: number) => {\n const item = filteredItems[index];\n return (\n <SelectInputItemView key={index} item={item} renderValue={renderValue} needle={needle} />\n );\n };\n\n const findMatchingItem = (autocompleteValue: string): T | null => {\n const flatOptions = items\n .flatMap((item) =>\n item.type === 'group' ? item.options : item.type === 'option' ? [item] : [],\n )\n .filter(\n (item): item is SelectInputOptionItem<NonNullable<T>> =>\n item.type === 'option' && item.value != null,\n );\n\n const exactMatch = flatOptions.find(\n (option) =>\n String(option.value) === autocompleteValue ||\n option.filterMatchers?.some((matcher) => matcher === autocompleteValue),\n );\n\n if (exactMatch) {\n return exactMatch.value;\n }\n\n const fuzzyMatch = flatOptions.find((option) =>\n option.filterMatchers?.some((matcher) =>\n matcher.toLowerCase().includes(autocompleteValue.toLowerCase()),\n ),\n );\n\n return fuzzyMatch ? fuzzyMatch.value : null;\n };\n\n return (\n <ListboxOptions\n modal\n as={SelectInputOptionsContainer}\n static\n className=\"np-select-input-options-container\"\n onAriaActiveDescendantChange={(value: React.AriaAttributes['aria-activedescendant']) => {\n if (controllerRef.current != null) {\n if (!initialRender && value != null) {\n controllerRef.current.setAttribute('aria-activedescendant', value);\n } else {\n controllerRef.current.removeAttribute('aria-activedescendant');\n }\n }\n }}\n >\n {filterable ? (\n <div className=\"np-select-input-query-container\">\n <SearchInput\n ref={searchInputRef}\n id={id}\n name={name}\n autoComplete={autocomplete}\n role=\"combobox\"\n shape=\"rectangle\"\n placeholder={filterPlaceholder}\n aria-label={filterPlaceholder}\n defaultValue={filterQuery}\n aria-autocomplete=\"list\"\n aria-expanded\n aria-controls={listboxId}\n aria-describedby={showStatus ? statusId : undefined}\n onKeyDown={(event) => {\n // Prevent interfering with the matcher of Headless UI\n // https://mathiasbynens.be/notes/javascript-unicode#regex\n if (/^.$/u.test(event.key)) {\n event.stopPropagation();\n }\n }}\n onChange={(event) => {\n // Free up resources and ensure not to go out of bounds when the\n // resulting item count is less than before\n const inputValue = event.currentTarget.value;\n\n // Free up resources and ensure not to go out of bounds\n setMountedIndexes([]);\n onFilterChange(inputValue);\n }}\n onInput={(event) => {\n const inputValue = event.currentTarget.value;\n const inputElement = event.currentTarget;\n\n if (autocomplete && onAutocompleteSelect && inputValue) {\n setTimeout(() => {\n if (inputElement.value === inputValue && inputValue.length > 2) {\n const matchedValue = findMatchingItem(inputValue);\n if (matchedValue !== null) {\n onAutocompleteSelect(matchedValue);\n }\n }\n }, 50);\n }\n }}\n />\n </div>\n ) : null}\n\n <section\n ref={listboxContainerRef}\n tabIndex={-1}\n className={clsx(\n 'np-select-input-listbox-container',\n virtualized && 'np-select-input-listbox-container--virtualized',\n needle == null && // Groups aren't shown when filtering\n items.some((item) => item.type === 'group') &&\n 'np-select-input-listbox-container--has-group',\n )}\n data-wds-parent={parentId ?? undefined}\n >\n {resultsEmpty ? (\n <div id={statusId} className=\"np-select-input-options-status\">\n <CrossCircle size={16} className=\"np-select-input-options-status-icon\" />\n {intl.formatMessage(messages.noResultsFound)}\n </div>\n ) : null}\n\n <div\n ref={listboxRef}\n id={listboxId}\n role=\"listbox\"\n aria-orientation=\"vertical\"\n aria-label={listBoxLabel}\n aria-labelledby={listBoxLabelledBy}\n tabIndex={0}\n className=\"np-select-input-listbox\"\n >\n {!virtualized ? (\n filteredItems.map((_, index) => getItemNode(index))\n ) : (\n <Virtualizer\n ref={virtualiserHandlerRef}\n key={needle}\n data={filteredItems}\n keepMounted={mountedIndexes}\n scrollRef={listboxRef} // `VList` doesn't expose this\n onScroll={async () => {\n if (!virtualiserHandlerRef.current) return;\n\n const startIndex = virtualiserHandlerRef.current.findItemIndex(\n virtualiserHandlerRef.current.scrollOffset,\n );\n const endIndex = virtualiserHandlerRef.current.findItemIndex(\n virtualiserHandlerRef.current.scrollOffset +\n virtualiserHandlerRef.current.viewportSize,\n );\n\n setMountedIndexes((prevMountedIndexes) => {\n const indexes = new Set(prevMountedIndexes);\n\n for (let index = startIndex; index <= endIndex; index += 1) {\n indexes.add(index);\n }\n\n return [...indexes].sort((a, b) => a - b);\n });\n }}\n >\n {(item, index) => (\n // The position of each item can't be inferred by browsers when\n // virtualizing, as some of the items may not be in the DOM\n <SelectInputItemsCountContext.Provider value={filteredItems.length}>\n <SelectInputItemPositionContext.Provider value={index + 1}>\n {getItemNode(index)}\n </SelectInputItemPositionContext.Provider>\n </SelectInputItemsCountContext.Provider>\n )}\n </Virtualizer>\n )}\n </div>\n\n {renderFooter != null ? (\n <footer className=\"np-select-input-footer\">\n <div\n role=\"none\"\n onKeyDown={(event) => {\n // Prevent interfering with Headless UI\n if (event.key !== 'Escape') {\n event.stopPropagation();\n }\n }}\n >\n {renderFooter({\n resultsEmpty,\n queryNormalized: needle,\n })}\n </div>\n </footer>\n ) : null}\n </section>\n </ListboxOptions>\n );\n}\n"],"names":["SelectInputOptions","id","parentId","items","compareValues","compareValuesProp","renderValue","String","renderFooter","filterable","filterPlaceholder","sortFilteredOptions","searchInputRef","listboxRef","filterQuery","onFilterChange","listBoxLabel","listBoxLabelledBy","autocomplete","name","onAutocompleteSelect","intl","useIntl","virtualiserHandlerRef","useRef","controllerRef","initialRender","setInitialRender","useState","needle","useMemo","searchableString","undefined","useEffect","requestAnimationFrame","current","hasAttribute","dispatchEvent","KeyboardEvent","key","bubbles","a","b","filteredItems","filtered","filterSelectInputItems","dedupeSelectInputItems","item","selectInputOptionItemIncludesNeedle","sortSelectInputItems","resultsEmpty","length","virtualized","SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION","mountedIndexes","setMountedIndexes","prevMountedIndexes","indexes","Set","add","listboxContainerRef","style","setProperty","offsetHeight","showStatus","statusId","useId","listboxId","getItemNode","index","_jsx","SelectInputItemView","findMatchingItem","autocompleteValue","flatOptions","flatMap","type","options","filter","value","exactMatch","find","option","filterMatchers","some","matcher","fuzzyMatch","toLowerCase","includes","_jsxs","ListboxOptions","modal","as","SelectInputOptionsContainer","static","className","onAriaActiveDescendantChange","setAttribute","removeAttribute","children","SearchInput","ref","autoComplete","role","shape","placeholder","defaultValue","onKeyDown","event","test","stopPropagation","onChange","inputValue","currentTarget","onInput","inputElement","setTimeout","matchedValue","tabIndex","clsx","CrossCircle","size","formatMessage","messages","noResultsFound","map","_","Virtualizer","data","keepMounted","scrollRef","onScroll","startIndex","findItemIndex","scrollOffset","endIndex","viewportSize","sort","SelectInputItemsCountContext","Provider","SelectInputItemPositionContext","queryNormalized"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SelectInput.constants.js","sources":["../../../src/inputs/SelectInput/SelectInput.constants.ts"],"sourcesContent":["export const SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;\n"],"names":["SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION"],"mappings":";;AAAO,MAAMA,6CAA6C,GAAG;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SelectInput.constants.mjs","sources":["../../../src/inputs/SelectInput/SelectInput.constants.ts"],"sourcesContent":["export const SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;\n"],"names":["SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION"],"mappings":"AAAO,MAAMA,6CAA6C,GAAG;;;;"}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Normalises a string for searching by trimming, normalising whitespace,
|
|
5
|
-
* removing diacritics, and converting to lowercase.
|
|
6
|
-
*/
|
|
7
|
-
function searchableString(value) {
|
|
8
|
-
return value.trim().replace(/\s+/gu, ' ')
|
|
9
|
-
// NFD converts an Å to A + ̊ (and other special characters)
|
|
10
|
-
.normalize('NFD')
|
|
11
|
-
// and then this replaces the ̊ with nothing (and other special characters)
|
|
12
|
-
.replace(/[\u0300-\u036f]/g, '').toLowerCase();
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Infers searchable strings from a value.
|
|
16
|
-
* Extracts string values from objects or returns the string itself.
|
|
17
|
-
*/
|
|
18
|
-
function inferSearchableStrings(value) {
|
|
19
|
-
if (typeof value === 'string') {
|
|
20
|
-
return [searchableString(value)];
|
|
21
|
-
}
|
|
22
|
-
if (typeof value === 'object' && value != null) {
|
|
23
|
-
return Object.values(value).filter(innerValue => typeof innerValue === 'string').map(innerValue => searchableString(innerValue));
|
|
24
|
-
}
|
|
25
|
-
return [];
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Checks if a select input option item matches the search needle.
|
|
29
|
-
*/
|
|
30
|
-
function selectInputOptionItemIncludesNeedle(item, needle) {
|
|
31
|
-
return inferSearchableStrings(item.filterMatchers ?? item.value).some(haystack => haystack.includes(needle));
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Deduplicates a single option item by checking against existing values.
|
|
35
|
-
* Returns the item with value set to undefined if it's a duplicate.
|
|
36
|
-
*/
|
|
37
|
-
function dedupeSelectInputOptionItem(item, existingValues, compareValues) {
|
|
38
|
-
const isDuplicate = compareValues ? Array.from(existingValues).some(existingValue => compareValues(item.value, existingValue)) : existingValues.has(item.value);
|
|
39
|
-
if (!isDuplicate) {
|
|
40
|
-
existingValues.add(item.value);
|
|
41
|
-
return item;
|
|
42
|
-
}
|
|
43
|
-
return {
|
|
44
|
-
...item,
|
|
45
|
-
value: undefined
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Sets the `value` of duplicate option items to `undefined`, hiding them when
|
|
50
|
-
* rendered. Indexes are kept intact within groups to preserve the active item
|
|
51
|
-
* between filter changes when possible.
|
|
52
|
-
*/
|
|
53
|
-
function dedupeSelectInputItems(items, compareValues) {
|
|
54
|
-
const existingValues = new Set();
|
|
55
|
-
return items.map(item => {
|
|
56
|
-
switch (item.type) {
|
|
57
|
-
case 'option':
|
|
58
|
-
{
|
|
59
|
-
return dedupeSelectInputOptionItem(item, existingValues, compareValues);
|
|
60
|
-
}
|
|
61
|
-
case 'group':
|
|
62
|
-
{
|
|
63
|
-
return {
|
|
64
|
-
...item,
|
|
65
|
-
options: item.options.map(option => dedupeSelectInputOptionItem(option, existingValues, compareValues))
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return item;
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Filters select input items based on a predicate function.
|
|
74
|
-
* Groups are included if at least one option matches the predicate.
|
|
75
|
-
*/
|
|
76
|
-
function filterSelectInputItems(items, predicate) {
|
|
77
|
-
return items.filter(item => {
|
|
78
|
-
switch (item.type) {
|
|
79
|
-
case 'option':
|
|
80
|
-
{
|
|
81
|
-
return predicate(item);
|
|
82
|
-
}
|
|
83
|
-
case 'group':
|
|
84
|
-
{
|
|
85
|
-
return item.options.some(option => predicate(option));
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Flattens and sorts filtered options using the provided comparator.
|
|
93
|
-
* Extracts all options from groups, filters out undefined values (deduplicated items),
|
|
94
|
-
* sorts them, and returns as a flat list of option items.
|
|
95
|
-
*/
|
|
96
|
-
function sortSelectInputItems(items, compareFn, searchQuery) {
|
|
97
|
-
const flattenedOption = items.flatMap(item => {
|
|
98
|
-
if (item.type === 'option') {
|
|
99
|
-
return item.value !== undefined ? [item] : [];
|
|
100
|
-
}
|
|
101
|
-
if (item.type === 'group') {
|
|
102
|
-
return item.options.filter(option => option.value !== undefined);
|
|
103
|
-
}
|
|
104
|
-
return [];
|
|
105
|
-
});
|
|
106
|
-
// eslint-disable-next-line functional/immutable-data
|
|
107
|
-
return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
exports.dedupeSelectInputItems = dedupeSelectInputItems;
|
|
111
|
-
exports.filterSelectInputItems = filterSelectInputItems;
|
|
112
|
-
exports.searchableString = searchableString;
|
|
113
|
-
exports.selectInputOptionItemIncludesNeedle = selectInputOptionItemIncludesNeedle;
|
|
114
|
-
exports.sortSelectInputItems = sortSelectInputItems;
|
|
115
|
-
//# sourceMappingURL=SelectInput.helpers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SelectInput.helpers.js","sources":["../../../src/inputs/SelectInput/SelectInput.helpers.ts"],"sourcesContent":["import type { SelectInputOptionItem, SelectInputItem } from './SelectInput.types';\n\n/**\n * Normalises a string for searching by trimming, normalising whitespace,\n * removing diacritics, and converting to lowercase.\n */\nexport function searchableString(value: string) {\n return (\n value\n .trim()\n .replace(/\\s+/gu, ' ')\n // NFD converts an Å to A + ̊ (and other special characters)\n .normalize('NFD')\n // and then this replaces the ̊ with nothing (and other special characters)\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n );\n}\n\n/**\n * Infers searchable strings from a value.\n * Extracts string values from objects or returns the string itself.\n */\nfunction inferSearchableStrings(value: unknown) {\n if (typeof value === 'string') {\n return [searchableString(value)];\n }\n\n if (typeof value === 'object' && value != null) {\n return Object.values(value)\n .filter((innerValue) => typeof innerValue === 'string')\n .map((innerValue) => searchableString(innerValue));\n }\n\n return [];\n}\n\n/**\n * Checks if a select input option item matches the search needle.\n */\nexport function selectInputOptionItemIncludesNeedle<T>(\n item: SelectInputOptionItem<T>,\n needle: string,\n) {\n return inferSearchableStrings(item.filterMatchers ?? item.value).some((haystack) =>\n haystack.includes(needle),\n );\n}\n\n/**\n * Deduplicates a single option item by checking against existing values.\n * Returns the item with value set to undefined if it's a duplicate.\n */\nfunction dedupeSelectInputOptionItem<T>(\n item: SelectInputOptionItem<T>,\n existingValues: Set<T>,\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputOptionItem<T | undefined> {\n const isDuplicate = compareValues\n ? Array.from(existingValues).some((existingValue) => compareValues(item.value, existingValue))\n : existingValues.has(item.value);\n\n if (!isDuplicate) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\n/**\n * Sets the `value` of duplicate option items to `undefined`, hiding them when\n * rendered. Indexes are kept intact within groups to preserve the active item\n * between filter changes when possible.\n */\nexport function dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues, compareValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues, compareValues),\n ),\n };\n }\n default:\n }\n return item;\n });\n}\n\n/**\n * Filters select input items based on a predicate function.\n * Groups are included if at least one option matches the predicate.\n */\nexport function filterSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n predicate: (item: SelectInputOptionItem<T>) => boolean,\n) {\n return items.filter((item) => {\n switch (item.type) {\n case 'option': {\n return predicate(item);\n }\n case 'group': {\n return item.options.some((option) => predicate(option));\n }\n default:\n }\n return false;\n });\n}\n\n/**\n * Flattens and sorts filtered options using the provided comparator.\n * Extracts all options from groups, filters out undefined values (deduplicated items),\n * sorts them, and returns as a flat list of option items.\n */\nexport function sortSelectInputItems<T>(\n items: readonly SelectInputItem<T | undefined>[],\n compareFn: (\n a: SelectInputOptionItem<NonNullable<T>>,\n b: SelectInputOptionItem<NonNullable<T>>,\n searchQuery: string,\n ) => number,\n searchQuery: string,\n): SelectInputItem<NonNullable<T>>[] {\n const flattenedOption = items.flatMap((item) => {\n if (item.type === 'option') {\n return item.value !== undefined ? [item as SelectInputOptionItem<NonNullable<T>>] : [];\n }\n\n if (item.type === 'group') {\n return item.options.filter(\n (option): option is SelectInputOptionItem<NonNullable<T>> => option.value !== undefined,\n );\n }\n\n return [];\n });\n\n // eslint-disable-next-line functional/immutable-data\n return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));\n}\n"],"names":["searchableString","value","trim","replace","normalize","toLowerCase","inferSearchableStrings","Object","values","filter","innerValue","map","selectInputOptionItemIncludesNeedle","item","needle","filterMatchers","some","haystack","includes","dedupeSelectInputOptionItem","existingValues","compareValues","isDuplicate","Array","from","existingValue","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","filterSelectInputItems","predicate","sortSelectInputItems","compareFn","searchQuery","flattenedOption","flatMap","sort","a","b"],"mappings":"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"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Normalises a string for searching by trimming, normalising whitespace,
|
|
3
|
-
* removing diacritics, and converting to lowercase.
|
|
4
|
-
*/
|
|
5
|
-
function searchableString(value) {
|
|
6
|
-
return value.trim().replace(/\s+/gu, ' ')
|
|
7
|
-
// NFD converts an Å to A + ̊ (and other special characters)
|
|
8
|
-
.normalize('NFD')
|
|
9
|
-
// and then this replaces the ̊ with nothing (and other special characters)
|
|
10
|
-
.replace(/[\u0300-\u036f]/g, '').toLowerCase();
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Infers searchable strings from a value.
|
|
14
|
-
* Extracts string values from objects or returns the string itself.
|
|
15
|
-
*/
|
|
16
|
-
function inferSearchableStrings(value) {
|
|
17
|
-
if (typeof value === 'string') {
|
|
18
|
-
return [searchableString(value)];
|
|
19
|
-
}
|
|
20
|
-
if (typeof value === 'object' && value != null) {
|
|
21
|
-
return Object.values(value).filter(innerValue => typeof innerValue === 'string').map(innerValue => searchableString(innerValue));
|
|
22
|
-
}
|
|
23
|
-
return [];
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Checks if a select input option item matches the search needle.
|
|
27
|
-
*/
|
|
28
|
-
function selectInputOptionItemIncludesNeedle(item, needle) {
|
|
29
|
-
return inferSearchableStrings(item.filterMatchers ?? item.value).some(haystack => haystack.includes(needle));
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Deduplicates a single option item by checking against existing values.
|
|
33
|
-
* Returns the item with value set to undefined if it's a duplicate.
|
|
34
|
-
*/
|
|
35
|
-
function dedupeSelectInputOptionItem(item, existingValues, compareValues) {
|
|
36
|
-
const isDuplicate = compareValues ? Array.from(existingValues).some(existingValue => compareValues(item.value, existingValue)) : existingValues.has(item.value);
|
|
37
|
-
if (!isDuplicate) {
|
|
38
|
-
existingValues.add(item.value);
|
|
39
|
-
return item;
|
|
40
|
-
}
|
|
41
|
-
return {
|
|
42
|
-
...item,
|
|
43
|
-
value: undefined
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Sets the `value` of duplicate option items to `undefined`, hiding them when
|
|
48
|
-
* rendered. Indexes are kept intact within groups to preserve the active item
|
|
49
|
-
* between filter changes when possible.
|
|
50
|
-
*/
|
|
51
|
-
function dedupeSelectInputItems(items, compareValues) {
|
|
52
|
-
const existingValues = new Set();
|
|
53
|
-
return items.map(item => {
|
|
54
|
-
switch (item.type) {
|
|
55
|
-
case 'option':
|
|
56
|
-
{
|
|
57
|
-
return dedupeSelectInputOptionItem(item, existingValues, compareValues);
|
|
58
|
-
}
|
|
59
|
-
case 'group':
|
|
60
|
-
{
|
|
61
|
-
return {
|
|
62
|
-
...item,
|
|
63
|
-
options: item.options.map(option => dedupeSelectInputOptionItem(option, existingValues, compareValues))
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return item;
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Filters select input items based on a predicate function.
|
|
72
|
-
* Groups are included if at least one option matches the predicate.
|
|
73
|
-
*/
|
|
74
|
-
function filterSelectInputItems(items, predicate) {
|
|
75
|
-
return items.filter(item => {
|
|
76
|
-
switch (item.type) {
|
|
77
|
-
case 'option':
|
|
78
|
-
{
|
|
79
|
-
return predicate(item);
|
|
80
|
-
}
|
|
81
|
-
case 'group':
|
|
82
|
-
{
|
|
83
|
-
return item.options.some(option => predicate(option));
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return false;
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Flattens and sorts filtered options using the provided comparator.
|
|
91
|
-
* Extracts all options from groups, filters out undefined values (deduplicated items),
|
|
92
|
-
* sorts them, and returns as a flat list of option items.
|
|
93
|
-
*/
|
|
94
|
-
function sortSelectInputItems(items, compareFn, searchQuery) {
|
|
95
|
-
const flattenedOption = items.flatMap(item => {
|
|
96
|
-
if (item.type === 'option') {
|
|
97
|
-
return item.value !== undefined ? [item] : [];
|
|
98
|
-
}
|
|
99
|
-
if (item.type === 'group') {
|
|
100
|
-
return item.options.filter(option => option.value !== undefined);
|
|
101
|
-
}
|
|
102
|
-
return [];
|
|
103
|
-
});
|
|
104
|
-
// eslint-disable-next-line functional/immutable-data
|
|
105
|
-
return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export { dedupeSelectInputItems, filterSelectInputItems, searchableString, selectInputOptionItemIncludesNeedle, sortSelectInputItems };
|
|
109
|
-
//# sourceMappingURL=SelectInput.helpers.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SelectInput.helpers.mjs","sources":["../../../src/inputs/SelectInput/SelectInput.helpers.ts"],"sourcesContent":["import type { SelectInputOptionItem, SelectInputItem } from './SelectInput.types';\n\n/**\n * Normalises a string for searching by trimming, normalising whitespace,\n * removing diacritics, and converting to lowercase.\n */\nexport function searchableString(value: string) {\n return (\n value\n .trim()\n .replace(/\\s+/gu, ' ')\n // NFD converts an Å to A + ̊ (and other special characters)\n .normalize('NFD')\n // and then this replaces the ̊ with nothing (and other special characters)\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n );\n}\n\n/**\n * Infers searchable strings from a value.\n * Extracts string values from objects or returns the string itself.\n */\nfunction inferSearchableStrings(value: unknown) {\n if (typeof value === 'string') {\n return [searchableString(value)];\n }\n\n if (typeof value === 'object' && value != null) {\n return Object.values(value)\n .filter((innerValue) => typeof innerValue === 'string')\n .map((innerValue) => searchableString(innerValue));\n }\n\n return [];\n}\n\n/**\n * Checks if a select input option item matches the search needle.\n */\nexport function selectInputOptionItemIncludesNeedle<T>(\n item: SelectInputOptionItem<T>,\n needle: string,\n) {\n return inferSearchableStrings(item.filterMatchers ?? item.value).some((haystack) =>\n haystack.includes(needle),\n );\n}\n\n/**\n * Deduplicates a single option item by checking against existing values.\n * Returns the item with value set to undefined if it's a duplicate.\n */\nfunction dedupeSelectInputOptionItem<T>(\n item: SelectInputOptionItem<T>,\n existingValues: Set<T>,\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputOptionItem<T | undefined> {\n const isDuplicate = compareValues\n ? Array.from(existingValues).some((existingValue) => compareValues(item.value, existingValue))\n : existingValues.has(item.value);\n\n if (!isDuplicate) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\n/**\n * Sets the `value` of duplicate option items to `undefined`, hiding them when\n * rendered. Indexes are kept intact within groups to preserve the active item\n * between filter changes when possible.\n */\nexport function dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues, compareValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues, compareValues),\n ),\n };\n }\n default:\n }\n return item;\n });\n}\n\n/**\n * Filters select input items based on a predicate function.\n * Groups are included if at least one option matches the predicate.\n */\nexport function filterSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n predicate: (item: SelectInputOptionItem<T>) => boolean,\n) {\n return items.filter((item) => {\n switch (item.type) {\n case 'option': {\n return predicate(item);\n }\n case 'group': {\n return item.options.some((option) => predicate(option));\n }\n default:\n }\n return false;\n });\n}\n\n/**\n * Flattens and sorts filtered options using the provided comparator.\n * Extracts all options from groups, filters out undefined values (deduplicated items),\n * sorts them, and returns as a flat list of option items.\n */\nexport function sortSelectInputItems<T>(\n items: readonly SelectInputItem<T | undefined>[],\n compareFn: (\n a: SelectInputOptionItem<NonNullable<T>>,\n b: SelectInputOptionItem<NonNullable<T>>,\n searchQuery: string,\n ) => number,\n searchQuery: string,\n): SelectInputItem<NonNullable<T>>[] {\n const flattenedOption = items.flatMap((item) => {\n if (item.type === 'option') {\n return item.value !== undefined ? [item as SelectInputOptionItem<NonNullable<T>>] : [];\n }\n\n if (item.type === 'group') {\n return item.options.filter(\n (option): option is SelectInputOptionItem<NonNullable<T>> => option.value !== undefined,\n );\n }\n\n return [];\n });\n\n // eslint-disable-next-line functional/immutable-data\n return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));\n}\n"],"names":["searchableString","value","trim","replace","normalize","toLowerCase","inferSearchableStrings","Object","values","filter","innerValue","map","selectInputOptionItemIncludesNeedle","item","needle","filterMatchers","some","haystack","includes","dedupeSelectInputOptionItem","existingValues","compareValues","isDuplicate","Array","from","existingValue","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","filterSelectInputItems","predicate","sortSelectInputItems","compareFn","searchQuery","flattenedOption","flatMap","sort","a","b"],"mappings":"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"}
|