@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.
Files changed (180) hide show
  1. package/build/dateInput/DateInput.js +3 -6
  2. package/build/dateInput/DateInput.js.map +1 -1
  3. package/build/dateInput/DateInput.mjs +2 -5
  4. package/build/dateInput/DateInput.mjs.map +1 -1
  5. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js +3 -5
  6. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js.map +1 -1
  7. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs +1 -3
  8. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs.map +1 -1
  9. package/build/index.js +3 -5
  10. package/build/index.js.map +1 -1
  11. package/build/index.mjs +1 -3
  12. package/build/index.mjs.map +1 -1
  13. package/build/inputs/SelectInput.js +840 -0
  14. package/build/inputs/SelectInput.js.map +1 -0
  15. package/build/inputs/SelectInput.messages.js.map +1 -0
  16. package/build/inputs/SelectInput.messages.mjs.map +1 -0
  17. package/build/inputs/SelectInput.mjs +832 -0
  18. package/build/inputs/SelectInput.mjs.map +1 -0
  19. package/build/main.css +70 -65
  20. package/build/moneyInput/MoneyInput.js +2 -5
  21. package/build/moneyInput/MoneyInput.js.map +1 -1
  22. package/build/moneyInput/MoneyInput.mjs +1 -4
  23. package/build/moneyInput/MoneyInput.mjs.map +1 -1
  24. package/build/phoneNumberInput/PhoneNumberInput.js +2 -5
  25. package/build/phoneNumberInput/PhoneNumberInput.js.map +1 -1
  26. package/build/phoneNumberInput/PhoneNumberInput.mjs +1 -4
  27. package/build/phoneNumberInput/PhoneNumberInput.mjs.map +1 -1
  28. package/build/styles/inputs/{SelectInput/SelectInput.css → SelectInput.css} +70 -65
  29. package/build/styles/main.css +70 -65
  30. package/build/types/inputs/{SelectInput/SelectInput.types.d.ts → SelectInput.d.ts} +7 -10
  31. package/build/types/inputs/SelectInput.d.ts.map +1 -0
  32. package/build/types/inputs/SelectInput.messages.d.ts.map +1 -0
  33. package/package.json +2 -2
  34. package/src/inputs/{SelectInput/SelectInput.css → SelectInput.css} +70 -65
  35. package/src/inputs/{SelectInput/SelectInput.docs.mdx → SelectInput.docs.mdx} +1 -0
  36. package/src/inputs/SelectInput.less +219 -0
  37. package/src/inputs/{SelectInput/SelectInput.story.tsx → SelectInput.story.tsx} +7 -7
  38. package/src/inputs/SelectInput.tsx +1209 -0
  39. package/src/main.css +70 -65
  40. package/src/main.less +1 -1
  41. package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.js +0 -26
  42. package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.js.map +0 -1
  43. package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.mjs +0 -24
  44. package/build/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.mjs.map +0 -1
  45. package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.js +0 -54
  46. package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.js.map +0 -1
  47. package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.mjs +0 -52
  48. package/build/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.mjs.map +0 -1
  49. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.js +0 -41
  50. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.js.map +0 -1
  51. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs +0 -38
  52. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs.map +0 -1
  53. package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.js +0 -50
  54. package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.js.map +0 -1
  55. package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.mjs +0 -48
  56. package/build/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.mjs.map +0 -1
  57. package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.js +0 -45
  58. package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.js.map +0 -1
  59. package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.mjs +0 -41
  60. package/build/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.mjs.map +0 -1
  61. package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.js +0 -50
  62. package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.js.map +0 -1
  63. package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.mjs +0 -48
  64. package/build/inputs/SelectInput/Options/ItemView/SelectInputItemView.mjs.map +0 -1
  65. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.js +0 -48
  66. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.js.map +0 -1
  67. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.mjs +0 -46
  68. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.mjs.map +0 -1
  69. package/build/inputs/SelectInput/Options/SelectInputOptions.js +0 -270
  70. package/build/inputs/SelectInput/Options/SelectInputOptions.js.map +0 -1
  71. package/build/inputs/SelectInput/Options/SelectInputOptions.mjs +0 -268
  72. package/build/inputs/SelectInput/Options/SelectInputOptions.mjs.map +0 -1
  73. package/build/inputs/SelectInput/SelectInput.constants.js +0 -6
  74. package/build/inputs/SelectInput/SelectInput.constants.js.map +0 -1
  75. package/build/inputs/SelectInput/SelectInput.constants.mjs +0 -4
  76. package/build/inputs/SelectInput/SelectInput.constants.mjs.map +0 -1
  77. package/build/inputs/SelectInput/SelectInput.helpers.js +0 -115
  78. package/build/inputs/SelectInput/SelectInput.helpers.js.map +0 -1
  79. package/build/inputs/SelectInput/SelectInput.helpers.mjs +0 -109
  80. package/build/inputs/SelectInput/SelectInput.helpers.mjs.map +0 -1
  81. package/build/inputs/SelectInput/SelectInput.js +0 -216
  82. package/build/inputs/SelectInput/SelectInput.js.map +0 -1
  83. package/build/inputs/SelectInput/SelectInput.messages.js.map +0 -1
  84. package/build/inputs/SelectInput/SelectInput.messages.mjs.map +0 -1
  85. package/build/inputs/SelectInput/SelectInput.mjs +0 -210
  86. package/build/inputs/SelectInput/SelectInput.mjs.map +0 -1
  87. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.js +0 -41
  88. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.js.map +0 -1
  89. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.mjs +0 -34
  90. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.mjs.map +0 -1
  91. package/build/styles/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.css +0 -17
  92. package/build/styles/inputs/SelectInput/OptionContent/SelectInputOptionContent.css +0 -37
  93. package/build/styles/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.css +0 -33
  94. package/build/styles/inputs/SelectInput/Options/ItemView/SelectInputItemView.css +0 -44
  95. package/build/styles/inputs/SelectInput/Options/SelectInputOptions.css +0 -125
  96. package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.d.ts +0 -5
  97. package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.d.ts.map +0 -1
  98. package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/index.d.ts +0 -2
  99. package/build/types/inputs/SelectInput/DefaultTrigger/ClearButton/index.d.ts.map +0 -1
  100. package/build/types/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.d.ts +0 -9
  101. package/build/types/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.d.ts.map +0 -1
  102. package/build/types/inputs/SelectInput/DefaultTrigger/index.d.ts +0 -2
  103. package/build/types/inputs/SelectInput/DefaultTrigger/index.d.ts.map +0 -1
  104. package/build/types/inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts +0 -9
  105. package/build/types/inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts.map +0 -1
  106. package/build/types/inputs/SelectInput/OptionContent/index.d.ts +0 -3
  107. package/build/types/inputs/SelectInput/OptionContent/index.d.ts.map +0 -1
  108. package/build/types/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.d.ts +0 -3
  109. package/build/types/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.d.ts.map +0 -1
  110. package/build/types/inputs/SelectInput/Options/GroupItemView/index.d.ts +0 -2
  111. package/build/types/inputs/SelectInput/Options/GroupItemView/index.d.ts.map +0 -1
  112. package/build/types/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.d.ts +0 -10
  113. package/build/types/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.d.ts.map +0 -1
  114. package/build/types/inputs/SelectInput/Options/ItemView/Option/index.d.ts +0 -2
  115. package/build/types/inputs/SelectInput/Options/ItemView/Option/index.d.ts.map +0 -1
  116. package/build/types/inputs/SelectInput/Options/ItemView/SelectInputItemView.d.ts +0 -3
  117. package/build/types/inputs/SelectInput/Options/ItemView/SelectInputItemView.d.ts.map +0 -1
  118. package/build/types/inputs/SelectInput/Options/ItemView/index.d.ts +0 -2
  119. package/build/types/inputs/SelectInput/Options/ItemView/index.d.ts.map +0 -1
  120. package/build/types/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.d.ts +0 -6
  121. package/build/types/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.d.ts.map +0 -1
  122. package/build/types/inputs/SelectInput/Options/OptionsContainer/index.d.ts +0 -2
  123. package/build/types/inputs/SelectInput/Options/OptionsContainer/index.d.ts.map +0 -1
  124. package/build/types/inputs/SelectInput/Options/SelectInputOptions.d.ts +0 -15
  125. package/build/types/inputs/SelectInput/Options/SelectInputOptions.d.ts.map +0 -1
  126. package/build/types/inputs/SelectInput/Options/index.d.ts +0 -2
  127. package/build/types/inputs/SelectInput/Options/index.d.ts.map +0 -1
  128. package/build/types/inputs/SelectInput/SelectInput.constants.d.ts +0 -2
  129. package/build/types/inputs/SelectInput/SelectInput.constants.d.ts.map +0 -1
  130. package/build/types/inputs/SelectInput/SelectInput.d.ts +0 -3
  131. package/build/types/inputs/SelectInput/SelectInput.d.ts.map +0 -1
  132. package/build/types/inputs/SelectInput/SelectInput.helpers.d.ts +0 -28
  133. package/build/types/inputs/SelectInput/SelectInput.helpers.d.ts.map +0 -1
  134. package/build/types/inputs/SelectInput/SelectInput.messages.d.ts.map +0 -1
  135. package/build/types/inputs/SelectInput/SelectInput.types.d.ts.map +0 -1
  136. package/build/types/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.d.ts +0 -15
  137. package/build/types/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.d.ts.map +0 -1
  138. package/build/types/inputs/SelectInput/TriggerButton/index.d.ts +0 -3
  139. package/build/types/inputs/SelectInput/TriggerButton/index.d.ts.map +0 -1
  140. package/build/types/inputs/SelectInput/index.d.ts +0 -5
  141. package/build/types/inputs/SelectInput/index.d.ts.map +0 -1
  142. package/src/inputs/SelectInput/DefaultTrigger/ClearButton/SelectInputClearButton.tsx +0 -25
  143. package/src/inputs/SelectInput/DefaultTrigger/ClearButton/index.ts +0 -1
  144. package/src/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.css +0 -17
  145. package/src/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.less +0 -15
  146. package/src/inputs/SelectInput/DefaultTrigger/SelectInputDefaultTrigger.tsx +0 -56
  147. package/src/inputs/SelectInput/DefaultTrigger/index.ts +0 -1
  148. package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.css +0 -37
  149. package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.less +0 -38
  150. package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.tsx +0 -67
  151. package/src/inputs/SelectInput/OptionContent/index.ts +0 -5
  152. package/src/inputs/SelectInput/Options/GroupItemView/SelectInputGroupItemView.tsx +0 -53
  153. package/src/inputs/SelectInput/Options/GroupItemView/index.ts +0 -1
  154. package/src/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.css +0 -33
  155. package/src/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.less +0 -32
  156. package/src/inputs/SelectInput/Options/ItemView/Option/SelectInputOption.tsx +0 -51
  157. package/src/inputs/SelectInput/Options/ItemView/Option/index.ts +0 -5
  158. package/src/inputs/SelectInput/Options/ItemView/SelectInputItemView.css +0 -44
  159. package/src/inputs/SelectInput/Options/ItemView/SelectInputItemView.less +0 -14
  160. package/src/inputs/SelectInput/Options/ItemView/SelectInputItemView.tsx +0 -37
  161. package/src/inputs/SelectInput/Options/ItemView/index.ts +0 -1
  162. package/src/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.tsx +0 -55
  163. package/src/inputs/SelectInput/Options/OptionsContainer/index.ts +0 -1
  164. package/src/inputs/SelectInput/Options/SelectInputOptions.css +0 -125
  165. package/src/inputs/SelectInput/Options/SelectInputOptions.less +0 -78
  166. package/src/inputs/SelectInput/Options/SelectInputOptions.tsx +0 -372
  167. package/src/inputs/SelectInput/Options/index.ts +0 -1
  168. package/src/inputs/SelectInput/SelectInput.constants.ts +0 -1
  169. package/src/inputs/SelectInput/SelectInput.helpers.ts +0 -152
  170. package/src/inputs/SelectInput/SelectInput.less +0 -40
  171. package/src/inputs/SelectInput/SelectInput.test.tsx +0 -606
  172. package/src/inputs/SelectInput/SelectInput.tsx +0 -247
  173. package/src/inputs/SelectInput/SelectInput.types.ts +0 -127
  174. package/src/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.tsx +0 -39
  175. package/src/inputs/SelectInput/TriggerButton/index.ts +0 -5
  176. package/src/inputs/SelectInput/index.ts +0 -13
  177. /package/build/inputs/{SelectInput/SelectInput.messages.js → SelectInput.messages.js} +0 -0
  178. /package/build/inputs/{SelectInput/SelectInput.messages.mjs → SelectInput.messages.mjs} +0 -0
  179. /package/build/types/inputs/{SelectInput/SelectInput.messages.d.ts → SelectInput.messages.d.ts} +0 -0
  180. /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,6 +0,0 @@
1
- 'use strict';
2
-
3
- const SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;
4
-
5
- exports.SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION = SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION;
6
- //# sourceMappingURL=SelectInput.constants.js.map
@@ -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,4 +0,0 @@
1
- const SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;
2
-
3
- export { SELECT_INPUT_MAX_ITEMS_WITHOUT_VIRTUALIZATION };
4
- //# sourceMappingURL=SelectInput.constants.mjs.map
@@ -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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"}