@entur/dropdown 4.0.10 → 5.0.0-beta.0

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,13 +1,15 @@
1
1
  import { mergeRefs, debounce, useRandomId, warnAboutMissingStyles } from '@entur/utils';
2
2
  import React, { useState, useRef } from 'react';
3
- import Downshift, { useSelect, useCombobox } from 'downshift';
3
+ import Downshift, { useSelect, useCombobox, useMultipleSelection } from 'downshift';
4
4
  import classNames from 'classnames';
5
- import { BaseFormControl, VariantProvider, FeedbackText } from '@entur/form';
5
+ import { BaseFormControl, VariantProvider, FeedbackText, Checkbox } from '@entur/form';
6
6
  import { CheckIcon, DownArrowIcon, CloseSmallIcon, CloseIcon } from '@entur/icons';
7
7
  import { VisuallyHidden } from '@entur/a11y';
8
8
  import { LoadingDots } from '@entur/loader';
9
9
  import { space } from '@entur/tokens';
10
10
  import { IconButton } from '@entur/button';
11
+ import { TagChip } from '@entur/chip';
12
+ import { Tooltip } from '@entur/tooltip';
11
13
 
12
14
  function _regeneratorRuntime() {
13
15
  _regeneratorRuntime = function () {
@@ -370,7 +372,7 @@ function _objectWithoutPropertiesLoose(source, excluded) {
370
372
  return target;
371
373
  }
372
374
 
373
- var _excluded$a = ["children", "onChange", "onInputValueChange", "highlightFirstItemOnOpen", "className", "style", "searchable"];
375
+ var _excluded$d = ["children", "onChange", "onInputValueChange", "highlightFirstItemOnOpen", "className", "style", "searchable"];
374
376
  var DownshiftContext = /*#__PURE__*/React.createContext(null);
375
377
  var DownshiftProvider = function DownshiftProvider(_ref) {
376
378
  var children = _ref.children,
@@ -388,7 +390,7 @@ var DownshiftProvider = function DownshiftProvider(_ref) {
388
390
  style = _ref.style,
389
391
  _ref$searchable = _ref.searchable,
390
392
  searchable = _ref$searchable === void 0 ? false : _ref$searchable,
391
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$a);
393
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$d);
392
394
  var handleStateChange = function handleStateChange(changes, stateAndHelpers) {
393
395
  if (changes.type === Downshift.stateChangeTypes.controlledPropUpdatedSelectedItem) {
394
396
  return;
@@ -448,10 +450,10 @@ var useDownshift = function useDownshift() {
448
450
  return context;
449
451
  };
450
452
 
451
- var _excluded$9 = ["items"];
453
+ var _excluded$c = ["items"];
452
454
  var DropdownList$1 = function DropdownList(_ref) {
453
455
  var items = _ref.items,
454
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$9);
456
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$c);
455
457
  var _useDownshift = useDownshift(),
456
458
  highlightedIndex = _useDownshift.highlightedIndex,
457
459
  isOpen = _useDownshift.isOpen,
@@ -499,17 +501,17 @@ var DropdownToggleButton$1 = function DropdownToggleButton() {
499
501
  }), React.createElement(DownArrowIcon, null));
500
502
  };
501
503
 
502
- var _excluded$8 = ["className", "children"];
504
+ var _excluded$b = ["className", "children"];
503
505
  var DropdownLoadingDots = function DropdownLoadingDots(_ref) {
504
506
  var className = _ref.className,
505
507
  children = _ref.children,
506
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
508
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$b);
507
509
  return React.createElement("div", _extends({
508
510
  className: classNames('eds-inline-spinner', className)
509
511
  }, rest), React.createElement(LoadingDots, null), React.createElement(VisuallyHidden, null, children));
510
512
  };
511
513
 
512
- var _excluded$7 = ["children", "className", "items", "loading", "loadingText", "placeholder", "style", "listStyle", "clearable", "label", "isFilled", "disableLabelAnimation"];
514
+ var _excluded$a = ["children", "className", "items", "loading", "loadingText", "placeholder", "style", "listStyle", "clearable", "label", "isFilled", "disableLabelAnimation"];
513
515
  var BaseDropdown = function BaseDropdown(_ref) {
514
516
  var children = _ref.children,
515
517
  className = _ref.className,
@@ -525,14 +527,14 @@ var BaseDropdown = function BaseDropdown(_ref) {
525
527
  _ref$isFilled = _ref.isFilled,
526
528
  isFilled = _ref$isFilled === void 0 ? false : _ref$isFilled,
527
529
  disableLabelAnimation = _ref.disableLabelAnimation,
528
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$7);
530
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$a);
529
531
  var _useDownshift = useDownshift(),
530
532
  getLabelProps = _useDownshift.getLabelProps;
531
533
  return React.createElement("div", {
532
534
  className: "eds-dropdown-wrapper",
533
535
  style: style
534
536
  }, React.createElement(BaseFormControl, _extends({
535
- append: React.createElement(Appendix$2, {
537
+ append: React.createElement(Appendix$1, {
536
538
  clearable: clearable,
537
539
  loading: loading,
538
540
  loadingText: loadingText,
@@ -568,7 +570,7 @@ var ClearButton$1 = function ClearButton(_ref2) {
568
570
  className: "eds-dropdown__divider"
569
571
  }));
570
572
  };
571
- var Appendix$2 = function Appendix(_ref3) {
573
+ var Appendix$1 = function Appendix(_ref3) {
572
574
  var clearable = _ref3.clearable,
573
575
  loading = _ref3.loading,
574
576
  loadingText = _ref3.loadingText,
@@ -582,7 +584,7 @@ var Appendix$2 = function Appendix(_ref3) {
582
584
  return clearable ? React.createElement(React.Fragment, null, React.createElement(ClearButton$1, null), " ", React.createElement(DropdownToggleButton$1, null)) : React.createElement(DropdownToggleButton$1, null);
583
585
  };
584
586
 
585
- var _excluded$6 = ["disabled", "placeholder", "selectOnTab", "openOnFocus", "listStyle", "items", "label", "disableLabelAnimation", "loading", "loadingText", "className", "clearable"];
587
+ var _excluded$9 = ["disabled", "placeholder", "selectOnTab", "openOnFocus", "listStyle", "items", "label", "disableLabelAnimation", "loading", "loadingText", "className", "clearable"];
586
588
  var RegularDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
587
589
  var disabled = _ref.disabled,
588
590
  _ref$placeholder = _ref.placeholder,
@@ -599,7 +601,7 @@ var RegularDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
599
601
  loadingText = _ref.loadingText,
600
602
  className = _ref.className,
601
603
  clearable = _ref.clearable,
602
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
604
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$9);
603
605
  var _useDownshift = useDownshift(),
604
606
  getToggleButtonProps = _useDownshift.getToggleButtonProps,
605
607
  selectedItem = _useDownshift.selectedItem,
@@ -660,7 +662,7 @@ var RegularDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
660
662
  }), selectedItem ? selectedItem.label : placeholder));
661
663
  });
662
664
 
663
- var _excluded$5 = ["disabled", "className", "items", "loading", "loadingText", "readOnly", "prepend", "selectOnTab", "openOnFocus", "listStyle", "clearable", "itemFilter", "label", "disableLabelAnimation", "placeholder"];
665
+ var _excluded$8 = ["disabled", "className", "items", "loading", "loadingText", "readOnly", "prepend", "selectOnTab", "openOnFocus", "listStyle", "clearable", "itemFilter", "label", "disableLabelAnimation", "placeholder"];
664
666
  function LowerCaseFilterTest(item, input) {
665
667
  if (!input) {
666
668
  return true;
@@ -692,7 +694,7 @@ var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
692
694
  label = _ref.label,
693
695
  disableLabelAnimation = _ref.disableLabelAnimation,
694
696
  placeholder = _ref.placeholder,
695
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
697
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
696
698
  var _useDownshift = useDownshift(),
697
699
  getInputProps = _useDownshift.getInputProps,
698
700
  inputValue = _useDownshift.inputValue,
@@ -881,7 +883,7 @@ debounceTimeout) {
881
883
  if (isItemsFunction) {
882
884
  fetchItems('');
883
885
  }
884
- }, [isItemsFunction, fetchItems]);
886
+ }, [isItemsFunction]); // eslint-disable-line react-hooks/exhaustive-deps
885
887
  return {
886
888
  items: normalizedItems,
887
889
  loading: isItemsFunction ? loading : false,
@@ -889,7 +891,7 @@ debounceTimeout) {
889
891
  };
890
892
  };
891
893
 
892
- var _excluded$4 = ["highlightFirstItemOnOpen", "debounceTimeout", "disabled", "feedback", "items", "label", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "searchable", "selectOnTab", "openOnFocus", "variant", "value", "clearable", "className", "style", "listStyle", "itemFilter", "disableLabelAnimation"];
894
+ var _excluded$7 = ["highlightFirstItemOnOpen", "debounceTimeout", "disabled", "feedback", "items", "label", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "searchable", "selectOnTab", "openOnFocus", "variant", "value", "clearable", "className", "style", "listStyle", "itemFilter", "disableLabelAnimation"];
893
895
  var Dropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
894
896
  var highlightFirstItemOnOpen = _ref.highlightFirstItemOnOpen,
895
897
  debounceTimeout = _ref.debounceTimeout,
@@ -917,7 +919,7 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
917
919
  listStyle = _ref.listStyle,
918
920
  itemFilter = _ref.itemFilter,
919
921
  disableLabelAnimation = _ref.disableLabelAnimation,
920
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
922
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$7);
921
923
  var _useResolvedItems = useResolvedItems(items, debounceTimeout),
922
924
  normalizedItems = _useResolvedItems.items,
923
925
  loading = _useResolvedItems.loading,
@@ -964,7 +966,7 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
964
966
  }, searchAbleProps))));
965
967
  });
966
968
 
967
- var _excluded$3 = ["className", "disabled", "readOnly", "items", "loadingText", "prepend", "style", "label", "variant", "feedback", "disableLabelAnimation"];
969
+ var _excluded$6 = ["className", "disabled", "readOnly", "items", "loadingText", "prepend", "style", "label", "variant", "feedback", "disableLabelAnimation"];
968
970
  var NativeDropdown = function NativeDropdown(_ref) {
969
971
  var className = _ref.className,
970
972
  _ref$disabled = _ref.disabled,
@@ -979,7 +981,7 @@ var NativeDropdown = function NativeDropdown(_ref) {
979
981
  variant = _ref.variant,
980
982
  feedback = _ref.feedback,
981
983
  disableLabelAnimation = _ref.disableLabelAnimation,
982
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
984
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
983
985
  var _useResolvedItems = useResolvedItems(items),
984
986
  normalizedItems = _useResolvedItems.items,
985
987
  loading = _useResolvedItems.loading;
@@ -1022,7 +1024,7 @@ var NativeDropdown = function NativeDropdown(_ref) {
1022
1024
  })));
1023
1025
  };
1024
1026
 
1025
- var _excluded$2 = ["items", "itemsSelectedLabel", "label", "feedback", "variant", "disabled", "readOnly", "onChange", "className", "clearable", "loading", "loadingText", "openOnFocus", "style", "listStyle", "initialSelectedItems", "debounceTimeout"];
1027
+ var _excluded$5 = ["className", "clearable", "debounceTimeout", "disabled", "feedback", "initialSelectedItems", "items", "itemsSelectedLabel", "label", "listStyle", "loading", "loadingText", "onChange", "openOnFocus", "readOnly", "style", "variant"];
1026
1028
  var MultiSelectContext = /*#__PURE__*/React.createContext(null);
1027
1029
  var useMultiSelectContext = function useMultiSelectContext() {
1028
1030
  var context = React.useContext(MultiSelectContext);
@@ -1049,36 +1051,36 @@ actionAndChanges) {
1049
1051
  }
1050
1052
  }
1051
1053
  var MultiSelect = function MultiSelect(_ref) {
1052
- var input = _ref.items,
1054
+ var className = _ref.className,
1055
+ _ref$clearable = _ref.clearable,
1056
+ clearable = _ref$clearable === void 0 ? false : _ref$clearable,
1057
+ debounceTimeout = _ref.debounceTimeout,
1058
+ disabled = _ref.disabled,
1059
+ feedback = _ref.feedback,
1060
+ _ref$initialSelectedI = _ref.initialSelectedItems,
1061
+ initialSelectedItems = _ref$initialSelectedI === void 0 ? [] : _ref$initialSelectedI,
1062
+ input = _ref.items,
1053
1063
  _ref$itemsSelectedLab = _ref.itemsSelectedLabel,
1054
1064
  itemsSelectedLabel = _ref$itemsSelectedLab === void 0 ? function (items) {
1055
1065
  return SelectedItemsLabel(items);
1056
1066
  } : _ref$itemsSelectedLab,
1057
1067
  label = _ref.label,
1058
- feedback = _ref.feedback,
1059
- variant = _ref.variant,
1060
- disabled = _ref.disabled,
1061
- _ref$readOnly = _ref.readOnly,
1062
- readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1063
- _ref$onChange = _ref.onChange,
1064
- onChange = _ref$onChange === void 0 ? function () {
1065
- return undefined;
1066
- } : _ref$onChange,
1067
- className = _ref.className,
1068
- _ref$clearable = _ref.clearable,
1069
- clearable = _ref$clearable === void 0 ? false : _ref$clearable,
1068
+ listStyle = _ref.listStyle,
1070
1069
  _ref$loading = _ref.loading,
1071
1070
  loading = _ref$loading === void 0 ? false : _ref$loading,
1072
1071
  _ref$loadingText = _ref.loadingText,
1073
1072
  loadingText = _ref$loadingText === void 0 ? '' : _ref$loadingText,
1073
+ _ref$onChange = _ref.onChange,
1074
+ onChange = _ref$onChange === void 0 ? function () {
1075
+ return undefined;
1076
+ } : _ref$onChange,
1074
1077
  _ref$openOnFocus = _ref.openOnFocus,
1075
1078
  openOnFocus = _ref$openOnFocus === void 0 ? false : _ref$openOnFocus,
1079
+ _ref$readOnly = _ref.readOnly,
1080
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1076
1081
  style = _ref.style,
1077
- listStyle = _ref.listStyle,
1078
- _ref$initialSelectedI = _ref.initialSelectedItems,
1079
- initialSelectedItems = _ref$initialSelectedI === void 0 ? [] : _ref$initialSelectedI,
1080
- debounceTimeout = _ref.debounceTimeout,
1081
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
1082
+ variant = _ref.variant,
1083
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
1082
1084
  var _useResolvedItems = useResolvedItems(input, debounceTimeout),
1083
1085
  items = _useResolvedItems.items;
1084
1086
  var _useState = useState(initialSelectedItems),
@@ -1144,7 +1146,7 @@ var MultiSelect = function MultiSelect(_ref) {
1144
1146
  isFilled: selectedItems.length > 0 || isOpen,
1145
1147
  disabled: disabled,
1146
1148
  readOnly: readOnly,
1147
- append: React.createElement(Appendix$1, {
1149
+ append: React.createElement(Appendix, {
1148
1150
  hasSelected: clearable && selectedItems.length > 0,
1149
1151
  loading: loading,
1150
1152
  loadingText: loadingText,
@@ -1213,7 +1215,7 @@ var ClearButton = function ClearButton(_ref3) {
1213
1215
  className: "eds-dropdown__divider"
1214
1216
  }));
1215
1217
  };
1216
- var Appendix$1 = function Appendix(_ref4) {
1218
+ var Appendix = function Appendix(_ref4) {
1217
1219
  var loading = _ref4.loading,
1218
1220
  loadingText = _ref4.loadingText,
1219
1221
  readOnly = _ref4.readOnly,
@@ -1263,46 +1265,91 @@ function SelectedItemsLabel(items) {
1263
1265
  }).toString() : items.length + " elementer valgt";
1264
1266
  }
1265
1267
 
1266
- var _excluded$1 = ["selectedItem", "isOpen", "getMenuProps", "getItemProps", "filteredItems", "highlightedIndex", "listStyle"];
1268
+ var _excluded$4 = ["selectedItems", "listItems", "inputValue", "isOpen", "getMenuProps", "getItemProps", "highlightedIndex", "showSelectAllInList", "loading", "selectAllCheckboxState", "selectAllItem", "listStyle", "noMatchesText", "loadingText", "selectedItemAriaLabel"];
1267
1269
  var DropdownList = function DropdownList(_ref) {
1268
- var selectedItem = _ref.selectedItem,
1270
+ var selectedItems = _ref.selectedItems,
1271
+ listItems = _ref.listItems,
1269
1272
  isOpen = _ref.isOpen,
1270
1273
  getMenuProps = _ref.getMenuProps,
1271
1274
  getItemProps = _ref.getItemProps,
1272
- filteredItems = _ref.filteredItems,
1273
1275
  highlightedIndex = _ref.highlightedIndex,
1276
+ _ref$loading = _ref.loading,
1277
+ loading = _ref$loading === void 0 ? false : _ref$loading,
1278
+ selectAllCheckboxState = _ref.selectAllCheckboxState,
1279
+ selectAllItem = _ref.selectAllItem,
1274
1280
  listStyle = _ref.listStyle,
1275
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
1276
- return React.createElement("ul", _extends({
1277
- className: classNames('eds-searchable-dropdown__list', {
1278
- 'eds-searchable-dropdown__list--open': isOpen
1279
- })
1280
- }, getMenuProps(), {
1281
+ _ref$noMatchesText = _ref.noMatchesText,
1282
+ noMatchesText = _ref$noMatchesText === void 0 ? 'Ingen treff for søket' : _ref$noMatchesText,
1283
+ _ref$loadingText = _ref.loadingText,
1284
+ loadingText = _ref$loadingText === void 0 ? 'Laster inn …' : _ref$loadingText,
1285
+ _ref$selectedItemAria = _ref.selectedItemAriaLabel,
1286
+ selectedItemAriaLabel = _ref$selectedItemAria === void 0 ? ', valgt element' : _ref$selectedItemAria,
1287
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
1288
+ var isMultiselect = selectAllItem !== undefined;
1289
+ var isNoMatches = !loading && (listItems.length === 0 || listItems.length === 1 && listItems[0].value === (selectAllItem == null ? void 0 : selectAllItem.value));
1290
+ var itemIsSelected = function itemIsSelected(item) {
1291
+ return selectedItems.some(function (selectedItem) {
1292
+ return selectedItem.value === item.value;
1293
+ });
1294
+ };
1295
+ var selectAllListItemContent = function selectAllListItemContent() {
1296
+ return React.createElement(React.Fragment, null, React.createElement(Checkbox, {
1297
+ checked: selectAllCheckboxState == null ? void 0 : selectAllCheckboxState(),
1298
+ "aria-hidden": "true",
1299
+ onChange: function onChange() {
1300
+ return;
1301
+ }
1302
+ }), React.createElement("span", {
1303
+ className: "eds-dropdown__list__item-text"
1304
+ }, selectAllItem == null ? void 0 : selectAllItem.label));
1305
+ };
1306
+ var listItemContent = function listItemContent(item) {
1307
+ return React.createElement(React.Fragment, null, React.createElement(Checkbox, {
1308
+ style: !isMultiselect ? {
1309
+ display: 'none'
1310
+ } : {},
1311
+ checked: itemIsSelected(item),
1312
+ "aria-hidden": "true",
1313
+ onChange: function onChange() {
1314
+ return;
1315
+ }
1316
+ }), React.createElement("span", {
1317
+ className: "eds-dropdown__list__item-text"
1318
+ }, item.label, React.createElement(VisuallyHidden, null, selectedItemAriaLabel)), item.icons && React.createElement("span", null, item.icons.map(function (Icon, index) {
1319
+ return React.createElement(Icon, {
1320
+ key: index,
1321
+ inline: true,
1322
+ className: "eds-dropdown__list__item-icon"
1323
+ });
1324
+ })));
1325
+ };
1326
+ return React.createElement("ul", _extends({}, getMenuProps(), {
1327
+ className: classNames('eds-dropdown__list', {
1328
+ 'eds-dropdown__list--open': isOpen
1329
+ }),
1281
1330
  style: _extends({}, rest.style, listStyle)
1282
- }), isOpen ? filteredItems.map(function (item, index) {
1283
- return (
1284
- // eslint-disable-next-line react/jsx-key
1285
- React.createElement("li", _extends({
1286
- className: classNames('eds-searchable-dropdown__list__item', {
1287
- 'eds-searchable-dropdown__list__item--highlighted': highlightedIndex === index,
1288
- 'eds-searchable-dropdown__list__item--selected': (selectedItem == null ? void 0 : selectedItem.value) === item.value
1289
- })
1290
- }, getItemProps({
1291
- key: "" + index + item.value,
1292
- item: item,
1293
- index: index
1294
- })), React.createElement("span", null, item.label), item.icons && React.createElement("span", null, item.icons.map(function (Icon, index) {
1295
- return React.createElement(Icon, {
1296
- key: index,
1297
- inline: true,
1298
- className: "eds-searchable-dropdown__list__item-icon"
1299
- });
1300
- })), (selectedItem == null ? void 0 : selectedItem.value) === item.value && React.createElement(CheckIcon, null))
1301
- );
1302
- }) : null);
1331
+ }), isOpen && listItems.length > 0 && listItems.map(function (item, index) {
1332
+ var itemIsSelectAll = item.value === (selectAllItem == null ? void 0 : selectAllItem.value);
1333
+ if (itemIsSelectAll && listItems.length <= 2) return React.createElement(React.Fragment, null);
1334
+ return React.createElement("li", _extends({
1335
+ key: item.value,
1336
+ className: classNames('eds-dropdown__list__item', {
1337
+ 'eds-dropdown__list__item--select-all': itemIsSelectAll,
1338
+ 'eds-dropdown__list__item--highlighted': highlightedIndex === index,
1339
+ 'eds-dropdown__list__item--selected': !isMultiselect && itemIsSelected(item)
1340
+ })
1341
+ }, getItemProps({
1342
+ key: "" + index + item.value,
1343
+ item: item,
1344
+ index: index
1345
+ })), itemIsSelectAll ? selectAllListItemContent() : listItemContent(item));
1346
+ }), isOpen && isNoMatches && React.createElement("li", {
1347
+ className: "eds-dropdown__list__item"
1348
+ }, noMatchesText), isOpen && loading && React.createElement("li", {
1349
+ className: "eds-dropdown__list__item"
1350
+ }, loadingText));
1303
1351
  };
1304
1352
 
1305
- var _excluded = ["items", "selectedItem", "onChange", "label", "placeholder", "clearable", "openOnFocus", "readonly", "feedback", "variant", "className", "listStyle"];
1306
1353
  function lowerCaseFilterTest(item, input) {
1307
1354
  if (!input) {
1308
1355
  return true;
@@ -1311,69 +1358,279 @@ function lowerCaseFilterTest(item, input) {
1311
1358
  var inputRegex = new RegExp(sanitizeEscapeCharacters, 'i');
1312
1359
  return inputRegex.test(item.label);
1313
1360
  }
1361
+ var itemToString = function itemToString(item) {
1362
+ return item ? item.label : '';
1363
+ };
1364
+ var useMultiselectUtils = function useMultiselectUtils(_ref) {
1365
+ var listItems = _ref.listItems,
1366
+ selectedItems = _ref.selectedItems,
1367
+ selectAllValue = _ref.selectAllValue;
1368
+ var hasSelectedItems = selectedItems.length > 0;
1369
+ var listItemsWithoutSelectAll = listItems.filter(function (item) {
1370
+ return item.value !== selectAllValue;
1371
+ });
1372
+ var allListItemsAreSelected = listItemsWithoutSelectAll.filter(function (item) {
1373
+ return !selectedItems.includes(item);
1374
+ }).length === 0;
1375
+ var someListItemsAreSelected = listItemsWithoutSelectAll.some(function (item) {
1376
+ return selectedItems.includes(item);
1377
+ });
1378
+ var addClickedItemToSelectedItems = function addClickedItemToSelectedItems(clickedItem, onChange) {
1379
+ return onChange([].concat(selectedItems, [clickedItem]));
1380
+ };
1381
+ var clickedItemIsInSelectedItems = function clickedItemIsInSelectedItems(clickedItem) {
1382
+ return selectedItems.some(function (selectedItem) {
1383
+ return selectedItem.value === clickedItem.value;
1384
+ });
1385
+ };
1386
+ var clickedItemIsSelectAll = function clickedItemIsSelectAll(clickedItem) {
1387
+ return clickedItem.value === selectAllValue;
1388
+ };
1389
+ var removeClickedItemFromSelectedItems = function removeClickedItemFromSelectedItems(clickedItem, onChange) {
1390
+ return onChange(selectedItems.filter(function (selectedItem) {
1391
+ return selectedItem.value !== clickedItem.value;
1392
+ }));
1393
+ };
1394
+ var selectAllCheckboxState = function selectAllCheckboxState() {
1395
+ if (allListItemsAreSelected) return true;
1396
+ if (someListItemsAreSelected) return 'indeterminate';
1397
+ return false;
1398
+ };
1399
+ var selectAllUnselectedItemsInListItems = function selectAllUnselectedItemsInListItems(onChange) {
1400
+ onChange([].concat(selectedItems, listItemsWithoutSelectAll.filter(function (item) {
1401
+ return !selectedItems.includes(item);
1402
+ })));
1403
+ };
1404
+ var unselectAllListItems = function unselectAllListItems(onChange) {
1405
+ onChange(selectedItems.filter(function (item) {
1406
+ return !listItemsWithoutSelectAll.includes(item);
1407
+ }));
1408
+ };
1409
+ return {
1410
+ addClickedItemToSelectedItems: addClickedItemToSelectedItems,
1411
+ allListItemsAreSelected: allListItemsAreSelected,
1412
+ clickedItemIsInSelectedItems: clickedItemIsInSelectedItems,
1413
+ clickedItemIsSelectAll: clickedItemIsSelectAll,
1414
+ hasSelectedItems: hasSelectedItems,
1415
+ listItemsWithoutSelectAll: listItemsWithoutSelectAll,
1416
+ removeClickedItemFromSelectedItems: removeClickedItemFromSelectedItems,
1417
+ selectAllCheckboxState: selectAllCheckboxState,
1418
+ selectAllUnselectedItemsInListItems: selectAllUnselectedItemsInListItems,
1419
+ someListItemsAreSelected: someListItemsAreSelected,
1420
+ unselectAllListItems: unselectAllListItems
1421
+ };
1422
+ };
1423
+
1424
+ var _excluded$3 = ["tabIndex"];
1425
+ var SelectedElementsTag = function SelectedElementsTag(_ref) {
1426
+ var getSelectedItemProps = _ref.getSelectedItemProps,
1427
+ removeSelectedItem = _ref.removeSelectedItem,
1428
+ selectedItem = _ref.selectedItem,
1429
+ index = _ref.index,
1430
+ ariaLabelRemoveSelected = _ref.ariaLabelRemoveSelected;
1431
+ var _getSelectedItemProps = getSelectedItemProps({
1432
+ selectedItem: selectedItem,
1433
+ index: index
1434
+ }),
1435
+ selectedItemProps = _objectWithoutPropertiesLoose(_getSelectedItemProps, _excluded$3);
1436
+ return React.createElement(TagChip, _extends({
1437
+ className: classNames('eds-dropdown__selected-element-tag')
1438
+ }, selectedItemProps, {
1439
+ onClose: function onClose(e) {
1440
+ e.stopPropagation();
1441
+ removeSelectedItem(selectedItem);
1442
+ },
1443
+ closeButtonAriaLabel: selectedItem.label + ", " + ariaLabelRemoveSelected + " ",
1444
+ key: selectedItem.value
1445
+ }), React.createElement("span", {
1446
+ "aria-hidden": "true"
1447
+ }, selectedItem.label));
1448
+ };
1449
+ var FieldAppend = function FieldAppend(_ref2) {
1450
+ var clearable = _ref2.clearable,
1451
+ readOnly = _ref2.readOnly,
1452
+ getToggleButtonProps = _ref2.getToggleButtonProps,
1453
+ selectedItems = _ref2.selectedItems,
1454
+ _ref2$loading = _ref2.loading,
1455
+ loading = _ref2$loading === void 0 ? false : _ref2$loading,
1456
+ _ref2$loadingText = _ref2.loadingText,
1457
+ loadingText = _ref2$loadingText === void 0 ? 'Laster resultater …' : _ref2$loadingText,
1458
+ ariaLabelClearItems = _ref2.ariaLabelClearItems,
1459
+ clearSelectedItemsLabel = _ref2.clearSelectedItemsLabel,
1460
+ isOpen = _ref2.isOpen,
1461
+ onClear = _ref2.onClear,
1462
+ _ref2$focusable = _ref2.focusable,
1463
+ focusable = _ref2$focusable === void 0 ? false : _ref2$focusable;
1464
+ if (loading) {
1465
+ return React.createElement(DropdownLoadingDots, null, loadingText);
1466
+ }
1467
+ if (readOnly) {
1468
+ return null;
1469
+ }
1470
+ return React.createElement("div", {
1471
+ className: "eds-dropdown-appendix"
1472
+ }, clearable && (selectedItems == null ? void 0 : selectedItems.length) > 0 && selectedItems[0] !== null && React.createElement(React.Fragment, null, React.createElement(ClearableButton, {
1473
+ onClear: onClear,
1474
+ focusable: focusable,
1475
+ clearSelectedItemsLabel: clearSelectedItemsLabel,
1476
+ ariaLabelClearItems: ariaLabelClearItems
1477
+ }), React.createElement("div", {
1478
+ className: "eds-dropdown-appendix__divider"
1479
+ })), React.createElement(ToggleButton, {
1480
+ getToggleButtonProps: getToggleButtonProps,
1481
+ isOpen: isOpen,
1482
+ focusable: focusable
1483
+ }));
1484
+ };
1485
+ var ClearableButton = function ClearableButton(_ref3) {
1486
+ var onClear = _ref3.onClear,
1487
+ _ref3$clearSelectedIt = _ref3.clearSelectedItemsLabel,
1488
+ clearSelectedItemsLabel = _ref3$clearSelectedIt === void 0 ? 'Fjern valgte' : _ref3$clearSelectedIt,
1489
+ _ref3$ariaLabelClearI = _ref3.ariaLabelClearItems,
1490
+ ariaLabelClearItems = _ref3$ariaLabelClearI === void 0 ? 'Fjern valgte' : _ref3$ariaLabelClearI,
1491
+ _ref3$focusable = _ref3.focusable,
1492
+ focusable = _ref3$focusable === void 0 ? false : _ref3$focusable;
1493
+ return React.createElement(Tooltip, {
1494
+ "aria-hidden": "true",
1495
+ placement: "right",
1496
+ content: clearSelectedItemsLabel
1497
+ }, React.createElement(IconButton, {
1498
+ className: "eds-dropdown-appendix__clear-button",
1499
+ type: "button",
1500
+ tabIndex: focusable ? 0 : 1,
1501
+ onClick: onClear,
1502
+ "aria-label": ariaLabelClearItems
1503
+ }, React.createElement(CloseSmallIcon, {
1504
+ "aria-hidden": "true"
1505
+ })));
1506
+ };
1507
+ var ToggleButton = function ToggleButton(_ref4) {
1508
+ var getToggleButtonProps = _ref4.getToggleButtonProps,
1509
+ isOpen = _ref4.isOpen,
1510
+ _ref4$closeAriaLabel = _ref4.closeAriaLabel,
1511
+ closeAriaLabel = _ref4$closeAriaLabel === void 0 ? 'Lukk liste med valg' : _ref4$closeAriaLabel,
1512
+ _ref4$openAriaLabel = _ref4.openAriaLabel,
1513
+ openAriaLabel = _ref4$openAriaLabel === void 0 ? 'Åpne liste med valg' : _ref4$openAriaLabel,
1514
+ _ref4$focusable = _ref4.focusable,
1515
+ focusable = _ref4$focusable === void 0 ? false : _ref4$focusable;
1516
+ return React.createElement(IconButton, _extends({}, getToggleButtonProps({
1517
+ className: classNames('eds-dropdown-appendix__toggle-button', {
1518
+ 'eds-dropdown-appendix__toggle-button--open': isOpen
1519
+ })
1520
+ }), {
1521
+ "aria-label": isOpen ? closeAriaLabel : openAriaLabel,
1522
+ tabIndex: focusable ? 0 : 1,
1523
+ type: "button"
1524
+ }), React.createElement(DownArrowIcon, {
1525
+ "aria-hidden": "true"
1526
+ }));
1527
+ };
1528
+
1529
+ var _excluded$2 = ["className", "clearable", "debounceTimeout", "disableLabelAnimation", "feedback", "itemFilter", "items", "label", "listStyle", "onChange", "openOnFocus", "placeholder", "readonly", "selectedItem", "selectOnBlur", "variant"];
1314
1530
  // TODO Husk å @deprecate searchable-prop-en til Dropdown når denne komponenten skal ha official release
1315
1531
  // TODO Husk å generelt legge inn støtte for typeof value === string
1316
1532
  var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1317
1533
  var _selectedItem$label;
1318
- var items = _ref.items,
1319
- value = _ref.selectedItem,
1320
- onChange = _ref.onChange,
1321
- label = _ref.label,
1322
- placeholder = _ref.placeholder,
1534
+ var className = _ref.className,
1323
1535
  _ref$clearable = _ref.clearable,
1324
1536
  clearable = _ref$clearable === void 0 ? false : _ref$clearable,
1537
+ debounceTimeout = _ref.debounceTimeout,
1538
+ _ref$disableLabelAnim = _ref.disableLabelAnimation,
1539
+ disableLabelAnimation = _ref$disableLabelAnim === void 0 ? false : _ref$disableLabelAnim,
1540
+ feedback = _ref.feedback,
1541
+ _ref$itemFilter = _ref.itemFilter,
1542
+ itemFilter = _ref$itemFilter === void 0 ? lowerCaseFilterTest : _ref$itemFilter,
1543
+ initialItems = _ref.items,
1544
+ label = _ref.label,
1545
+ listStyle = _ref.listStyle,
1546
+ onChange = _ref.onChange,
1325
1547
  _ref$openOnFocus = _ref.openOnFocus,
1326
1548
  openOnFocus = _ref$openOnFocus === void 0 ? false : _ref$openOnFocus,
1549
+ placeholder = _ref.placeholder,
1327
1550
  _ref$readonly = _ref.readonly,
1328
1551
  readonly = _ref$readonly === void 0 ? false : _ref$readonly,
1329
- feedback = _ref.feedback,
1552
+ value = _ref.selectedItem,
1553
+ _ref$selectOnBlur = _ref.selectOnBlur,
1554
+ selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1330
1555
  _ref$variant = _ref.variant,
1331
1556
  variant = _ref$variant === void 0 ? 'info' : _ref$variant,
1332
- className = _ref.className,
1333
- listStyle = _ref.listStyle,
1334
- rest = _objectWithoutPropertiesLoose(_ref, _excluded);
1335
- var _React$useState = React.useState(items),
1336
- filteredItems = _React$useState[0],
1337
- setFilteredItems = _React$useState[1];
1557
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
1338
1558
  var _useState = useState(false),
1339
1559
  hideSelectedItem = _useState[0],
1340
1560
  setHideSelectedItem = _useState[1];
1341
1561
  var inputRef = useRef(null);
1342
- var stateReducer = React.useCallback(function (_, actionAndChanges) {
1343
- var type = actionAndChanges.type,
1344
- changes = actionAndChanges.changes;
1562
+ var _useResolvedItems = useResolvedItems(initialItems, debounceTimeout),
1563
+ normalizedItems = _useResolvedItems.items,
1564
+ loading = _useResolvedItems.loading,
1565
+ fetchItems = _useResolvedItems.fetchItems;
1566
+ var _React$useState = React.useState(normalizedItems),
1567
+ listItems = _React$useState[0],
1568
+ setListItems = _React$useState[1];
1569
+ var filterListItems = function filterListItems(_ref2) {
1570
+ var inputValue = _ref2.inputValue;
1571
+ return setListItems(normalizedItems.filter(function (item) {
1572
+ return itemFilter(item, inputValue);
1573
+ }));
1574
+ };
1575
+ React.useEffect(function () {
1576
+ filterListItems({
1577
+ inputValue: inputValue
1578
+ });
1579
+ }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps
1580
+ var stateReducer = React.useCallback(function (_, _ref3) {
1581
+ var type = _ref3.type,
1582
+ changes = _ref3.changes;
1345
1583
  switch (type) {
1346
1584
  case useCombobox.stateChangeTypes.ItemClick:
1347
1585
  case useCombobox.stateChangeTypes.InputKeyDownEnter:
1348
1586
  case useCombobox.stateChangeTypes.InputBlur:
1349
1587
  case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
1350
- return _extends({}, changes, changes.selectedItem && {
1351
- inputValue: ''
1352
- });
1588
+ {
1589
+ filterListItems({
1590
+ inputValue: ''
1591
+ });
1592
+ return _extends({}, changes, {
1593
+ inputValue: '' // reset input value to show placeholder on focus
1594
+ });
1595
+ }
1596
+
1597
+ case useCombobox.stateChangeTypes.InputChange:
1598
+ {
1599
+ var _changes$inputValue;
1600
+ var leadingWhitespaceTest = /^\s+/g;
1601
+ if ((_changes$inputValue = changes.inputValue) != null && _changes$inputValue.match(leadingWhitespaceTest)) setInputValue(changes.inputValue.replace(leadingWhitespaceTest, ''));else {
1602
+ var _changes$inputValue2, _changes$inputValue3;
1603
+ fetchItems((_changes$inputValue2 = changes.inputValue) != null ? _changes$inputValue2 : '');
1604
+ filterListItems({
1605
+ inputValue: (_changes$inputValue3 = changes.inputValue) != null ? _changes$inputValue3 : ''
1606
+ });
1607
+ }
1608
+ return changes;
1609
+ }
1353
1610
  default:
1354
1611
  return changes;
1355
1612
  }
1356
- }, []);
1613
+ }, [fetchItems, filterListItems]);
1357
1614
  var _useCombobox = useCombobox(_extends({
1358
- onInputValueChange: function onInputValueChange(_ref2) {
1359
- var inputValue = _ref2.inputValue;
1360
- setFilteredItems(items.filter(function (item) {
1361
- return lowerCaseFilterTest(item, inputValue);
1362
- }));
1363
- },
1364
- items: filteredItems,
1365
- itemToString: function itemToString(item) {
1366
- if (item) return item.value;
1367
- return '';
1368
- },
1369
- stateReducer: stateReducer,
1615
+ items: listItems,
1370
1616
  selectedItem: value,
1371
- onSelectedItemChange: function onSelectedItemChange(_ref3) {
1372
- var newSelectedItem = _ref3.selectedItem;
1373
- return onChange(newSelectedItem != null ? newSelectedItem : null);
1617
+ itemToString: itemToString,
1618
+ stateReducer: stateReducer,
1619
+ onStateChange: function onStateChange(_ref4) {
1620
+ var type = _ref4.type,
1621
+ clickedItem = _ref4.selectedItem;
1622
+ switch (type) {
1623
+ // @ts-expect-error This falltrough is wanted
1624
+ case useCombobox.stateChangeTypes.InputBlur:
1625
+ if (!selectOnBlur) break;
1626
+ case useCombobox.stateChangeTypes.InputKeyDownEnter: // eslint-disable-line no-fallthrough
1627
+ case useCombobox.stateChangeTypes.ItemClick:
1628
+ onChange(clickedItem != null ? clickedItem : null);
1629
+ }
1374
1630
  }
1375
1631
  }, rest)),
1376
1632
  isOpen = _useCombobox.isOpen,
1633
+ openMenu = _useCombobox.openMenu,
1377
1634
  getToggleButtonProps = _useCombobox.getToggleButtonProps,
1378
1635
  getLabelProps = _useCombobox.getLabelProps,
1379
1636
  getMenuProps = _useCombobox.getMenuProps,
@@ -1382,39 +1639,46 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1382
1639
  highlightedIndex = _useCombobox.highlightedIndex,
1383
1640
  getItemProps = _useCombobox.getItemProps,
1384
1641
  selectedItem = _useCombobox.selectedItem,
1385
- openMenu = _useCombobox.openMenu,
1386
- inputValue = _useCombobox.inputValue;
1642
+ inputValue = _useCombobox.inputValue,
1643
+ setInputValue = _useCombobox.setInputValue;
1387
1644
  return React.createElement("div", {
1388
- className: "eds-searchable-dropdown__wrapper"
1645
+ className: "eds-dropdown__wrapper"
1389
1646
  }, React.createElement(BaseFormControl, _extends({
1390
- append: React.createElement(Appendix, {
1391
- selectedItem: selectedItem,
1647
+ append: React.createElement(FieldAppend, {
1648
+ selectedItems: [selectedItem],
1392
1649
  isOpen: isOpen,
1393
1650
  clearable: clearable,
1394
1651
  loading: false,
1395
1652
  loadingText: '',
1396
1653
  readOnly: readonly,
1397
- onChange: onChange,
1654
+ onClear: function onClear() {
1655
+ var _inputRef$current;
1656
+ onChange(null);
1657
+ setInputValue('');
1658
+ (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
1659
+ if (typeof initialItems === 'function') fetchItems(inputValue != null ? inputValue : '');
1660
+ },
1398
1661
  getToggleButtonProps: getToggleButtonProps
1399
1662
  }),
1400
- className: classNames('eds-searchable-dropdown', className),
1663
+ disableLabelAnimation: disableLabelAnimation,
1664
+ className: classNames('eds-dropdown', className),
1401
1665
  label: label,
1402
- isFilled: selectedItem ? true : false,
1666
+ isFilled: selectedItem || inputValue !== '',
1403
1667
  feedback: feedback,
1404
1668
  variant: variant,
1405
1669
  readOnly: readonly,
1406
1670
  labelProps: getLabelProps()
1407
1671
  }, getComboboxProps(), rest), !hideSelectedItem && selectedItem && !inputValue && React.createElement("span", {
1408
- className: "eds-searchable-dropdown__selected-item__wrapper"
1672
+ className: "eds-dropdown__selected-item__wrapper"
1409
1673
  }, React.createElement("span", {
1410
- className: "eds-searchable-dropdown__selected-item",
1674
+ className: "eds-dropdown__selected-item",
1411
1675
  onClick: function onClick() {
1412
- var _inputRef$current;
1413
- return (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
1676
+ var _inputRef$current2;
1677
+ return (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.focus();
1414
1678
  }
1415
1679
  }, selectedItem.label)), React.createElement("input", _extends({
1416
1680
  placeholder: (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : placeholder,
1417
- className: "eds-searchable-dropdown__input eds-form-control"
1681
+ className: "eds-dropdown__input eds-form-control"
1418
1682
  }, getInputProps({
1419
1683
  onFocus: function onFocus() {
1420
1684
  if (!isOpen && openOnFocus) openMenu();
@@ -1425,54 +1689,340 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1425
1689
  },
1426
1690
  ref: inputRef
1427
1691
  })))), React.createElement(DropdownList, {
1428
- selectedItem: selectedItem,
1692
+ selectedItems: selectedItem !== null ? [selectedItem] : [],
1429
1693
  isOpen: isOpen,
1430
- filteredItems: filteredItems,
1694
+ listItems: listItems,
1431
1695
  highlightedIndex: highlightedIndex,
1432
1696
  listStyle: listStyle,
1433
1697
  getMenuProps: getMenuProps,
1434
- getItemProps: getItemProps
1698
+ getItemProps: getItemProps,
1699
+ loading: loading
1435
1700
  }));
1436
1701
  };
1437
- var Appendix = function Appendix(_ref4) {
1438
- var clearable = _ref4.clearable,
1439
- readOnly = _ref4.readOnly,
1440
- getToggleButtonProps = _ref4.getToggleButtonProps,
1441
- selectedItem = _ref4.selectedItem,
1442
- isOpen = _ref4.isOpen,
1443
- onChange = _ref4.onChange;
1444
- // TODO implement loading / async
1445
- // if (loading) {
1446
- // return <DropdownLoadingDots>{loadingText}</DropdownLoadingDots>;
1447
- // }
1448
- if (readOnly) {
1449
- return null;
1450
- }
1451
- return React.createElement("div", {
1452
- style: {
1453
- display: 'flex',
1454
- alignItems: 'center'
1702
+
1703
+ var _excluded$1 = ["ariaLabelRemoveSelected", "className", "clearable", "debounceTimeout", "feedback", "hideSelectAll", "items", "label", "listStyle", "onChange", "openOnFocus", "placeholder", "readonly", "selectAllLabel", "selectedItems", "selectOnBlur", "style", "variant"];
1704
+ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1705
+ var _ref$ariaLabelRemoveS = _ref.ariaLabelRemoveSelected,
1706
+ ariaLabelRemoveSelected = _ref$ariaLabelRemoveS === void 0 ? 'trykk for å fjerne valg' : _ref$ariaLabelRemoveS,
1707
+ className = _ref.className,
1708
+ _ref$clearable = _ref.clearable,
1709
+ clearable = _ref$clearable === void 0 ? false : _ref$clearable,
1710
+ feedback = _ref.feedback,
1711
+ _ref$hideSelectAll = _ref.hideSelectAll,
1712
+ hideSelectAll = _ref$hideSelectAll === void 0 ? false : _ref$hideSelectAll,
1713
+ initialItems = _ref.items,
1714
+ label = _ref.label,
1715
+ listStyle = _ref.listStyle,
1716
+ onChange = _ref.onChange,
1717
+ _ref$openOnFocus = _ref.openOnFocus,
1718
+ openOnFocus = _ref$openOnFocus === void 0 ? false : _ref$openOnFocus,
1719
+ placeholder = _ref.placeholder,
1720
+ _ref$readonly = _ref.readonly,
1721
+ readonly = _ref$readonly === void 0 ? false : _ref$readonly,
1722
+ _ref$selectAllLabel = _ref.selectAllLabel,
1723
+ selectAllLabel = _ref$selectAllLabel === void 0 ? 'Velg alle' : _ref$selectAllLabel,
1724
+ selectedItems = _ref.selectedItems,
1725
+ _ref$selectOnBlur = _ref.selectOnBlur,
1726
+ selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1727
+ style = _ref.style,
1728
+ _ref$variant = _ref.variant,
1729
+ variant = _ref$variant === void 0 ? 'info' : _ref$variant,
1730
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
1731
+ var _React$useState = React.useState(0),
1732
+ lastHighlightedIndex = _React$useState[0],
1733
+ setLastHighlightedIndex = _React$useState[1];
1734
+ var inputRef = useRef(null);
1735
+ var _useResolvedItems = useResolvedItems(initialItems),
1736
+ normalizedItems = _useResolvedItems.items,
1737
+ loading = _useResolvedItems.loading,
1738
+ fetchItems = _useResolvedItems.fetchItems;
1739
+ var selectAll = {
1740
+ value: useRandomId('select-all'),
1741
+ label: selectAllLabel
1742
+ };
1743
+ var _useState = useState([].concat(!hideSelectAll ? [selectAll] : [], normalizedItems)),
1744
+ listItems = _useState[0],
1745
+ setListItems = _useState[1];
1746
+ var filterListItems = function filterListItems(_ref2) {
1747
+ var inputValue = _ref2.inputValue;
1748
+ return setListItems([].concat(!hideSelectAll ? [selectAll] : [], normalizedItems.filter(function (item) {
1749
+ return lowerCaseFilterTest(item, inputValue);
1750
+ })));
1751
+ };
1752
+ React.useEffect(function () {
1753
+ filterListItems({
1754
+ inputValue: inputValue
1755
+ });
1756
+ }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps
1757
+ var _useMultiselectUtils = useMultiselectUtils({
1758
+ listItems: listItems,
1759
+ selectAllValue: selectAll.value,
1760
+ selectedItems: selectedItems
1761
+ }),
1762
+ addClickedItemToSelectedItems = _useMultiselectUtils.addClickedItemToSelectedItems,
1763
+ allListItemsAreSelected = _useMultiselectUtils.allListItemsAreSelected,
1764
+ clickedItemIsInSelectedItems = _useMultiselectUtils.clickedItemIsInSelectedItems,
1765
+ clickedItemIsSelectAll = _useMultiselectUtils.clickedItemIsSelectAll,
1766
+ hasSelectedItems = _useMultiselectUtils.hasSelectedItems,
1767
+ removeClickedItemFromSelectedItems = _useMultiselectUtils.removeClickedItemFromSelectedItems,
1768
+ selectAllCheckboxState = _useMultiselectUtils.selectAllCheckboxState,
1769
+ selectAllUnselectedItemsInListItems = _useMultiselectUtils.selectAllUnselectedItemsInListItems,
1770
+ unselectAllListItems = _useMultiselectUtils.unselectAllListItems;
1771
+ var _useMultipleSelection = useMultipleSelection({
1772
+ selectedItems: selectedItems,
1773
+ itemToString: itemToString,
1774
+ onSelectedItemsChange: function onSelectedItemsChange(changes) {
1775
+ var _changes$selectedItem;
1776
+ onChange((_changes$selectedItem = changes.selectedItems) != null ? _changes$selectedItem : []);
1777
+ }
1778
+ }),
1779
+ getSelectedItemProps = _useMultipleSelection.getSelectedItemProps,
1780
+ getDropdownProps = _useMultipleSelection.getDropdownProps,
1781
+ removeSelectedItem = _useMultipleSelection.removeSelectedItem;
1782
+ var stateReducer = React.useCallback(function (_, _ref3) {
1783
+ var _inputRef$current$val, _inputRef$current, _inputRef$current$val2, _inputRef$current2, _changes$inputValue, _changes$inputValue2, _changes$inputValue3;
1784
+ var changes = _ref3.changes,
1785
+ type = _ref3.type;
1786
+ if (changes != null && changes.highlightedIndex && (changes == null ? void 0 : changes.highlightedIndex) >= 0) setLastHighlightedIndex(changes == null ? void 0 : changes.highlightedIndex);
1787
+ switch (type) {
1788
+ case useCombobox.stateChangeTypes.InputKeyDownEnter:
1789
+ case useCombobox.stateChangeTypes.ItemClick:
1790
+ return _extends({}, changes, {
1791
+ isOpen: true,
1792
+ inputValue: (_inputRef$current$val = inputRef == null ? void 0 : (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.value) != null ? _inputRef$current$val : '' // don't reset input value on select
1793
+ });
1794
+
1795
+ case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
1796
+ return _extends({}, changes, {
1797
+ inputValue: (_inputRef$current$val2 = inputRef == null ? void 0 : (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value) != null ? _inputRef$current$val2 : '' // don't reset input value on select
1798
+ });
1799
+
1800
+ case useCombobox.stateChangeTypes.InputChange:
1801
+ if ((_changes$inputValue = changes.inputValue) != null && _changes$inputValue.match(/^\s+/g)) {
1802
+ var _changes$inputValue$r;
1803
+ // remove leading whitespace if it exists
1804
+ return _extends({}, changes, {
1805
+ inputValue: (_changes$inputValue$r = changes.inputValue.replace(/^\s+/g, '')) != null ? _changes$inputValue$r : ''
1806
+ });
1807
+ }
1808
+ if (typeof initialItems === 'function') fetchItems((_changes$inputValue2 = changes.inputValue) != null ? _changes$inputValue2 : ''); // fetch items only if user provides a function as items
1809
+ filterListItems({
1810
+ inputValue: (_changes$inputValue3 = changes.inputValue) != null ? _changes$inputValue3 : ''
1811
+ });
1812
+ return changes;
1813
+ case useCombobox.stateChangeTypes.InputBlur:
1814
+ return _extends({}, changes, {
1815
+ inputValue: ''
1816
+ });
1817
+ default:
1818
+ return changes;
1455
1819
  }
1456
- }, clearable && selectedItem && React.createElement(React.Fragment, null, React.createElement(IconButton, {
1457
- className: "eds-searchable-dropdown-appendix__clear-button",
1458
- type: "button",
1459
- tabIndex: -1,
1460
- onClick: function onClick() {
1461
- return onChange(null);
1820
+ }, [hideSelectAll, normalizedItems, filterListItems, initialItems]);
1821
+ var _useCombobox = useCombobox(_extends({
1822
+ defaultHighlightedIndex: lastHighlightedIndex,
1823
+ items: listItems,
1824
+ itemToString: itemToString,
1825
+ selectedItem: null,
1826
+ stateReducer: stateReducer,
1827
+ onStateChange: function onStateChange(_ref4) {
1828
+ var type = _ref4.type,
1829
+ clickedItem = _ref4.selectedItem;
1830
+ // clickedItem means item chosen either via mouse or keyboard
1831
+ if (!clickedItem) return;
1832
+ switch (type) {
1833
+ // @ts-expect-error This falltrough is wanted
1834
+ case useCombobox.stateChangeTypes.InputBlur:
1835
+ if (!selectOnBlur) break;
1836
+ case useCombobox.stateChangeTypes.InputKeyDownEnter: // eslint-disable-line no-fallthrough
1837
+ case useCombobox.stateChangeTypes.ItemClick:
1838
+ if (clickedItemIsSelectAll(clickedItem)) {
1839
+ if (allListItemsAreSelected) {
1840
+ return unselectAllListItems(onChange);
1841
+ }
1842
+ return selectAllUnselectedItemsInListItems(onChange);
1843
+ }
1844
+ if (clickedItemIsInSelectedItems(clickedItem)) {
1845
+ return removeClickedItemFromSelectedItems(clickedItem, onChange);
1846
+ }
1847
+ addClickedItemToSelectedItems(clickedItem, onChange);
1848
+ }
1849
+ }
1850
+ }, rest)),
1851
+ getComboboxProps = _useCombobox.getComboboxProps,
1852
+ getInputProps = _useCombobox.getInputProps,
1853
+ getItemProps = _useCombobox.getItemProps,
1854
+ getLabelProps = _useCombobox.getLabelProps,
1855
+ getMenuProps = _useCombobox.getMenuProps,
1856
+ getToggleButtonProps = _useCombobox.getToggleButtonProps,
1857
+ highlightedIndex = _useCombobox.highlightedIndex,
1858
+ inputValue = _useCombobox.inputValue,
1859
+ isOpen = _useCombobox.isOpen,
1860
+ openMenu = _useCombobox.openMenu,
1861
+ setInputValue = _useCombobox.setInputValue;
1862
+ // role=combobox leads to strange VoiceOver behavior and is therefor omitted
1863
+ // const { role: _, ...comboboxProps } = getComboboxProps();
1864
+ var _getComboboxProps = getComboboxProps(),
1865
+ comboboxProps = _extends({}, (_objectDestructuringEmpty(_getComboboxProps), _getComboboxProps));
1866
+ return React.createElement("div", {
1867
+ className: "eds-dropdown__wrapper"
1868
+ }, React.createElement(BaseFormControl, _extends({
1869
+ append: React.createElement(FieldAppend, {
1870
+ selectedItems: selectedItems,
1871
+ isOpen: isOpen,
1872
+ clearable: clearable,
1873
+ loading: loading,
1874
+ loadingText: '',
1875
+ readOnly: readonly,
1876
+ onClear: function onClear() {
1877
+ var _inputRef$current3;
1878
+ onChange([]);
1879
+ setInputValue('');
1880
+ (_inputRef$current3 = inputRef.current) == null ? void 0 : _inputRef$current3.focus();
1881
+ if (typeof initialItems === 'function') fetchItems(inputValue != null ? inputValue : '');
1882
+ },
1883
+ getToggleButtonProps: getToggleButtonProps
1884
+ }),
1885
+ className: classNames('eds-dropdown', className),
1886
+ label: label,
1887
+ isFilled: hasSelectedItems || inputValue !== '',
1888
+ feedback: feedback,
1889
+ variant: variant,
1890
+ readOnly: readonly,
1891
+ style: style,
1892
+ labelProps: _extends({
1893
+ 'aria-label': label + ", multiselect, " + selectedItems.length + " valgte elementer"
1894
+ }, getLabelProps())
1895
+ }, comboboxProps, rest), React.createElement("div", {
1896
+ className: classNames('eds-dropdown__selected-items-and-input', {
1897
+ 'eds-dropdown__selected-items-and-input--filled': hasSelectedItems
1898
+ }),
1899
+ onClick: function onClick(e) {
1900
+ var _inputRef$current4;
1901
+ if (e.target === e.currentTarget) (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.focus();
1462
1902
  }
1463
- }, React.createElement(CloseSmallIcon, null)), React.createElement("div", {
1464
- className: "eds-searchable-dropdown-appendix__divider"
1465
- })), React.createElement(IconButton, _extends({}, getToggleButtonProps({
1466
- className: classNames('eds-searchable-dropdown-appendix__toggle-button', {
1467
- 'eds-searchable-dropdown-appendix__toggle-button--open': isOpen
1468
- })
1469
- }), {
1470
- tabIndex: -1,
1471
- type: "button"
1472
- }), React.createElement(DownArrowIcon, null)));
1903
+ }, selectedItems.map(function (selectedItem, index) {
1904
+ return React.createElement(SelectedElementsTag, {
1905
+ index: index,
1906
+ key: selectedItem.value,
1907
+ getSelectedItemProps: getSelectedItemProps,
1908
+ selectedItem: selectedItem,
1909
+ removeSelectedItem: removeSelectedItem,
1910
+ ariaLabelRemoveSelected: ariaLabelRemoveSelected
1911
+ });
1912
+ }), React.createElement("input", _extends({
1913
+ placeholder: placeholder,
1914
+ className: "eds-dropdown__input eds-form-control",
1915
+ role: "combobox" // eslint-disable-line jsx-a11y/role-has-required-aria-props
1916
+ }, getInputProps(getDropdownProps({
1917
+ preventKeyAction: isOpen,
1918
+ onFocus: function onFocus() {
1919
+ if (!isOpen && openOnFocus) openMenu();
1920
+ },
1921
+ ref: inputRef,
1922
+ value: inputValue != null ? inputValue : ''
1923
+ })))))), React.createElement(DropdownList, {
1924
+ listItems: listItems,
1925
+ selectedItems: selectedItems,
1926
+ inputValue: inputValue,
1927
+ isOpen: isOpen,
1928
+ highlightedIndex: highlightedIndex,
1929
+ getMenuProps: getMenuProps,
1930
+ getItemProps: getItemProps,
1931
+ selectAllItem: selectAll,
1932
+ selectAllCheckboxState: selectAllCheckboxState,
1933
+ listStyle: listStyle,
1934
+ loading: loading
1935
+ }));
1936
+ };
1937
+
1938
+ var _excluded = ["className", "clearable", "debounceTimeout", "feedback", "items", "label", "listStyle", "onChange", "openOnFocus", "placeholder", "readonly", "selectedItem", "selectOnBlur", "selectOnTab", "variant"];
1939
+ var DropdownBeta = function DropdownBeta(_ref) {
1940
+ var _selectedItem$label;
1941
+ var className = _ref.className,
1942
+ debounceTimeout = _ref.debounceTimeout,
1943
+ feedback = _ref.feedback,
1944
+ initialItems = _ref.items,
1945
+ label = _ref.label,
1946
+ listStyle = _ref.listStyle,
1947
+ onChange = _ref.onChange,
1948
+ _ref$readonly = _ref.readonly,
1949
+ readonly = _ref$readonly === void 0 ? false : _ref$readonly,
1950
+ selectedItem = _ref.selectedItem,
1951
+ _ref$selectOnBlur = _ref.selectOnBlur,
1952
+ selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1953
+ _ref$variant = _ref.variant,
1954
+ variant = _ref$variant === void 0 ? 'info' : _ref$variant,
1955
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded);
1956
+ var _useResolvedItems = useResolvedItems(initialItems, debounceTimeout),
1957
+ normalizedItems = _useResolvedItems.items,
1958
+ loading = _useResolvedItems.loading;
1959
+ var _useSelect = useSelect({
1960
+ items: normalizedItems,
1961
+ selectedItem: selectedItem,
1962
+ onStateChange: function onStateChange(_ref2) {
1963
+ var type = _ref2.type,
1964
+ clickedItem = _ref2.selectedItem;
1965
+ switch (type) {
1966
+ // @ts-expect-error This falltrough is wanted
1967
+ case useSelect.stateChangeTypes.InputBlur:
1968
+ if (!selectOnBlur) break;
1969
+ case useSelect.stateChangeTypes.MenuKeyDownEnter: // eslint-disable-line no-fallthrough
1970
+ case useSelect.stateChangeTypes.ItemClick:
1971
+ onChange == null ? void 0 : onChange(clickedItem !== undefined ? clickedItem : null);
1972
+ }
1973
+ },
1974
+ itemToString: itemToString
1975
+ }),
1976
+ isOpen = _useSelect.isOpen,
1977
+ getToggleButtonProps = _useSelect.getToggleButtonProps,
1978
+ getLabelProps = _useSelect.getLabelProps,
1979
+ getMenuProps = _useSelect.getMenuProps,
1980
+ highlightedIndex = _useSelect.highlightedIndex,
1981
+ getItemProps = _useSelect.getItemProps;
1982
+ return React.createElement("div", {
1983
+ className: "eds-dropdown__wrapper"
1984
+ }, React.createElement(BaseFormControl, _extends({
1985
+ append: React.createElement(FieldAppend, {
1986
+ selectedItems: [selectedItem],
1987
+ isOpen: isOpen,
1988
+ clearable: true,
1989
+ loading: loading,
1990
+ loadingText: '',
1991
+ readOnly: readonly,
1992
+ onClear: function onClear() {
1993
+ onChange == null ? void 0 : onChange(null);
1994
+ },
1995
+ getToggleButtonProps: getToggleButtonProps,
1996
+ clearSelectedItemsLabel: "Fjern valgt",
1997
+ ariaLabelClearItems: (selectedItem == null ? void 0 : selectedItem.label) + " valgt, trykk for \xE5 fjerne valget",
1998
+ focusable: true
1999
+ }),
2000
+ className: classNames('eds-dropdown', className, {
2001
+ 'eds-dropdown--not-filled': selectedItem === null
2002
+ }),
2003
+ label: label,
2004
+ labelId: getLabelProps().id,
2005
+ labelProps: getLabelProps(),
2006
+ disableLabelAnimation: true,
2007
+ isFilled: selectedItem !== null,
2008
+ feedback: feedback,
2009
+ variant: variant,
2010
+ readOnly: readonly
2011
+ }, rest), React.createElement("div", _extends({
2012
+ className: "eds-dropdown__selected-item-button"
2013
+ }, getToggleButtonProps()), (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : '')), React.createElement(DropdownList, {
2014
+ selectedItems: selectedItem !== null ? [selectedItem] : [],
2015
+ isOpen: isOpen,
2016
+ listItems: normalizedItems,
2017
+ highlightedIndex: highlightedIndex,
2018
+ listStyle: listStyle,
2019
+ getMenuProps: getMenuProps,
2020
+ getItemProps: getItemProps,
2021
+ loading: loading
2022
+ }));
1473
2023
  };
1474
2024
 
1475
2025
  warnAboutMissingStyles('dropdown', 'form', 'a11y', 'chip');
1476
2026
 
1477
- export { Dropdown, MultiSelect, NativeDropdown, SearchableDropdownBeta };
2027
+ export { Dropdown, DropdownBeta, MultiSelect, MultiSelectBeta, NativeDropdown, SearchableDropdownBeta };
1478
2028
  //# sourceMappingURL=dropdown.esm.js.map