@entur/dropdown 5.0.0-beta.2 → 5.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -976,65 +976,7 @@ var Dropdown = /*#__PURE__*/React__default["default"].forwardRef(function (_ref,
976
976
  }, searchAbleProps))));
977
977
  });
978
978
 
979
- var _excluded$6 = ["className", "disabled", "readOnly", "items", "loadingText", "prepend", "style", "label", "variant", "feedback", "disableLabelAnimation"];
980
- var NativeDropdown = function NativeDropdown(_ref) {
981
- var className = _ref.className,
982
- _ref$disabled = _ref.disabled,
983
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
984
- _ref$readOnly = _ref.readOnly,
985
- readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
986
- items = _ref.items,
987
- loadingText = _ref.loadingText,
988
- prepend = _ref.prepend,
989
- style = _ref.style,
990
- label = _ref.label,
991
- variant = _ref.variant,
992
- feedback = _ref.feedback,
993
- disableLabelAnimation = _ref.disableLabelAnimation,
994
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
995
- var _useResolvedItems = useResolvedItems(items),
996
- normalizedItems = _useResolvedItems.items,
997
- loading = _useResolvedItems.loading;
998
- var rightSideIcon = React__default["default"].createElement(icons.DownArrowIcon, {
999
- inline: true,
1000
- "aria-hidden": "true"
1001
- });
1002
- if (disabled || readOnly) {
1003
- rightSideIcon = null;
1004
- } else if (loading) {
1005
- rightSideIcon = React__default["default"].createElement(DropdownLoadingDots, {
1006
- "aria-hidden": "true"
1007
- }, loadingText);
1008
- }
1009
- var nativeDropdownId = utils.useRandomId('eds-native-dropdown');
1010
- return React__default["default"].createElement(form.BaseFormControl, {
1011
- disabled: disabled,
1012
- readOnly: readOnly,
1013
- prepend: prepend,
1014
- append: rightSideIcon,
1015
- className: className,
1016
- style: style,
1017
- label: label,
1018
- labelId: nativeDropdownId,
1019
- variant: variant,
1020
- feedback: feedback,
1021
- disableLabelAnimation: disableLabelAnimation,
1022
- isFilled: true
1023
- }, React__default["default"].createElement("select", _extends({
1024
- "aria-invalid": variant === 'error',
1025
- "aria-labelledby": nativeDropdownId,
1026
- "aria-busy": loading,
1027
- className: "eds-form-control eds-dropdown",
1028
- disabled: disabled || readOnly
1029
- }, rest), normalizedItems.map(function (item) {
1030
- return React__default["default"].createElement("option", {
1031
- key: item.value,
1032
- value: item.value
1033
- }, item.label);
1034
- })));
1035
- };
1036
-
1037
- var _excluded$5 = ["className", "clearable", "debounceTimeout", "disabled", "feedback", "initialSelectedItems", "items", "itemsSelectedLabel", "label", "listStyle", "loading", "loadingText", "onChange", "openOnFocus", "readOnly", "style", "variant"];
979
+ var _excluded$6 = ["className", "clearable", "debounceTimeout", "disabled", "feedback", "initialSelectedItems", "items", "itemsSelectedLabel", "label", "listStyle", "loading", "loadingText", "onChange", "openOnFocus", "readOnly", "style", "variant"];
1038
980
  var MultiSelectContext = /*#__PURE__*/React__default["default"].createContext(null);
1039
981
  var useMultiSelectContext = function useMultiSelectContext() {
1040
982
  var context = React__default["default"].useContext(MultiSelectContext);
@@ -1049,8 +991,8 @@ actionAndChanges) {
1049
991
  var changes = actionAndChanges.changes,
1050
992
  type = actionAndChanges.type;
1051
993
  switch (type) {
1052
- case Downshift.useSelect.stateChangeTypes.MenuKeyDownEnter:
1053
- case Downshift.useSelect.stateChangeTypes.MenuKeyDownSpaceButton:
994
+ case Downshift.useSelect.stateChangeTypes.ToggleButtonKeyDownEnter:
995
+ case Downshift.useSelect.stateChangeTypes.ToggleButtonKeyDownSpaceButton:
1054
996
  case Downshift.useSelect.stateChangeTypes.ItemClick:
1055
997
  return _extends({}, changes, {
1056
998
  isOpen: true,
@@ -1090,7 +1032,7 @@ var MultiSelect = function MultiSelect(_ref) {
1090
1032
  readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1091
1033
  style = _ref.style,
1092
1034
  variant = _ref.variant,
1093
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
1035
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
1094
1036
  var _useResolvedItems = useResolvedItems(input, debounceTimeout),
1095
1037
  items = _useResolvedItems.items;
1096
1038
  var _useState = React.useState(initialSelectedItems),
@@ -1275,59 +1217,78 @@ function SelectedItemsLabel(items) {
1275
1217
  }).toString() : items.length + " elementer valgt";
1276
1218
  }
1277
1219
 
1278
- var _excluded$4 = ["selectedItems", "listItems", "inputValue", "isOpen", "getMenuProps", "getItemProps", "highlightedIndex", "showSelectAllInList", "loading", "selectAllCheckboxState", "selectAllItem", "listStyle", "noMatchesText", "loadingText", "selectedItemAriaLabel"];
1220
+ var _excluded$5 = ["ariaLabelSelectedItem", "getItemProps", "getMenuProps", "inputValue", "isOpen", "highlightedIndex", "listItems", "listStyle", "loading", "loadingText", "noMatchesText", "selectAllCheckboxState", "selectAllItem", "selectedItems", "showSelectAllInList"];
1279
1221
  var DropdownList = function DropdownList(_ref) {
1280
- var selectedItems = _ref.selectedItems,
1281
- listItems = _ref.listItems,
1282
- isOpen = _ref.isOpen,
1283
- getMenuProps = _ref.getMenuProps,
1222
+ var _ref$ariaLabelSelecte = _ref.ariaLabelSelectedItem,
1223
+ ariaLabelSelectedItem = _ref$ariaLabelSelecte === void 0 ? ', valgt element, trykk for å fjerne' : _ref$ariaLabelSelecte,
1284
1224
  getItemProps = _ref.getItemProps,
1225
+ getMenuProps = _ref.getMenuProps,
1226
+ isOpen = _ref.isOpen,
1285
1227
  highlightedIndex = _ref.highlightedIndex,
1228
+ listItems = _ref.listItems,
1229
+ listStyle = _ref.listStyle,
1286
1230
  _ref$loading = _ref.loading,
1287
1231
  loading = _ref$loading === void 0 ? false : _ref$loading,
1288
- selectAllCheckboxState = _ref.selectAllCheckboxState,
1289
- selectAllItem = _ref.selectAllItem,
1290
- listStyle = _ref.listStyle,
1291
- _ref$noMatchesText = _ref.noMatchesText,
1292
- noMatchesText = _ref$noMatchesText === void 0 ? 'Ingen treff for søket' : _ref$noMatchesText,
1293
1232
  _ref$loadingText = _ref.loadingText,
1294
1233
  loadingText = _ref$loadingText === void 0 ? 'Laster inn …' : _ref$loadingText,
1295
- _ref$selectedItemAria = _ref.selectedItemAriaLabel,
1296
- selectedItemAriaLabel = _ref$selectedItemAria === void 0 ? ', valgt element' : _ref$selectedItemAria,
1297
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
1234
+ _ref$noMatchesText = _ref.noMatchesText,
1235
+ noMatchesText = _ref$noMatchesText === void 0 ? 'Ingen treff for søket' : _ref$noMatchesText,
1236
+ selectAllCheckboxState = _ref.selectAllCheckboxState,
1237
+ selectAllItem = _ref.selectAllItem,
1238
+ selectedItems = _ref.selectedItems,
1239
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
1298
1240
  var isMultiselect = selectAllItem !== undefined;
1299
1241
  var isNoMatches = !loading && (listItems.length === 0 || listItems.length === 1 && listItems[0].value === (selectAllItem == null ? void 0 : selectAllItem.value));
1300
- var itemIsSelected = function itemIsSelected(item) {
1242
+ var isItemSelected = function isItemSelected(item) {
1301
1243
  return selectedItems.some(function (selectedItem) {
1302
1244
  return selectedItem.value === item.value;
1303
1245
  });
1304
1246
  };
1247
+ var ariaLabelSelectAll = function ariaLabelSelectAll() {
1248
+ switch (selectAllCheckboxState == null ? void 0 : selectAllCheckboxState()) {
1249
+ case 'indeterminate':
1250
+ {
1251
+ return (selectAllItem == null ? void 0 : selectAllItem.label) + ", delvis valgt";
1252
+ }
1253
+ case true:
1254
+ {
1255
+ return (selectAllItem == null ? void 0 : selectAllItem.label) + ", valgt";
1256
+ }
1257
+ default:
1258
+ {
1259
+ return "" + (selectAllItem == null ? void 0 : selectAllItem.label);
1260
+ }
1261
+ }
1262
+ };
1305
1263
  var selectAllListItemContent = function selectAllListItemContent() {
1306
1264
  return React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement(form.Checkbox, {
1307
- className: "eds-dropdown__list__item__checkbox",
1308
- checked: selectAllCheckboxState == null ? void 0 : selectAllCheckboxState(),
1309
1265
  "aria-hidden": "true",
1266
+ checked: selectAllCheckboxState == null ? void 0 : selectAllCheckboxState(),
1267
+ className: "eds-dropdown__list__item__checkbox",
1310
1268
  onChange: function onChange() {
1311
1269
  return;
1312
- }
1270
+ },
1271
+ tabIndex: -1
1313
1272
  }), React__default["default"].createElement("span", {
1314
- className: "eds-dropdown__list__item__text"
1273
+ className: "eds-dropdown__list__item__text",
1274
+ "aria-label": ariaLabelSelectAll()
1315
1275
  }, selectAllItem == null ? void 0 : selectAllItem.label));
1316
1276
  };
1317
1277
  var listItemContent = function listItemContent(item) {
1318
1278
  return React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement(form.Checkbox, {
1319
- style: !isMultiselect ? {
1320
- display: 'none'
1321
- } : {},
1322
- className: "eds-dropdown__list__item__checkbox",
1323
- checked: itemIsSelected(item),
1324
1279
  "aria-hidden": "true",
1280
+ checked: isItemSelected(item),
1281
+ className: "eds-dropdown__list__item__checkbox",
1325
1282
  onChange: function onChange() {
1326
1283
  return;
1327
- }
1284
+ },
1285
+ style: !isMultiselect ? {
1286
+ display: 'none'
1287
+ } : {},
1288
+ tabIndex: -1
1328
1289
  }), React__default["default"].createElement("span", {
1329
1290
  className: "eds-dropdown__list__item__text"
1330
- }, item.label, React__default["default"].createElement(a11y.VisuallyHidden, null, selectedItemAriaLabel)), item.icons && React__default["default"].createElement("span", null, item.icons.map(function (Icon, index) {
1291
+ }, item.label, React__default["default"].createElement(a11y.VisuallyHidden, null, isItemSelected(item) ? ariaLabelSelectedItem : '')), item.icons && React__default["default"].createElement("span", null, item.icons.map(function (Icon, index) {
1331
1292
  return React__default["default"].createElement(Icon, {
1332
1293
  key: index,
1333
1294
  inline: true,
@@ -1335,161 +1296,112 @@ var DropdownList = function DropdownList(_ref) {
1335
1296
  });
1336
1297
  })));
1337
1298
  };
1338
- return React__default["default"].createElement("ul", _extends({}, getMenuProps(), {
1339
- className: classNames__default["default"]('eds-dropdown__list', {
1340
- 'eds-dropdown__list--open': isOpen
1341
- }),
1342
- style: _extends({}, rest.style, listStyle)
1343
- }), isOpen && listItems.length > 0 && listItems.map(function (item, index) {
1344
- var itemIsSelectAll = item.value === (selectAllItem == null ? void 0 : selectAllItem.value);
1345
- if (itemIsSelectAll && listItems.length <= 2) return React__default["default"].createElement(React__default["default"].Fragment, null);
1346
- return React__default["default"].createElement("li", _extends({
1347
- key: item.value,
1348
- className: classNames__default["default"]('eds-dropdown__list__item', {
1349
- 'eds-dropdown__list__item--select-all': itemIsSelectAll,
1350
- 'eds-dropdown__list__item--highlighted': highlightedIndex === index,
1351
- 'eds-dropdown__list__item--selected': !isMultiselect && itemIsSelected(item)
1352
- })
1353
- }, getItemProps({
1354
- key: "" + index + item.value,
1355
- item: item,
1356
- index: index
1357
- })), itemIsSelectAll ? selectAllListItemContent() : listItemContent(item));
1358
- }), isOpen && isNoMatches && React__default["default"].createElement("li", {
1359
- className: "eds-dropdown__list__item"
1360
- }, noMatchesText), isOpen && loading && React__default["default"].createElement("li", {
1361
- className: "eds-dropdown__list__item"
1362
- }, loadingText));
1363
- };
1364
-
1365
- function lowerCaseFilterTest(item, input) {
1366
- if (!input) {
1367
- return true;
1368
- }
1369
- var sanitizeEscapeCharacters = input.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
1370
- var inputRegex = new RegExp(sanitizeEscapeCharacters, 'i');
1371
- return inputRegex.test(item.label);
1372
- }
1373
- var itemToString = function itemToString(item) {
1374
- return item ? item.label : '';
1375
- };
1376
- var useMultiselectUtils = function useMultiselectUtils(_ref) {
1377
- var listItems = _ref.listItems,
1378
- selectedItems = _ref.selectedItems,
1379
- selectAllValue = _ref.selectAllValue;
1380
- var hasSelectedItems = selectedItems.length > 0;
1381
- var listItemsWithoutSelectAll = listItems.filter(function (item) {
1382
- return item.value !== selectAllValue;
1383
- });
1384
- var allListItemsAreSelected = listItemsWithoutSelectAll.filter(function (item) {
1385
- return !selectedItems.includes(item);
1386
- }).length === 0;
1387
- var someListItemsAreSelected = listItemsWithoutSelectAll.some(function (item) {
1388
- return selectedItems.includes(item);
1389
- });
1390
- var addClickedItemToSelectedItems = function addClickedItemToSelectedItems(clickedItem, onChange) {
1391
- return onChange([].concat(selectedItems, [clickedItem]));
1392
- };
1393
- var clickedItemIsInSelectedItems = function clickedItemIsInSelectedItems(clickedItem) {
1394
- return selectedItems.some(function (selectedItem) {
1395
- return selectedItem.value === clickedItem.value;
1396
- });
1397
- };
1398
- var clickedItemIsSelectAll = function clickedItemIsSelectAll(clickedItem) {
1399
- return clickedItem.value === selectAllValue;
1400
- };
1401
- var removeClickedItemFromSelectedItems = function removeClickedItemFromSelectedItems(clickedItem, onChange) {
1402
- return onChange(selectedItems.filter(function (selectedItem) {
1403
- return selectedItem.value !== clickedItem.value;
1404
- }));
1405
- };
1406
- var selectAllCheckboxState = function selectAllCheckboxState() {
1407
- if (allListItemsAreSelected) return true;
1408
- if (someListItemsAreSelected) return 'indeterminate';
1409
- return false;
1410
- };
1411
- var selectAllUnselectedItemsInListItems = function selectAllUnselectedItemsInListItems(onChange) {
1412
- onChange([].concat(selectedItems, listItemsWithoutSelectAll.filter(function (item) {
1413
- return !selectedItems.includes(item);
1414
- })));
1415
- };
1416
- var unselectAllListItems = function unselectAllListItems(onChange) {
1417
- onChange(selectedItems.filter(function (item) {
1418
- return !listItemsWithoutSelectAll.includes(item);
1419
- }));
1420
- };
1421
- return {
1422
- addClickedItemToSelectedItems: addClickedItemToSelectedItems,
1423
- allListItemsAreSelected: allListItemsAreSelected,
1424
- clickedItemIsInSelectedItems: clickedItemIsInSelectedItems,
1425
- clickedItemIsSelectAll: clickedItemIsSelectAll,
1426
- hasSelectedItems: hasSelectedItems,
1427
- listItemsWithoutSelectAll: listItemsWithoutSelectAll,
1428
- removeClickedItemFromSelectedItems: removeClickedItemFromSelectedItems,
1429
- selectAllCheckboxState: selectAllCheckboxState,
1430
- selectAllUnselectedItemsInListItems: selectAllUnselectedItemsInListItems,
1431
- someListItemsAreSelected: someListItemsAreSelected,
1432
- unselectAllListItems: unselectAllListItems
1433
- };
1299
+ return (
1300
+ // use popover from @entur/tooltip when that package upgrades to floating-ui
1301
+ React__default["default"].createElement("ul", _extends({}, getMenuProps(), {
1302
+ className: classNames__default["default"]('eds-dropdown__list', {
1303
+ 'eds-dropdown__list--open': isOpen
1304
+ }),
1305
+ style: _extends({}, rest.style, listStyle)
1306
+ }), listItems.length > 0 && listItems.map(function (item, index) {
1307
+ var itemIsSelectAll = item.value === (selectAllItem == null ? void 0 : selectAllItem.value);
1308
+ if (itemIsSelectAll && listItems.length <= 2) return React__default["default"].createElement(React__default["default"].Fragment, null);
1309
+ return React__default["default"].createElement("li", _extends({
1310
+ key: item.value,
1311
+ className: classNames__default["default"]('eds-dropdown__list__item', {
1312
+ 'eds-dropdown__list__item--select-all': itemIsSelectAll,
1313
+ 'eds-dropdown__list__item--highlighted': highlightedIndex === index,
1314
+ 'eds-dropdown__list__item--selected': !isMultiselect && isItemSelected(item)
1315
+ })
1316
+ }, getItemProps({
1317
+ key: "" + index + item.value,
1318
+ item: item,
1319
+ index: index
1320
+ })), itemIsSelectAll ? selectAllListItemContent() : listItemContent(item));
1321
+ }), isNoMatches && React__default["default"].createElement("li", {
1322
+ className: "eds-dropdown__list__item"
1323
+ }, noMatchesText), loading && React__default["default"].createElement("li", {
1324
+ className: "eds-dropdown__list__item"
1325
+ }, loadingText))
1326
+ );
1434
1327
  };
1435
1328
 
1436
- var _excluded$3 = ["tabIndex"];
1329
+ var _excluded$4 = ["tabIndex"];
1437
1330
  var SelectedItemTag = function SelectedItemTag(_ref) {
1438
1331
  var _getSelectedItemProps;
1439
- var getSelectedItemProps = _ref.getSelectedItemProps,
1440
- removeSelectedItem = _ref.removeSelectedItem,
1441
- selectedItem = _ref.selectedItem,
1332
+ var ariaLabelRemoveSelected = _ref.ariaLabelRemoveSelected,
1333
+ _ref$ariaLabelChosen = _ref.ariaLabelChosen,
1334
+ ariaLabelChosen = _ref$ariaLabelChosen === void 0 ? 'valgt' : _ref$ariaLabelChosen,
1335
+ disabled = _ref.disabled,
1336
+ getSelectedItemProps = _ref.getSelectedItemProps,
1442
1337
  index = _ref.index,
1443
- ariaLabelRemoveSelected = _ref.ariaLabelRemoveSelected;
1338
+ readOnly = _ref.readOnly,
1339
+ removeSelectedItem = _ref.removeSelectedItem,
1340
+ selectedItem = _ref.selectedItem;
1444
1341
  var _ref2 = (_getSelectedItemProps = getSelectedItemProps == null ? void 0 : getSelectedItemProps({
1445
1342
  selectedItem: selectedItem,
1446
1343
  index: index
1447
1344
  })) != null ? _getSelectedItemProps : {},
1448
- selectedItemProps = _objectWithoutPropertiesLoose(_ref2, _excluded$3);
1345
+ selectedItemProps = _objectWithoutPropertiesLoose(_ref2, _excluded$4);
1449
1346
  return React__default["default"].createElement(chip.TagChip, _extends({
1450
- className: classNames__default["default"]('eds-dropdown__selected-element-tag')
1347
+ className: classNames__default["default"]('eds-dropdown__selected-item-tag', {
1348
+ 'eds-dropdown__selected-item-tag--readonly': readOnly,
1349
+ 'eds-dropdown__selected-item-tag--disabled': disabled
1350
+ })
1451
1351
  }, selectedItemProps, {
1452
1352
  onClose: function onClose(e) {
1453
1353
  e.stopPropagation();
1454
1354
  removeSelectedItem(selectedItem);
1455
1355
  },
1456
- closeButtonAriaLabel: selectedItem.label + ", " + ariaLabelRemoveSelected + " ",
1457
- key: selectedItem.value
1356
+ closeButtonAriaLabel: selectedItem.label + " " + ariaLabelChosen + ", " + ariaLabelRemoveSelected + " ",
1357
+ key: selectedItem.value,
1358
+ "aria-live": "polite"
1458
1359
  }), React__default["default"].createElement("span", {
1459
1360
  "aria-hidden": "true"
1460
1361
  }, selectedItem.label));
1461
1362
  };
1462
- var FieldAppend = function FieldAppend(_ref3) {
1463
- var clearable = _ref3.clearable,
1464
- readOnly = _ref3.readOnly,
1363
+ var FieldAppend$1 = function FieldAppend(_ref3) {
1364
+ var _ref3$ariaHiddenToggl = _ref3.ariaHiddenToggleButton,
1365
+ ariaHiddenToggleButton = _ref3$ariaHiddenToggl === void 0 ? false : _ref3$ariaHiddenToggl,
1366
+ ariaLabelCloseList = _ref3.ariaLabelCloseList,
1367
+ ariaLabelOpenList = _ref3.ariaLabelOpenList,
1368
+ _ref3$clearable = _ref3.clearable,
1369
+ clearable = _ref3$clearable === void 0 ? false : _ref3$clearable,
1370
+ labelClearSelectedItems = _ref3.labelClearSelectedItems,
1371
+ _ref3$disabled = _ref3.disabled,
1372
+ disabled = _ref3$disabled === void 0 ? false : _ref3$disabled,
1373
+ _ref3$focusable = _ref3.focusable,
1374
+ focusable = _ref3$focusable === void 0 ? false : _ref3$focusable,
1465
1375
  getToggleButtonProps = _ref3.getToggleButtonProps,
1466
- selectedItems = _ref3.selectedItems,
1376
+ isOpen = _ref3.isOpen,
1467
1377
  _ref3$loading = _ref3.loading,
1468
1378
  loading = _ref3$loading === void 0 ? false : _ref3$loading,
1469
1379
  _ref3$loadingText = _ref3.loadingText,
1470
1380
  loadingText = _ref3$loadingText === void 0 ? 'Laster resultater …' : _ref3$loadingText,
1471
- ariaLabelClearItems = _ref3.ariaLabelClearItems,
1472
- clearSelectedItemsLabel = _ref3.clearSelectedItemsLabel,
1473
- isOpen = _ref3.isOpen,
1474
1381
  onClear = _ref3.onClear,
1475
- _ref3$focusable = _ref3.focusable,
1476
- focusable = _ref3$focusable === void 0 ? false : _ref3$focusable;
1382
+ selectedItems = _ref3.selectedItems;
1477
1383
  if (loading) {
1478
- return React__default["default"].createElement(DropdownLoadingDots, null, loadingText);
1384
+ return React__default["default"].createElement("div", {
1385
+ className: 'eds-dropdown-appendix__toggle-button--loading-dots'
1386
+ }, React__default["default"].createElement(loader.LoadingDots, {
1387
+ "aria-label": loadingText
1388
+ }));
1479
1389
  }
1480
- if (readOnly) {
1390
+ if (disabled) {
1481
1391
  return null;
1482
1392
  }
1483
1393
  return React__default["default"].createElement("div", {
1484
1394
  className: "eds-dropdown-appendix"
1485
1395
  }, clearable && (selectedItems == null ? void 0 : selectedItems.length) > 0 && selectedItems[0] !== null && React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement(ClearableButton, {
1486
1396
  onClear: onClear,
1487
- focusable: focusable,
1488
- clearSelectedItemsLabel: clearSelectedItemsLabel,
1489
- ariaLabelClearItems: ariaLabelClearItems
1397
+ focusable: true,
1398
+ labelClearSelectedItems: labelClearSelectedItems
1490
1399
  }), React__default["default"].createElement("div", {
1491
1400
  className: "eds-dropdown-appendix__divider"
1492
1401
  })), React__default["default"].createElement(ToggleButton, {
1402
+ "aria-hidden": ariaHiddenToggleButton,
1403
+ ariaLabelCloseList: ariaLabelCloseList,
1404
+ ariaLabelOpenList: ariaLabelOpenList,
1493
1405
  getToggleButtonProps: getToggleButtonProps,
1494
1406
  isOpen: isOpen,
1495
1407
  focusable: focusable
@@ -1497,22 +1409,20 @@ var FieldAppend = function FieldAppend(_ref3) {
1497
1409
  };
1498
1410
  var ClearableButton = function ClearableButton(_ref4) {
1499
1411
  var onClear = _ref4.onClear,
1500
- _ref4$clearSelectedIt = _ref4.clearSelectedItemsLabel,
1501
- clearSelectedItemsLabel = _ref4$clearSelectedIt === void 0 ? 'Fjern valgte' : _ref4$clearSelectedIt,
1502
- _ref4$ariaLabelClearI = _ref4.ariaLabelClearItems,
1503
- ariaLabelClearItems = _ref4$ariaLabelClearI === void 0 ? 'Fjern valgte' : _ref4$ariaLabelClearI,
1412
+ _ref4$labelClearSelec = _ref4.labelClearSelectedItems,
1413
+ labelClearSelectedItems = _ref4$labelClearSelec === void 0 ? 'Fjern valgte' : _ref4$labelClearSelec,
1504
1414
  _ref4$focusable = _ref4.focusable,
1505
1415
  focusable = _ref4$focusable === void 0 ? false : _ref4$focusable;
1506
1416
  return React__default["default"].createElement(tooltip.Tooltip, {
1507
1417
  "aria-hidden": "true",
1508
1418
  placement: "right",
1509
- content: clearSelectedItemsLabel
1419
+ content: labelClearSelectedItems
1510
1420
  }, React__default["default"].createElement(button.IconButton, {
1511
1421
  className: "eds-dropdown-appendix__clear-button",
1512
1422
  type: "button",
1513
1423
  tabIndex: focusable ? 0 : 1,
1514
1424
  onClick: onClear,
1515
- "aria-label": ariaLabelClearItems
1425
+ "aria-label": labelClearSelectedItems
1516
1426
  }, React__default["default"].createElement(icons.CloseSmallIcon, {
1517
1427
  "aria-hidden": "true"
1518
1428
  })));
@@ -1520,10 +1430,12 @@ var ClearableButton = function ClearableButton(_ref4) {
1520
1430
  var ToggleButton = function ToggleButton(_ref5) {
1521
1431
  var getToggleButtonProps = _ref5.getToggleButtonProps,
1522
1432
  isOpen = _ref5.isOpen,
1523
- _ref5$closeAriaLabel = _ref5.closeAriaLabel,
1524
- closeAriaLabel = _ref5$closeAriaLabel === void 0 ? 'Lukk liste med valg' : _ref5$closeAriaLabel,
1525
- _ref5$openAriaLabel = _ref5.openAriaLabel,
1526
- openAriaLabel = _ref5$openAriaLabel === void 0 ? 'Åpne liste med valg' : _ref5$openAriaLabel,
1433
+ _ref5$ariaHidden = _ref5['aria-hidden'],
1434
+ ariaHidden = _ref5$ariaHidden === void 0 ? false : _ref5$ariaHidden,
1435
+ _ref5$ariaLabelCloseL = _ref5.ariaLabelCloseList,
1436
+ ariaLabelCloseList = _ref5$ariaLabelCloseL === void 0 ? 'Lukk liste med valg' : _ref5$ariaLabelCloseL,
1437
+ _ref5$ariaLabelOpenLi = _ref5.ariaLabelOpenList,
1438
+ ariaLabelOpenList = _ref5$ariaLabelOpenLi === void 0 ? 'Åpne liste med valg' : _ref5$ariaLabelOpenLi,
1527
1439
  _ref5$focusable = _ref5.focusable,
1528
1440
  focusable = _ref5$focusable === void 0 ? false : _ref5$focusable;
1529
1441
  return React__default["default"].createElement(button.IconButton, _extends({}, getToggleButtonProps({
@@ -1531,91 +1443,257 @@ var ToggleButton = function ToggleButton(_ref5) {
1531
1443
  'eds-dropdown-appendix__toggle-button--open': isOpen
1532
1444
  })
1533
1445
  }), {
1534
- "aria-label": isOpen ? closeAriaLabel : openAriaLabel,
1535
- tabIndex: focusable ? 0 : 1,
1446
+ "aria-hidden": ariaHidden,
1447
+ "aria-label": isOpen ? ariaLabelCloseList : ariaLabelOpenList,
1448
+ tabIndex: focusable ? 0 : -1,
1536
1449
  type: "button"
1537
1450
  }), React__default["default"].createElement(icons.DownArrowIcon, {
1538
1451
  "aria-hidden": "true"
1539
1452
  }));
1540
1453
  };
1541
1454
 
1542
- var _excluded$2 = ["className", "clearable", "debounceTimeout", "disableLabelAnimation", "feedback", "itemFilter", "items", "label", "listStyle", "onChange", "openOnFocus", "placeholder", "readonly", "selectedItem", "selectOnBlur", "variant"];
1543
- // TODO Husk å @deprecate searchable-prop-en til Dropdown når denne komponenten skal ha official release
1544
- // TODO Husk å generelt legge inn støtte for typeof value === string
1545
- var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1546
- var _selectedItem$label;
1547
- var className = _ref.className,
1548
- _ref$clearable = _ref.clearable,
1549
- clearable = _ref$clearable === void 0 ? false : _ref$clearable,
1550
- debounceTimeout = _ref.debounceTimeout,
1551
- _ref$disableLabelAnim = _ref.disableLabelAnimation,
1552
- disableLabelAnimation = _ref$disableLabelAnim === void 0 ? false : _ref$disableLabelAnim,
1553
- feedback = _ref.feedback,
1554
- _ref$itemFilter = _ref.itemFilter,
1555
- itemFilter = _ref$itemFilter === void 0 ? lowerCaseFilterTest : _ref$itemFilter,
1556
- initialItems = _ref.items,
1557
- label = _ref.label,
1558
- listStyle = _ref.listStyle,
1559
- onChange = _ref.onChange,
1560
- _ref$openOnFocus = _ref.openOnFocus,
1561
- openOnFocus = _ref$openOnFocus === void 0 ? false : _ref$openOnFocus,
1562
- placeholder = _ref.placeholder,
1563
- _ref$readonly = _ref.readonly,
1564
- readonly = _ref$readonly === void 0 ? false : _ref$readonly,
1565
- value = _ref.selectedItem,
1566
- _ref$selectOnBlur = _ref.selectOnBlur,
1567
- selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1568
- _ref$variant = _ref.variant,
1569
- variant = _ref$variant === void 0 ? 'info' : _ref$variant,
1570
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
1571
- var _useState = React.useState(false),
1572
- hideSelectedItem = _useState[0],
1573
- setHideSelectedItem = _useState[1];
1574
- var inputRef = React.useRef(null);
1575
- var _useResolvedItems = useResolvedItems(initialItems, debounceTimeout),
1576
- normalizedItems = _useResolvedItems.items,
1577
- loading = _useResolvedItems.loading,
1578
- fetchItems = _useResolvedItems.fetchItems;
1579
- var _React$useState = React__default["default"].useState(normalizedItems),
1580
- listItems = _React$useState[0],
1581
- setListItems = _React$useState[1];
1582
- var filterListItems = function filterListItems(_ref2) {
1583
- var inputValue = _ref2.inputValue;
1584
- return setListItems(normalizedItems.filter(function (item) {
1585
- return itemFilter(item, inputValue);
1586
- }));
1455
+ /* start general utils */
1456
+ var EMPTY_INPUT = '';
1457
+ function lowerCaseFilterTest(item, input) {
1458
+ if (!input) {
1459
+ return true;
1460
+ }
1461
+ var sanitizeEscapeCharacters = input.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
1462
+ var inputRegex = new RegExp(sanitizeEscapeCharacters, 'i');
1463
+ return inputRegex.test(item.label);
1464
+ }
1465
+ var itemToString = function itemToString(item) {
1466
+ return item ? item.label : '';
1467
+ };
1468
+ var useMultiselectUtils = function useMultiselectUtils(_ref) {
1469
+ var listItems = _ref.listItems,
1470
+ selectedItems = _ref.selectedItems,
1471
+ selectAll = _ref.selectAll;
1472
+ var hasSelectedItems = selectedItems.length > 0;
1473
+ var listItemsWithoutSelectAll = listItems.filter(function (item) {
1474
+ return item.value !== selectAll.value;
1475
+ });
1476
+ var allListItemsAreSelected = listItemsWithoutSelectAll.filter(function (item) {
1477
+ return !selectedItems.includes(item);
1478
+ }).length === 0;
1479
+ var someListItemsAreSelected = listItemsWithoutSelectAll.some(function (item) {
1480
+ return selectedItems.includes(item);
1481
+ });
1482
+ var addClickedItemToSelectedItems = function addClickedItemToSelectedItems(clickedItem, onChange) {
1483
+ return onChange([].concat(selectedItems, [clickedItem]));
1587
1484
  };
1588
- React__default["default"].useEffect(function () {
1589
- filterListItems({
1590
- inputValue: inputValue
1591
- });
1592
- }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps
1593
- var stateReducer = React__default["default"].useCallback(function (_, _ref3) {
1594
- var type = _ref3.type,
1595
- changes = _ref3.changes;
1485
+ var clickedItemIsInSelectedItems = function clickedItemIsInSelectedItems(clickedItem) {
1486
+ return selectedItems.some(function (selectedItem) {
1487
+ return selectedItem.value === clickedItem.value;
1488
+ });
1489
+ };
1490
+ var clickedItemIsSelectAll = function clickedItemIsSelectAll(clickedItem) {
1491
+ return clickedItem.value === selectAll.value;
1492
+ };
1493
+ var handleListItemClicked = function handleListItemClicked(_ref2) {
1494
+ var clickedItem = _ref2.clickedItem,
1495
+ onChange = _ref2.onChange,
1496
+ setLastRemovedItem = _ref2.setLastRemovedItem;
1497
+ if (clickedItemIsSelectAll(clickedItem)) {
1498
+ if (allListItemsAreSelected) {
1499
+ setLastRemovedItem(selectAll);
1500
+ return unselectAllListItems(onChange);
1501
+ }
1502
+ return selectAllUnselectedItemsInListItems(onChange);
1503
+ }
1504
+ if (clickedItemIsInSelectedItems(clickedItem)) {
1505
+ setLastRemovedItem(clickedItem);
1506
+ return removeClickedItemFromSelectedItems(clickedItem, onChange);
1507
+ }
1508
+ addClickedItemToSelectedItems(clickedItem, onChange);
1509
+ };
1510
+ var removeClickedItemFromSelectedItems = function removeClickedItemFromSelectedItems(clickedItem, onChange) {
1511
+ return onChange(selectedItems.filter(function (selectedItem) {
1512
+ return selectedItem.value !== clickedItem.value;
1513
+ }));
1514
+ };
1515
+ var selectAllCheckboxState = function selectAllCheckboxState() {
1516
+ if (allListItemsAreSelected) return true;
1517
+ if (someListItemsAreSelected) return 'indeterminate';
1518
+ return false;
1519
+ };
1520
+ var selectAllUnselectedItemsInListItems = function selectAllUnselectedItemsInListItems(onChange) {
1521
+ onChange([].concat(selectedItems, listItemsWithoutSelectAll.filter(function (item) {
1522
+ return !selectedItems.includes(item);
1523
+ })));
1524
+ };
1525
+ var unselectAllListItems = function unselectAllListItems(onChange) {
1526
+ onChange(selectedItems.filter(function (item) {
1527
+ return !listItemsWithoutSelectAll.includes(item);
1528
+ }));
1529
+ };
1530
+ return {
1531
+ addClickedItemToSelectedItems: addClickedItemToSelectedItems,
1532
+ allListItemsAreSelected: allListItemsAreSelected,
1533
+ clickedItemIsInSelectedItems: clickedItemIsInSelectedItems,
1534
+ clickedItemIsSelectAll: clickedItemIsSelectAll,
1535
+ handleListItemClicked: handleListItemClicked,
1536
+ hasSelectedItems: hasSelectedItems,
1537
+ listItemsWithoutSelectAll: listItemsWithoutSelectAll,
1538
+ removeClickedItemFromSelectedItems: removeClickedItemFromSelectedItems,
1539
+ selectAllCheckboxState: selectAllCheckboxState,
1540
+ selectAllUnselectedItemsInListItems: selectAllUnselectedItemsInListItems,
1541
+ someListItemsAreSelected: someListItemsAreSelected,
1542
+ unselectAllListItems: unselectAllListItems
1543
+ };
1544
+ };
1545
+ function getA11yStatusMessage(options) {
1546
+ var isOpen = options.isOpen,
1547
+ resultCount = options.resultCount,
1548
+ previousResultCount = options.previousResultCount,
1549
+ _options$selectAllIte = options.selectAllItemIncluded,
1550
+ selectAllItemIncluded = _options$selectAllIte === void 0 ? false : _options$selectAllIte,
1551
+ _options$ariaLabelNoR = options.ariaLabelNoResults,
1552
+ ariaLabelNoResults = _options$ariaLabelNoR === void 0 ? 'Ingen resultater' : _options$ariaLabelNoR;
1553
+ if (!isOpen) {
1554
+ return '';
1555
+ }
1556
+ var resultCountWithoutSelectAll = selectAllItemIncluded ? resultCount - 1 : resultCount;
1557
+ if (resultCountWithoutSelectAll === 0) {
1558
+ return ariaLabelNoResults;
1559
+ }
1560
+ if (resultCount !== previousResultCount) {
1561
+ return resultCountWithoutSelectAll + " resultat" + (resultCountWithoutSelectAll === 1 ? '' : 'er') + " tilgjengelig, naviger med pil opp eller ned, velg elementer med enter.";
1562
+ }
1563
+ return '';
1564
+ }
1565
+ function getA11ySelectionMessage(options) {
1566
+ var selectedItem = options.selectedItem,
1567
+ itemToStringLocal = options.itemToString,
1568
+ selectAllItem = options.selectAllItem;
1569
+ if ((selectedItem == null ? void 0 : selectedItem.value) === (selectAllItem == null ? void 0 : selectAllItem.value)) return 'Alle elementer i listen valgt.';
1570
+ return selectedItem ? itemToStringLocal(selectedItem) + " er valgt." : '';
1571
+ }
1572
+ function getA11yRemovalMessage(options) {
1573
+ var itemToString = options.itemToString,
1574
+ selectAllItem = options.selectAllItem,
1575
+ removedItem = options.removedItem;
1576
+ if (removedItem === undefined) return '';
1577
+ if (removedItem.value === (selectAllItem == null ? void 0 : selectAllItem.value)) return 'Alle elementer i listen fjernet fra valgte.';
1578
+ return itemToString(removedItem) + " fjernet fra valgte.";
1579
+ }
1580
+ /**A VoiceOver click is always preformed in the center of the clicked element.
1581
+ This functions expolits that to check if the performed click likely is
1582
+ made by VoiceOver. */
1583
+ var isVoiceOverClick = function isVoiceOverClick(clickEvent) {
1584
+ var targetElementRect = clickEvent.currentTarget.getBoundingClientRect();
1585
+ var targetElementMiddleX = Math.floor(targetElementRect.x + targetElementRect.width / 2);
1586
+ var targetElementMiddleY = Math.floor(targetElementRect.y + targetElementRect.height / 2);
1587
+ var clickPositionX = clickEvent.clientX;
1588
+ var clickPositionY = clickEvent.clientY;
1589
+ console.log('targetX:', targetElementMiddleX, 'targetY:', targetElementMiddleY, 'clickX:', clickPositionX, 'clickY:', clickPositionY);
1590
+ return Math.abs(targetElementMiddleX - clickPositionX) <= 1 && Math.abs(targetElementMiddleY - clickPositionY) <= 1;
1591
+ };
1592
+ /* end a11y utils */
1593
+
1594
+ var _excluded$3 = ["ariaLabelCloseList", "ariaLabelOpenList", "className", "clearable", "debounceTimeout", "disabled", "disableLabelAnimation", "feedback", "itemFilter", "items", "label", "labelClearSelectedItem", "listStyle", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "style", "variant"];
1595
+ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1596
+ var _selectedItem$label;
1597
+ var ariaLabelCloseList = _ref.ariaLabelCloseList,
1598
+ ariaLabelOpenList = _ref.ariaLabelOpenList,
1599
+ className = _ref.className,
1600
+ _ref$clearable = _ref.clearable,
1601
+ clearable = _ref$clearable === void 0 ? true : _ref$clearable,
1602
+ debounceTimeout = _ref.debounceTimeout,
1603
+ _ref$disabled = _ref.disabled,
1604
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1605
+ _ref$disableLabelAnim = _ref.disableLabelAnimation,
1606
+ disableLabelAnimation = _ref$disableLabelAnim === void 0 ? false : _ref$disableLabelAnim,
1607
+ feedback = _ref.feedback,
1608
+ _ref$itemFilter = _ref.itemFilter,
1609
+ itemFilter = _ref$itemFilter === void 0 ? lowerCaseFilterTest : _ref$itemFilter,
1610
+ initialItems = _ref.items,
1611
+ label = _ref.label,
1612
+ _ref$labelClearSelect = _ref.labelClearSelectedItem,
1613
+ labelClearSelectedItem = _ref$labelClearSelect === void 0 ? 'fjern valgt' : _ref$labelClearSelect,
1614
+ listStyle = _ref.listStyle,
1615
+ loadingText = _ref.loadingText,
1616
+ onChange = _ref.onChange,
1617
+ placeholder = _ref.placeholder,
1618
+ prepend = _ref.prepend,
1619
+ _ref$readOnly = _ref.readOnly,
1620
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1621
+ value = _ref.selectedItem,
1622
+ _ref$selectOnBlur = _ref.selectOnBlur,
1623
+ selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1624
+ style = _ref.style,
1625
+ _ref$variant = _ref.variant,
1626
+ variant = _ref$variant === void 0 ? 'info' : _ref$variant,
1627
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
1628
+ var _useState = React.useState(false),
1629
+ hideSelectedItem = _useState[0],
1630
+ setHideSelectedItem = _useState[1];
1631
+ var _React$useState = React__default["default"].useState(0),
1632
+ lastHighlightedIndex = _React$useState[0],
1633
+ setLastHighlightedIndex = _React$useState[1];
1634
+ var inputRef = React.useRef(null);
1635
+ var _useResolvedItems = useResolvedItems(initialItems, debounceTimeout),
1636
+ normalizedItems = _useResolvedItems.items,
1637
+ loading = _useResolvedItems.loading,
1638
+ fetchItems = _useResolvedItems.fetchItems;
1639
+ var _React$useState2 = React__default["default"].useState(normalizedItems),
1640
+ listItems = _React$useState2[0],
1641
+ setListItems = _React$useState2[1];
1642
+ var filterListItems = function filterListItems(_ref2) {
1643
+ var inputValue = _ref2.inputValue;
1644
+ return setListItems(normalizedItems.filter(function (item) {
1645
+ return itemFilter(item, inputValue);
1646
+ }));
1647
+ };
1648
+ var updateListItems = function updateListItems(_ref3) {
1649
+ var inputValue = _ref3.inputValue;
1650
+ if (typeof initialItems === 'function') fetchItems(inputValue != null ? inputValue : EMPTY_INPUT); // fetch items only if user provides a function as items
1651
+ filterListItems({
1652
+ inputValue: inputValue != null ? inputValue : EMPTY_INPUT
1653
+ });
1654
+ };
1655
+ React__default["default"].useEffect(function () {
1656
+ filterListItems({
1657
+ inputValue: inputValue
1658
+ });
1659
+ }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps
1660
+ var stateReducer = React__default["default"].useCallback(function (_, _ref4) {
1661
+ var type = _ref4.type,
1662
+ changes = _ref4.changes;
1663
+ if (changes.highlightedIndex !== undefined && (changes == null ? void 0 : changes.highlightedIndex) >= 0) {
1664
+ setLastHighlightedIndex(changes == null ? void 0 : changes.highlightedIndex);
1665
+ }
1596
1666
  switch (type) {
1667
+ // empty input to show selected item and reset dropdown list on item selection
1597
1668
  case Downshift.useCombobox.stateChangeTypes.ItemClick:
1598
1669
  case Downshift.useCombobox.stateChangeTypes.InputKeyDownEnter:
1599
1670
  case Downshift.useCombobox.stateChangeTypes.InputBlur:
1600
1671
  case Downshift.useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
1601
1672
  {
1602
1673
  filterListItems({
1603
- inputValue: ''
1674
+ inputValue: EMPTY_INPUT
1604
1675
  });
1605
1676
  return _extends({}, changes, {
1606
- inputValue: '' // reset input value to show placeholder on focus
1677
+ inputValue: EMPTY_INPUT
1607
1678
  });
1608
1679
  }
1609
-
1680
+ // remove leading whitespace, select element with spacebar on empty input, and filter list based on input
1610
1681
  case Downshift.useCombobox.stateChangeTypes.InputChange:
1611
1682
  {
1612
1683
  var _changes$inputValue;
1613
1684
  var leadingWhitespaceTest = /^\s+/g;
1614
- if ((_changes$inputValue = changes.inputValue) != null && _changes$inputValue.match(leadingWhitespaceTest)) setInputValue(changes.inputValue.replace(leadingWhitespaceTest, ''));else {
1615
- var _changes$inputValue2, _changes$inputValue3;
1616
- fetchItems((_changes$inputValue2 = changes.inputValue) != null ? _changes$inputValue2 : '');
1617
- filterListItems({
1618
- inputValue: (_changes$inputValue3 = changes.inputValue) != null ? _changes$inputValue3 : ''
1685
+ var isSpacePressedOnEmptyInput = changes.inputValue === ' ';
1686
+ if ((_changes$inputValue = changes.inputValue) != null && _changes$inputValue.match(leadingWhitespaceTest)) {
1687
+ setInputValue(changes.inputValue.replace(leadingWhitespaceTest, EMPTY_INPUT));
1688
+ if (isSpacePressedOnEmptyInput) {
1689
+ openMenu();
1690
+ if (isOpen && changes.highlightedIndex !== undefined) {
1691
+ onChange == null ? void 0 : onChange(listItems[changes.highlightedIndex]);
1692
+ }
1693
+ }
1694
+ } else {
1695
+ updateListItems({
1696
+ inputValue: changes.inputValue
1619
1697
  });
1620
1698
  }
1621
1699
  return changes;
@@ -1625,21 +1703,29 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1625
1703
  }
1626
1704
  }, [fetchItems, filterListItems]);
1627
1705
  var _useCombobox = Downshift.useCombobox(_extends({
1706
+ defaultHighlightedIndex: lastHighlightedIndex,
1628
1707
  items: listItems,
1629
- selectedItem: value,
1630
1708
  itemToString: itemToString,
1709
+ selectedItem: value,
1631
1710
  stateReducer: stateReducer,
1632
- onStateChange: function onStateChange(_ref4) {
1633
- var type = _ref4.type,
1634
- clickedItem = _ref4.selectedItem;
1711
+ onStateChange: function onStateChange(_ref5) {
1712
+ var type = _ref5.type,
1713
+ clickedItem = _ref5.selectedItem;
1635
1714
  switch (type) {
1636
1715
  // @ts-expect-error This falltrough is wanted
1637
1716
  case Downshift.useCombobox.stateChangeTypes.InputBlur:
1638
1717
  if (!selectOnBlur) break;
1639
1718
  case Downshift.useCombobox.stateChangeTypes.InputKeyDownEnter: // eslint-disable-line no-fallthrough
1640
1719
  case Downshift.useCombobox.stateChangeTypes.ItemClick:
1641
- onChange(clickedItem != null ? clickedItem : null);
1720
+ onChange == null ? void 0 : onChange(clickedItem != null ? clickedItem : null);
1642
1721
  }
1722
+ },
1723
+ // Accessibility
1724
+ getA11yStatusMessage: getA11yStatusMessage,
1725
+ // The following A11y-helper does not work due to a bug (https://github.com/downshift-js/downshift/issues/1227)
1726
+ // but is left here for when it is fixed
1727
+ getA11ySelectionMessage: function getA11ySelectionMessage$1(options) {
1728
+ return getA11ySelectionMessage(options);
1643
1729
  }
1644
1730
  }, rest)),
1645
1731
  isOpen = _useCombobox.isOpen,
@@ -1648,41 +1734,52 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1648
1734
  getLabelProps = _useCombobox.getLabelProps,
1649
1735
  getMenuProps = _useCombobox.getMenuProps,
1650
1736
  getInputProps = _useCombobox.getInputProps,
1651
- getComboboxProps = _useCombobox.getComboboxProps,
1652
1737
  highlightedIndex = _useCombobox.highlightedIndex,
1653
1738
  getItemProps = _useCombobox.getItemProps,
1654
1739
  selectedItem = _useCombobox.selectedItem,
1655
1740
  inputValue = _useCombobox.inputValue,
1656
1741
  setInputValue = _useCombobox.setInputValue;
1742
+ var handleOnClear = function handleOnClear() {
1743
+ var _inputRef$current;
1744
+ onChange == null ? void 0 : onChange(null);
1745
+ setInputValue(EMPTY_INPUT);
1746
+ (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
1747
+ updateListItems({
1748
+ inputValue: inputValue
1749
+ });
1750
+ };
1657
1751
  return React__default["default"].createElement("div", {
1658
1752
  className: "eds-dropdown__wrapper"
1659
1753
  }, React__default["default"].createElement(form.BaseFormControl, _extends({
1660
- append: React__default["default"].createElement(FieldAppend, {
1661
- selectedItems: [selectedItem],
1662
- isOpen: isOpen,
1754
+ append: React__default["default"].createElement(FieldAppend$1, {
1755
+ ariaLabelCloseList: ariaLabelCloseList,
1756
+ ariaLabelOpenList: ariaLabelOpenList,
1663
1757
  clearable: clearable,
1664
- loading: false,
1665
- loadingText: '',
1666
- readOnly: readonly,
1667
- onClear: function onClear() {
1668
- var _inputRef$current;
1669
- onChange(null);
1670
- setInputValue('');
1671
- (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
1672
- if (typeof initialItems === 'function') fetchItems(inputValue != null ? inputValue : '');
1673
- },
1674
- getToggleButtonProps: getToggleButtonProps
1758
+ labelClearSelectedItems: labelClearSelectedItem,
1759
+ disabled: readOnly || disabled,
1760
+ focusable: false,
1761
+ getToggleButtonProps: getToggleButtonProps,
1762
+ isOpen: isOpen,
1763
+ loading: loading,
1764
+ loadingText: loadingText,
1765
+ onClear: handleOnClear,
1766
+ selectedItems: [selectedItem]
1675
1767
  }),
1676
- disableLabelAnimation: disableLabelAnimation,
1677
1768
  className: classNames__default["default"]('eds-dropdown', className),
1678
- label: label,
1679
- isFilled: selectedItem || inputValue !== '',
1769
+ disabled: disabled,
1770
+ disableLabelAnimation: disableLabelAnimation,
1680
1771
  feedback: feedback,
1681
- variant: variant,
1682
- readOnly: readonly,
1683
- labelProps: getLabelProps()
1684
- }, getComboboxProps(), rest), !hideSelectedItem && selectedItem && !inputValue && React__default["default"].createElement("span", {
1685
- className: "eds-dropdown__selected-item__wrapper"
1772
+ isFilled: selectedItem !== null || inputValue !== EMPTY_INPUT,
1773
+ label: label,
1774
+ labelId: getLabelProps().id,
1775
+ labelProps: getLabelProps(),
1776
+ prepend: prepend,
1777
+ readOnly: readOnly,
1778
+ style: style,
1779
+ variant: variant
1780
+ }, rest), !hideSelectedItem && selectedItem && !inputValue && React__default["default"].createElement("span", {
1781
+ className: "eds-dropdown__selected-item__wrapper",
1782
+ "aria-hidden": "true"
1686
1783
  }, React__default["default"].createElement("span", {
1687
1784
  className: "eds-dropdown__selected-item",
1688
1785
  onClick: function onClick() {
@@ -1690,84 +1787,106 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1690
1787
  return (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.focus();
1691
1788
  }
1692
1789
  }, selectedItem.label)), React__default["default"].createElement("input", _extends({
1693
- placeholder: (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : placeholder,
1694
- className: "eds-dropdown__input eds-form-control"
1790
+ className: "eds-dropdown__input eds-form-control",
1791
+ disabled: readOnly || disabled,
1792
+ placeholder: (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : placeholder
1695
1793
  }, getInputProps({
1696
- onFocus: function onFocus() {
1697
- if (!isOpen && openOnFocus) openMenu();
1698
- setHideSelectedItem(true);
1794
+ onClick: function onClick(e) {
1795
+ if (!isOpen && isVoiceOverClick(e)) openMenu();
1699
1796
  },
1700
1797
  onBlur: function onBlur() {
1701
1798
  setHideSelectedItem(false);
1702
1799
  },
1800
+ onFocus: function onFocus() {
1801
+ setHideSelectedItem(true);
1802
+ },
1703
1803
  ref: inputRef
1704
1804
  })))), React__default["default"].createElement(DropdownList, {
1705
- selectedItems: selectedItem !== null ? [selectedItem] : [],
1706
1805
  isOpen: isOpen,
1707
1806
  listItems: listItems,
1708
- highlightedIndex: highlightedIndex,
1709
1807
  listStyle: listStyle,
1710
- getMenuProps: getMenuProps,
1808
+ loading: loading,
1809
+ loadingText: loadingText,
1711
1810
  getItemProps: getItemProps,
1712
- loading: loading
1811
+ getMenuProps: getMenuProps,
1812
+ highlightedIndex: highlightedIndex,
1813
+ selectedItems: selectedItem !== null ? [selectedItem] : []
1713
1814
  }));
1714
1815
  };
1715
1816
 
1716
- var _excluded$1 = ["allItemsSelectedLabel", "ariaLabelRemoveSelected", "className", "clearable", "clearInputOnSelect", "debounceTimeout", "feedback", "hideSelectAll", "items", "label", "listStyle", "maxTags", "onChange", "openOnFocus", "placeholder", "readonly", "removeAllItemsAriaLabel", "selectAllLabel", "selectedItems", "selectOnBlur", "style", "variant"];
1817
+ var _excluded$2 = ["className", "clearable", "clearInputOnSelect", "debounceTimeout", "disabled", "feedback", "hideSelectAll", "items", "label", "labelAllItemsSelected", "labelClearAllItems", "labelSelectAll", "listStyle", "loadingText", "maxTags", "onChange", "placeholder", "readOnly", "selectedItems", "selectOnBlur", "style", "variant", "ariaLabelChosenSingular", "ariaLabelChosenPlural", "ariaLabelCloseList", "ariaLabelJumpToInput", "ariaLabelOpenList", "ariaLabelRemoveSelected"];
1717
1818
  var MultiSelectBeta = function MultiSelectBeta(_ref) {
1718
- var _ref$allItemsSelected = _ref.allItemsSelectedLabel,
1719
- allItemsSelectedLabel = _ref$allItemsSelected === void 0 ? 'Alle valgt' : _ref$allItemsSelected,
1720
- _ref$ariaLabelRemoveS = _ref.ariaLabelRemoveSelected,
1721
- ariaLabelRemoveSelected = _ref$ariaLabelRemoveS === void 0 ? 'trykk for å fjerne valg' : _ref$ariaLabelRemoveS,
1722
- className = _ref.className,
1819
+ var className = _ref.className,
1723
1820
  _ref$clearable = _ref.clearable,
1724
- clearable = _ref$clearable === void 0 ? false : _ref$clearable,
1821
+ clearable = _ref$clearable === void 0 ? true : _ref$clearable,
1725
1822
  _ref$clearInputOnSele = _ref.clearInputOnSelect,
1726
1823
  clearInputOnSelect = _ref$clearInputOnSele === void 0 ? false : _ref$clearInputOnSele,
1824
+ _ref$disabled = _ref.disabled,
1825
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1727
1826
  feedback = _ref.feedback,
1728
1827
  _ref$hideSelectAll = _ref.hideSelectAll,
1729
1828
  hideSelectAll = _ref$hideSelectAll === void 0 ? false : _ref$hideSelectAll,
1730
1829
  initialItems = _ref.items,
1731
1830
  label = _ref.label,
1831
+ _ref$labelAllItemsSel = _ref.labelAllItemsSelected,
1832
+ labelAllItemsSelected = _ref$labelAllItemsSel === void 0 ? 'Alle valgt' : _ref$labelAllItemsSel,
1833
+ _ref$labelClearAllIte = _ref.labelClearAllItems,
1834
+ labelClearAllItems = _ref$labelClearAllIte === void 0 ? 'Fjern valgte' : _ref$labelClearAllIte,
1835
+ _ref$labelSelectAll = _ref.labelSelectAll,
1836
+ labelSelectAll = _ref$labelSelectAll === void 0 ? 'Velg alle' : _ref$labelSelectAll,
1732
1837
  listStyle = _ref.listStyle,
1838
+ loadingText = _ref.loadingText,
1733
1839
  _ref$maxTags = _ref.maxTags,
1734
1840
  maxTags = _ref$maxTags === void 0 ? 10 : _ref$maxTags,
1735
- onChange = _ref.onChange,
1736
- _ref$openOnFocus = _ref.openOnFocus,
1737
- openOnFocus = _ref$openOnFocus === void 0 ? false : _ref$openOnFocus,
1841
+ _ref$onChange = _ref.onChange,
1842
+ onChange = _ref$onChange === void 0 ? function () {
1843
+ return undefined;
1844
+ } : _ref$onChange,
1738
1845
  placeholder = _ref.placeholder,
1739
- _ref$readonly = _ref.readonly,
1740
- readonly = _ref$readonly === void 0 ? false : _ref$readonly,
1741
- _ref$removeAllItemsAr = _ref.removeAllItemsAriaLabel,
1742
- removeAllItemsAriaLabel = _ref$removeAllItemsAr === void 0 ? 'Fjern valgte' : _ref$removeAllItemsAr,
1743
- _ref$selectAllLabel = _ref.selectAllLabel,
1744
- selectAllLabel = _ref$selectAllLabel === void 0 ? 'Velg alle' : _ref$selectAllLabel,
1846
+ _ref$readOnly = _ref.readOnly,
1847
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1745
1848
  selectedItems = _ref.selectedItems,
1746
1849
  _ref$selectOnBlur = _ref.selectOnBlur,
1747
1850
  selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1748
1851
  style = _ref.style,
1749
1852
  _ref$variant = _ref.variant,
1750
1853
  variant = _ref$variant === void 0 ? 'info' : _ref$variant,
1751
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
1854
+ _ref$ariaLabelChosenS = _ref.ariaLabelChosenSingular,
1855
+ ariaLabelChosenSingular = _ref$ariaLabelChosenS === void 0 ? 'valgt' : _ref$ariaLabelChosenS,
1856
+ _ref$ariaLabelChosenP = _ref.ariaLabelChosenPlural,
1857
+ ariaLabelChosenPlural = _ref$ariaLabelChosenP === void 0 ? 'valgte' : _ref$ariaLabelChosenP,
1858
+ ariaLabelCloseList = _ref.ariaLabelCloseList,
1859
+ _ref$ariaLabelJumpToI = _ref.ariaLabelJumpToInput,
1860
+ ariaLabelJumpToInput = _ref$ariaLabelJumpToI === void 0 ? selectedItems.length + " valgte elementer, trykk for \xE5 hoppe til tekstfeltet" : _ref$ariaLabelJumpToI,
1861
+ ariaLabelOpenList = _ref.ariaLabelOpenList,
1862
+ _ref$ariaLabelRemoveS = _ref.ariaLabelRemoveSelected,
1863
+ ariaLabelRemoveSelected = _ref$ariaLabelRemoveS === void 0 ? 'trykk for å fjerne valg' : _ref$ariaLabelRemoveS,
1864
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
1752
1865
  var _React$useState = React__default["default"].useState(0),
1753
1866
  lastHighlightedIndex = _React$useState[0],
1754
1867
  setLastHighlightedIndex = _React$useState[1];
1868
+ var _React$useState2 = React__default["default"].useState(undefined),
1869
+ lastRemovedItem = _React$useState2[0],
1870
+ setLastRemovedItem = _React$useState2[1];
1755
1871
  var inputRef = React.useRef(null);
1756
1872
  var _useResolvedItems = useResolvedItems(initialItems),
1757
1873
  normalizedItems = _useResolvedItems.items,
1758
1874
  loading = _useResolvedItems.loading,
1759
1875
  fetchItems = _useResolvedItems.fetchItems;
1760
1876
  var isAllNonAsyncItemsSelected = typeof initialItems !== 'function' && selectedItems.length === normalizedItems.length;
1877
+ // special 'item' used as Select All entry in the dropdown list
1761
1878
  var selectAll = {
1762
1879
  value: utils.useRandomId('select-all'),
1763
- label: selectAllLabel
1880
+ label: labelSelectAll
1764
1881
  };
1882
+ // special 'item' used as a replacement selected item tag for when
1883
+ // there are more selected element than maxTags
1765
1884
  var summarySelectedItems = React__default["default"].useMemo(function () {
1766
1885
  return {
1767
- value: '',
1768
- label: isAllNonAsyncItemsSelected ? allItemsSelectedLabel : selectedItems.length + ' valgte'
1886
+ value: EMPTY_INPUT,
1887
+ label: isAllNonAsyncItemsSelected ? labelAllItemsSelected : selectedItems.length + ' ' + ariaLabelChosenPlural
1769
1888
  };
1770
- }, [isAllNonAsyncItemsSelected, selectedItems, normalizedItems, allItemsSelectedLabel]);
1889
+ }, [isAllNonAsyncItemsSelected, selectedItems, labelAllItemsSelected]);
1771
1890
  var _useState = React.useState([].concat(!hideSelectAll ? [selectAll] : [], normalizedItems)),
1772
1891
  listItems = _useState[0],
1773
1892
  setListItems = _useState[1];
@@ -1777,10 +1896,11 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1777
1896
  return lowerCaseFilterTest(item, inputValue);
1778
1897
  })));
1779
1898
  };
1780
- var updateListItems = function updateListItems(inputValue) {
1781
- if (typeof initialItems === 'function') fetchItems(inputValue != null ? inputValue : ''); // fetch items only if user provides a function as items
1899
+ var updateListItems = function updateListItems(_ref3) {
1900
+ var inputValue = _ref3.inputValue;
1901
+ if (typeof initialItems === 'function') fetchItems(inputValue != null ? inputValue : EMPTY_INPUT); // fetch items only if user provides a function as items
1782
1902
  filterListItems({
1783
- inputValue: inputValue != null ? inputValue : ''
1903
+ inputValue: inputValue != null ? inputValue : EMPTY_INPUT
1784
1904
  });
1785
1905
  };
1786
1906
  React__default["default"].useEffect(function () {
@@ -1790,62 +1910,87 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1790
1910
  }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps
1791
1911
  var _useMultiselectUtils = useMultiselectUtils({
1792
1912
  listItems: listItems,
1793
- selectAllValue: selectAll.value,
1913
+ selectAll: selectAll,
1794
1914
  selectedItems: selectedItems
1795
1915
  }),
1796
- addClickedItemToSelectedItems = _useMultiselectUtils.addClickedItemToSelectedItems,
1797
- allListItemsAreSelected = _useMultiselectUtils.allListItemsAreSelected,
1798
- clickedItemIsInSelectedItems = _useMultiselectUtils.clickedItemIsInSelectedItems,
1799
- clickedItemIsSelectAll = _useMultiselectUtils.clickedItemIsSelectAll,
1800
1916
  hasSelectedItems = _useMultiselectUtils.hasSelectedItems,
1801
- removeClickedItemFromSelectedItems = _useMultiselectUtils.removeClickedItemFromSelectedItems,
1802
- selectAllCheckboxState = _useMultiselectUtils.selectAllCheckboxState,
1803
- selectAllUnselectedItemsInListItems = _useMultiselectUtils.selectAllUnselectedItemsInListItems,
1804
- unselectAllListItems = _useMultiselectUtils.unselectAllListItems;
1917
+ handleListItemClicked = _useMultiselectUtils.handleListItemClicked,
1918
+ selectAllCheckboxState = _useMultiselectUtils.selectAllCheckboxState;
1805
1919
  var _useMultipleSelection = Downshift.useMultipleSelection({
1806
1920
  selectedItems: selectedItems,
1807
1921
  itemToString: itemToString,
1808
- onSelectedItemsChange: function onSelectedItemsChange(changes) {
1809
- var _changes$selectedItem;
1810
- onChange((_changes$selectedItem = changes.selectedItems) != null ? _changes$selectedItem : []);
1922
+ // Accessibility
1923
+ getA11yRemovalMessage: function getA11yRemovalMessage$1(options) {
1924
+ return getA11yRemovalMessage(_extends({}, options, {
1925
+ selectAllItem: selectAll,
1926
+ removedItem: lastRemovedItem
1927
+ }));
1811
1928
  }
1812
1929
  }),
1813
1930
  getSelectedItemProps = _useMultipleSelection.getSelectedItemProps,
1814
- getDropdownProps = _useMultipleSelection.getDropdownProps,
1815
- removeSelectedItem = _useMultipleSelection.removeSelectedItem;
1816
- var stateReducer = React__default["default"].useCallback(function (_, _ref3) {
1817
- var _inputRef$current$val, _inputRef$current, _inputRef$current$val2, _inputRef$current2, _changes$inputValue;
1818
- var changes = _ref3.changes,
1819
- type = _ref3.type;
1820
- if (changes != null && changes.highlightedIndex && (changes == null ? void 0 : changes.highlightedIndex) >= 0) setLastHighlightedIndex(changes == null ? void 0 : changes.highlightedIndex);
1931
+ getDropdownProps = _useMultipleSelection.getDropdownProps;
1932
+ var stateReducer = React__default["default"].useCallback(function (_, _ref4) {
1933
+ var changes = _ref4.changes,
1934
+ type = _ref4.type;
1935
+ if (changes.highlightedIndex !== undefined && (changes == null ? void 0 : changes.highlightedIndex) >= 0) {
1936
+ setLastHighlightedIndex(changes == null ? void 0 : changes.highlightedIndex);
1937
+ }
1821
1938
  switch (type) {
1939
+ // keep menu open and edit input value on item selection
1822
1940
  case Downshift.useCombobox.stateChangeTypes.InputKeyDownEnter:
1823
1941
  case Downshift.useCombobox.stateChangeTypes.ItemClick:
1824
- if (clearInputOnSelect) {
1825
- updateListItems('');
1942
+ {
1943
+ var _inputRef$current$val, _inputRef$current;
1944
+ if (clearInputOnSelect) {
1945
+ updateListItems({
1946
+ inputValue: EMPTY_INPUT
1947
+ });
1948
+ }
1949
+ return _extends({}, changes, {
1950
+ isOpen: true,
1951
+ inputValue: clearInputOnSelect ? EMPTY_INPUT : (_inputRef$current$val = inputRef == null ? void 0 : (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.value) != null ? _inputRef$current$val : EMPTY_INPUT
1952
+ });
1826
1953
  }
1827
- return _extends({}, changes, {
1828
- isOpen: true,
1829
- inputValue: clearInputOnSelect ? '' : (_inputRef$current$val = inputRef == null ? void 0 : (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.value) != null ? _inputRef$current$val : ''
1830
- });
1954
+ // edit input value when selected items is updated outside component
1831
1955
  case Downshift.useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
1832
- return _extends({}, changes, {
1833
- inputValue: clearInputOnSelect ? '' : (_inputRef$current$val2 = inputRef == null ? void 0 : (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value) != null ? _inputRef$current$val2 : ''
1834
- });
1835
- case Downshift.useCombobox.stateChangeTypes.InputChange:
1836
- if ((_changes$inputValue = changes.inputValue) != null && _changes$inputValue.match(/^\s+/g)) {
1837
- var _changes$inputValue$r;
1838
- // remove leading whitespace if it exists
1956
+ {
1957
+ var _inputRef$current$val2, _inputRef$current2;
1839
1958
  return _extends({}, changes, {
1840
- inputValue: (_changes$inputValue$r = changes.inputValue.replace(/^\s+/g, '')) != null ? _changes$inputValue$r : ''
1959
+ inputValue: clearInputOnSelect ? EMPTY_INPUT : (_inputRef$current$val2 = inputRef == null ? void 0 : (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value) != null ? _inputRef$current$val2 : EMPTY_INPUT
1841
1960
  });
1842
1961
  }
1843
- updateListItems(changes.inputValue);
1844
- return changes;
1962
+ // remove leading whitespace, select item with spacebar if input is empty and filter list items
1963
+ case Downshift.useCombobox.stateChangeTypes.InputChange:
1964
+ {
1965
+ var _changes$inputValue;
1966
+ var leadingWhitespaceTest = /^\s+/g;
1967
+ var isSpacePressedOnEmptyInput = changes.inputValue === ' ';
1968
+ if ((_changes$inputValue = changes.inputValue) != null && _changes$inputValue.match(leadingWhitespaceTest)) {
1969
+ setInputValue(changes.inputValue.replace(leadingWhitespaceTest, EMPTY_INPUT));
1970
+ if (isSpacePressedOnEmptyInput) {
1971
+ openMenu();
1972
+ if (isOpen && changes.highlightedIndex !== undefined) {
1973
+ handleListItemClicked({
1974
+ clickedItem: listItems[changes.highlightedIndex],
1975
+ onChange: onChange,
1976
+ setLastRemovedItem: setLastRemovedItem
1977
+ });
1978
+ }
1979
+ }
1980
+ } else {
1981
+ updateListItems({
1982
+ inputValue: changes.inputValue
1983
+ });
1984
+ }
1985
+ return changes;
1986
+ }
1987
+ // reset input value when leaving input field
1845
1988
  case Downshift.useCombobox.stateChangeTypes.InputBlur:
1846
- return _extends({}, changes, {
1847
- inputValue: ''
1848
- });
1989
+ {
1990
+ return _extends({}, changes, {
1991
+ inputValue: EMPTY_INPUT
1992
+ });
1993
+ }
1849
1994
  default:
1850
1995
  return changes;
1851
1996
  }
@@ -1856,9 +2001,9 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1856
2001
  itemToString: itemToString,
1857
2002
  selectedItem: null,
1858
2003
  stateReducer: stateReducer,
1859
- onStateChange: function onStateChange(_ref4) {
1860
- var type = _ref4.type,
1861
- clickedItem = _ref4.selectedItem;
2004
+ onStateChange: function onStateChange(_ref5) {
2005
+ var type = _ref5.type,
2006
+ clickedItem = _ref5.selectedItem;
1862
2007
  // clickedItem means item chosen either via mouse or keyboard
1863
2008
  if (!clickedItem) return;
1864
2009
  switch (type) {
@@ -1867,20 +2012,29 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1867
2012
  if (!selectOnBlur) break;
1868
2013
  case Downshift.useCombobox.stateChangeTypes.InputKeyDownEnter: // eslint-disable-line no-fallthrough
1869
2014
  case Downshift.useCombobox.stateChangeTypes.ItemClick:
1870
- if (clickedItemIsSelectAll(clickedItem)) {
1871
- if (allListItemsAreSelected) {
1872
- return unselectAllListItems(onChange);
1873
- }
1874
- return selectAllUnselectedItemsInListItems(onChange);
1875
- }
1876
- if (clickedItemIsInSelectedItems(clickedItem)) {
1877
- return removeClickedItemFromSelectedItems(clickedItem, onChange);
2015
+ {
2016
+ handleListItemClicked({
2017
+ clickedItem: clickedItem,
2018
+ onChange: onChange,
2019
+ setLastRemovedItem: setLastRemovedItem
2020
+ });
1878
2021
  }
1879
- addClickedItemToSelectedItems(clickedItem, onChange);
1880
2022
  }
2023
+ },
2024
+ // Accessibility
2025
+ getA11yStatusMessage: function getA11yStatusMessage$1(options) {
2026
+ return getA11yStatusMessage(_extends({}, options, {
2027
+ selectAllItemIncluded: !hideSelectAll
2028
+ }));
2029
+ },
2030
+ // The following A11y-helper does not work due to a bug (https://github.com/downshift-js/downshift/issues/1227)
2031
+ // but is left here for when it is fixed
2032
+ getA11ySelectionMessage: function getA11ySelectionMessage$1(options) {
2033
+ return getA11ySelectionMessage(_extends({}, options, {
2034
+ selectAllItem: selectAll
2035
+ }));
1881
2036
  }
1882
2037
  }, rest)),
1883
- getComboboxProps = _useCombobox.getComboboxProps,
1884
2038
  getInputProps = _useCombobox.getInputProps,
1885
2039
  getItemProps = _useCombobox.getItemProps,
1886
2040
  getLabelProps = _useCombobox.getLabelProps,
@@ -1894,39 +2048,40 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1894
2048
  var handleOnClear = function handleOnClear() {
1895
2049
  var _inputRef$current3;
1896
2050
  onChange([]);
1897
- setInputValue('');
2051
+ setInputValue(EMPTY_INPUT);
1898
2052
  (_inputRef$current3 = inputRef.current) == null ? void 0 : _inputRef$current3.focus();
1899
- updateListItems(inputValue);
2053
+ updateListItems({
2054
+ inputValue: inputValue
2055
+ });
1900
2056
  };
1901
- // role=combobox leads to strange VoiceOver behavior and is therefor omitted
1902
- // const { role: _, ...comboboxProps } = getComboboxProps();
1903
- var _getComboboxProps = getComboboxProps(),
1904
- comboboxProps = _extends({}, (_objectDestructuringEmpty(_getComboboxProps), _getComboboxProps));
1905
2057
  return React__default["default"].createElement("div", {
1906
2058
  className: "eds-dropdown__wrapper"
1907
2059
  }, React__default["default"].createElement(form.BaseFormControl, _extends({
1908
- append: React__default["default"].createElement(FieldAppend, {
2060
+ append: React__default["default"].createElement(FieldAppend$1, {
2061
+ ariaLabelCloseList: ariaLabelCloseList,
2062
+ ariaLabelOpenList: ariaLabelOpenList,
1909
2063
  selectedItems: selectedItems,
1910
2064
  isOpen: isOpen,
1911
2065
  clearable: clearable,
1912
- clearSelectedItemsLabel: removeAllItemsAriaLabel,
2066
+ labelClearSelectedItems: labelClearAllItems,
2067
+ focusable: false,
1913
2068
  loading: loading,
1914
- loadingText: '',
1915
- readOnly: readonly,
2069
+ loadingText: loadingText,
2070
+ disabled: readOnly || disabled,
1916
2071
  onClear: handleOnClear,
1917
2072
  getToggleButtonProps: getToggleButtonProps
1918
2073
  }),
1919
2074
  className: classNames__default["default"]('eds-dropdown', className),
1920
- label: label,
1921
- isFilled: hasSelectedItems || inputValue !== '',
2075
+ disabled: disabled,
1922
2076
  feedback: feedback,
1923
- variant: variant,
1924
- readOnly: readonly,
2077
+ isFilled: hasSelectedItems || inputValue !== EMPTY_INPUT,
2078
+ label: label,
2079
+ labelId: getLabelProps().id,
2080
+ labelProps: getLabelProps(),
2081
+ readOnly: readOnly,
1925
2082
  style: style,
1926
- labelProps: _extends({
1927
- 'aria-label': label + ", multiselect, " + selectedItems.length + " valgte elementer"
1928
- }, getLabelProps())
1929
- }, comboboxProps, rest), React__default["default"].createElement("div", {
2083
+ variant: variant
2084
+ }, rest), React__default["default"].createElement("div", {
1930
2085
  className: classNames__default["default"]('eds-dropdown__selected-items-and-input', {
1931
2086
  'eds-dropdown__selected-items-and-input--filled': hasSelectedItems
1932
2087
  }),
@@ -1934,68 +2089,100 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1934
2089
  var _inputRef$current4;
1935
2090
  if (e.target === e.currentTarget) (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.focus();
1936
2091
  }
1937
- }, selectedItems.length < maxTags ? selectedItems.map(function (selectedItem, index) {
2092
+ }, selectedItems.length < maxTags ? React__default["default"].createElement(React__default["default"].Fragment, null, selectedItems.length > 1 ? React__default["default"].createElement(a11y.VisuallyHidden, {
2093
+ onClick: function onClick() {
2094
+ var _inputRef$current5;
2095
+ return (_inputRef$current5 = inputRef.current) == null ? void 0 : _inputRef$current5.focus();
2096
+ }
2097
+ }, ariaLabelJumpToInput) : React__default["default"].createElement(React__default["default"].Fragment, null), selectedItems.map(function (selectedItem, index) {
1938
2098
  return React__default["default"].createElement(SelectedItemTag, {
2099
+ ariaLabelChosen: ariaLabelChosenSingular,
2100
+ ariaLabelRemoveSelected: ariaLabelRemoveSelected,
2101
+ disabled: disabled,
2102
+ getSelectedItemProps: getSelectedItemProps,
1939
2103
  index: index,
1940
2104
  key: selectedItem.value,
1941
- getSelectedItemProps: getSelectedItemProps,
1942
- selectedItem: selectedItem,
1943
- removeSelectedItem: removeSelectedItem,
1944
- ariaLabelRemoveSelected: ariaLabelRemoveSelected
2105
+ readOnly: readOnly,
2106
+ removeSelectedItem: function removeSelectedItem() {
2107
+ var _inputRef$current6;
2108
+ handleListItemClicked({
2109
+ clickedItem: selectedItem,
2110
+ onChange: onChange,
2111
+ setLastRemovedItem: setLastRemovedItem
2112
+ });
2113
+ inputRef == null ? void 0 : (_inputRef$current6 = inputRef.current) == null ? void 0 : _inputRef$current6.focus();
2114
+ },
2115
+ selectedItem: selectedItem
1945
2116
  });
1946
- }) : React__default["default"].createElement(SelectedItemTag, {
1947
- selectedItem: summarySelectedItems,
2117
+ })) : React__default["default"].createElement(SelectedItemTag, {
2118
+ ariaLabelRemoveSelected: labelClearAllItems,
2119
+ ariaLabelChosen: "",
2120
+ disabled: disabled,
2121
+ readOnly: readOnly,
1948
2122
  removeSelectedItem: handleOnClear,
1949
- ariaLabelRemoveSelected: removeAllItemsAriaLabel
2123
+ selectedItem: summarySelectedItems
1950
2124
  }), React__default["default"].createElement("input", _extends({
1951
2125
  placeholder: placeholder,
1952
2126
  className: "eds-dropdown__input eds-form-control",
1953
- role: "combobox" // eslint-disable-line jsx-a11y/role-has-required-aria-props
2127
+ disabled: readOnly || disabled
1954
2128
  }, getInputProps(getDropdownProps({
1955
- preventKeyAction: isOpen,
1956
- onFocus: function onFocus() {
1957
- if (!isOpen && openOnFocus) openMenu();
2129
+ onClick: function onClick(e) {
2130
+ if (!isOpen && isVoiceOverClick(e)) openMenu();
1958
2131
  },
2132
+ preventKeyAction: isOpen,
1959
2133
  ref: inputRef,
1960
- value: inputValue != null ? inputValue : ''
2134
+ value: inputValue != null ? inputValue : EMPTY_INPUT
1961
2135
  })))))), React__default["default"].createElement(DropdownList, {
1962
- listItems: listItems,
1963
- selectedItems: selectedItems,
2136
+ getItemProps: getItemProps,
2137
+ getMenuProps: getMenuProps,
2138
+ highlightedIndex: highlightedIndex,
1964
2139
  inputValue: inputValue,
1965
2140
  isOpen: isOpen,
1966
- highlightedIndex: highlightedIndex,
1967
- getMenuProps: getMenuProps,
1968
- getItemProps: getItemProps,
1969
- selectAllItem: selectAll,
1970
- selectAllCheckboxState: selectAllCheckboxState,
2141
+ listItems: listItems,
1971
2142
  listStyle: listStyle,
1972
- loading: loading
2143
+ loading: loading,
2144
+ loadingText: loadingText,
2145
+ selectAllCheckboxState: selectAllCheckboxState,
2146
+ selectAllItem: selectAll,
2147
+ selectedItems: selectedItems
1973
2148
  }));
1974
2149
  };
1975
2150
 
1976
- var _excluded = ["className", "clearable", "debounceTimeout", "feedback", "items", "label", "listStyle", "onChange", "openOnFocus", "placeholder", "readonly", "selectedItem", "selectOnBlur", "selectOnTab", "variant"];
2151
+ var _excluded$1 = ["ariaLabelCloseList", "ariaLabelOpenList", "className", "clearable", "disabled", "disableLabelAnimation", "feedback", "items", "label", "labelClearSelectedItem", "listStyle", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "style", "variant"];
1977
2152
  var DropdownBeta = function DropdownBeta(_ref) {
1978
- var _selectedItem$label;
1979
- var className = _ref.className,
1980
- debounceTimeout = _ref.debounceTimeout,
2153
+ var _ref3, _selectedItem$label;
2154
+ var ariaLabelCloseList = _ref.ariaLabelCloseList,
2155
+ ariaLabelOpenList = _ref.ariaLabelOpenList,
2156
+ className = _ref.className,
2157
+ _ref$disabled = _ref.disabled,
2158
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
2159
+ disableLabelAnimation = _ref.disableLabelAnimation,
1981
2160
  feedback = _ref.feedback,
1982
2161
  initialItems = _ref.items,
1983
2162
  label = _ref.label,
2163
+ _ref$labelClearSelect = _ref.labelClearSelectedItem,
2164
+ labelClearSelectedItem = _ref$labelClearSelect === void 0 ? 'fjern valgt' : _ref$labelClearSelect,
1984
2165
  listStyle = _ref.listStyle,
2166
+ loadingText = _ref.loadingText,
1985
2167
  onChange = _ref.onChange,
1986
- _ref$readonly = _ref.readonly,
1987
- readonly = _ref$readonly === void 0 ? false : _ref$readonly,
2168
+ placeholder = _ref.placeholder,
2169
+ prepend = _ref.prepend,
2170
+ _ref$readOnly = _ref.readOnly,
2171
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1988
2172
  selectedItem = _ref.selectedItem,
1989
2173
  _ref$selectOnBlur = _ref.selectOnBlur,
1990
2174
  selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
2175
+ style = _ref.style,
1991
2176
  _ref$variant = _ref.variant,
1992
2177
  variant = _ref$variant === void 0 ? 'info' : _ref$variant,
1993
- rest = _objectWithoutPropertiesLoose(_ref, _excluded);
1994
- var _useResolvedItems = useResolvedItems(initialItems, debounceTimeout),
2178
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
2179
+ var _useResolvedItems = useResolvedItems(initialItems),
1995
2180
  normalizedItems = _useResolvedItems.items,
1996
2181
  loading = _useResolvedItems.loading;
2182
+ var isFilled = selectedItem !== null || placeholder !== undefined;
1997
2183
  var _useSelect = Downshift.useSelect({
1998
2184
  items: normalizedItems,
2185
+ defaultHighlightedIndex: selectedItem ? undefined : 0,
1999
2186
  selectedItem: selectedItem,
2000
2187
  onStateChange: function onStateChange(_ref2) {
2001
2188
  var type = _ref2.type,
@@ -2004,7 +2191,7 @@ var DropdownBeta = function DropdownBeta(_ref) {
2004
2191
  // @ts-expect-error This falltrough is wanted
2005
2192
  case Downshift.useSelect.stateChangeTypes.InputBlur:
2006
2193
  if (!selectOnBlur) break;
2007
- case Downshift.useSelect.stateChangeTypes.MenuKeyDownEnter: // eslint-disable-line no-fallthrough
2194
+ case Downshift.useSelect.stateChangeTypes.ToggleButtonKeyDownEnter: // eslint-disable-line no-fallthrough
2008
2195
  case Downshift.useSelect.stateChangeTypes.ItemClick:
2009
2196
  onChange == null ? void 0 : onChange(clickedItem !== undefined ? clickedItem : null);
2010
2197
  }
@@ -2012,54 +2199,148 @@ var DropdownBeta = function DropdownBeta(_ref) {
2012
2199
  itemToString: itemToString
2013
2200
  }),
2014
2201
  isOpen = _useSelect.isOpen,
2015
- getToggleButtonProps = _useSelect.getToggleButtonProps,
2202
+ getItemProps = _useSelect.getItemProps,
2016
2203
  getLabelProps = _useSelect.getLabelProps,
2017
2204
  getMenuProps = _useSelect.getMenuProps,
2018
- highlightedIndex = _useSelect.highlightedIndex,
2019
- getItemProps = _useSelect.getItemProps;
2205
+ getToggleButtonProps = _useSelect.getToggleButtonProps,
2206
+ highlightedIndex = _useSelect.highlightedIndex;
2020
2207
  return React__default["default"].createElement("div", {
2021
2208
  className: "eds-dropdown__wrapper"
2022
2209
  }, React__default["default"].createElement(form.BaseFormControl, _extends({
2023
- append: React__default["default"].createElement(FieldAppend, {
2024
- selectedItems: [selectedItem],
2025
- isOpen: isOpen,
2210
+ append: React__default["default"].createElement(FieldAppend$1, {
2211
+ ariaHiddenToggleButton: true,
2212
+ ariaLabelCloseList: ariaLabelCloseList,
2213
+ ariaLabelOpenList: ariaLabelOpenList,
2026
2214
  clearable: true,
2215
+ labelClearSelectedItems: labelClearSelectedItem,
2216
+ focusable: false,
2217
+ getToggleButtonProps: getToggleButtonProps,
2218
+ isOpen: isOpen,
2027
2219
  loading: loading,
2028
- loadingText: '',
2029
- readOnly: readonly,
2220
+ loadingText: loadingText,
2030
2221
  onClear: function onClear() {
2031
2222
  onChange == null ? void 0 : onChange(null);
2032
2223
  },
2033
- getToggleButtonProps: getToggleButtonProps,
2034
- clearSelectedItemsLabel: "Fjern valgt",
2035
- ariaLabelClearItems: (selectedItem == null ? void 0 : selectedItem.label) + " valgt, trykk for \xE5 fjerne valget",
2036
- focusable: true
2224
+ disabled: readOnly || disabled,
2225
+ selectedItems: [selectedItem]
2037
2226
  }),
2038
2227
  className: classNames__default["default"]('eds-dropdown', className, {
2039
- 'eds-dropdown--not-filled': selectedItem === null
2228
+ 'eds-dropdown--not-filled': !isFilled
2040
2229
  }),
2230
+ disabled: disabled,
2231
+ disableLabelAnimation: disableLabelAnimation,
2232
+ feedback: feedback,
2233
+ isFilled: isFilled,
2041
2234
  label: label,
2042
2235
  labelId: getLabelProps().id,
2043
2236
  labelProps: getLabelProps(),
2044
- disableLabelAnimation: true,
2045
- isFilled: selectedItem !== null,
2046
- feedback: feedback,
2047
- variant: variant,
2048
- readOnly: readonly
2049
- }, rest), React__default["default"].createElement("div", _extends({
2237
+ prepend: prepend,
2238
+ readOnly: readOnly,
2239
+ style: style,
2240
+ variant: variant
2241
+ }, rest), React__default["default"].createElement("button", _extends({
2050
2242
  className: "eds-dropdown__selected-item-button"
2051
- }, getToggleButtonProps()), (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : '')), React__default["default"].createElement(DropdownList, {
2052
- selectedItems: selectedItem !== null ? [selectedItem] : [],
2243
+ }, getToggleButtonProps()), (_ref3 = (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : React__default["default"].createElement("span", {
2244
+ className: classNames__default["default"]('eds-dropdown__selected-item-button__placeholder', {
2245
+ 'eds-dropdown__selected-item-button__placeholder--readonly': readOnly
2246
+ })
2247
+ }, placeholder)) != null ? _ref3 : '')), React__default["default"].createElement(DropdownList, {
2248
+ getItemProps: getItemProps,
2249
+ getMenuProps: getMenuProps,
2250
+ highlightedIndex: highlightedIndex,
2053
2251
  isOpen: isOpen,
2054
2252
  listItems: normalizedItems,
2055
- highlightedIndex: highlightedIndex,
2056
2253
  listStyle: listStyle,
2057
- getMenuProps: getMenuProps,
2058
- getItemProps: getItemProps,
2059
- loading: loading
2254
+ loading: loading,
2255
+ loadingText: loadingText,
2256
+ selectedItems: selectedItem !== null ? [selectedItem] : []
2060
2257
  }));
2061
2258
  };
2062
2259
 
2260
+ var _excluded = ["className", "disabled", "disableLabelAnimation", "feedback", "items", "label", "loadingText", "onChange", "prepend", "readOnly", "selectedItem", "style", "value", "variant"];
2261
+ var NativeDropdown = function NativeDropdown(_ref) {
2262
+ var _ref2;
2263
+ var className = _ref.className,
2264
+ _ref$disabled = _ref.disabled,
2265
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
2266
+ disableLabelAnimation = _ref.disableLabelAnimation,
2267
+ feedback = _ref.feedback,
2268
+ items = _ref.items,
2269
+ label = _ref.label,
2270
+ loadingText = _ref.loadingText,
2271
+ _onChange = _ref.onChange,
2272
+ prepend = _ref.prepend,
2273
+ _ref$readOnly = _ref.readOnly,
2274
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
2275
+ selectedItem = _ref.selectedItem,
2276
+ style = _ref.style,
2277
+ value = _ref.value,
2278
+ variant = _ref.variant,
2279
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded);
2280
+ var _useResolvedItems = useResolvedItems(items),
2281
+ normalizedItems = _useResolvedItems.items,
2282
+ loading = _useResolvedItems.loading;
2283
+ var nativeDropdownId = utils.useRandomId('eds-dropdown-native');
2284
+ return React__default["default"].createElement(form.BaseFormControl, {
2285
+ disabled: disabled,
2286
+ readOnly: readOnly,
2287
+ prepend: prepend,
2288
+ append: React__default["default"].createElement(FieldAppend, {
2289
+ hidden: disabled || readOnly,
2290
+ loading: loading,
2291
+ loadingText: loadingText
2292
+ }),
2293
+ className: className,
2294
+ style: style,
2295
+ label: label,
2296
+ labelId: nativeDropdownId,
2297
+ variant: variant,
2298
+ feedback: feedback,
2299
+ disableLabelAnimation: disableLabelAnimation,
2300
+ isFilled: true
2301
+ }, React__default["default"].createElement("select", _extends({
2302
+ "aria-invalid": variant === 'error',
2303
+ "aria-labelledby": nativeDropdownId,
2304
+ "aria-busy": loading,
2305
+ className: "eds-form-control eds-dropdown--native",
2306
+ disabled: disabled || readOnly,
2307
+ onChange: function onChange(event) {
2308
+ var _normalizedItems$find;
2309
+ _onChange == null ? void 0 : _onChange({
2310
+ value: event.target.value,
2311
+ selectedItem: (_normalizedItems$find = normalizedItems.find(function (item) {
2312
+ return item.value === event.target.value;
2313
+ })) != null ? _normalizedItems$find : null,
2314
+ target: event.target
2315
+ });
2316
+ },
2317
+ value: (_ref2 = value != null ? value : selectedItem == null ? void 0 : selectedItem.value) != null ? _ref2 : undefined
2318
+ }, rest), normalizedItems.map(function (item) {
2319
+ return React__default["default"].createElement("option", {
2320
+ key: item.value,
2321
+ value: item.value
2322
+ }, item.label);
2323
+ })));
2324
+ };
2325
+ var FieldAppend = function FieldAppend(_ref3) {
2326
+ var loading = _ref3.loading,
2327
+ loadingText = _ref3.loadingText,
2328
+ hidden = _ref3.hidden;
2329
+ if (loading) {
2330
+ return React__default["default"].createElement("div", {
2331
+ className: "eds-dropdown-native__loading-dots"
2332
+ }, React__default["default"].createElement(loader.LoadingDots, {
2333
+ "aria-label": loadingText
2334
+ }));
2335
+ }
2336
+ if (hidden) {
2337
+ return React__default["default"].createElement(React__default["default"].Fragment, null);
2338
+ }
2339
+ return React__default["default"].createElement(icons.DownArrowIcon, {
2340
+ inline: true
2341
+ });
2342
+ };
2343
+
2063
2344
  utils.warnAboutMissingStyles('dropdown', 'form', 'a11y', 'chip');
2064
2345
 
2065
2346
  exports.Dropdown = Dropdown;