@entur/dropdown 7.3.2-beta.3 → 7.3.2-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Dropdown.d.ts +91 -0
- package/dist/MultiSelect.d.ts +108 -0
- package/dist/NativeDropdown.d.ts +56 -0
- package/dist/SearchableDropdown.d.ts +32 -0
- package/dist/components/DropdownList.d.ts +27 -0
- package/dist/components/FieldComponents.d.ts +33 -0
- package/dist/dropdown.cjs.development.js +1825 -0
- package/dist/dropdown.cjs.development.js.map +1 -0
- package/dist/dropdown.cjs.production.min.js +2 -0
- package/dist/dropdown.cjs.production.min.js.map +1 -0
- package/dist/dropdown.esm.js +1689 -1336
- package/dist/dropdown.esm.js.map +1 -1
- package/dist/index.d.ts +7 -313
- package/dist/index.js +8 -0
- package/dist/styles.css +90 -82
- package/dist/types.d.ts +15 -0
- package/dist/useNormalizedItems.d.ts +2 -0
- package/dist/useResolvedItems.d.ts +6 -0
- package/dist/utils.d.ts +39 -0
- package/package.json +21 -31
- package/dist/dropdown.cjs.js +0 -1465
- package/dist/dropdown.cjs.js.map +0 -1
package/dist/dropdown.esm.js
CHANGED
|
@@ -1,382 +1,678 @@
|
|
|
1
|
-
import { useDebounce, mergeRefs, useRandomId, warnAboutMissingStyles } from
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
import { useDebounce, mergeRefs, useRandomId, warnAboutMissingStyles } from '@entur/utils';
|
|
2
|
+
import React, { forwardRef, useState, useRef, useEffect, useCallback } from 'react';
|
|
3
|
+
import { useCombobox, useMultipleSelection, useSelect } from 'downshift';
|
|
4
|
+
import classNames from 'classnames';
|
|
5
|
+
import { useFloating, offset, shift, size, flip, autoUpdate } from '@floating-ui/react-dom';
|
|
6
|
+
import { Checkbox, BaseFormControl } from '@entur/form';
|
|
7
|
+
import { space } from '@entur/tokens';
|
|
8
|
+
import { VisuallyHidden } from '@entur/a11y';
|
|
9
|
+
import { IconButton } from '@entur/button';
|
|
10
|
+
import { TagChip } from '@entur/chip';
|
|
11
|
+
import { DownArrowIcon, CloseSmallIcon } from '@entur/icons';
|
|
12
|
+
import { LoadingDots } from '@entur/loader';
|
|
13
|
+
import { Tooltip } from '@entur/tooltip';
|
|
14
|
+
|
|
15
|
+
function _OverloadYield(e, d) {
|
|
16
|
+
this.v = e, this.k = d;
|
|
17
|
+
}
|
|
18
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) {
|
|
19
|
+
try {
|
|
20
|
+
var i = n[a](c),
|
|
21
|
+
u = i.value;
|
|
22
|
+
} catch (n) {
|
|
23
|
+
return void e(n);
|
|
24
|
+
}
|
|
25
|
+
i.done ? t(u) : Promise.resolve(u).then(r, o);
|
|
26
|
+
}
|
|
27
|
+
function _asyncToGenerator(n) {
|
|
28
|
+
return function () {
|
|
29
|
+
var t = this,
|
|
30
|
+
e = arguments;
|
|
31
|
+
return new Promise(function (r, o) {
|
|
32
|
+
var a = n.apply(t, e);
|
|
33
|
+
function _next(n) {
|
|
34
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
|
|
35
|
+
}
|
|
36
|
+
function _throw(n) {
|
|
37
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
|
|
38
|
+
}
|
|
39
|
+
_next(void 0);
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function _extends() {
|
|
44
|
+
return _extends = Object.assign ? Object.assign.bind() : function (n) {
|
|
45
|
+
for (var e = 1; e < arguments.length; e++) {
|
|
46
|
+
var t = arguments[e];
|
|
47
|
+
for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
|
|
48
|
+
}
|
|
49
|
+
return n;
|
|
50
|
+
}, _extends.apply(null, arguments);
|
|
51
|
+
}
|
|
52
|
+
function _objectWithoutPropertiesLoose(r, e) {
|
|
53
|
+
if (null == r) return {};
|
|
54
|
+
var t = {};
|
|
55
|
+
for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
|
|
56
|
+
if (-1 !== e.indexOf(n)) continue;
|
|
57
|
+
t[n] = r[n];
|
|
58
|
+
}
|
|
59
|
+
return t;
|
|
60
|
+
}
|
|
61
|
+
function _regenerator() {
|
|
62
|
+
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
|
|
63
|
+
var e,
|
|
64
|
+
t,
|
|
65
|
+
r = "function" == typeof Symbol ? Symbol : {},
|
|
66
|
+
n = r.iterator || "@@iterator",
|
|
67
|
+
o = r.toStringTag || "@@toStringTag";
|
|
68
|
+
function i(r, n, o, i) {
|
|
69
|
+
var c = n && n.prototype instanceof Generator ? n : Generator,
|
|
70
|
+
u = Object.create(c.prototype);
|
|
71
|
+
return _regeneratorDefine(u, "_invoke", function (r, n, o) {
|
|
72
|
+
var i,
|
|
73
|
+
c,
|
|
74
|
+
u,
|
|
75
|
+
f = 0,
|
|
76
|
+
p = o || [],
|
|
77
|
+
y = !1,
|
|
78
|
+
G = {
|
|
79
|
+
p: 0,
|
|
80
|
+
n: 0,
|
|
81
|
+
v: e,
|
|
82
|
+
a: d,
|
|
83
|
+
f: d.bind(e, 4),
|
|
84
|
+
d: function (t, r) {
|
|
85
|
+
return i = t, c = 0, u = e, G.n = r, a;
|
|
86
|
+
}
|
|
45
87
|
};
|
|
88
|
+
function d(r, n) {
|
|
89
|
+
for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {
|
|
90
|
+
var o,
|
|
91
|
+
i = p[t],
|
|
92
|
+
d = G.p,
|
|
93
|
+
l = i[2];
|
|
94
|
+
r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));
|
|
95
|
+
}
|
|
96
|
+
if (o || r > 1) return a;
|
|
97
|
+
throw y = !0, n;
|
|
46
98
|
}
|
|
47
|
-
|
|
99
|
+
return function (o, p, l) {
|
|
100
|
+
if (f > 1) throw TypeError("Generator is already running");
|
|
101
|
+
for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {
|
|
102
|
+
i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);
|
|
103
|
+
try {
|
|
104
|
+
if (f = 2, i) {
|
|
105
|
+
if (c || (o = "next"), t = i[o]) {
|
|
106
|
+
if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object");
|
|
107
|
+
if (!t.done) return t;
|
|
108
|
+
u = t.value, c < 2 && (c = 0);
|
|
109
|
+
} else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1);
|
|
110
|
+
i = e;
|
|
111
|
+
} else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;
|
|
112
|
+
} catch (t) {
|
|
113
|
+
i = e, c = 1, u = t;
|
|
114
|
+
} finally {
|
|
115
|
+
f = 1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
48
118
|
return {
|
|
49
|
-
|
|
50
|
-
|
|
119
|
+
value: t,
|
|
120
|
+
done: y
|
|
51
121
|
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
122
|
+
};
|
|
123
|
+
}(r, o, i), !0), u;
|
|
124
|
+
}
|
|
125
|
+
var a = {};
|
|
126
|
+
function Generator() {}
|
|
127
|
+
function GeneratorFunction() {}
|
|
128
|
+
function GeneratorFunctionPrototype() {}
|
|
129
|
+
t = Object.getPrototypeOf;
|
|
130
|
+
var c = [][n] ? t(t([][n]())) : (_regeneratorDefine(t = {}, n, function () {
|
|
131
|
+
return this;
|
|
132
|
+
}), t),
|
|
133
|
+
u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);
|
|
134
|
+
function f(e) {
|
|
135
|
+
return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e;
|
|
136
|
+
}
|
|
137
|
+
return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine(u), _regeneratorDefine(u, o, "Generator"), _regeneratorDefine(u, n, function () {
|
|
138
|
+
return this;
|
|
139
|
+
}), _regeneratorDefine(u, "toString", function () {
|
|
140
|
+
return "[object Generator]";
|
|
141
|
+
}), (_regenerator = function () {
|
|
142
|
+
return {
|
|
143
|
+
w: i,
|
|
144
|
+
m: f
|
|
145
|
+
};
|
|
146
|
+
})();
|
|
147
|
+
}
|
|
148
|
+
function _regeneratorAsync(n, e, r, t, o) {
|
|
149
|
+
var a = _regeneratorAsyncGen(n, e, r, t, o);
|
|
150
|
+
return a.next().then(function (n) {
|
|
151
|
+
return n.done ? n.value : a.next();
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
function _regeneratorAsyncGen(r, e, t, o, n) {
|
|
155
|
+
return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise);
|
|
156
|
+
}
|
|
157
|
+
function _regeneratorAsyncIterator(t, e) {
|
|
158
|
+
function n(r, o, i, f) {
|
|
159
|
+
try {
|
|
160
|
+
var c = t[r](o),
|
|
161
|
+
u = c.value;
|
|
162
|
+
return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) {
|
|
163
|
+
n("next", t, i, f);
|
|
164
|
+
}, function (t) {
|
|
165
|
+
n("throw", t, i, f);
|
|
166
|
+
}) : e.resolve(u).then(function (t) {
|
|
167
|
+
c.value = t, i(c);
|
|
168
|
+
}, function (t) {
|
|
169
|
+
return n("throw", t, i, f);
|
|
170
|
+
});
|
|
171
|
+
} catch (t) {
|
|
172
|
+
f(t);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
var r;
|
|
176
|
+
this.next || (_regeneratorDefine(_regeneratorAsyncIterator.prototype), _regeneratorDefine(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () {
|
|
177
|
+
return this;
|
|
178
|
+
})), _regeneratorDefine(this, "_invoke", function (t, o, i) {
|
|
179
|
+
function f() {
|
|
180
|
+
return new e(function (e, r) {
|
|
181
|
+
n(t, i, e, r);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return r = r ? r.then(f, f) : f();
|
|
185
|
+
}, !0);
|
|
186
|
+
}
|
|
187
|
+
function _regeneratorDefine(e, r, n, t) {
|
|
188
|
+
var i = Object.defineProperty;
|
|
189
|
+
try {
|
|
190
|
+
i({}, "", {});
|
|
191
|
+
} catch (e) {
|
|
192
|
+
i = 0;
|
|
193
|
+
}
|
|
194
|
+
_regeneratorDefine = function (e, r, n, t) {
|
|
195
|
+
function o(r, n) {
|
|
196
|
+
_regeneratorDefine(e, r, function (e) {
|
|
197
|
+
return this._invoke(r, n, e);
|
|
198
|
+
});
|
|
56
199
|
}
|
|
200
|
+
r ? i ? i(e, r, {
|
|
201
|
+
value: n,
|
|
202
|
+
enumerable: !t,
|
|
203
|
+
configurable: !t,
|
|
204
|
+
writable: !t
|
|
205
|
+
}) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2));
|
|
206
|
+
}, _regeneratorDefine(e, r, n, t);
|
|
207
|
+
}
|
|
208
|
+
function _regeneratorKeys(e) {
|
|
209
|
+
var n = Object(e),
|
|
210
|
+
r = [];
|
|
211
|
+
for (var t in n) r.unshift(t);
|
|
212
|
+
return function e() {
|
|
213
|
+
for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e;
|
|
214
|
+
return e.done = !0, e;
|
|
57
215
|
};
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
216
|
+
}
|
|
217
|
+
function _regeneratorValues(e) {
|
|
218
|
+
if (null != e) {
|
|
219
|
+
var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"],
|
|
220
|
+
r = 0;
|
|
221
|
+
if (t) return t.call(e);
|
|
222
|
+
if ("function" == typeof e.next) return e;
|
|
223
|
+
if (!isNaN(e.length)) return {
|
|
224
|
+
next: function () {
|
|
225
|
+
return e && r >= e.length && (e = void 0), {
|
|
226
|
+
value: e && e[r++],
|
|
227
|
+
done: !e
|
|
228
|
+
};
|
|
67
229
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
throw new TypeError(typeof e + " is not iterable");
|
|
233
|
+
}
|
|
234
|
+
function _regeneratorRuntime() {
|
|
235
|
+
|
|
236
|
+
var r = _regenerator(),
|
|
237
|
+
e = r.m(_regeneratorRuntime),
|
|
238
|
+
t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor;
|
|
239
|
+
function n(r) {
|
|
240
|
+
var e = "function" == typeof r && r.constructor;
|
|
241
|
+
return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name));
|
|
242
|
+
}
|
|
243
|
+
var o = {
|
|
244
|
+
throw: 1,
|
|
245
|
+
return: 2,
|
|
246
|
+
break: 3,
|
|
247
|
+
continue: 3
|
|
248
|
+
};
|
|
249
|
+
function a(r) {
|
|
250
|
+
var e, t;
|
|
251
|
+
return function (n) {
|
|
252
|
+
e || (e = {
|
|
253
|
+
stop: function () {
|
|
254
|
+
return t(n.a, 2);
|
|
255
|
+
},
|
|
256
|
+
catch: function () {
|
|
257
|
+
return n.v;
|
|
258
|
+
},
|
|
259
|
+
abrupt: function (r, e) {
|
|
260
|
+
return t(n.a, o[r], e);
|
|
261
|
+
},
|
|
262
|
+
delegateYield: function (r, o, a) {
|
|
263
|
+
return e.resultName = o, t(n.d, _regeneratorValues(r), a);
|
|
264
|
+
},
|
|
265
|
+
finish: function (r) {
|
|
266
|
+
return t(n.f, r);
|
|
267
|
+
}
|
|
268
|
+
}, t = function (r, t, o) {
|
|
269
|
+
n.p = e.prev, n.n = e.next;
|
|
270
|
+
try {
|
|
271
|
+
return r(t, o);
|
|
272
|
+
} finally {
|
|
273
|
+
e.next = n.n;
|
|
274
|
+
}
|
|
275
|
+
}), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n;
|
|
276
|
+
try {
|
|
277
|
+
return r.call(this, e);
|
|
278
|
+
} finally {
|
|
279
|
+
n.p = e.prev, n.n = e.next;
|
|
75
280
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
return (_regeneratorRuntime = function () {
|
|
284
|
+
return {
|
|
285
|
+
wrap: function (e, t, n, o) {
|
|
286
|
+
return r.w(a(e), t, n, o && o.reverse());
|
|
287
|
+
},
|
|
288
|
+
isGeneratorFunction: n,
|
|
289
|
+
mark: r.m,
|
|
290
|
+
awrap: function (r, e) {
|
|
291
|
+
return new _OverloadYield(r, e);
|
|
292
|
+
},
|
|
293
|
+
AsyncIterator: _regeneratorAsyncIterator,
|
|
294
|
+
async: function (r, e, t, o, u) {
|
|
295
|
+
return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u);
|
|
296
|
+
},
|
|
297
|
+
keys: _regeneratorKeys,
|
|
298
|
+
values: _regeneratorValues
|
|
299
|
+
};
|
|
300
|
+
})();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
var _excluded$5 = ["ariaLabelChosenSingular", "ariaLabelSelectedItem", "getItemProps", "getMenuProps", "isOpen", "highlightedIndex", "listItems", "floatingStyles", "setListRef", "loading", "loadingText", "noMatchesText", "selectAllCheckboxState", "selectAllItem", "selectedItems", "readOnly"];
|
|
304
|
+
var DropdownList = function DropdownList(_ref) {
|
|
305
|
+
var _listItems$;
|
|
306
|
+
var _ref$ariaLabelChosenS = _ref.ariaLabelChosenSingular,
|
|
307
|
+
ariaLabelChosenSingular = _ref$ariaLabelChosenS === void 0 ? 'valgt' : _ref$ariaLabelChosenS,
|
|
308
|
+
_ref$ariaLabelSelecte = _ref.ariaLabelSelectedItem,
|
|
309
|
+
ariaLabelSelectedItem = _ref$ariaLabelSelecte === void 0 ? ', valgt element, trykk for å fjerne' : _ref$ariaLabelSelecte,
|
|
310
|
+
getItemProps = _ref.getItemProps,
|
|
311
|
+
getMenuProps = _ref.getMenuProps,
|
|
312
|
+
isOpen = _ref.isOpen,
|
|
313
|
+
highlightedIndex = _ref.highlightedIndex,
|
|
314
|
+
listItems = _ref.listItems,
|
|
315
|
+
floatingStyles = _ref.floatingStyles,
|
|
316
|
+
setListRef = _ref.setListRef,
|
|
317
|
+
_ref$loading = _ref.loading,
|
|
318
|
+
loading = _ref$loading === void 0 ? false : _ref$loading,
|
|
319
|
+
_ref$loadingText = _ref.loadingText,
|
|
320
|
+
loadingText = _ref$loadingText === void 0 ? 'Laster inn …' : _ref$loadingText,
|
|
321
|
+
_ref$noMatchesText = _ref.noMatchesText,
|
|
322
|
+
noMatchesText = _ref$noMatchesText === void 0 ? 'Ingen treff for søket' : _ref$noMatchesText,
|
|
323
|
+
selectAllCheckboxState = _ref.selectAllCheckboxState,
|
|
324
|
+
selectAllItem = _ref.selectAllItem,
|
|
325
|
+
selectedItems = _ref.selectedItems,
|
|
326
|
+
_ref$readOnly = _ref.readOnly,
|
|
327
|
+
readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
|
|
328
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
|
|
329
|
+
var isMultiselect = selectAllItem !== undefined;
|
|
330
|
+
var isNoMatches = !loading && (listItems.length === 0 || (listItems == null ? void 0 : listItems.length) === 1 && (listItems == null || (_listItems$ = listItems[0]) == null ? void 0 : _listItems$.value) === (selectAllItem == null ? void 0 : selectAllItem.value));
|
|
331
|
+
var isItemSelected = function isItemSelected(item) {
|
|
332
|
+
return selectedItems.some(function (selectedItem) {
|
|
333
|
+
return (selectedItem == null ? void 0 : selectedItem.value) === (item == null ? void 0 : item.value) && (selectedItem == null ? void 0 : selectedItem.label) === (item == null ? void 0 : item.label);
|
|
334
|
+
});
|
|
80
335
|
};
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
336
|
+
var ariaValuesSelectAll = function ariaValuesSelectAll() {
|
|
337
|
+
switch (selectAllCheckboxState == null ? void 0 : selectAllCheckboxState()) {
|
|
338
|
+
case 'indeterminate':
|
|
339
|
+
{
|
|
340
|
+
return {
|
|
341
|
+
label: (selectAllItem == null ? void 0 : selectAllItem.label) + ", delvis valgt",
|
|
342
|
+
selected: false
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
case true:
|
|
85
346
|
{
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
onChange: () => void 0
|
|
347
|
+
return {
|
|
348
|
+
label: (selectAllItem == null ? void 0 : selectAllItem.label) + ", " + ariaLabelChosenSingular,
|
|
349
|
+
selected: true
|
|
350
|
+
};
|
|
91
351
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
352
|
+
default:
|
|
353
|
+
{
|
|
354
|
+
return {
|
|
355
|
+
label: "" + (selectAllItem == null ? void 0 : selectAllItem.label),
|
|
356
|
+
selected: false
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
var selectAllListItemContent = function selectAllListItemContent() {
|
|
362
|
+
return React.createElement(React.Fragment, null, React.createElement(Checkbox, {
|
|
363
|
+
"aria-hidden": "true",
|
|
364
|
+
checked: selectAllCheckboxState == null ? void 0 : selectAllCheckboxState(),
|
|
365
|
+
className: "eds-dropdown__list__item__checkbox",
|
|
366
|
+
tabIndex: -1,
|
|
367
|
+
onChange: function onChange() {
|
|
368
|
+
return undefined;
|
|
369
|
+
}
|
|
370
|
+
}), React.createElement("span", {
|
|
371
|
+
className: "eds-dropdown__list__item__text",
|
|
372
|
+
"aria-label": ariaValuesSelectAll().label
|
|
373
|
+
}, selectAllItem == null ? void 0 : selectAllItem.label));
|
|
374
|
+
};
|
|
375
|
+
var isReactComponent = function isReactComponent(icon) {
|
|
376
|
+
return typeof icon === 'function' || typeof icon === 'object' && icon !== null && '$$typeof' in icon && typeof icon.$$typeof === 'symbol';
|
|
377
|
+
};
|
|
378
|
+
var listItemContent = function listItemContent(item) {
|
|
379
|
+
return React.createElement(React.Fragment, null, isMultiselect && React.createElement(Checkbox, {
|
|
380
|
+
"aria-hidden": "true",
|
|
381
|
+
checked: isItemSelected(item),
|
|
382
|
+
className: "eds-dropdown__list__item__checkbox",
|
|
383
|
+
tabIndex: -1,
|
|
384
|
+
onChange: function onChange() {
|
|
385
|
+
return undefined;
|
|
386
|
+
}
|
|
387
|
+
}), React.createElement("span", {
|
|
388
|
+
className: "eds-dropdown__list__item__text"
|
|
389
|
+
}, item.label, React.createElement(VisuallyHidden, null, isItemSelected(item) ? ariaLabelSelectedItem : '')), Array.isArray(item.icons) ? item.icons.filter(isReactComponent).map(function (Icon, index) {
|
|
390
|
+
var _ref2, _Icon$displayName;
|
|
391
|
+
var key = ((_ref2 = (_Icon$displayName = Icon.displayName) != null ? _Icon$displayName : Icon.name) != null ? _ref2 : Icon.name) + "-" + index;
|
|
392
|
+
return React.createElement(Icon, {
|
|
393
|
+
key: key,
|
|
394
|
+
inline: true,
|
|
395
|
+
className: "eds-dropdown__list__item__icon"
|
|
396
|
+
});
|
|
397
|
+
}) : null);
|
|
109
398
|
};
|
|
110
399
|
return (
|
|
111
400
|
// use popover from @entur/tooltip when that package upgrades to floating-ui
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
...rest.style
|
|
123
|
-
}
|
|
124
|
-
}),
|
|
125
|
-
children: (() => {
|
|
126
|
-
if (!isOpen || readOnly) {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
if (loading) {
|
|
130
|
-
return /* @__PURE__ */ jsx(
|
|
131
|
-
"li",
|
|
132
|
-
{
|
|
133
|
-
className: "eds-dropdown__list__item",
|
|
134
|
-
children: loadingText
|
|
135
|
-
},
|
|
136
|
-
"dropdown-list-loading"
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
if (isNoMatches) {
|
|
140
|
-
return /* @__PURE__ */ jsx(
|
|
141
|
-
"li",
|
|
142
|
-
{
|
|
143
|
-
className: "eds-dropdown__list__item",
|
|
144
|
-
children: noMatchesText
|
|
145
|
-
},
|
|
146
|
-
"dropdown-list-no-match"
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
return listItems.map((item, index) => {
|
|
150
|
-
const key = item.itemKey ?? `${item.label ?? ""}-${item.value ?? ""}-${(item.icons ?? []).map((icon) => icon?.displayName ?? icon?.name ?? "unknown").join("-")}`;
|
|
151
|
-
const itemIsSelectAll = item.value === selectAllItem?.value;
|
|
152
|
-
if (itemIsSelectAll && listItems.length <= 2) return null;
|
|
153
|
-
return /* @__PURE__ */ jsx(
|
|
154
|
-
"li",
|
|
155
|
-
{
|
|
156
|
-
className: classNames("eds-dropdown__list__item", {
|
|
157
|
-
"eds-dropdown__list__item--select-all": itemIsSelectAll,
|
|
158
|
-
"eds-dropdown__list__item--highlighted": highlightedIndex === index,
|
|
159
|
-
"eds-dropdown__list__item--selected": !isMultiselect && isItemSelected(item)
|
|
160
|
-
}),
|
|
161
|
-
...getItemProps({
|
|
162
|
-
// @ts-expect-error Since getItemProps expects the same item type
|
|
163
|
-
// here as items, it throws error when selectAllItem is a string.
|
|
164
|
-
// This does, however, not cause any functional issues.
|
|
165
|
-
item,
|
|
166
|
-
index,
|
|
167
|
-
"aria-selected": itemIsSelectAll ? ariaValuesSelectAll().selected : isItemSelected(item)
|
|
168
|
-
}),
|
|
169
|
-
children: itemIsSelectAll ? selectAllListItemContent() : listItemContent(
|
|
170
|
-
item
|
|
171
|
-
)
|
|
172
|
-
},
|
|
173
|
-
key
|
|
174
|
-
);
|
|
175
|
-
});
|
|
176
|
-
})()
|
|
401
|
+
React.createElement("ul", _extends({}, getMenuProps({
|
|
402
|
+
'aria-multiselectable': isMultiselect,
|
|
403
|
+
ref: setListRef,
|
|
404
|
+
className: 'eds-dropdown__list',
|
|
405
|
+
style: _extends({}, floatingStyles, {
|
|
406
|
+
display: isOpen && !readOnly ? undefined : 'none'
|
|
407
|
+
}, rest.style)
|
|
408
|
+
})), function () {
|
|
409
|
+
if (!isOpen || readOnly) {
|
|
410
|
+
return null;
|
|
177
411
|
}
|
|
178
|
-
|
|
412
|
+
if (loading) {
|
|
413
|
+
return React.createElement("li", {
|
|
414
|
+
key: "dropdown-list-loading",
|
|
415
|
+
className: "eds-dropdown__list__item"
|
|
416
|
+
}, loadingText);
|
|
417
|
+
}
|
|
418
|
+
if (isNoMatches) {
|
|
419
|
+
return React.createElement("li", {
|
|
420
|
+
key: "dropdown-list-no-match",
|
|
421
|
+
className: "eds-dropdown__list__item"
|
|
422
|
+
}, noMatchesText);
|
|
423
|
+
}
|
|
424
|
+
return listItems.map(function (item, index) {
|
|
425
|
+
var _item$itemKey, _item$label, _item$value, _item$icons;
|
|
426
|
+
var key = (_item$itemKey = item.itemKey) != null ? _item$itemKey : ((_item$label = item.label) != null ? _item$label : '') + "-" + ((_item$value = item.value) != null ? _item$value : '') + "-" + ((_item$icons = item.icons) != null ? _item$icons : []).map(function (icon) {
|
|
427
|
+
var _ref3, _icon$displayName;
|
|
428
|
+
return (_ref3 = (_icon$displayName = icon == null ? void 0 : icon.displayName) != null ? _icon$displayName : icon == null ? void 0 : icon.name) != null ? _ref3 : 'unknown';
|
|
429
|
+
}).join('-');
|
|
430
|
+
var itemIsSelectAll = item.value === (selectAllItem == null ? void 0 : selectAllItem.value);
|
|
431
|
+
if (itemIsSelectAll && listItems.length <= 2) return null;
|
|
432
|
+
return React.createElement("li", _extends({
|
|
433
|
+
className: classNames('eds-dropdown__list__item', {
|
|
434
|
+
'eds-dropdown__list__item--select-all': itemIsSelectAll,
|
|
435
|
+
'eds-dropdown__list__item--highlighted': highlightedIndex === index,
|
|
436
|
+
'eds-dropdown__list__item--selected': !isMultiselect && isItemSelected(item)
|
|
437
|
+
}),
|
|
438
|
+
key: key
|
|
439
|
+
}, getItemProps({
|
|
440
|
+
// @ts-expect-error Since getItemProps expects the same item type
|
|
441
|
+
// here as items, it throws error when selectAllItem is a string.
|
|
442
|
+
// This does, however, not cause any functional issues.
|
|
443
|
+
item: item,
|
|
444
|
+
index: index,
|
|
445
|
+
'aria-selected': itemIsSelectAll ? ariaValuesSelectAll().selected : isItemSelected(item)
|
|
446
|
+
})), itemIsSelectAll ? selectAllListItemContent() : listItemContent(item));
|
|
447
|
+
});
|
|
448
|
+
}())
|
|
179
449
|
);
|
|
180
450
|
};
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
key: selectedItem.value,
|
|
211
|
-
"aria-live": "polite"
|
|
451
|
+
|
|
452
|
+
var _excluded$4 = ["tabIndex"],
|
|
453
|
+
_excluded2 = ["ariaLabelCloseList", "ariaLabelOpenList", "clearable", "labelClearSelected", "focusable", "disabled", "isOpen", "loading", "loadingText", "onClear", "itemIsSelected"];
|
|
454
|
+
var SelectedItemTag = function SelectedItemTag(_ref) {
|
|
455
|
+
var _getSelectedItemProps;
|
|
456
|
+
var ariaLabelRemoveSelected = _ref.ariaLabelRemoveSelected,
|
|
457
|
+
_ref$ariaLabelChosen = _ref.ariaLabelChosen,
|
|
458
|
+
ariaLabelChosen = _ref$ariaLabelChosen === void 0 ? 'valgt' : _ref$ariaLabelChosen,
|
|
459
|
+
disabled = _ref.disabled,
|
|
460
|
+
getSelectedItemProps = _ref.getSelectedItemProps,
|
|
461
|
+
index = _ref.index,
|
|
462
|
+
readOnly = _ref.readOnly,
|
|
463
|
+
removeSelectedItem = _ref.removeSelectedItem,
|
|
464
|
+
selectedItem = _ref.selectedItem;
|
|
465
|
+
var _ref2 = (_getSelectedItemProps = getSelectedItemProps == null ? void 0 : getSelectedItemProps({
|
|
466
|
+
selectedItem: selectedItem,
|
|
467
|
+
index: index
|
|
468
|
+
})) != null ? _getSelectedItemProps : {},
|
|
469
|
+
selectedItemProps = _objectWithoutPropertiesLoose(_ref2, _excluded$4);
|
|
470
|
+
return React.createElement(TagChip, _extends({
|
|
471
|
+
size: "small",
|
|
472
|
+
className: classNames('eds-dropdown__selected-item-tag', {
|
|
473
|
+
'eds-dropdown__selected-item-tag--readonly': readOnly,
|
|
474
|
+
'eds-dropdown__selected-item-tag--disabled': disabled
|
|
475
|
+
})
|
|
476
|
+
}, selectedItemProps, {
|
|
477
|
+
onClose: function onClose(e) {
|
|
478
|
+
e.stopPropagation();
|
|
479
|
+
removeSelectedItem(selectedItem);
|
|
212
480
|
},
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
481
|
+
onClick: function onClick(e) {
|
|
482
|
+
return e.stopPropagation();
|
|
483
|
+
},
|
|
484
|
+
closeButtonAriaLabel: selectedItem.label + " " + ariaLabelChosen + ", " + ariaLabelRemoveSelected + " ",
|
|
485
|
+
key: selectedItem.value,
|
|
486
|
+
"aria-live": "polite"
|
|
487
|
+
}), React.createElement("span", {
|
|
488
|
+
"aria-hidden": "true",
|
|
489
|
+
className: "eds-dropdown__selected-item-tag__text"
|
|
490
|
+
}, selectedItem.label));
|
|
222
491
|
};
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
clearable = false,
|
|
228
|
-
labelClearSelected,
|
|
229
|
-
focusable =
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
return /* @__PURE__ */ jsx(Fragment, { children: !disabled && /* @__PURE__ */ jsxs("div", { className: "eds-dropdown__appendix", children: [
|
|
244
|
-
clearable && itemIsSelected && /* @__PURE__ */ jsx(
|
|
245
|
-
ClearableButton,
|
|
246
|
-
{
|
|
247
|
-
onClear,
|
|
248
|
-
focusable: true,
|
|
249
|
-
labelClearSelectedItems: labelClearSelected
|
|
250
|
-
}
|
|
251
|
-
),
|
|
252
|
-
/* @__PURE__ */ jsx(
|
|
253
|
-
IconButton,
|
|
254
|
-
{
|
|
255
|
-
className: classNames("eds-dropdown__appendix__toggle-button", {
|
|
256
|
-
"eds-dropdown__appendix__toggle-button--open": isOpen
|
|
257
|
-
}),
|
|
258
|
-
ref,
|
|
259
|
-
"aria-label": getToggleAriaLabel(),
|
|
260
|
-
...rest,
|
|
261
|
-
type: "button",
|
|
262
|
-
tabIndex: focusable ? 0 : -1,
|
|
263
|
-
children: !loading ? /* @__PURE__ */ jsx(DownArrowIcon, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx(LoadingDots, { "aria-hidden": "true" })
|
|
264
|
-
}
|
|
265
|
-
)
|
|
266
|
-
] }) });
|
|
492
|
+
var DropdownFieldAppendix = /*#__PURE__*/forwardRef(function (_ref3, ref) {
|
|
493
|
+
var ariaLabelCloseList = _ref3.ariaLabelCloseList,
|
|
494
|
+
ariaLabelOpenList = _ref3.ariaLabelOpenList,
|
|
495
|
+
_ref3$clearable = _ref3.clearable,
|
|
496
|
+
clearable = _ref3$clearable === void 0 ? false : _ref3$clearable,
|
|
497
|
+
labelClearSelected = _ref3.labelClearSelected,
|
|
498
|
+
_ref3$focusable = _ref3.focusable,
|
|
499
|
+
focusable = _ref3$focusable === void 0 ? false : _ref3$focusable,
|
|
500
|
+
disabled = _ref3.disabled,
|
|
501
|
+
isOpen = _ref3.isOpen,
|
|
502
|
+
_ref3$loading = _ref3.loading,
|
|
503
|
+
loading = _ref3$loading === void 0 ? false : _ref3$loading,
|
|
504
|
+
loadingText = _ref3.loadingText,
|
|
505
|
+
onClear = _ref3.onClear,
|
|
506
|
+
itemIsSelected = _ref3.itemIsSelected,
|
|
507
|
+
rest = _objectWithoutPropertiesLoose(_ref3, _excluded2);
|
|
508
|
+
function getToggleAriaLabel() {
|
|
509
|
+
if (loading) return loadingText;
|
|
510
|
+
if (isOpen) return ariaLabelCloseList;
|
|
511
|
+
return ariaLabelOpenList;
|
|
267
512
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
513
|
+
return React.createElement(React.Fragment, null, !disabled && React.createElement("div", {
|
|
514
|
+
className: "eds-dropdown__appendix"
|
|
515
|
+
}, clearable && itemIsSelected && React.createElement(ClearableButton, {
|
|
516
|
+
onClear: onClear,
|
|
517
|
+
focusable: true,
|
|
518
|
+
labelClearSelectedItems: labelClearSelected
|
|
519
|
+
}), React.createElement(IconButton, _extends({
|
|
520
|
+
className: classNames('eds-dropdown__appendix__toggle-button', {
|
|
521
|
+
'eds-dropdown__appendix__toggle-button--open': isOpen
|
|
522
|
+
}),
|
|
523
|
+
ref: ref,
|
|
524
|
+
"aria-label": getToggleAriaLabel()
|
|
525
|
+
}, rest, {
|
|
526
|
+
type: "button",
|
|
527
|
+
tabIndex: focusable ? 0 : -1
|
|
528
|
+
}), !loading ? React.createElement(DownArrowIcon, {
|
|
529
|
+
"aria-hidden": "true"
|
|
530
|
+
}) : React.createElement(LoadingDots, {
|
|
531
|
+
"aria-hidden": "true"
|
|
532
|
+
}))));
|
|
533
|
+
});
|
|
534
|
+
var ClearableButton = function ClearableButton(_ref4) {
|
|
535
|
+
var onClear = _ref4.onClear,
|
|
536
|
+
_ref4$labelClearSelec = _ref4.labelClearSelectedItems,
|
|
537
|
+
labelClearSelectedItems = _ref4$labelClearSelec === void 0 ? 'Fjern valgte' : _ref4$labelClearSelec,
|
|
538
|
+
_ref4$focusable = _ref4.focusable,
|
|
539
|
+
focusable = _ref4$focusable === void 0 ? false : _ref4$focusable;
|
|
540
|
+
return React.createElement(React.Fragment, null, React.createElement(Tooltip, {
|
|
541
|
+
"aria-hidden": "true",
|
|
542
|
+
placement: "top",
|
|
543
|
+
content: labelClearSelectedItems,
|
|
544
|
+
className: "eds-dropdown__appendix__clear-button__tooltip"
|
|
545
|
+
}, React.createElement(IconButton, {
|
|
546
|
+
className: "eds-dropdown__appendix__clear-button",
|
|
547
|
+
type: "button",
|
|
548
|
+
tabIndex: focusable ? 0 : -1,
|
|
549
|
+
// These events bubble up to the Dropdown container and trigger openMenu.
|
|
550
|
+
// To avoid this, stopPropagation and preventDefault are added.
|
|
551
|
+
onClick: function onClick(e) {
|
|
552
|
+
e.stopPropagation();
|
|
553
|
+
onClear();
|
|
554
|
+
},
|
|
555
|
+
onKeyDown: function onKeyDown(e) {
|
|
556
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
557
|
+
e.preventDefault();
|
|
558
|
+
e.stopPropagation();
|
|
559
|
+
onClear();
|
|
303
560
|
}
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
561
|
+
},
|
|
562
|
+
"aria-label": labelClearSelectedItems
|
|
563
|
+
}, React.createElement(CloseSmallIcon, {
|
|
564
|
+
"aria-hidden": "true"
|
|
565
|
+
}))), React.createElement("div", {
|
|
566
|
+
className: "eds-dropdown__appendix__divider"
|
|
567
|
+
}));
|
|
307
568
|
};
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
return {
|
|
318
|
-
...item,
|
|
319
|
-
value: item.label
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
return { ...item, value: item.value };
|
|
323
|
-
}),
|
|
324
|
-
[items]
|
|
325
|
-
);
|
|
326
|
-
const useResolvedItems = (itemsOrItemsResolver, debounceTimeout = 250) => {
|
|
327
|
-
const itemsIsAFunction = typeof itemsOrItemsResolver === "function";
|
|
328
|
-
const [items, setItems] = React.useState(
|
|
329
|
-
itemsIsAFunction ? [] : itemsOrItemsResolver
|
|
330
|
-
);
|
|
331
|
-
const [loading, setLoading] = React.useState(false);
|
|
332
|
-
const abortControllerRef = React.useRef(
|
|
333
|
-
new AbortController()
|
|
334
|
-
);
|
|
335
|
-
const itemsResolver = React.useMemo(() => {
|
|
336
|
-
if (itemsIsAFunction)
|
|
337
|
-
return itemsOrItemsResolver;
|
|
338
|
-
return () => Promise.resolve(itemsOrItemsResolver);
|
|
339
|
-
}, [itemsOrItemsResolver, itemsIsAFunction]);
|
|
340
|
-
const updateItems = async (inputValue) => {
|
|
341
|
-
if (abortControllerRef?.current) abortControllerRef?.current?.abort();
|
|
342
|
-
const abortController = new AbortController();
|
|
343
|
-
abortControllerRef.current = abortController;
|
|
344
|
-
setLoading(true);
|
|
345
|
-
try {
|
|
346
|
-
const resolvedItems = await itemsResolver(
|
|
347
|
-
inputValue ?? "",
|
|
348
|
-
abortControllerRef
|
|
349
|
-
);
|
|
350
|
-
if (abortControllerRef?.current?.signal?.aborted) {
|
|
351
|
-
console.warn(
|
|
352
|
-
"Avbryt den asynkrone funksjonen din med signalet fra AbortController-en for å for å unngå minnelekkasje.",
|
|
353
|
-
'Funksjonen bør kaste en DOMException med navnet "AbortError" når den avbrytes.',
|
|
354
|
-
"",
|
|
355
|
-
"\n\nSe eksempel her: https://linje.entur.no/komponenter/skjemaelementer/dropdown#s%C3%B8kbar-dropdown-med-valg-fra-nettverkskall-bassert-p%C3%A5-tekstinput",
|
|
356
|
-
"\nLes mer om AbortController her: https://developer.mozilla.org/en-US/docs/Web/API/AbortController"
|
|
357
|
-
);
|
|
358
|
-
return;
|
|
569
|
+
|
|
570
|
+
var useNormalizedItems = function useNormalizedItems(items) {
|
|
571
|
+
return React.useMemo(function () {
|
|
572
|
+
return items.map(function (item) {
|
|
573
|
+
if (typeof item == 'string') {
|
|
574
|
+
return {
|
|
575
|
+
value: item,
|
|
576
|
+
label: item
|
|
577
|
+
};
|
|
359
578
|
}
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
return;
|
|
579
|
+
if ((item == null ? void 0 : item.value) === undefined) {
|
|
580
|
+
return _extends({}, item, {
|
|
581
|
+
value: item.label
|
|
582
|
+
});
|
|
365
583
|
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
);
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
584
|
+
return _extends({}, item, {
|
|
585
|
+
value: item.value
|
|
586
|
+
});
|
|
587
|
+
});
|
|
588
|
+
}, [items]);
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
var useResolvedItems = function useResolvedItems(/** The list of items, or an async function that resolves the list of items */
|
|
592
|
+
itemsOrItemsResolver, /** The time to wait after the input changes to the fetchItems method is called */
|
|
593
|
+
debounceTimeout) {
|
|
594
|
+
if (debounceTimeout === void 0) {
|
|
595
|
+
debounceTimeout = 250;
|
|
596
|
+
}
|
|
597
|
+
var itemsIsAFunction = typeof itemsOrItemsResolver === 'function';
|
|
598
|
+
var _React$useState = React.useState(itemsIsAFunction ? [] : itemsOrItemsResolver),
|
|
599
|
+
items = _React$useState[0],
|
|
600
|
+
setItems = _React$useState[1];
|
|
601
|
+
var _React$useState2 = React.useState(false),
|
|
602
|
+
loading = _React$useState2[0],
|
|
603
|
+
setLoading = _React$useState2[1];
|
|
604
|
+
var abortControllerRef = React.useRef(new AbortController());
|
|
605
|
+
// We normalize the itemsResolver argument to an async function, so we
|
|
606
|
+
// can use it without thinking about the differences later
|
|
607
|
+
var itemsResolver = React.useMemo(function () {
|
|
608
|
+
if (itemsIsAFunction) return itemsOrItemsResolver;
|
|
609
|
+
return function () {
|
|
610
|
+
return Promise.resolve(itemsOrItemsResolver);
|
|
611
|
+
};
|
|
612
|
+
}, [itemsOrItemsResolver, itemsIsAFunction]);
|
|
613
|
+
// This should be called whenever the input value changes
|
|
614
|
+
var updateItems = /*#__PURE__*/function () {
|
|
615
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(inputValue) {
|
|
616
|
+
var _abortControllerRef$c;
|
|
617
|
+
var abortController, _abortControllerRef$c2, resolvedItems;
|
|
618
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
619
|
+
while (1) switch (_context.prev = _context.next) {
|
|
620
|
+
case 0:
|
|
621
|
+
// The abortController handles cleanup of the previous request and unmounting
|
|
622
|
+
if (abortControllerRef != null && abortControllerRef.current) abortControllerRef == null || (_abortControllerRef$c = abortControllerRef.current) == null || _abortControllerRef$c.abort();
|
|
623
|
+
abortController = new AbortController();
|
|
624
|
+
abortControllerRef.current = abortController;
|
|
625
|
+
setLoading(true);
|
|
626
|
+
_context.prev = 4;
|
|
627
|
+
_context.next = 7;
|
|
628
|
+
return itemsResolver(inputValue != null ? inputValue : '', abortControllerRef);
|
|
629
|
+
case 7:
|
|
630
|
+
resolvedItems = _context.sent;
|
|
631
|
+
if (!(abortControllerRef != null && (_abortControllerRef$c2 = abortControllerRef.current) != null && (_abortControllerRef$c2 = _abortControllerRef$c2.signal) != null && _abortControllerRef$c2.aborted)) {
|
|
632
|
+
_context.next = 11;
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
console.warn('Avbryt den asynkrone funksjonen din med signalet fra AbortController-en for å for å unngå minnelekkasje.', 'Funksjonen bør kaste en DOMException med navnet "AbortError" når den avbrytes.', '', '\n\nSe eksempel her: https://linje.entur.no/komponenter/skjemaelementer/dropdown#s%C3%B8kbar-dropdown-med-valg-fra-nettverkskall-bassert-p%C3%A5-tekstinput', '\nLes mer om AbortController her: https://developer.mozilla.org/en-US/docs/Web/API/AbortController');
|
|
636
|
+
return _context.abrupt("return");
|
|
637
|
+
case 11:
|
|
638
|
+
setLoading(false);
|
|
639
|
+
setItems(resolvedItems);
|
|
640
|
+
_context.next = 21;
|
|
641
|
+
break;
|
|
642
|
+
case 15:
|
|
643
|
+
_context.prev = 15;
|
|
644
|
+
_context.t0 = _context["catch"](4);
|
|
645
|
+
if (!(_context.t0 && typeof _context.t0 === 'object' && 'name' in _context.t0 && _context.t0.name === 'AbortError')) {
|
|
646
|
+
_context.next = 19;
|
|
647
|
+
break;
|
|
648
|
+
}
|
|
649
|
+
return _context.abrupt("return");
|
|
650
|
+
case 19:
|
|
651
|
+
console.warn('The following error was received but not handled inside Entur Designsystems useResolvedItems hook:');
|
|
652
|
+
throw _context.t0;
|
|
653
|
+
case 21:
|
|
654
|
+
case "end":
|
|
655
|
+
return _context.stop();
|
|
656
|
+
}
|
|
657
|
+
}, _callee, null, [[4, 15]]);
|
|
658
|
+
}));
|
|
659
|
+
return function updateItems(_x) {
|
|
660
|
+
return _ref.apply(this, arguments);
|
|
661
|
+
};
|
|
662
|
+
}();
|
|
663
|
+
var debouncedFetchItems = useDebounce(updateItems, debounceTimeout);
|
|
664
|
+
var normalizedItems = useNormalizedItems(items);
|
|
665
|
+
React.useEffect(function () {
|
|
666
|
+
// send abort signal to previous request on unmount for cleanup
|
|
667
|
+
return function () {
|
|
668
|
+
var _abortControllerRef$c3;
|
|
669
|
+
return abortControllerRef == null || (_abortControllerRef$c3 = abortControllerRef.current) == null ? void 0 : _abortControllerRef$c3.abort('Component unmounted');
|
|
670
|
+
};
|
|
376
671
|
}, []);
|
|
377
|
-
React.useEffect(()
|
|
672
|
+
React.useEffect(function () {
|
|
673
|
+
// Let's fetch the list initially if it's specified
|
|
378
674
|
if (itemsIsAFunction) {
|
|
379
|
-
debouncedFetchItems(
|
|
675
|
+
debouncedFetchItems('');
|
|
380
676
|
}
|
|
381
677
|
}, [itemsIsAFunction, itemsResolver]);
|
|
382
678
|
return {
|
|
@@ -385,56 +681,79 @@ const useResolvedItems = (itemsOrItemsResolver, debounceTimeout = 250) => {
|
|
|
385
681
|
fetchItems: debouncedFetchItems
|
|
386
682
|
};
|
|
387
683
|
};
|
|
388
|
-
|
|
684
|
+
|
|
685
|
+
/* start general utils */
|
|
686
|
+
var EMPTY_INPUT = '';
|
|
389
687
|
function lowerCaseFilterTest(item, input) {
|
|
390
688
|
if (!input) {
|
|
391
689
|
return true;
|
|
392
690
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
"\\$&"
|
|
396
|
-
);
|
|
397
|
-
const inputRegex = new RegExp(sanitizeEscapeCharacters, "i");
|
|
691
|
+
var sanitizeEscapeCharacters = input.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
692
|
+
var inputRegex = new RegExp(sanitizeEscapeCharacters, 'i');
|
|
398
693
|
return inputRegex.test(item.label);
|
|
399
694
|
}
|
|
400
|
-
function noFilter(
|
|
695
|
+
function noFilter(
|
|
696
|
+
//@ts-expect-error only here to comply with dropdown filter API
|
|
697
|
+
item,
|
|
698
|
+
//@ts-expect-error only here to comply with dropdown filter API
|
|
699
|
+
input) {
|
|
401
700
|
return true;
|
|
402
701
|
}
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
);
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
702
|
+
var itemToString = function itemToString(item) {
|
|
703
|
+
return item ? item.label : '';
|
|
704
|
+
};
|
|
705
|
+
var itemToKey = function itemToKey(item) {
|
|
706
|
+
return (item == null ? void 0 : item.label) + (item == null ? void 0 : item.value);
|
|
707
|
+
};
|
|
708
|
+
var isFunctionWithQueryArgument = function isFunctionWithQueryArgument(object) {
|
|
709
|
+
return typeof object === 'function' && object.length > 0;
|
|
710
|
+
};
|
|
711
|
+
var clamp = function clamp(val, min, max) {
|
|
712
|
+
if (min === void 0) {
|
|
713
|
+
min = 1;
|
|
714
|
+
}
|
|
715
|
+
if (max === void 0) {
|
|
716
|
+
max = 10;
|
|
717
|
+
}
|
|
718
|
+
return Math.min(Math.max(val, min), max);
|
|
719
|
+
};
|
|
720
|
+
var useMultiselectUtils = function useMultiselectUtils(_ref) {
|
|
721
|
+
var listItems = _ref.listItems,
|
|
722
|
+
selectedItems = _ref.selectedItems,
|
|
723
|
+
selectAll = _ref.selectAll;
|
|
724
|
+
var hasSelectedItems = selectedItems.length > 0;
|
|
725
|
+
var listItemsWithoutSelectAll = listItems.filter(function (item) {
|
|
726
|
+
return item.value !== selectAll.value;
|
|
727
|
+
});
|
|
728
|
+
var unselectedItemsInListItems = listItemsWithoutSelectAll.filter(function (listItem) {
|
|
729
|
+
return !selectedItems.some(function (selectedItem) {
|
|
730
|
+
return selectedItem.value === listItem.value;
|
|
731
|
+
});
|
|
732
|
+
});
|
|
733
|
+
var allListItemsAreSelected = !listItemsWithoutSelectAll.some(function (listItem) {
|
|
734
|
+
return !selectedItems.some(function (selectedItem) {
|
|
735
|
+
return selectedItem.value === listItem.value;
|
|
736
|
+
});
|
|
737
|
+
});
|
|
738
|
+
var someListItemsAreSelected = listItemsWithoutSelectAll.some(function (listItem) {
|
|
739
|
+
return selectedItems.some(function (selectedItem) {
|
|
740
|
+
return selectedItem.value === listItem.value;
|
|
741
|
+
});
|
|
742
|
+
});
|
|
743
|
+
var addClickedItemToSelectedItems = function addClickedItemToSelectedItems(clickedItem, onChange) {
|
|
744
|
+
return onChange([].concat(selectedItems, [clickedItem]));
|
|
745
|
+
};
|
|
746
|
+
var clickedItemIsInSelectedItems = function clickedItemIsInSelectedItems(clickedItem) {
|
|
747
|
+
return selectedItems.some(function (selectedItem) {
|
|
748
|
+
return selectedItem.value === clickedItem.value;
|
|
749
|
+
});
|
|
750
|
+
};
|
|
751
|
+
var clickedItemIsSelectAll = function clickedItemIsSelectAll(clickedItem) {
|
|
752
|
+
return clickedItem.value === selectAll.value;
|
|
753
|
+
};
|
|
754
|
+
var handleListItemClicked = function handleListItemClicked(_ref2) {
|
|
755
|
+
var clickedItem = _ref2.clickedItem,
|
|
756
|
+
onChange = _ref2.onChange;
|
|
438
757
|
if (clickedItemIsSelectAll(clickedItem)) {
|
|
439
758
|
if (allListItemsAreSelected) {
|
|
440
759
|
return unselectAllListItems(onChange);
|
|
@@ -446,1020 +765,1054 @@ const useMultiselectUtils = ({
|
|
|
446
765
|
}
|
|
447
766
|
addClickedItemToSelectedItems(clickedItem, onChange);
|
|
448
767
|
};
|
|
449
|
-
|
|
450
|
-
selectedItems.filter(
|
|
451
|
-
|
|
452
|
-
)
|
|
453
|
-
|
|
454
|
-
|
|
768
|
+
var removeClickedItemFromSelectedItems = function removeClickedItemFromSelectedItems(clickedItem, onChange) {
|
|
769
|
+
return onChange(selectedItems.filter(function (selectedItem) {
|
|
770
|
+
return selectedItem.value !== clickedItem.value;
|
|
771
|
+
}));
|
|
772
|
+
};
|
|
773
|
+
var selectAllCheckboxState = function selectAllCheckboxState() {
|
|
455
774
|
if (allListItemsAreSelected) return true;
|
|
456
|
-
if (someListItemsAreSelected) return
|
|
775
|
+
if (someListItemsAreSelected) return 'indeterminate';
|
|
457
776
|
return false;
|
|
458
777
|
};
|
|
459
|
-
|
|
460
|
-
onChange([
|
|
778
|
+
var selectAllUnselectedItemsInListItems = function selectAllUnselectedItemsInListItems(onChange) {
|
|
779
|
+
onChange([].concat(selectedItems, unselectedItemsInListItems));
|
|
461
780
|
};
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
)
|
|
467
|
-
);
|
|
781
|
+
var unselectAllListItems = function unselectAllListItems(onChange) {
|
|
782
|
+
var selectedItemsWithoutItemsInListItems = selectedItems.filter(function (selectedItem) {
|
|
783
|
+
return !listItemsWithoutSelectAll.some(function (listItem) {
|
|
784
|
+
return listItem.value === selectedItem.value;
|
|
785
|
+
});
|
|
786
|
+
});
|
|
468
787
|
onChange(selectedItemsWithoutItemsInListItems);
|
|
469
788
|
};
|
|
470
789
|
return {
|
|
471
|
-
addClickedItemToSelectedItems,
|
|
472
|
-
allListItemsAreSelected,
|
|
473
|
-
clickedItemIsInSelectedItems,
|
|
474
|
-
clickedItemIsSelectAll,
|
|
475
|
-
handleListItemClicked,
|
|
476
|
-
hasSelectedItems,
|
|
477
|
-
listItemsWithoutSelectAll,
|
|
478
|
-
removeClickedItemFromSelectedItems,
|
|
479
|
-
selectAllCheckboxState,
|
|
480
|
-
selectAllUnselectedItemsInListItems,
|
|
481
|
-
someListItemsAreSelected,
|
|
482
|
-
unselectAllListItems
|
|
790
|
+
addClickedItemToSelectedItems: addClickedItemToSelectedItems,
|
|
791
|
+
allListItemsAreSelected: allListItemsAreSelected,
|
|
792
|
+
clickedItemIsInSelectedItems: clickedItemIsInSelectedItems,
|
|
793
|
+
clickedItemIsSelectAll: clickedItemIsSelectAll,
|
|
794
|
+
handleListItemClicked: handleListItemClicked,
|
|
795
|
+
hasSelectedItems: hasSelectedItems,
|
|
796
|
+
listItemsWithoutSelectAll: listItemsWithoutSelectAll,
|
|
797
|
+
removeClickedItemFromSelectedItems: removeClickedItemFromSelectedItems,
|
|
798
|
+
selectAllCheckboxState: selectAllCheckboxState,
|
|
799
|
+
selectAllUnselectedItemsInListItems: selectAllUnselectedItemsInListItems,
|
|
800
|
+
someListItemsAreSelected: someListItemsAreSelected,
|
|
801
|
+
unselectAllListItems: unselectAllListItems
|
|
483
802
|
};
|
|
484
803
|
};
|
|
804
|
+
/* end multiselect utils */
|
|
805
|
+
/* start a11y utils */
|
|
806
|
+
// called when the state changes:
|
|
807
|
+
// selectedItem, highlightedIndex, inputValue or isOpen.
|
|
485
808
|
function getA11yStatusMessage(options) {
|
|
486
|
-
|
|
809
|
+
var isOpen = options.isOpen,
|
|
810
|
+
_options$selectAllIte = options.selectAllItemIncluded,
|
|
811
|
+
selectAllItemIncluded = _options$selectAllIte === void 0 ? false : _options$selectAllIte,
|
|
812
|
+
resultCount = options.resultCount;
|
|
487
813
|
if (!isOpen) {
|
|
488
|
-
return
|
|
814
|
+
return '';
|
|
489
815
|
}
|
|
490
|
-
|
|
816
|
+
var resultCountWithoutSelectAll = selectAllItemIncluded ? resultCount - 1 : resultCount;
|
|
491
817
|
if (resultCountWithoutSelectAll === 0) {
|
|
492
|
-
return
|
|
818
|
+
return 'Ingen resultater';
|
|
493
819
|
}
|
|
494
|
-
return
|
|
820
|
+
return resultCountWithoutSelectAll + " resultat" + (resultCountWithoutSelectAll === 1 ? '' : 'er') + " tilgjengelig, naviger med pil opp eller ned, velg elementer med Enter.";
|
|
495
821
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
822
|
+
/* end a11y utils */
|
|
823
|
+
|
|
824
|
+
var _excluded$3 = ["ariaLabelChosenSingular", "ariaLabelCloseList", "ariaLabelOpenList", "ariaLabelSelectedItem", "className", "clearable", "debounceTimeout", "disabled", "disableLabelAnimation", "feedback", "items", "itemFilter", "label", "labelClearSelectedItem", "labelTooltip", "listStyle", "loading", "loadingText", "noMatchesText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "selectOnTab", "style", "variant"];
|
|
825
|
+
var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
826
|
+
var _document, _selectedItem$label;
|
|
827
|
+
var ariaLabelChosenSingular = _ref.ariaLabelChosenSingular,
|
|
828
|
+
_ref$ariaLabelCloseLi = _ref.ariaLabelCloseList,
|
|
829
|
+
ariaLabelCloseList = _ref$ariaLabelCloseLi === void 0 ? 'Lukk liste med valg' : _ref$ariaLabelCloseLi,
|
|
830
|
+
_ref$ariaLabelOpenLis = _ref.ariaLabelOpenList,
|
|
831
|
+
ariaLabelOpenList = _ref$ariaLabelOpenLis === void 0 ? 'Åpne liste med valg' : _ref$ariaLabelOpenLis,
|
|
832
|
+
ariaLabelSelectedItem = _ref.ariaLabelSelectedItem,
|
|
833
|
+
className = _ref.className,
|
|
834
|
+
_ref$clearable = _ref.clearable,
|
|
835
|
+
clearable = _ref$clearable === void 0 ? true : _ref$clearable,
|
|
836
|
+
debounceTimeout = _ref.debounceTimeout,
|
|
837
|
+
_ref$disabled = _ref.disabled,
|
|
838
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
839
|
+
_ref$disableLabelAnim = _ref.disableLabelAnimation,
|
|
840
|
+
disableLabelAnimation = _ref$disableLabelAnim === void 0 ? false : _ref$disableLabelAnim,
|
|
841
|
+
feedback = _ref.feedback,
|
|
842
|
+
initialItems = _ref.items,
|
|
843
|
+
_ref$itemFilter = _ref.itemFilter,
|
|
844
|
+
itemFilter = _ref$itemFilter === void 0 ? isFunctionWithQueryArgument(initialItems) ? noFilter : lowerCaseFilterTest : _ref$itemFilter,
|
|
845
|
+
label = _ref.label,
|
|
846
|
+
_ref$labelClearSelect = _ref.labelClearSelectedItem,
|
|
847
|
+
labelClearSelectedItem = _ref$labelClearSelect === void 0 ? 'fjern valgt' : _ref$labelClearSelect,
|
|
848
|
+
labelTooltip = _ref.labelTooltip,
|
|
849
|
+
listStyle = _ref.listStyle,
|
|
850
|
+
loading = _ref.loading,
|
|
851
|
+
_ref$loadingText = _ref.loadingText,
|
|
852
|
+
loadingText = _ref$loadingText === void 0 ? 'Laster resultater …' : _ref$loadingText,
|
|
853
|
+
_ref$noMatchesText = _ref.noMatchesText,
|
|
854
|
+
noMatchesText = _ref$noMatchesText === void 0 ? 'Ingen tilgjengelige valg …' : _ref$noMatchesText,
|
|
855
|
+
_ref$onChange = _ref.onChange,
|
|
856
|
+
onChange = _ref$onChange === void 0 ? function () {
|
|
857
|
+
return undefined;
|
|
858
|
+
} : _ref$onChange,
|
|
859
|
+
placeholder = _ref.placeholder,
|
|
860
|
+
prepend = _ref.prepend,
|
|
861
|
+
_ref$readOnly = _ref.readOnly,
|
|
862
|
+
readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
|
|
863
|
+
value = _ref.selectedItem,
|
|
864
|
+
_ref$selectOnBlur = _ref.selectOnBlur,
|
|
865
|
+
selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
|
|
866
|
+
_ref$selectOnTab = _ref.selectOnTab,
|
|
867
|
+
selectOnTab = _ref$selectOnTab === void 0 ? false : _ref$selectOnTab,
|
|
868
|
+
style = _ref.style,
|
|
869
|
+
_ref$variant = _ref.variant,
|
|
870
|
+
variant = _ref$variant === void 0 ? 'info' : _ref$variant,
|
|
871
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
|
|
872
|
+
var _useState = useState(value !== null),
|
|
873
|
+
showSelectedItem = _useState[0],
|
|
874
|
+
setShowSelectedItem = _useState[1];
|
|
875
|
+
var _useState2 = useState(0),
|
|
876
|
+
lastHighlightedIndex = _useState2[0],
|
|
877
|
+
setLastHighlightedIndex = _useState2[1];
|
|
878
|
+
var inputRef = useRef(null);
|
|
879
|
+
var _useResolvedItems = useResolvedItems(initialItems, debounceTimeout),
|
|
880
|
+
normalizedItems = _useResolvedItems.items,
|
|
881
|
+
resolvedItemsLoading = _useResolvedItems.loading,
|
|
882
|
+
fetchItems = _useResolvedItems.fetchItems;
|
|
883
|
+
var _useState3 = useState(normalizedItems),
|
|
884
|
+
listItems = _useState3[0],
|
|
885
|
+
setListItems = _useState3[1];
|
|
886
|
+
var filterListItems = function filterListItems(_ref2) {
|
|
887
|
+
var inputValue = _ref2.inputValue;
|
|
888
|
+
return setListItems(normalizedItems.filter(function (item) {
|
|
889
|
+
return itemFilter(item, inputValue);
|
|
890
|
+
}));
|
|
891
|
+
};
|
|
892
|
+
var updateListItems = function updateListItems(_ref3) {
|
|
893
|
+
var inputValue = _ref3.inputValue;
|
|
894
|
+
var shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
|
|
895
|
+
if (shouldRefetchItems) fetchItems(inputValue != null ? inputValue : EMPTY_INPUT);
|
|
896
|
+
filterListItems({
|
|
897
|
+
inputValue: inputValue != null ? inputValue : EMPTY_INPUT
|
|
898
|
+
});
|
|
899
|
+
};
|
|
900
|
+
var resetInputState = function resetInputState(_ref4) {
|
|
901
|
+
var changes = _ref4.changes;
|
|
902
|
+
updateListItems({
|
|
903
|
+
inputValue: EMPTY_INPUT
|
|
904
|
+
});
|
|
905
|
+
return _extends({}, changes, {
|
|
906
|
+
inputValue: EMPTY_INPUT
|
|
907
|
+
});
|
|
908
|
+
};
|
|
909
|
+
var inputHasFocus = typeof document !== 'undefined' ? (inputRef == null ? void 0 : inputRef.current) === ((_document = document) == null ? void 0 : _document.activeElement) : false;
|
|
910
|
+
useEffect(function () {
|
|
911
|
+
filterListItems({
|
|
912
|
+
inputValue: inputValue
|
|
913
|
+
});
|
|
914
|
+
}, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
915
|
+
useEffect(function () {
|
|
916
|
+
// sync internal state on initial render
|
|
917
|
+
if (selectedItem !== null && !inputHasFocus) {
|
|
918
|
+
setShowSelectedItem(true);
|
|
919
|
+
updateListItems({
|
|
551
920
|
inputValue: EMPTY_INPUT
|
|
552
|
-
};
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
if (!state.isOpen)
|
|
595
|
-
return {
|
|
596
|
-
...changes,
|
|
597
|
-
inputValue: sanitizedInputValue,
|
|
598
|
-
isOpen: true
|
|
599
|
-
};
|
|
600
|
-
if (changes.highlightedIndex !== void 0) {
|
|
601
|
-
return {
|
|
602
|
-
...changes,
|
|
603
|
-
inputValue: sanitizedInputValue,
|
|
604
|
-
selectedItem: listItems[changes.highlightedIndex]
|
|
605
|
-
};
|
|
606
|
-
}
|
|
921
|
+
});
|
|
922
|
+
setInputValue(EMPTY_INPUT);
|
|
923
|
+
}
|
|
924
|
+
}, []);
|
|
925
|
+
var stateReducer = useCallback(function (state, _ref5) {
|
|
926
|
+
var type = _ref5.type,
|
|
927
|
+
changes = _ref5.changes;
|
|
928
|
+
if (changes.highlightedIndex !== undefined && (changes == null ? void 0 : changes.highlightedIndex) >= 0) {
|
|
929
|
+
setLastHighlightedIndex(changes == null ? void 0 : changes.highlightedIndex);
|
|
930
|
+
}
|
|
931
|
+
switch (type) {
|
|
932
|
+
// empty input to show selected item and reset dropdown list on item selection
|
|
933
|
+
case useCombobox.stateChangeTypes.ItemClick:
|
|
934
|
+
case useCombobox.stateChangeTypes.InputKeyDownEnter:
|
|
935
|
+
case useCombobox.stateChangeTypes.InputBlur:
|
|
936
|
+
return resetInputState({
|
|
937
|
+
changes: changes
|
|
938
|
+
});
|
|
939
|
+
case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
|
|
940
|
+
if (changes.selectedItem !== null && !inputHasFocus) setShowSelectedItem(true);
|
|
941
|
+
return resetInputState({
|
|
942
|
+
changes: changes
|
|
943
|
+
});
|
|
944
|
+
// remove leading whitespace, select element with spacebar on empty input
|
|
945
|
+
case useCombobox.stateChangeTypes.InputChange:
|
|
946
|
+
{
|
|
947
|
+
var _changes$inputValue;
|
|
948
|
+
var leadingWhitespaceTest = /^\s+/g;
|
|
949
|
+
var isSpacePressedOnEmptyInput = changes.inputValue === ' ';
|
|
950
|
+
if (!isSpacePressedOnEmptyInput) setLastHighlightedIndex(0);
|
|
951
|
+
if ((_changes$inputValue = changes.inputValue) != null && _changes$inputValue.match(leadingWhitespaceTest)) {
|
|
952
|
+
var sanitizedInputValue = changes.inputValue.replace(leadingWhitespaceTest, EMPTY_INPUT);
|
|
953
|
+
if (isSpacePressedOnEmptyInput) {
|
|
954
|
+
if (!state.isOpen) return _extends({}, changes, {
|
|
955
|
+
inputValue: sanitizedInputValue,
|
|
956
|
+
isOpen: true
|
|
957
|
+
});
|
|
958
|
+
if (changes.highlightedIndex !== undefined) {
|
|
959
|
+
return _extends({}, changes, {
|
|
960
|
+
inputValue: sanitizedInputValue,
|
|
961
|
+
selectedItem: listItems[changes.highlightedIndex]
|
|
962
|
+
});
|
|
607
963
|
}
|
|
608
964
|
}
|
|
609
|
-
return { ...changes, highlightedIndex: 0 };
|
|
610
965
|
}
|
|
611
|
-
|
|
612
|
-
|
|
966
|
+
return _extends({}, changes, {
|
|
967
|
+
highlightedIndex: 0
|
|
968
|
+
});
|
|
613
969
|
}
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
getToggleButtonProps,
|
|
620
|
-
getLabelProps,
|
|
621
|
-
getMenuProps,
|
|
622
|
-
getInputProps,
|
|
623
|
-
highlightedIndex,
|
|
624
|
-
getItemProps,
|
|
625
|
-
selectedItem,
|
|
626
|
-
inputValue,
|
|
627
|
-
setInputValue,
|
|
628
|
-
selectItem,
|
|
629
|
-
reset
|
|
630
|
-
} = useCombobox({
|
|
970
|
+
default:
|
|
971
|
+
return changes;
|
|
972
|
+
}
|
|
973
|
+
}, [fetchItems, filterListItems, inputHasFocus, resetInputState]);
|
|
974
|
+
var _useCombobox = useCombobox({
|
|
631
975
|
defaultHighlightedIndex: lastHighlightedIndex,
|
|
632
976
|
items: listItems,
|
|
633
|
-
itemToString,
|
|
977
|
+
itemToString: itemToString,
|
|
634
978
|
selectedItem: value,
|
|
635
|
-
stateReducer,
|
|
636
|
-
onInputValueChange(changes) {
|
|
637
|
-
updateListItems({
|
|
979
|
+
stateReducer: stateReducer,
|
|
980
|
+
onInputValueChange: function onInputValueChange(changes) {
|
|
981
|
+
updateListItems({
|
|
982
|
+
inputValue: changes.inputValue
|
|
983
|
+
});
|
|
638
984
|
},
|
|
639
|
-
onSelectedItemChange
|
|
985
|
+
onSelectedItemChange: function onSelectedItemChange(_ref6) {
|
|
986
|
+
var newSelectedItem = _ref6.selectedItem;
|
|
640
987
|
onChange(newSelectedItem);
|
|
641
988
|
},
|
|
642
989
|
// Accessibility
|
|
643
|
-
getA11yStatusMessage: (options)
|
|
644
|
-
|
|
645
|
-
|
|
990
|
+
getA11yStatusMessage: function getA11yStatusMessage$1(options) {
|
|
991
|
+
return getA11yStatusMessage(_extends({}, options, {
|
|
992
|
+
resultCount: listItems.length
|
|
993
|
+
}));
|
|
994
|
+
}
|
|
995
|
+
}),
|
|
996
|
+
isOpen = _useCombobox.isOpen,
|
|
997
|
+
getToggleButtonProps = _useCombobox.getToggleButtonProps,
|
|
998
|
+
getLabelProps = _useCombobox.getLabelProps,
|
|
999
|
+
getMenuProps = _useCombobox.getMenuProps,
|
|
1000
|
+
getInputProps = _useCombobox.getInputProps,
|
|
1001
|
+
highlightedIndex = _useCombobox.highlightedIndex,
|
|
1002
|
+
getItemProps = _useCombobox.getItemProps,
|
|
1003
|
+
selectedItem = _useCombobox.selectedItem,
|
|
1004
|
+
inputValue = _useCombobox.inputValue,
|
|
1005
|
+
setInputValue = _useCombobox.setInputValue,
|
|
1006
|
+
selectItem = _useCombobox.selectItem,
|
|
1007
|
+
reset = _useCombobox.reset;
|
|
1008
|
+
// calculations for floating-UI popover position
|
|
1009
|
+
var _useFloating = useFloating({
|
|
646
1010
|
open: isOpen,
|
|
647
|
-
placement:
|
|
648
|
-
middleware: [
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
1011
|
+
placement: 'bottom-start',
|
|
1012
|
+
middleware: [offset(space.extraSmall2), shift({
|
|
1013
|
+
padding: space.extraSmall
|
|
1014
|
+
}), size({
|
|
1015
|
+
apply: function apply(_ref7) {
|
|
1016
|
+
var rects = _ref7.rects,
|
|
1017
|
+
elements = _ref7.elements,
|
|
1018
|
+
availableHeight = _ref7.availableHeight;
|
|
1019
|
+
Object.assign(elements.floating.style, {
|
|
1020
|
+
width: rects.reference.width + "px",
|
|
1021
|
+
// Floating will flip when smaller than 10*16 px
|
|
1022
|
+
// and never exceed 20*16 px.
|
|
1023
|
+
maxHeight: clamp(10 * 16, availableHeight, 20 * 16) + "px"
|
|
1024
|
+
});
|
|
1025
|
+
}
|
|
1026
|
+
}), flip({
|
|
1027
|
+
fallbackStrategy: 'initialPlacement'
|
|
1028
|
+
})]
|
|
1029
|
+
}),
|
|
1030
|
+
refs = _useFloating.refs,
|
|
1031
|
+
floatingStyles = _useFloating.floatingStyles,
|
|
1032
|
+
update = _useFloating.update;
|
|
1033
|
+
// Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside
|
|
1034
|
+
// the useFloating hook but this requires the floating element to be conditionally rendered.
|
|
1035
|
+
// Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly
|
|
1036
|
+
// spread to the component. We therefor use this useEffect to update position. See https://floating-ui.com/docs/autoupdate#usage
|
|
1037
|
+
useEffect(function () {
|
|
1038
|
+
if (isOpen && refs.reference.current && refs.floating.current) {
|
|
1039
|
+
return autoUpdate(refs.reference.current, refs.floating.current, update);
|
|
1040
|
+
}
|
|
1041
|
+
}, [isOpen, refs.reference, refs.floating, update]);
|
|
1042
|
+
var handleOnClear = function handleOnClear() {
|
|
1043
|
+
var _inputRef$current;
|
|
1044
|
+
(_inputRef$current = inputRef.current) == null || _inputRef$current.focus();
|
|
1045
|
+
reset();
|
|
1046
|
+
};
|
|
1047
|
+
return React.createElement(BaseFormControl, _extends({
|
|
1048
|
+
className: classNames('eds-dropdown', 'eds-dropdown--searchable', className, {
|
|
1049
|
+
'eds-dropdown--has-tooltip': labelTooltip !== undefined
|
|
1050
|
+
}),
|
|
1051
|
+
disabled: disabled,
|
|
1052
|
+
disableLabelAnimation: disableLabelAnimation,
|
|
1053
|
+
feedback: feedback,
|
|
1054
|
+
isFilled: selectedItem !== null || inputValue !== EMPTY_INPUT,
|
|
1055
|
+
label: label,
|
|
1056
|
+
labelId: getLabelProps().id,
|
|
1057
|
+
labelProps: getLabelProps(),
|
|
1058
|
+
labelTooltip: labelTooltip,
|
|
1059
|
+
onClick: function onClick(e) {
|
|
1060
|
+
if (e.target === e.currentTarget) {
|
|
1061
|
+
var _getInputProps;
|
|
1062
|
+
(_getInputProps = getInputProps()) == null || _getInputProps.onClick == null || _getInputProps.onClick(e);
|
|
671
1063
|
}
|
|
672
|
-
},
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
ariaLabelChosenSingular,
|
|
709
|
-
ariaLabelSelectedItem,
|
|
710
|
-
floatingStyles,
|
|
711
|
-
getItemProps,
|
|
712
|
-
getMenuProps,
|
|
713
|
-
highlightedIndex,
|
|
714
|
-
isOpen,
|
|
715
|
-
listItems,
|
|
716
|
-
style: listStyle,
|
|
717
|
-
setListRef: refs.setFloating,
|
|
718
|
-
loading: loading ?? resolvedItemsLoading,
|
|
719
|
-
loadingText,
|
|
720
|
-
noMatchesText,
|
|
721
|
-
selectedItems: selectedItem !== null ? [selectedItem] : [],
|
|
722
|
-
readOnly
|
|
723
|
-
}
|
|
724
|
-
),
|
|
725
|
-
...rest,
|
|
726
|
-
append: void 0,
|
|
727
|
-
children: [
|
|
728
|
-
/* @__PURE__ */ jsx(
|
|
729
|
-
"span",
|
|
730
|
-
{
|
|
731
|
-
className: classNames("eds-dropdown--searchable__selected-item", {
|
|
732
|
-
"eds-dropdown--searchable__selected-item--hidden": !showSelectedItem
|
|
733
|
-
}),
|
|
734
|
-
onClick: (event) => {
|
|
735
|
-
if (!disabled && !readOnly) {
|
|
736
|
-
inputRef.current?.focus();
|
|
737
|
-
getInputProps()?.onClick?.(event);
|
|
738
|
-
}
|
|
739
|
-
},
|
|
740
|
-
tabIndex: readOnly ? 0 : -1,
|
|
741
|
-
children: showSelectedItem ? selectedItem?.label : ""
|
|
742
|
-
}
|
|
743
|
-
),
|
|
744
|
-
/* @__PURE__ */ jsx(
|
|
745
|
-
"input",
|
|
746
|
-
{
|
|
747
|
-
className: classNames("eds-dropdown__input eds-form-control", {
|
|
748
|
-
"eds-dropdown__input--hidden": showSelectedItem
|
|
749
|
-
}),
|
|
750
|
-
...getInputProps({
|
|
751
|
-
onKeyDown(e) {
|
|
752
|
-
if (isOpen && e.key === "Tab") {
|
|
753
|
-
const highlitedItem = listItems[highlightedIndex];
|
|
754
|
-
if ((selectOnTab || selectOnBlur) && highlitedItem && highlitedItem !== selectedItem) {
|
|
755
|
-
selectItem(highlitedItem);
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
},
|
|
759
|
-
onBlur() {
|
|
760
|
-
if (selectedItem !== null) setShowSelectedItem(true);
|
|
761
|
-
},
|
|
762
|
-
onFocus() {
|
|
763
|
-
if (!readOnly) {
|
|
764
|
-
setShowSelectedItem(false);
|
|
765
|
-
}
|
|
766
|
-
},
|
|
767
|
-
disabled,
|
|
768
|
-
readOnly,
|
|
769
|
-
placeholder: selectedItem?.label ?? placeholder,
|
|
770
|
-
tabIndex: disabled || readOnly ? -1 : void 0,
|
|
771
|
-
ref: mergeRefs(inputRef, ref)
|
|
772
|
-
})
|
|
773
|
-
}
|
|
774
|
-
),
|
|
775
|
-
/* @__PURE__ */ jsx(
|
|
776
|
-
DropdownFieldAppendix,
|
|
777
|
-
{
|
|
778
|
-
...getToggleButtonProps({
|
|
779
|
-
"aria-busy": !(loading ?? resolvedItemsLoading) ? void 0 : "true"
|
|
780
|
-
}),
|
|
781
|
-
ariaLabelCloseList,
|
|
782
|
-
ariaLabelOpenList,
|
|
783
|
-
clearable,
|
|
784
|
-
disabled: disabled || readOnly,
|
|
785
|
-
onClear: handleOnClear,
|
|
786
|
-
focusable: false,
|
|
787
|
-
labelClearSelected: labelClearSelectedItem,
|
|
788
|
-
isOpen,
|
|
789
|
-
itemIsSelected: selectedItem !== null,
|
|
790
|
-
loadingText,
|
|
791
|
-
loading: loading ?? resolvedItemsLoading
|
|
792
|
-
}
|
|
793
|
-
)
|
|
794
|
-
]
|
|
1064
|
+
},
|
|
1065
|
+
prepend: prepend,
|
|
1066
|
+
readOnly: readOnly,
|
|
1067
|
+
ref: refs.setReference,
|
|
1068
|
+
style: style,
|
|
1069
|
+
tabIndex: disabled || readOnly ? -1 : undefined,
|
|
1070
|
+
variant: variant,
|
|
1071
|
+
after: React.createElement(DropdownList, {
|
|
1072
|
+
ariaLabelChosenSingular: ariaLabelChosenSingular,
|
|
1073
|
+
ariaLabelSelectedItem: ariaLabelSelectedItem,
|
|
1074
|
+
floatingStyles: floatingStyles,
|
|
1075
|
+
getItemProps: getItemProps,
|
|
1076
|
+
getMenuProps: getMenuProps,
|
|
1077
|
+
highlightedIndex: highlightedIndex,
|
|
1078
|
+
isOpen: isOpen,
|
|
1079
|
+
listItems: listItems,
|
|
1080
|
+
style: listStyle,
|
|
1081
|
+
setListRef: refs.setFloating,
|
|
1082
|
+
loading: loading != null ? loading : resolvedItemsLoading,
|
|
1083
|
+
loadingText: loadingText,
|
|
1084
|
+
noMatchesText: noMatchesText,
|
|
1085
|
+
selectedItems: selectedItem !== null ? [selectedItem] : [],
|
|
1086
|
+
readOnly: readOnly
|
|
1087
|
+
})
|
|
1088
|
+
}, rest, {
|
|
1089
|
+
// Append is not supported as of now
|
|
1090
|
+
append: undefined
|
|
1091
|
+
}), React.createElement("span", {
|
|
1092
|
+
className: classNames('eds-dropdown--searchable__selected-item', {
|
|
1093
|
+
'eds-dropdown--searchable__selected-item--hidden': !showSelectedItem
|
|
1094
|
+
}),
|
|
1095
|
+
onClick: function onClick(event) {
|
|
1096
|
+
if (!disabled && !readOnly) {
|
|
1097
|
+
var _inputRef$current2, _getInputProps2;
|
|
1098
|
+
(_inputRef$current2 = inputRef.current) == null || _inputRef$current2.focus();
|
|
1099
|
+
(_getInputProps2 = getInputProps()) == null || _getInputProps2.onClick == null || _getInputProps2.onClick(event);
|
|
795
1100
|
}
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
)
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
placeholder,
|
|
823
|
-
readOnly
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
1101
|
+
},
|
|
1102
|
+
tabIndex: readOnly ? 0 : -1
|
|
1103
|
+
}, showSelectedItem ? selectedItem == null ? void 0 : selectedItem.label : ''), React.createElement("input", _extends({
|
|
1104
|
+
className: classNames('eds-dropdown__input eds-form-control', {
|
|
1105
|
+
'eds-dropdown__input--hidden': showSelectedItem
|
|
1106
|
+
})
|
|
1107
|
+
}, getInputProps({
|
|
1108
|
+
onKeyDown: function onKeyDown(e) {
|
|
1109
|
+
if (isOpen && e.key === 'Tab') {
|
|
1110
|
+
var highlitedItem = listItems[highlightedIndex];
|
|
1111
|
+
// we don't want to clear selection with tab
|
|
1112
|
+
if ((selectOnTab || selectOnBlur) && highlitedItem && highlitedItem !== selectedItem) {
|
|
1113
|
+
selectItem(highlitedItem);
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
},
|
|
1117
|
+
onBlur: function onBlur() {
|
|
1118
|
+
if (selectedItem !== null) setShowSelectedItem(true);
|
|
1119
|
+
},
|
|
1120
|
+
onFocus: function onFocus() {
|
|
1121
|
+
if (!readOnly) {
|
|
1122
|
+
setShowSelectedItem(false);
|
|
1123
|
+
}
|
|
1124
|
+
},
|
|
1125
|
+
disabled: disabled,
|
|
1126
|
+
readOnly: readOnly,
|
|
1127
|
+
placeholder: (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : placeholder,
|
|
1128
|
+
tabIndex: disabled || readOnly ? -1 : undefined,
|
|
1129
|
+
ref: mergeRefs(inputRef, ref)
|
|
1130
|
+
}))), React.createElement(DropdownFieldAppendix, _extends({}, getToggleButtonProps({
|
|
1131
|
+
'aria-busy': !(loading != null ? loading : resolvedItemsLoading) ? undefined : 'true'
|
|
1132
|
+
}), {
|
|
1133
|
+
ariaLabelCloseList: ariaLabelCloseList,
|
|
1134
|
+
ariaLabelOpenList: ariaLabelOpenList,
|
|
1135
|
+
clearable: clearable,
|
|
1136
|
+
disabled: disabled || readOnly,
|
|
1137
|
+
onClear: handleOnClear,
|
|
1138
|
+
focusable: false,
|
|
1139
|
+
labelClearSelected: labelClearSelectedItem,
|
|
1140
|
+
isOpen: isOpen,
|
|
1141
|
+
itemIsSelected: selectedItem !== null,
|
|
1142
|
+
loadingText: loadingText,
|
|
1143
|
+
loading: loading != null ? loading : resolvedItemsLoading
|
|
1144
|
+
})));
|
|
1145
|
+
});
|
|
1146
|
+
|
|
1147
|
+
var _excluded$2 = ["className", "clearable", "clearInputOnSelect", "debounceTimeout", "disabled", "disableLabelAnimation", "feedback", "hideSelectAll", "items", "itemFilter", "label", "labelAllItemsSelected", "labelClearAllItems", "labelSelectAll", "labelTooltip", "listStyle", "loading", "loadingText", "maxChips", "noMatchesText", "onChange", "placeholder", "readOnly", "selectedItems", "selectOnBlur", "selectOnTab", "style", "variant", "ariaLabelChosenSingular", "ariaLabelChosenPlural", "ariaLabelCloseList", "ariaLabelJumpToInput", "ariaLabelOpenList", "ariaLabelRemoveSelected", "ariaLabelSelectedItem"];
|
|
1148
|
+
var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
1149
|
+
var _inputRef$current4;
|
|
1150
|
+
var className = _ref.className,
|
|
1151
|
+
_ref$clearable = _ref.clearable,
|
|
1152
|
+
clearable = _ref$clearable === void 0 ? true : _ref$clearable,
|
|
1153
|
+
_ref$clearInputOnSele = _ref.clearInputOnSelect,
|
|
1154
|
+
clearInputOnSelect = _ref$clearInputOnSele === void 0 ? false : _ref$clearInputOnSele,
|
|
1155
|
+
debounceTimeout = _ref.debounceTimeout,
|
|
1156
|
+
_ref$disabled = _ref.disabled,
|
|
1157
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
1158
|
+
disableLabelAnimation = _ref.disableLabelAnimation,
|
|
1159
|
+
feedback = _ref.feedback,
|
|
1160
|
+
_ref$hideSelectAll = _ref.hideSelectAll,
|
|
1161
|
+
hideSelectAll = _ref$hideSelectAll === void 0 ? false : _ref$hideSelectAll,
|
|
1162
|
+
initialItems = _ref.items,
|
|
1163
|
+
_ref$itemFilter = _ref.itemFilter,
|
|
1164
|
+
itemFilter = _ref$itemFilter === void 0 ? isFunctionWithQueryArgument(initialItems) ? noFilter : lowerCaseFilterTest : _ref$itemFilter,
|
|
1165
|
+
label = _ref.label,
|
|
1166
|
+
_ref$labelAllItemsSel = _ref.labelAllItemsSelected,
|
|
1167
|
+
labelAllItemsSelected = _ref$labelAllItemsSel === void 0 ? 'Alle valgt' : _ref$labelAllItemsSel,
|
|
1168
|
+
_ref$labelClearAllIte = _ref.labelClearAllItems,
|
|
1169
|
+
labelClearAllItems = _ref$labelClearAllIte === void 0 ? 'Fjern valgte' : _ref$labelClearAllIte,
|
|
1170
|
+
_ref$labelSelectAll = _ref.labelSelectAll,
|
|
1171
|
+
labelSelectAll = _ref$labelSelectAll === void 0 ? 'Velg alle' : _ref$labelSelectAll,
|
|
1172
|
+
labelTooltip = _ref.labelTooltip,
|
|
1173
|
+
listStyle = _ref.listStyle,
|
|
1174
|
+
loading = _ref.loading,
|
|
1175
|
+
_ref$loadingText = _ref.loadingText,
|
|
1176
|
+
loadingText = _ref$loadingText === void 0 ? 'Laster resultater …' : _ref$loadingText,
|
|
1177
|
+
_ref$maxChips = _ref.maxChips,
|
|
1178
|
+
maxChips = _ref$maxChips === void 0 ? 10 : _ref$maxChips,
|
|
1179
|
+
noMatchesText = _ref.noMatchesText,
|
|
1180
|
+
_ref$onChange = _ref.onChange,
|
|
1181
|
+
onChange = _ref$onChange === void 0 ? function () {
|
|
1182
|
+
return undefined;
|
|
1183
|
+
} : _ref$onChange,
|
|
1184
|
+
placeholder = _ref.placeholder,
|
|
1185
|
+
_ref$readOnly = _ref.readOnly,
|
|
1186
|
+
readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
|
|
1187
|
+
_ref$selectedItems = _ref.selectedItems,
|
|
1188
|
+
selectedItems = _ref$selectedItems === void 0 ? [] : _ref$selectedItems,
|
|
1189
|
+
_ref$selectOnTab = _ref.selectOnTab,
|
|
1190
|
+
selectOnTab = _ref$selectOnTab === void 0 ? false : _ref$selectOnTab,
|
|
1191
|
+
style = _ref.style,
|
|
1192
|
+
_ref$variant = _ref.variant,
|
|
1193
|
+
variant = _ref$variant === void 0 ? 'information' : _ref$variant,
|
|
1194
|
+
ariaLabelChosenSingular = _ref.ariaLabelChosenSingular,
|
|
1195
|
+
_ref$ariaLabelChosenP = _ref.ariaLabelChosenPlural,
|
|
1196
|
+
ariaLabelChosenPlural = _ref$ariaLabelChosenP === void 0 ? 'valgte' : _ref$ariaLabelChosenP,
|
|
1197
|
+
_ref$ariaLabelCloseLi = _ref.ariaLabelCloseList,
|
|
1198
|
+
ariaLabelCloseList = _ref$ariaLabelCloseLi === void 0 ? 'Lukk liste med valg' : _ref$ariaLabelCloseLi,
|
|
1199
|
+
_ref$ariaLabelJumpToI = _ref.ariaLabelJumpToInput,
|
|
1200
|
+
ariaLabelJumpToInput = _ref$ariaLabelJumpToI === void 0 ? selectedItems.length + " valgte elementer, trykk for \xE5 hoppe til tekstfeltet" : _ref$ariaLabelJumpToI,
|
|
1201
|
+
_ref$ariaLabelOpenLis = _ref.ariaLabelOpenList,
|
|
1202
|
+
ariaLabelOpenList = _ref$ariaLabelOpenLis === void 0 ? 'Åpne liste med valg' : _ref$ariaLabelOpenLis,
|
|
1203
|
+
_ref$ariaLabelRemoveS = _ref.ariaLabelRemoveSelected,
|
|
1204
|
+
ariaLabelRemoveSelected = _ref$ariaLabelRemoveS === void 0 ? 'trykk for å fjerne valg' : _ref$ariaLabelRemoveS,
|
|
1205
|
+
ariaLabelSelectedItem = _ref.ariaLabelSelectedItem,
|
|
1206
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
|
|
1207
|
+
var _React$useState = React.useState(0),
|
|
1208
|
+
lastHighlightedIndex = _React$useState[0],
|
|
1209
|
+
setLastHighlightedIndex = _React$useState[1];
|
|
1210
|
+
var inputRef = useRef(null);
|
|
1211
|
+
useEffect(function () {
|
|
1212
|
+
//@ts-expect-error this is done to aid developers debug wrong prop usage
|
|
1213
|
+
if (rest.selectedItem !== undefined) console.warn("Incorrect 'selectedItem' prop found, did you mean to use 'selectedItems?");
|
|
1214
|
+
//@ts-expect-error selectedItem should not actually exist in rest
|
|
1215
|
+
}, [rest.selectedItem]);
|
|
1216
|
+
var _useResolvedItems = useResolvedItems(initialItems, debounceTimeout),
|
|
1217
|
+
normalizedItems = _useResolvedItems.items,
|
|
1218
|
+
resolvedItemsLoading = _useResolvedItems.loading,
|
|
1219
|
+
fetchItems = _useResolvedItems.fetchItems;
|
|
1220
|
+
var isAllNonAsyncItemsSelected = typeof initialItems !== 'function' && selectedItems.length === normalizedItems.length;
|
|
1221
|
+
// special 'item' used as Select All entry in the dropdown list
|
|
1222
|
+
var selectAll = {
|
|
1223
|
+
value: useRandomId('select-all'),
|
|
1224
|
+
label: labelSelectAll
|
|
1225
|
+
};
|
|
1226
|
+
// special 'item' used as a replacement selected item tag for when
|
|
1227
|
+
// there are more selected element than maxChips
|
|
1228
|
+
var summarySelectedItems = React.useMemo(function () {
|
|
1229
|
+
return {
|
|
1230
|
+
value: EMPTY_INPUT,
|
|
1231
|
+
label: isAllNonAsyncItemsSelected ? labelAllItemsSelected : selectedItems.length + ' ' + ariaLabelChosenPlural
|
|
880
1232
|
};
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
1233
|
+
}, [isAllNonAsyncItemsSelected, selectedItems, labelAllItemsSelected, ariaLabelChosenPlural]);
|
|
1234
|
+
var _useState = useState([].concat(!hideSelectAll ? [selectAll] : [], normalizedItems)),
|
|
1235
|
+
listItems = _useState[0],
|
|
1236
|
+
setListItems = _useState[1];
|
|
1237
|
+
var filterListItems = function filterListItems(_ref2) {
|
|
1238
|
+
var inputValue = _ref2.inputValue;
|
|
1239
|
+
return setListItems([].concat(!hideSelectAll ? [selectAll] : [], normalizedItems.filter(function (item) {
|
|
1240
|
+
return itemFilter(item, inputValue);
|
|
1241
|
+
})));
|
|
1242
|
+
};
|
|
1243
|
+
var updateListItems = function updateListItems(_ref3) {
|
|
1244
|
+
var inputValue = _ref3.inputValue;
|
|
1245
|
+
var shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
|
|
1246
|
+
if (shouldRefetchItems) fetchItems(inputValue != null ? inputValue : EMPTY_INPUT);
|
|
1247
|
+
filterListItems({
|
|
1248
|
+
inputValue: inputValue != null ? inputValue : EMPTY_INPUT
|
|
1249
|
+
});
|
|
1250
|
+
};
|
|
1251
|
+
React.useEffect(function () {
|
|
1252
|
+
filterListItems({
|
|
1253
|
+
inputValue: inputValue
|
|
894
1254
|
});
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
1255
|
+
}, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
1256
|
+
var _useMultiselectUtils = useMultiselectUtils({
|
|
1257
|
+
listItems: listItems,
|
|
1258
|
+
selectAll: selectAll,
|
|
1259
|
+
selectedItems: selectedItems
|
|
1260
|
+
}),
|
|
1261
|
+
hasSelectedItems = _useMultiselectUtils.hasSelectedItems,
|
|
1262
|
+
handleListItemClicked = _useMultiselectUtils.handleListItemClicked,
|
|
1263
|
+
selectAllCheckboxState = _useMultiselectUtils.selectAllCheckboxState,
|
|
1264
|
+
clickedItemIsInSelectedItems = _useMultiselectUtils.clickedItemIsInSelectedItems,
|
|
1265
|
+
clickedItemIsSelectAll = _useMultiselectUtils.clickedItemIsSelectAll;
|
|
1266
|
+
var _useMultipleSelection = useMultipleSelection({
|
|
1267
|
+
selectedItems: selectedItems,
|
|
903
1268
|
// @ts-expect-error prop missing from library types
|
|
904
|
-
itemToString,
|
|
905
|
-
itemToKey,
|
|
906
|
-
onSelectedItemsChange
|
|
1269
|
+
itemToString: itemToString,
|
|
1270
|
+
itemToKey: itemToKey,
|
|
1271
|
+
onSelectedItemsChange: function onSelectedItemsChange(_ref4) {
|
|
1272
|
+
var newSelectedItems = _ref4.selectedItems;
|
|
907
1273
|
onChange(newSelectedItems);
|
|
908
1274
|
}
|
|
909
|
-
})
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
1275
|
+
}),
|
|
1276
|
+
getSelectedItemProps = _useMultipleSelection.getSelectedItemProps,
|
|
1277
|
+
getDropdownProps = _useMultipleSelection.getDropdownProps,
|
|
1278
|
+
reset = _useMultipleSelection.reset,
|
|
1279
|
+
_removeSelectedItem = _useMultipleSelection.removeSelectedItem,
|
|
1280
|
+
setSelectedItems = _useMultipleSelection.setSelectedItems;
|
|
1281
|
+
var stateReducer = React.useCallback(function (state, _ref5) {
|
|
1282
|
+
var changes = _ref5.changes,
|
|
1283
|
+
type = _ref5.type;
|
|
1284
|
+
if (changes.highlightedIndex !== undefined && (changes == null ? void 0 : changes.highlightedIndex) >= 0) {
|
|
1285
|
+
setLastHighlightedIndex(changes == null ? void 0 : changes.highlightedIndex);
|
|
1286
|
+
}
|
|
1287
|
+
switch (type) {
|
|
1288
|
+
// reset input value when leaving input field
|
|
1289
|
+
case useCombobox.stateChangeTypes.InputBlur:
|
|
1290
|
+
return _extends({}, changes, {
|
|
1291
|
+
inputValue: EMPTY_INPUT
|
|
1292
|
+
});
|
|
1293
|
+
// keep menu open and edit input value on item selection
|
|
1294
|
+
case useCombobox.stateChangeTypes.InputKeyDownEnter:
|
|
1295
|
+
case useCombobox.stateChangeTypes.ItemClick:
|
|
1296
|
+
{
|
|
1297
|
+
var _inputRef$current$val, _inputRef$current;
|
|
1298
|
+
return _extends({}, changes, {
|
|
1299
|
+
isOpen: true,
|
|
1300
|
+
inputValue: clearInputOnSelect ? EMPTY_INPUT : (_inputRef$current$val = inputRef == null || (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.value) != null ? _inputRef$current$val : EMPTY_INPUT
|
|
1301
|
+
});
|
|
917
1302
|
}
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
const isSpacePressedOnEmptyInput = changes.inputValue === " ";
|
|
945
|
-
if (changes.inputValue?.match(leadingWhitespaceTest)) {
|
|
946
|
-
const sanitizedInputValue = changes.inputValue.replace(
|
|
947
|
-
leadingWhitespaceTest,
|
|
948
|
-
EMPTY_INPUT
|
|
949
|
-
);
|
|
950
|
-
if (isSpacePressedOnEmptyInput) {
|
|
951
|
-
if (!state.isOpen)
|
|
952
|
-
return {
|
|
953
|
-
...changes,
|
|
954
|
-
inputValue: sanitizedInputValue,
|
|
955
|
-
isOpen: true
|
|
956
|
-
};
|
|
957
|
-
if (changes.highlightedIndex !== void 0) {
|
|
958
|
-
return {
|
|
959
|
-
...changes,
|
|
960
|
-
inputValue: sanitizedInputValue,
|
|
961
|
-
selectedItem: listItems[changes.highlightedIndex]
|
|
962
|
-
};
|
|
963
|
-
}
|
|
1303
|
+
// edit input value when selected items is updated outside component
|
|
1304
|
+
case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
|
|
1305
|
+
{
|
|
1306
|
+
var _inputRef$current$val2, _inputRef$current2;
|
|
1307
|
+
return _extends({}, changes, {
|
|
1308
|
+
inputValue: (_inputRef$current$val2 = inputRef == null || (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value) != null ? _inputRef$current$val2 : EMPTY_INPUT
|
|
1309
|
+
});
|
|
1310
|
+
}
|
|
1311
|
+
// remove leading whitespace, select item with spacebar if input is empty and filter list items
|
|
1312
|
+
case useCombobox.stateChangeTypes.InputChange:
|
|
1313
|
+
{
|
|
1314
|
+
var _changes$inputValue;
|
|
1315
|
+
var leadingWhitespaceTest = /^\s+/g;
|
|
1316
|
+
var isSpacePressedOnEmptyInput = changes.inputValue === ' ';
|
|
1317
|
+
if ((_changes$inputValue = changes.inputValue) != null && _changes$inputValue.match(leadingWhitespaceTest)) {
|
|
1318
|
+
var sanitizedInputValue = changes.inputValue.replace(leadingWhitespaceTest, EMPTY_INPUT);
|
|
1319
|
+
if (isSpacePressedOnEmptyInput) {
|
|
1320
|
+
if (!state.isOpen) return _extends({}, changes, {
|
|
1321
|
+
inputValue: sanitizedInputValue,
|
|
1322
|
+
isOpen: true
|
|
1323
|
+
});
|
|
1324
|
+
if (changes.highlightedIndex !== undefined) {
|
|
1325
|
+
return _extends({}, changes, {
|
|
1326
|
+
inputValue: sanitizedInputValue,
|
|
1327
|
+
selectedItem: listItems[changes.highlightedIndex]
|
|
1328
|
+
});
|
|
964
1329
|
}
|
|
965
1330
|
}
|
|
966
|
-
return changes;
|
|
967
1331
|
}
|
|
968
|
-
|
|
969
|
-
return changes;
|
|
1332
|
+
return changes;
|
|
970
1333
|
}
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
getItemProps,
|
|
977
|
-
getLabelProps,
|
|
978
|
-
getMenuProps,
|
|
979
|
-
getToggleButtonProps,
|
|
980
|
-
highlightedIndex,
|
|
981
|
-
setHighlightedIndex,
|
|
982
|
-
inputValue,
|
|
983
|
-
isOpen,
|
|
984
|
-
setInputValue
|
|
985
|
-
} = useCombobox({
|
|
1334
|
+
default:
|
|
1335
|
+
return changes;
|
|
1336
|
+
}
|
|
1337
|
+
}, [hideSelectAll, normalizedItems, filterListItems, initialItems]);
|
|
1338
|
+
var _useCombobox = useCombobox(_extends({
|
|
986
1339
|
defaultHighlightedIndex: lastHighlightedIndex,
|
|
987
1340
|
// after selection, highlight previously selected item.
|
|
988
1341
|
items: listItems,
|
|
989
|
-
itemToString,
|
|
1342
|
+
itemToString: itemToString,
|
|
990
1343
|
selectedItem: null,
|
|
991
|
-
stateReducer,
|
|
992
|
-
onInputValueChange(changes) {
|
|
993
|
-
updateListItems({
|
|
1344
|
+
stateReducer: stateReducer,
|
|
1345
|
+
onInputValueChange: function onInputValueChange(changes) {
|
|
1346
|
+
updateListItems({
|
|
1347
|
+
inputValue: changes.inputValue
|
|
1348
|
+
});
|
|
1349
|
+
// set highlighted item to first item after search
|
|
994
1350
|
setHighlightedIndex(hideSelectAll ? 0 : 1);
|
|
995
1351
|
setLastHighlightedIndex(hideSelectAll ? 0 : 1);
|
|
996
1352
|
},
|
|
997
|
-
onSelectedItemChange
|
|
1353
|
+
onSelectedItemChange: function onSelectedItemChange(_ref6) {
|
|
1354
|
+
var clickedItem = _ref6.selectedItem;
|
|
1355
|
+
// clickedItem means item chosen either via mouse or keyboard
|
|
998
1356
|
if (!clickedItem) return;
|
|
999
1357
|
handleListItemClicked({
|
|
1000
|
-
clickedItem,
|
|
1358
|
+
clickedItem: clickedItem,
|
|
1001
1359
|
onChange: setSelectedItems
|
|
1002
1360
|
});
|
|
1003
1361
|
},
|
|
1004
1362
|
// Accessibility
|
|
1005
|
-
getA11yStatusMessage: (options)
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
})
|
|
1012
|
-
|
|
1363
|
+
getA11yStatusMessage: function getA11yStatusMessage$1(options) {
|
|
1364
|
+
return getA11yStatusMessage(_extends({}, options, {
|
|
1365
|
+
selectAllItemIncluded: !hideSelectAll,
|
|
1366
|
+
resultCount: listItems.length
|
|
1367
|
+
}));
|
|
1368
|
+
}
|
|
1369
|
+
}, rest)),
|
|
1370
|
+
getInputProps = _useCombobox.getInputProps,
|
|
1371
|
+
getItemProps = _useCombobox.getItemProps,
|
|
1372
|
+
getLabelProps = _useCombobox.getLabelProps,
|
|
1373
|
+
getMenuProps = _useCombobox.getMenuProps,
|
|
1374
|
+
getToggleButtonProps = _useCombobox.getToggleButtonProps,
|
|
1375
|
+
highlightedIndex = _useCombobox.highlightedIndex,
|
|
1376
|
+
setHighlightedIndex = _useCombobox.setHighlightedIndex,
|
|
1377
|
+
inputValue = _useCombobox.inputValue,
|
|
1378
|
+
isOpen = _useCombobox.isOpen,
|
|
1379
|
+
setInputValue = _useCombobox.setInputValue;
|
|
1380
|
+
// calculations for floating-UI popover position
|
|
1381
|
+
var _useFloating = useFloating({
|
|
1013
1382
|
open: isOpen,
|
|
1014
|
-
placement:
|
|
1015
|
-
middleware: [
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1383
|
+
placement: 'bottom-start',
|
|
1384
|
+
middleware: [offset(space.extraSmall2), shift({
|
|
1385
|
+
padding: space.extraSmall
|
|
1386
|
+
}), size({
|
|
1387
|
+
apply: function apply(_ref7) {
|
|
1388
|
+
var rects = _ref7.rects,
|
|
1389
|
+
elements = _ref7.elements,
|
|
1390
|
+
availableHeight = _ref7.availableHeight;
|
|
1391
|
+
Object.assign(elements.floating.style, {
|
|
1392
|
+
width: rects.reference.width + "px",
|
|
1393
|
+
// Floating will flip when smaller than 10*16 px
|
|
1394
|
+
// and never exceed 20*16 px.
|
|
1395
|
+
maxHeight: clamp(10 * 16, availableHeight, 20 * 16) + "px"
|
|
1396
|
+
});
|
|
1397
|
+
}
|
|
1398
|
+
}), flip({
|
|
1399
|
+
fallbackStrategy: 'initialPlacement'
|
|
1400
|
+
})]
|
|
1401
|
+
}),
|
|
1402
|
+
refs = _useFloating.refs,
|
|
1403
|
+
floatingStyles = _useFloating.floatingStyles,
|
|
1404
|
+
update = _useFloating.update;
|
|
1405
|
+
// Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside
|
|
1406
|
+
// the useFloating hook but this requires the floating element to be conditionally rendered.
|
|
1407
|
+
// Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly
|
|
1408
|
+
// spread to the component. We therefor use this useEffect to update position. See https://floating-ui.com/docs/autoupdate#usage
|
|
1409
|
+
useEffect(function () {
|
|
1410
|
+
if (isOpen && refs.reference.current && refs.floating.current) {
|
|
1411
|
+
return autoUpdate(refs.reference.current, refs.floating.current, update);
|
|
1412
|
+
}
|
|
1413
|
+
}, [isOpen, refs.reference, refs.floating, update]);
|
|
1414
|
+
var handleOnClear = function handleOnClear() {
|
|
1415
|
+
var _inputRef$current3;
|
|
1416
|
+
(_inputRef$current3 = inputRef.current) == null || _inputRef$current3.focus();
|
|
1417
|
+
reset();
|
|
1418
|
+
};
|
|
1419
|
+
return React.createElement(BaseFormControl, _extends({
|
|
1420
|
+
className: classNames('eds-dropdown', 'eds-dropdown--multiselect', className, {
|
|
1421
|
+
'eds-dropdown--has-tooltip': labelTooltip !== undefined
|
|
1422
|
+
}),
|
|
1423
|
+
disabled: disabled,
|
|
1424
|
+
disableLabelAnimation: disableLabelAnimation,
|
|
1425
|
+
feedback: feedback,
|
|
1426
|
+
isFilled: hasSelectedItems || inputValue !== EMPTY_INPUT,
|
|
1427
|
+
label: label,
|
|
1428
|
+
labelId: getLabelProps().id,
|
|
1429
|
+
labelProps: getLabelProps(),
|
|
1430
|
+
labelTooltip: labelTooltip,
|
|
1431
|
+
onBlur: function onBlur() {
|
|
1432
|
+
return setInputValue('');
|
|
1433
|
+
},
|
|
1434
|
+
onClick: function onClick(e) {
|
|
1435
|
+
if (e.target === e.currentTarget) {
|
|
1436
|
+
var _getInputProps;
|
|
1437
|
+
(_getInputProps = getInputProps()) == null || _getInputProps.onClick == null || _getInputProps.onClick(e);
|
|
1038
1438
|
}
|
|
1039
|
-
},
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
children: [
|
|
1105
|
-
selectedItems.length > 1 ? /* @__PURE__ */ jsx(VisuallyHidden, { onClick: inputRef.current?.focus, children: ariaLabelJumpToInput }) : null,
|
|
1106
|
-
selectedItems.length <= maxChips ? selectedItems.map((selectedItem, index) => /* @__PURE__ */ jsx(
|
|
1107
|
-
SelectedItemTag,
|
|
1108
|
-
{
|
|
1109
|
-
ariaLabelChosen: ariaLabelChosenSingular,
|
|
1110
|
-
ariaLabelRemoveSelected,
|
|
1111
|
-
disabled,
|
|
1112
|
-
getSelectedItemProps,
|
|
1113
|
-
index,
|
|
1114
|
-
readOnly,
|
|
1115
|
-
removeSelectedItem: () => {
|
|
1116
|
-
removeSelectedItem(selectedItem);
|
|
1117
|
-
inputRef?.current?.focus();
|
|
1118
|
-
},
|
|
1119
|
-
selectedItem
|
|
1120
|
-
},
|
|
1121
|
-
selectedItem?.label + (typeof selectedItem?.value === "string" ? selectedItem.value : "")
|
|
1122
|
-
)) : /* @__PURE__ */ jsx(
|
|
1123
|
-
SelectedItemTag,
|
|
1124
|
-
{
|
|
1125
|
-
ariaLabelRemoveSelected: labelClearAllItems,
|
|
1126
|
-
ariaLabelChosen: "",
|
|
1127
|
-
disabled,
|
|
1128
|
-
readOnly,
|
|
1129
|
-
removeSelectedItem: handleOnClear,
|
|
1130
|
-
selectedItem: summarySelectedItems
|
|
1131
|
-
}
|
|
1132
|
-
),
|
|
1133
|
-
/* @__PURE__ */ jsx(
|
|
1134
|
-
"input",
|
|
1135
|
-
{
|
|
1136
|
-
...getInputProps({
|
|
1137
|
-
onKeyDown: (e) => {
|
|
1138
|
-
if (selectOnTab && isOpen && e.key === "Tab") {
|
|
1139
|
-
const highlitedItem = listItems[highlightedIndex];
|
|
1140
|
-
if (!highlitedItem) return;
|
|
1141
|
-
const shouldSkipTabSelection = clickedItemIsSelectAll(highlitedItem) || !clickedItemIsSelectAll(highlitedItem) && clickedItemIsInSelectedItems(highlitedItem);
|
|
1142
|
-
if (shouldSkipTabSelection) return;
|
|
1143
|
-
handleListItemClicked({
|
|
1144
|
-
clickedItem: highlitedItem,
|
|
1145
|
-
onChange: setSelectedItems
|
|
1146
|
-
});
|
|
1147
|
-
}
|
|
1148
|
-
},
|
|
1149
|
-
...getDropdownProps({
|
|
1150
|
-
preventKeyAction: isOpen,
|
|
1151
|
-
value: inputValue ?? EMPTY_INPUT,
|
|
1152
|
-
ref: mergeRefs(inputRef, ref)
|
|
1153
|
-
}),
|
|
1154
|
-
className: "eds-dropdown__input eds-form-control",
|
|
1155
|
-
disabled: readOnly || disabled,
|
|
1156
|
-
placeholder,
|
|
1157
|
-
tabIndex: disabled || readOnly ? -1 : void 0
|
|
1158
|
-
})
|
|
1159
|
-
}
|
|
1160
|
-
)
|
|
1161
|
-
]
|
|
1162
|
-
}
|
|
1163
|
-
),
|
|
1164
|
-
/* @__PURE__ */ jsx(
|
|
1165
|
-
DropdownFieldAppendix,
|
|
1166
|
-
{
|
|
1167
|
-
...getToggleButtonProps({
|
|
1168
|
-
"aria-busy": !(loading ?? resolvedItemsLoading) ? void 0 : "true"
|
|
1169
|
-
}),
|
|
1170
|
-
ariaLabelCloseList,
|
|
1171
|
-
ariaLabelOpenList,
|
|
1172
|
-
clearable,
|
|
1173
|
-
disabled: disabled || readOnly,
|
|
1174
|
-
onClear: handleOnClear,
|
|
1175
|
-
focusable: false,
|
|
1176
|
-
labelClearSelected: labelClearAllItems,
|
|
1177
|
-
isOpen,
|
|
1178
|
-
itemIsSelected: selectedItems.length > 0,
|
|
1179
|
-
loadingText,
|
|
1180
|
-
loading: loading ?? resolvedItemsLoading
|
|
1181
|
-
}
|
|
1182
|
-
)
|
|
1183
|
-
]
|
|
1439
|
+
},
|
|
1440
|
+
readOnly: readOnly,
|
|
1441
|
+
ref: refs.setReference,
|
|
1442
|
+
style: style,
|
|
1443
|
+
variant: variant,
|
|
1444
|
+
after: React.createElement(DropdownList, {
|
|
1445
|
+
ariaLabelChosenSingular: ariaLabelChosenSingular,
|
|
1446
|
+
ariaLabelSelectedItem: ariaLabelSelectedItem,
|
|
1447
|
+
floatingStyles: floatingStyles,
|
|
1448
|
+
getItemProps: getItemProps,
|
|
1449
|
+
getMenuProps: getMenuProps,
|
|
1450
|
+
highlightedIndex: highlightedIndex,
|
|
1451
|
+
isOpen: isOpen,
|
|
1452
|
+
listItems: listItems,
|
|
1453
|
+
style: listStyle,
|
|
1454
|
+
setListRef: refs.setFloating,
|
|
1455
|
+
loading: loading != null ? loading : resolvedItemsLoading,
|
|
1456
|
+
loadingText: loadingText,
|
|
1457
|
+
noMatchesText: noMatchesText,
|
|
1458
|
+
selectAllCheckboxState: selectAllCheckboxState,
|
|
1459
|
+
selectAllItem: selectAll,
|
|
1460
|
+
selectedItems: selectedItems,
|
|
1461
|
+
readOnly: readOnly
|
|
1462
|
+
})
|
|
1463
|
+
}, rest), React.createElement("div", {
|
|
1464
|
+
className: classNames('eds-dropdown--multiselect__selected-items-and-input', {
|
|
1465
|
+
'eds-dropdown--multiselect__selected-items-and-input--filled': hasSelectedItems
|
|
1466
|
+
})
|
|
1467
|
+
}, selectedItems.length > 1 ? React.createElement(VisuallyHidden, {
|
|
1468
|
+
onClick: (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.focus
|
|
1469
|
+
}, ariaLabelJumpToInput) : null, selectedItems.length <= maxChips ? selectedItems.map(function (selectedItem, index) {
|
|
1470
|
+
return React.createElement(SelectedItemTag, {
|
|
1471
|
+
ariaLabelChosen: ariaLabelChosenSingular,
|
|
1472
|
+
ariaLabelRemoveSelected: ariaLabelRemoveSelected,
|
|
1473
|
+
disabled: disabled,
|
|
1474
|
+
getSelectedItemProps: getSelectedItemProps,
|
|
1475
|
+
index: index,
|
|
1476
|
+
key: (selectedItem == null ? void 0 : selectedItem.label) + (typeof (selectedItem == null ? void 0 : selectedItem.value) === 'string' ? selectedItem.value : ''),
|
|
1477
|
+
readOnly: readOnly,
|
|
1478
|
+
removeSelectedItem: function removeSelectedItem() {
|
|
1479
|
+
var _inputRef$current5;
|
|
1480
|
+
_removeSelectedItem(selectedItem);
|
|
1481
|
+
inputRef == null || (_inputRef$current5 = inputRef.current) == null || _inputRef$current5.focus();
|
|
1482
|
+
},
|
|
1483
|
+
selectedItem: selectedItem
|
|
1484
|
+
});
|
|
1485
|
+
}) : React.createElement(SelectedItemTag, {
|
|
1486
|
+
ariaLabelRemoveSelected: labelClearAllItems,
|
|
1487
|
+
ariaLabelChosen: "",
|
|
1488
|
+
disabled: disabled,
|
|
1489
|
+
readOnly: readOnly,
|
|
1490
|
+
removeSelectedItem: handleOnClear,
|
|
1491
|
+
selectedItem: summarySelectedItems
|
|
1492
|
+
}), React.createElement("input", _extends({}, getInputProps(_extends({
|
|
1493
|
+
onKeyDown: function onKeyDown(e) {
|
|
1494
|
+
if (selectOnTab && isOpen && e.key === 'Tab') {
|
|
1495
|
+
var highlitedItem = listItems[highlightedIndex];
|
|
1496
|
+
if (!highlitedItem) return;
|
|
1497
|
+
// Skip tab selection for select all or if item already is selected
|
|
1498
|
+
var shouldSkipTabSelection = clickedItemIsSelectAll(highlitedItem) || !clickedItemIsSelectAll(highlitedItem) && clickedItemIsInSelectedItems(highlitedItem);
|
|
1499
|
+
if (shouldSkipTabSelection) return;
|
|
1500
|
+
handleListItemClicked({
|
|
1501
|
+
clickedItem: highlitedItem,
|
|
1502
|
+
onChange: setSelectedItems
|
|
1503
|
+
});
|
|
1184
1504
|
}
|
|
1185
|
-
|
|
1186
|
-
}
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1505
|
+
}
|
|
1506
|
+
}, getDropdownProps({
|
|
1507
|
+
preventKeyAction: isOpen,
|
|
1508
|
+
value: inputValue != null ? inputValue : EMPTY_INPUT,
|
|
1509
|
+
ref: mergeRefs(inputRef, ref)
|
|
1510
|
+
}), {
|
|
1511
|
+
className: 'eds-dropdown__input eds-form-control',
|
|
1512
|
+
disabled: readOnly || disabled,
|
|
1513
|
+
placeholder: placeholder,
|
|
1514
|
+
tabIndex: disabled || readOnly ? -1 : undefined
|
|
1515
|
+
}))))), React.createElement(DropdownFieldAppendix, _extends({}, getToggleButtonProps({
|
|
1516
|
+
'aria-busy': !(loading != null ? loading : resolvedItemsLoading) ? undefined : 'true'
|
|
1517
|
+
}), {
|
|
1518
|
+
ariaLabelCloseList: ariaLabelCloseList,
|
|
1519
|
+
ariaLabelOpenList: ariaLabelOpenList,
|
|
1520
|
+
clearable: clearable,
|
|
1521
|
+
disabled: disabled || readOnly,
|
|
1522
|
+
onClear: handleOnClear,
|
|
1523
|
+
focusable: false,
|
|
1524
|
+
labelClearSelected: labelClearAllItems,
|
|
1525
|
+
isOpen: isOpen,
|
|
1526
|
+
itemIsSelected: selectedItems.length > 0,
|
|
1527
|
+
loadingText: loadingText,
|
|
1528
|
+
loading: loading != null ? loading : resolvedItemsLoading
|
|
1529
|
+
})));
|
|
1530
|
+
});
|
|
1531
|
+
|
|
1532
|
+
var _excluded$1 = ["ariaLabelChosenSingular", "ariaLabelCloseList", "ariaLabelOpenList", "ariaLabelSelectedItem", "className", "clearable", "disabled", "disableLabelAnimation", "feedback", "items", "label", "labelClearSelectedItem", "labelTooltip", "listStyle", "loading", "loadingText", "noMatchesText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "selectOnTab", "style", "variant"];
|
|
1533
|
+
var Dropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
1534
|
+
var _getLabelProps, _selectedItem$label;
|
|
1535
|
+
var ariaLabelChosenSingular = _ref.ariaLabelChosenSingular,
|
|
1536
|
+
_ref$ariaLabelCloseLi = _ref.ariaLabelCloseList,
|
|
1537
|
+
ariaLabelCloseList = _ref$ariaLabelCloseLi === void 0 ? 'Lukk liste med valg' : _ref$ariaLabelCloseLi,
|
|
1538
|
+
_ref$ariaLabelOpenLis = _ref.ariaLabelOpenList,
|
|
1539
|
+
ariaLabelOpenList = _ref$ariaLabelOpenLis === void 0 ? 'Åpne liste med valg' : _ref$ariaLabelOpenLis,
|
|
1540
|
+
ariaLabelSelectedItem = _ref.ariaLabelSelectedItem,
|
|
1541
|
+
className = _ref.className,
|
|
1542
|
+
_ref$clearable = _ref.clearable,
|
|
1543
|
+
clearable = _ref$clearable === void 0 ? false : _ref$clearable,
|
|
1544
|
+
_ref$disabled = _ref.disabled,
|
|
1545
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
1546
|
+
disableLabelAnimation = _ref.disableLabelAnimation,
|
|
1547
|
+
feedback = _ref.feedback,
|
|
1548
|
+
initialItems = _ref.items,
|
|
1549
|
+
label = _ref.label,
|
|
1550
|
+
_ref$labelClearSelect = _ref.labelClearSelectedItem,
|
|
1551
|
+
labelClearSelectedItem = _ref$labelClearSelect === void 0 ? 'fjern valgt' : _ref$labelClearSelect,
|
|
1552
|
+
labelTooltip = _ref.labelTooltip,
|
|
1553
|
+
listStyle = _ref.listStyle,
|
|
1554
|
+
loading = _ref.loading,
|
|
1555
|
+
_ref$loadingText = _ref.loadingText,
|
|
1556
|
+
loadingText = _ref$loadingText === void 0 ? 'Laster resultater …' : _ref$loadingText,
|
|
1557
|
+
_ref$noMatchesText = _ref.noMatchesText,
|
|
1558
|
+
noMatchesText = _ref$noMatchesText === void 0 ? 'Ingen tilgjengelige valg …' : _ref$noMatchesText,
|
|
1559
|
+
onChange = _ref.onChange,
|
|
1560
|
+
placeholder = _ref.placeholder,
|
|
1561
|
+
prepend = _ref.prepend,
|
|
1562
|
+
_ref$readOnly = _ref.readOnly,
|
|
1563
|
+
readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
|
|
1564
|
+
selectedItem = _ref.selectedItem,
|
|
1565
|
+
_ref$selectOnBlur = _ref.selectOnBlur,
|
|
1566
|
+
selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
|
|
1567
|
+
_ref$selectOnTab = _ref.selectOnTab,
|
|
1568
|
+
selectOnTab = _ref$selectOnTab === void 0 ? false : _ref$selectOnTab,
|
|
1569
|
+
style = _ref.style,
|
|
1570
|
+
_ref$variant = _ref.variant,
|
|
1571
|
+
variant = _ref$variant === void 0 ? 'information' : _ref$variant,
|
|
1572
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
|
|
1573
|
+
var _useResolvedItems = useResolvedItems(initialItems),
|
|
1574
|
+
normalizedItems = _useResolvedItems.items,
|
|
1575
|
+
resolvedItemsLoading = _useResolvedItems.loading;
|
|
1576
|
+
var isFilled = selectedItem !== null || placeholder !== undefined;
|
|
1577
|
+
var _useSelect = useSelect({
|
|
1230
1578
|
items: normalizedItems,
|
|
1231
|
-
defaultHighlightedIndex: selectedItem ?
|
|
1232
|
-
selectedItem,
|
|
1233
|
-
stateReducer(_,
|
|
1234
|
-
|
|
1579
|
+
defaultHighlightedIndex: selectedItem ? undefined : 0,
|
|
1580
|
+
selectedItem: selectedItem,
|
|
1581
|
+
stateReducer: function stateReducer(_, _ref2) {
|
|
1582
|
+
var changes = _ref2.changes,
|
|
1583
|
+
type = _ref2.type;
|
|
1584
|
+
var toggleButtonIsFocused = typeof document !== 'undefined' && document.activeElement === refs.reference.current;
|
|
1235
1585
|
switch (type) {
|
|
1236
1586
|
case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowDown:
|
|
1237
1587
|
case useSelect.stateChangeTypes.ToggleButtonKeyDownArrowUp:
|
|
1238
|
-
if (!toggleButtonIsFocused) return {
|
|
1588
|
+
if (!toggleButtonIsFocused) return _extends({}, changes, {
|
|
1589
|
+
isOpen: false
|
|
1590
|
+
});
|
|
1239
1591
|
}
|
|
1240
1592
|
return changes;
|
|
1241
1593
|
},
|
|
1242
|
-
onStateChange
|
|
1594
|
+
onStateChange: function onStateChange(_ref3) {
|
|
1595
|
+
var type = _ref3.type,
|
|
1596
|
+
newSelectedItem = _ref3.selectedItem;
|
|
1243
1597
|
switch (type) {
|
|
1244
1598
|
case useSelect.stateChangeTypes.ToggleButtonBlur:
|
|
1245
1599
|
if (!selectOnBlur) return;
|
|
1246
1600
|
}
|
|
1247
|
-
if (newSelectedItem ===
|
|
1248
|
-
onChange
|
|
1601
|
+
if (newSelectedItem === undefined) return;
|
|
1602
|
+
onChange == null || onChange(newSelectedItem != null ? newSelectedItem : null);
|
|
1249
1603
|
},
|
|
1250
|
-
itemToString
|
|
1251
|
-
})
|
|
1252
|
-
|
|
1604
|
+
itemToString: itemToString
|
|
1605
|
+
}),
|
|
1606
|
+
isOpen = _useSelect.isOpen,
|
|
1607
|
+
getItemProps = _useSelect.getItemProps,
|
|
1608
|
+
getLabelProps = _useSelect.getLabelProps,
|
|
1609
|
+
getMenuProps = _useSelect.getMenuProps,
|
|
1610
|
+
getToggleButtonProps = _useSelect.getToggleButtonProps,
|
|
1611
|
+
highlightedIndex = _useSelect.highlightedIndex,
|
|
1612
|
+
selectItem = _useSelect.selectItem,
|
|
1613
|
+
reset = _useSelect.reset;
|
|
1614
|
+
// calculations for floating-UI popover position
|
|
1615
|
+
var _useFloating = useFloating({
|
|
1253
1616
|
open: isOpen,
|
|
1254
|
-
placement:
|
|
1255
|
-
middleware: [
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
refs.reference.current
|
|
1283
|
-
}
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
{
|
|
1320
|
-
ariaLabelChosenSingular,
|
|
1321
|
-
ariaLabelSelectedItem,
|
|
1322
|
-
floatingStyles,
|
|
1323
|
-
getItemProps,
|
|
1324
|
-
getMenuProps,
|
|
1325
|
-
highlightedIndex,
|
|
1326
|
-
isOpen,
|
|
1327
|
-
listItems: normalizedItems,
|
|
1328
|
-
noMatchesText,
|
|
1329
|
-
style: listStyle,
|
|
1330
|
-
setListRef: refs.setFloating,
|
|
1331
|
-
loading: loading ?? resolvedItemsLoading,
|
|
1332
|
-
loadingText,
|
|
1333
|
-
selectedItems: selectedItem !== null ? [selectedItem] : [],
|
|
1334
|
-
readOnly
|
|
1335
|
-
}
|
|
1336
|
-
),
|
|
1337
|
-
...rest,
|
|
1338
|
-
append: void 0,
|
|
1339
|
-
children: [
|
|
1340
|
-
/* @__PURE__ */ jsx("div", { className: "eds-dropdown__selected-item", children: selectedItem?.label ?? /* @__PURE__ */ jsx(
|
|
1341
|
-
"div",
|
|
1342
|
-
{
|
|
1343
|
-
className: classNames(
|
|
1344
|
-
"eds-dropdown__selected-item__placeholder",
|
|
1345
|
-
{
|
|
1346
|
-
"eds-dropdown__selected-item__placeholder--readonly": readOnly
|
|
1347
|
-
}
|
|
1348
|
-
),
|
|
1349
|
-
children: placeholder
|
|
1350
|
-
}
|
|
1351
|
-
) }),
|
|
1352
|
-
/* @__PURE__ */ jsx(
|
|
1353
|
-
DropdownFieldAppendix,
|
|
1354
|
-
{
|
|
1355
|
-
"aria-busy": !(loading ?? resolvedItemsLoading) ? void 0 : "true",
|
|
1356
|
-
"aria-expanded": isOpen,
|
|
1357
|
-
clearable,
|
|
1358
|
-
onClear: handleOnClear,
|
|
1359
|
-
disabled: disabled || readOnly,
|
|
1360
|
-
focusable: false,
|
|
1361
|
-
labelClearSelected: labelClearSelectedItem,
|
|
1362
|
-
isOpen,
|
|
1363
|
-
itemIsSelected: selectedItem !== null,
|
|
1364
|
-
ariaLabelCloseList,
|
|
1365
|
-
ariaLabelOpenList,
|
|
1366
|
-
loading: false,
|
|
1367
|
-
loadingText: void 0
|
|
1368
|
-
}
|
|
1369
|
-
)
|
|
1370
|
-
]
|
|
1371
|
-
}
|
|
1372
|
-
);
|
|
1373
|
-
}
|
|
1374
|
-
);
|
|
1375
|
-
const error = "error";
|
|
1376
|
-
const NativeDropdown = forwardRef(
|
|
1377
|
-
({
|
|
1378
|
-
className,
|
|
1379
|
-
disabled = false,
|
|
1380
|
-
disableLabelAnimation,
|
|
1381
|
-
feedback,
|
|
1382
|
-
items,
|
|
1383
|
-
label,
|
|
1384
|
-
loadingText,
|
|
1385
|
-
onChange,
|
|
1386
|
-
prepend,
|
|
1387
|
-
readOnly = false,
|
|
1388
|
-
selectedItem,
|
|
1389
|
-
style,
|
|
1390
|
-
value,
|
|
1391
|
-
variant,
|
|
1392
|
-
...rest
|
|
1393
|
-
}, ref) => {
|
|
1394
|
-
const { items: normalizedItems, loading } = useResolvedItems(items);
|
|
1395
|
-
const nativeDropdownId = useRandomId("eds-dropdown-native");
|
|
1396
|
-
return /* @__PURE__ */ jsx(
|
|
1397
|
-
BaseFormControl,
|
|
1398
|
-
{
|
|
1399
|
-
disabled,
|
|
1400
|
-
readOnly,
|
|
1401
|
-
prepend,
|
|
1402
|
-
append: /* @__PURE__ */ jsx(
|
|
1403
|
-
FieldAppend,
|
|
1404
|
-
{
|
|
1405
|
-
hidden: disabled || readOnly,
|
|
1406
|
-
loading,
|
|
1407
|
-
loadingText
|
|
1408
|
-
}
|
|
1409
|
-
),
|
|
1410
|
-
className,
|
|
1411
|
-
style,
|
|
1412
|
-
label,
|
|
1413
|
-
labelId: nativeDropdownId,
|
|
1414
|
-
variant,
|
|
1415
|
-
feedback,
|
|
1416
|
-
disableLabelAnimation,
|
|
1417
|
-
isFilled: true,
|
|
1418
|
-
children: /* @__PURE__ */ jsx(
|
|
1419
|
-
"select",
|
|
1420
|
-
{
|
|
1421
|
-
"aria-invalid": variant === "negative" || variant === error,
|
|
1422
|
-
"aria-labelledby": nativeDropdownId,
|
|
1423
|
-
"aria-busy": loading,
|
|
1424
|
-
className: "eds-form-control eds-dropdown--native",
|
|
1425
|
-
disabled: disabled || readOnly,
|
|
1426
|
-
onChange: (event) => {
|
|
1427
|
-
onChange?.({
|
|
1428
|
-
value: event.target.value,
|
|
1429
|
-
selectedItem: normalizedItems.find(
|
|
1430
|
-
(item) => item.value === event.target.value
|
|
1431
|
-
) ?? null,
|
|
1432
|
-
target: event.target
|
|
1433
|
-
});
|
|
1434
|
-
},
|
|
1435
|
-
value: value ?? selectedItem?.value ?? void 0,
|
|
1436
|
-
ref,
|
|
1437
|
-
...rest,
|
|
1438
|
-
children: normalizedItems.map((item) => /* @__PURE__ */ jsx("option", { value: item.value, children: item.label }, item.value))
|
|
1439
|
-
}
|
|
1440
|
-
)
|
|
1617
|
+
placement: 'bottom-start',
|
|
1618
|
+
middleware: [offset(space.extraSmall2), shift({
|
|
1619
|
+
padding: space.extraSmall
|
|
1620
|
+
}), size({
|
|
1621
|
+
apply: function apply(_ref4) {
|
|
1622
|
+
var rects = _ref4.rects,
|
|
1623
|
+
elements = _ref4.elements,
|
|
1624
|
+
availableHeight = _ref4.availableHeight;
|
|
1625
|
+
Object.assign(elements.floating.style, {
|
|
1626
|
+
width: rects.reference.width + "px",
|
|
1627
|
+
// Floating will flip when smaller than 10*16 px
|
|
1628
|
+
// and never exceed 20*16 px.
|
|
1629
|
+
maxHeight: clamp(10 * 16, availableHeight, 20 * 16) + "px"
|
|
1630
|
+
});
|
|
1631
|
+
}
|
|
1632
|
+
}), flip({
|
|
1633
|
+
fallbackStrategy: 'initialPlacement'
|
|
1634
|
+
})]
|
|
1635
|
+
}),
|
|
1636
|
+
refs = _useFloating.refs,
|
|
1637
|
+
floatingStyles = _useFloating.floatingStyles,
|
|
1638
|
+
update = _useFloating.update;
|
|
1639
|
+
// Update floating-ui position on scroll etc. Floating-ui's autoupdate is usually used inside
|
|
1640
|
+
// the useFloating hook but this requires the floating element to be conditionally rendered.
|
|
1641
|
+
// Downshift doesn't work correctly when conditionally rendered since props and refs aren't correctly
|
|
1642
|
+
// spread to the component. We therefor use this useEffect to update position. See https://floating-ui.com/docs/autoupdate#usage
|
|
1643
|
+
useEffect(function () {
|
|
1644
|
+
if (isOpen && refs.reference.current && refs.floating.current) {
|
|
1645
|
+
return autoUpdate(refs.reference.current, refs.floating.current, update);
|
|
1646
|
+
}
|
|
1647
|
+
}, [isOpen, refs.reference, refs.floating, update]);
|
|
1648
|
+
var handleOnClear = function handleOnClear() {
|
|
1649
|
+
var _refs$reference$curre;
|
|
1650
|
+
reset();
|
|
1651
|
+
(_refs$reference$curre = refs.reference.current) == null || _refs$reference$curre.focus();
|
|
1652
|
+
};
|
|
1653
|
+
return React.createElement(BaseFormControl, _extends({
|
|
1654
|
+
className: classNames('eds-dropdown', className, {
|
|
1655
|
+
'eds-dropdown--has-tooltip': labelTooltip !== undefined
|
|
1656
|
+
}),
|
|
1657
|
+
disableLabelAnimation: disableLabelAnimation,
|
|
1658
|
+
feedback: feedback,
|
|
1659
|
+
isFilled: isFilled,
|
|
1660
|
+
labelProps: getLabelProps(),
|
|
1661
|
+
labelTooltip: labelTooltip,
|
|
1662
|
+
prepend: prepend,
|
|
1663
|
+
style: style,
|
|
1664
|
+
variant: variant
|
|
1665
|
+
}, getToggleButtonProps({
|
|
1666
|
+
ref: mergeRefs(ref, refs.setReference),
|
|
1667
|
+
'aria-disabled': disabled,
|
|
1668
|
+
'aria-label': disabled ? 'Disabled dropdown' : '',
|
|
1669
|
+
disabled: disabled,
|
|
1670
|
+
readOnly: readOnly,
|
|
1671
|
+
label: label,
|
|
1672
|
+
labelId: (_getLabelProps = getLabelProps()) == null ? void 0 : _getLabelProps.id,
|
|
1673
|
+
children: undefined,
|
|
1674
|
+
tabIndex: disabled || readOnly ? -1 : 0,
|
|
1675
|
+
onKeyDown: function onKeyDown(e) {
|
|
1676
|
+
if (isOpen && e.key === 'Tab') {
|
|
1677
|
+
var highlitedItem = normalizedItems[highlightedIndex];
|
|
1678
|
+
// we don't want to clear selection with tab
|
|
1679
|
+
if ((selectOnTab || selectOnBlur) && highlitedItem && highlitedItem !== selectedItem) {
|
|
1680
|
+
selectItem(highlitedItem);
|
|
1681
|
+
}
|
|
1441
1682
|
}
|
|
1442
|
-
|
|
1443
|
-
}
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1683
|
+
}
|
|
1684
|
+
}), {
|
|
1685
|
+
after: React.createElement(DropdownList, {
|
|
1686
|
+
ariaLabelChosenSingular: ariaLabelChosenSingular,
|
|
1687
|
+
ariaLabelSelectedItem: ariaLabelSelectedItem,
|
|
1688
|
+
floatingStyles: floatingStyles,
|
|
1689
|
+
getItemProps: getItemProps,
|
|
1690
|
+
getMenuProps: getMenuProps,
|
|
1691
|
+
highlightedIndex: highlightedIndex,
|
|
1692
|
+
isOpen: isOpen,
|
|
1693
|
+
listItems: normalizedItems,
|
|
1694
|
+
noMatchesText: noMatchesText,
|
|
1695
|
+
style: listStyle,
|
|
1696
|
+
setListRef: refs.setFloating,
|
|
1697
|
+
loading: loading != null ? loading : resolvedItemsLoading,
|
|
1698
|
+
loadingText: loadingText,
|
|
1699
|
+
selectedItems: selectedItem !== null ? [selectedItem] : [],
|
|
1700
|
+
readOnly: readOnly
|
|
1701
|
+
})
|
|
1702
|
+
}, rest, {
|
|
1703
|
+
// Append is not supported as of now
|
|
1704
|
+
append: undefined
|
|
1705
|
+
}), React.createElement("div", {
|
|
1706
|
+
className: "eds-dropdown__selected-item"
|
|
1707
|
+
}, (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : React.createElement("div", {
|
|
1708
|
+
className: classNames('eds-dropdown__selected-item__placeholder', {
|
|
1709
|
+
'eds-dropdown__selected-item__placeholder--readonly': readOnly
|
|
1710
|
+
})
|
|
1711
|
+
}, placeholder)), React.createElement(DropdownFieldAppendix, {
|
|
1712
|
+
"aria-busy": !(loading != null ? loading : resolvedItemsLoading) ? undefined : 'true',
|
|
1713
|
+
"aria-expanded": isOpen,
|
|
1714
|
+
clearable: clearable,
|
|
1715
|
+
onClear: handleOnClear,
|
|
1716
|
+
disabled: disabled || readOnly,
|
|
1717
|
+
focusable: false,
|
|
1718
|
+
labelClearSelected: labelClearSelectedItem,
|
|
1719
|
+
isOpen: isOpen,
|
|
1720
|
+
itemIsSelected: selectedItem !== null,
|
|
1721
|
+
ariaLabelCloseList: ariaLabelCloseList,
|
|
1722
|
+
ariaLabelOpenList: ariaLabelOpenList,
|
|
1723
|
+
loading: false,
|
|
1724
|
+
loadingText: undefined
|
|
1725
|
+
}));
|
|
1726
|
+
});
|
|
1727
|
+
|
|
1728
|
+
var _excluded = ["className", "disabled", "disableLabelAnimation", "feedback", "items", "label", "loadingText", "onChange", "prepend", "readOnly", "selectedItem", "style", "value", "variant"];
|
|
1729
|
+
/** @deprecated use variant="negative" instead */
|
|
1730
|
+
var error = 'error';
|
|
1731
|
+
var NativeDropdown = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
1732
|
+
var _ref2;
|
|
1733
|
+
var className = _ref.className,
|
|
1734
|
+
_ref$disabled = _ref.disabled,
|
|
1735
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
1736
|
+
disableLabelAnimation = _ref.disableLabelAnimation,
|
|
1737
|
+
feedback = _ref.feedback,
|
|
1738
|
+
items = _ref.items,
|
|
1739
|
+
label = _ref.label,
|
|
1740
|
+
loadingText = _ref.loadingText,
|
|
1741
|
+
_onChange = _ref.onChange,
|
|
1742
|
+
prepend = _ref.prepend,
|
|
1743
|
+
_ref$readOnly = _ref.readOnly,
|
|
1744
|
+
readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
|
|
1745
|
+
selectedItem = _ref.selectedItem,
|
|
1746
|
+
style = _ref.style,
|
|
1747
|
+
value = _ref.value,
|
|
1748
|
+
variant = _ref.variant,
|
|
1749
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded);
|
|
1750
|
+
var _useResolvedItems = useResolvedItems(items),
|
|
1751
|
+
normalizedItems = _useResolvedItems.items,
|
|
1752
|
+
loading = _useResolvedItems.loading;
|
|
1753
|
+
var nativeDropdownId = useRandomId('eds-dropdown-native');
|
|
1754
|
+
return React.createElement(BaseFormControl, {
|
|
1755
|
+
disabled: disabled,
|
|
1756
|
+
readOnly: readOnly,
|
|
1757
|
+
prepend: prepend,
|
|
1758
|
+
append: React.createElement(FieldAppend, {
|
|
1759
|
+
hidden: disabled || readOnly,
|
|
1760
|
+
loading: loading,
|
|
1761
|
+
loadingText: loadingText
|
|
1762
|
+
}),
|
|
1763
|
+
className: className,
|
|
1764
|
+
style: style,
|
|
1765
|
+
label: label,
|
|
1766
|
+
labelId: nativeDropdownId,
|
|
1767
|
+
variant: variant,
|
|
1768
|
+
feedback: feedback,
|
|
1769
|
+
disableLabelAnimation: disableLabelAnimation,
|
|
1770
|
+
isFilled: true
|
|
1771
|
+
}, React.createElement("select", _extends({
|
|
1772
|
+
"aria-invalid": variant === 'negative' || variant === error,
|
|
1773
|
+
"aria-labelledby": nativeDropdownId,
|
|
1774
|
+
"aria-busy": loading,
|
|
1775
|
+
className: "eds-form-control eds-dropdown--native",
|
|
1776
|
+
disabled: disabled || readOnly,
|
|
1777
|
+
onChange: function onChange(event) {
|
|
1778
|
+
var _normalizedItems$find;
|
|
1779
|
+
_onChange == null || _onChange({
|
|
1780
|
+
value: event.target.value,
|
|
1781
|
+
selectedItem: (_normalizedItems$find = normalizedItems.find(function (item) {
|
|
1782
|
+
return item.value === event.target.value;
|
|
1783
|
+
})) != null ? _normalizedItems$find : null,
|
|
1784
|
+
target: event.target
|
|
1785
|
+
});
|
|
1786
|
+
},
|
|
1787
|
+
value: (_ref2 = value != null ? value : selectedItem == null ? void 0 : selectedItem.value) != null ? _ref2 : undefined,
|
|
1788
|
+
ref: ref
|
|
1789
|
+
}, rest), normalizedItems.map(function (item) {
|
|
1790
|
+
return React.createElement("option", {
|
|
1791
|
+
key: item.value,
|
|
1792
|
+
value: item.value
|
|
1793
|
+
}, item.label);
|
|
1794
|
+
})));
|
|
1795
|
+
});
|
|
1796
|
+
var FieldAppend = function FieldAppend(_ref3) {
|
|
1797
|
+
var loading = _ref3.loading,
|
|
1798
|
+
loadingText = _ref3.loadingText,
|
|
1799
|
+
hidden = _ref3.hidden;
|
|
1450
1800
|
if (loading) {
|
|
1451
|
-
return
|
|
1801
|
+
return React.createElement("div", {
|
|
1802
|
+
className: "eds-dropdown-native__loading-dots"
|
|
1803
|
+
}, React.createElement(LoadingDots, {
|
|
1804
|
+
"aria-label": loadingText
|
|
1805
|
+
}));
|
|
1452
1806
|
}
|
|
1453
1807
|
if (hidden) {
|
|
1454
|
-
return
|
|
1808
|
+
return React.createElement(React.Fragment, null);
|
|
1455
1809
|
}
|
|
1456
|
-
return
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
export {
|
|
1460
|
-
Dropdown,
|
|
1461
|
-
MultiSelect,
|
|
1462
|
-
NativeDropdown,
|
|
1463
|
-
SearchableDropdown
|
|
1810
|
+
return React.createElement(DownArrowIcon, {
|
|
1811
|
+
inline: true
|
|
1812
|
+
});
|
|
1464
1813
|
};
|
|
1814
|
+
|
|
1815
|
+
warnAboutMissingStyles('dropdown', 'form', 'a11y', 'chip');
|
|
1816
|
+
|
|
1817
|
+
export { Dropdown, MultiSelect, NativeDropdown, SearchableDropdown };
|
|
1465
1818
|
//# sourceMappingURL=dropdown.esm.js.map
|