@entur/dropdown 7.3.1 → 7.3.2-beta.1

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