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