@entur/dropdown 7.2.3-beta.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -421,7 +421,9 @@ var DropdownList = function DropdownList(_ref) {
421
421
  checked: selectAllCheckboxState == null ? void 0 : selectAllCheckboxState(),
422
422
  className: "eds-dropdown__list__item__checkbox",
423
423
  tabIndex: -1,
424
- readOnly: true
424
+ onChange: function onChange() {
425
+ return undefined;
426
+ }
425
427
  }), React.createElement("span", {
426
428
  className: "eds-dropdown__list__item__text",
427
429
  "aria-label": ariaValuesSelectAll().label
@@ -436,7 +438,9 @@ var DropdownList = function DropdownList(_ref) {
436
438
  checked: isItemSelected(item),
437
439
  className: "eds-dropdown__list__item__checkbox",
438
440
  tabIndex: -1,
439
- readOnly: true
441
+ onChange: function onChange() {
442
+ return undefined;
443
+ }
440
444
  }), React.createElement("span", {
441
445
  className: "eds-dropdown__list__item__text"
442
446
  }, item.label, React.createElement(VisuallyHidden, null, isItemSelected(item) ? ariaLabelSelectedItem : '')), Array.isArray(item.icons) ? item.icons.filter(isReactComponent).map(function (Icon, index) {
@@ -876,7 +880,7 @@ function getA11yStatusMessage(options) {
876
880
 
877
881
  var _excluded$3 = ["ariaLabelChosenSingular", "ariaLabelCloseList", "ariaLabelOpenList", "ariaLabelSelectedItem", "className", "clearable", "debounceTimeout", "disabled", "disableLabelAnimation", "feedback", "items", "itemFilter", "label", "labelClearSelectedItem", "labelTooltip", "listStyle", "loading", "loadingText", "noMatchesText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "selectOnTab", "style", "variant"];
878
882
  var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
879
- var _document, _selectedItem$label;
883
+ var _document, _getInputProps2, _selectedItem$label;
880
884
  var ariaLabelChosenSingular = _ref.ariaLabelChosenSingular,
881
885
  _ref$ariaLabelCloseLi = _ref.ariaLabelCloseList,
882
886
  ariaLabelCloseList = _ref$ariaLabelCloseLi === void 0 ? 'Lukk liste med valg' : _ref$ariaLabelCloseLi,
@@ -1035,9 +1039,8 @@ var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1035
1039
  inputValue: changes.inputValue
1036
1040
  });
1037
1041
  },
1038
- onStateChange: function onStateChange(_ref6) {
1042
+ onSelectedItemChange: function onSelectedItemChange(_ref6) {
1039
1043
  var newSelectedItem = _ref6.selectedItem;
1040
- if (newSelectedItem === undefined) return;
1041
1044
  onChange(newSelectedItem);
1042
1045
  },
1043
1046
  // Accessibility
@@ -1047,7 +1050,6 @@ var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1047
1050
  }));
1048
1051
  }
1049
1052
  }),
1050
- closeMenu = _useCombobox.closeMenu,
1051
1053
  isOpen = _useCombobox.isOpen,
1052
1054
  getToggleButtonProps = _useCombobox.getToggleButtonProps,
1053
1055
  getLabelProps = _useCombobox.getLabelProps,
@@ -1057,7 +1059,9 @@ var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1057
1059
  getItemProps = _useCombobox.getItemProps,
1058
1060
  selectedItem = _useCombobox.selectedItem,
1059
1061
  inputValue = _useCombobox.inputValue,
1060
- setInputValue = _useCombobox.setInputValue;
1062
+ setInputValue = _useCombobox.setInputValue,
1063
+ selectItem = _useCombobox.selectItem,
1064
+ reset = _useCombobox.reset;
1061
1065
  // calculations for floating-UI popover position
1062
1066
  var _useFloating = useFloating({
1063
1067
  open: isOpen,
@@ -1094,13 +1098,8 @@ var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1094
1098
  }, [isOpen, refs.reference, refs.floating, update]);
1095
1099
  var handleOnClear = function handleOnClear() {
1096
1100
  var _inputRef$current;
1097
- onChange(null);
1098
- setInputValue(EMPTY_INPUT);
1099
1101
  (_inputRef$current = inputRef.current) == null || _inputRef$current.focus();
1100
- updateListItems({
1101
- inputValue: inputValue
1102
- });
1103
- setShowSelectedItem(false);
1102
+ reset();
1104
1103
  };
1105
1104
  return React.createElement(BaseFormControl, _extends({
1106
1105
  className: classNames('eds-dropdown', 'eds-dropdown--searchable', className, {
@@ -1114,6 +1113,9 @@ var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1114
1113
  labelId: getLabelProps().id,
1115
1114
  labelProps: getLabelProps(),
1116
1115
  labelTooltip: labelTooltip,
1116
+ onBlur: function onBlur() {
1117
+ return setInputValue('');
1118
+ },
1117
1119
  onClick: function onClick(e) {
1118
1120
  if (e.target === e.currentTarget) {
1119
1121
  var _getInputProps;
@@ -1150,13 +1152,7 @@ var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1150
1152
  className: classNames('eds-dropdown--searchable__selected-item', {
1151
1153
  'eds-dropdown--searchable__selected-item--hidden': !showSelectedItem
1152
1154
  }),
1153
- onClick: function onClick(event) {
1154
- if (!disabled && !readOnly) {
1155
- var _inputRef$current2, _getInputProps2;
1156
- (_inputRef$current2 = inputRef.current) == null || _inputRef$current2.focus();
1157
- (_getInputProps2 = getInputProps()) == null || _getInputProps2.onClick == null || _getInputProps2.onClick(event);
1158
- }
1159
- },
1155
+ onClick: readOnly ? undefined : (_getInputProps2 = getInputProps()) == null ? void 0 : _getInputProps2.onClick,
1160
1156
  tabIndex: readOnly ? 0 : -1
1161
1157
  }, showSelectedItem ? selectedItem == null ? void 0 : selectedItem.label : ''), React.createElement("input", _extends({
1162
1158
  className: classNames('eds-dropdown__input eds-form-control', {
@@ -1168,10 +1164,8 @@ var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1168
1164
  var highlitedItem = listItems[highlightedIndex];
1169
1165
  // we don't want to clear selection with tab
1170
1166
  if ((selectOnTab || selectOnBlur) && highlitedItem && highlitedItem !== selectedItem) {
1171
- onChange == null || onChange(highlitedItem);
1167
+ selectItem(highlitedItem);
1172
1168
  }
1173
- closeMenu();
1174
- e.preventDefault();
1175
1169
  }
1176
1170
  },
1177
1171
  onBlur: function onBlur() {
@@ -1206,7 +1200,7 @@ var SearchableDropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1206
1200
 
1207
1201
  var _excluded$2 = ["className", "clearable", "clearInputOnSelect", "debounceTimeout", "disabled", "disableLabelAnimation", "feedback", "hideSelectAll", "items", "itemFilter", "label", "labelAllItemsSelected", "labelClearAllItems", "labelSelectAll", "labelTooltip", "listStyle", "loading", "loadingText", "maxChips", "noMatchesText", "onChange", "placeholder", "readOnly", "selectedItems", "selectOnBlur", "selectOnTab", "style", "variant", "ariaLabelChosenSingular", "ariaLabelChosenPlural", "ariaLabelCloseList", "ariaLabelJumpToInput", "ariaLabelOpenList", "ariaLabelRemoveSelected", "ariaLabelSelectedItem"];
1208
1202
  var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1209
- var _inputRef$current5;
1203
+ var _inputRef$current4;
1210
1204
  var className = _ref.className,
1211
1205
  _ref$clearable = _ref.clearable,
1212
1206
  clearable = _ref$clearable === void 0 ? true : _ref$clearable,
@@ -1320,21 +1314,25 @@ var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1320
1314
  }),
1321
1315
  hasSelectedItems = _useMultiselectUtils.hasSelectedItems,
1322
1316
  handleListItemClicked = _useMultiselectUtils.handleListItemClicked,
1323
- selectAllCheckboxState = _useMultiselectUtils.selectAllCheckboxState;
1317
+ selectAllCheckboxState = _useMultiselectUtils.selectAllCheckboxState,
1318
+ clickedItemIsInSelectedItems = _useMultiselectUtils.clickedItemIsInSelectedItems,
1319
+ clickedItemIsSelectAll = _useMultiselectUtils.clickedItemIsSelectAll;
1324
1320
  var _useMultipleSelection = useMultipleSelection({
1325
1321
  selectedItems: selectedItems,
1326
1322
  // @ts-expect-error prop missing from library types
1327
1323
  itemToString: itemToString,
1328
1324
  itemToKey: itemToKey,
1329
- onStateChange: function onStateChange(_ref4) {
1325
+ onSelectedItemsChange: function onSelectedItemsChange(_ref4) {
1330
1326
  var newSelectedItems = _ref4.selectedItems;
1331
- if (newSelectedItems !== undefined) onChange(newSelectedItems);
1327
+ onChange(newSelectedItems);
1332
1328
  }
1333
1329
  }),
1334
1330
  getSelectedItemProps = _useMultipleSelection.getSelectedItemProps,
1335
- getDropdownProps = _useMultipleSelection.getDropdownProps;
1331
+ getDropdownProps = _useMultipleSelection.getDropdownProps,
1332
+ reset = _useMultipleSelection.reset,
1333
+ _removeSelectedItem = _useMultipleSelection.removeSelectedItem,
1334
+ setSelectedItems = _useMultipleSelection.setSelectedItems;
1336
1335
  var stateReducer = React.useCallback(function (state, _ref5) {
1337
- var _inputRef$current;
1338
1336
  var changes = _ref5.changes,
1339
1337
  type = _ref5.type;
1340
1338
  if (changes.highlightedIndex !== undefined && (changes == null ? void 0 : changes.highlightedIndex) >= 0) {
@@ -1343,7 +1341,6 @@ var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1343
1341
  switch (type) {
1344
1342
  // reset input value when leaving input field
1345
1343
  case useCombobox.stateChangeTypes.InputBlur:
1346
- if (state.isOpen) (_inputRef$current = inputRef.current) == null || _inputRef$current.focus();
1347
1344
  return _extends({}, changes, {
1348
1345
  inputValue: EMPTY_INPUT
1349
1346
  });
@@ -1351,18 +1348,18 @@ var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1351
1348
  case useCombobox.stateChangeTypes.InputKeyDownEnter:
1352
1349
  case useCombobox.stateChangeTypes.ItemClick:
1353
1350
  {
1354
- var _inputRef$current$val, _inputRef$current2;
1351
+ var _inputRef$current$val, _inputRef$current;
1355
1352
  return _extends({}, changes, {
1356
1353
  isOpen: true,
1357
- inputValue: clearInputOnSelect ? EMPTY_INPUT : (_inputRef$current$val = inputRef == null || (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value) != null ? _inputRef$current$val : EMPTY_INPUT
1354
+ inputValue: clearInputOnSelect ? EMPTY_INPUT : (_inputRef$current$val = inputRef == null || (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.value) != null ? _inputRef$current$val : EMPTY_INPUT
1358
1355
  });
1359
1356
  }
1360
1357
  // edit input value when selected items is updated outside component
1361
1358
  case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
1362
1359
  {
1363
- var _inputRef$current$val2, _inputRef$current3;
1360
+ var _inputRef$current$val2, _inputRef$current2;
1364
1361
  return _extends({}, changes, {
1365
- inputValue: (_inputRef$current$val2 = inputRef == null || (_inputRef$current3 = inputRef.current) == null ? void 0 : _inputRef$current3.value) != null ? _inputRef$current$val2 : EMPTY_INPUT
1362
+ inputValue: (_inputRef$current$val2 = inputRef == null || (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value) != null ? _inputRef$current$val2 : EMPTY_INPUT
1366
1363
  });
1367
1364
  }
1368
1365
  // remove leading whitespace, select item with spacebar if input is empty and filter list items
@@ -1407,13 +1404,13 @@ var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1407
1404
  setHighlightedIndex(hideSelectAll ? 0 : 1);
1408
1405
  setLastHighlightedIndex(hideSelectAll ? 0 : 1);
1409
1406
  },
1410
- onStateChange: function onStateChange(_ref6) {
1407
+ onSelectedItemChange: function onSelectedItemChange(_ref6) {
1411
1408
  var clickedItem = _ref6.selectedItem;
1412
1409
  // clickedItem means item chosen either via mouse or keyboard
1413
1410
  if (!clickedItem) return;
1414
1411
  handleListItemClicked({
1415
1412
  clickedItem: clickedItem,
1416
- onChange: onChange
1413
+ onChange: setSelectedItems
1417
1414
  });
1418
1415
  },
1419
1416
  // Accessibility
@@ -1469,13 +1466,9 @@ var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1469
1466
  }
1470
1467
  }, [isOpen, refs.reference, refs.floating, update]);
1471
1468
  var handleOnClear = function handleOnClear() {
1472
- var _inputRef$current4;
1473
- onChange([]);
1474
- setInputValue(EMPTY_INPUT);
1475
- (_inputRef$current4 = inputRef.current) == null || _inputRef$current4.focus();
1476
- updateListItems({
1477
- inputValue: inputValue
1478
- });
1469
+ var _inputRef$current3;
1470
+ (_inputRef$current3 = inputRef.current) == null || _inputRef$current3.focus();
1471
+ reset();
1479
1472
  };
1480
1473
  return React.createElement(BaseFormControl, _extends({
1481
1474
  className: classNames('eds-dropdown', 'eds-dropdown--multiselect', className, {
@@ -1526,7 +1519,7 @@ var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1526
1519
  'eds-dropdown--multiselect__selected-items-and-input--filled': hasSelectedItems
1527
1520
  })
1528
1521
  }, selectedItems.length > 1 ? React.createElement(VisuallyHidden, {
1529
- onClick: (_inputRef$current5 = inputRef.current) == null ? void 0 : _inputRef$current5.focus
1522
+ onClick: (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.focus
1530
1523
  }, ariaLabelJumpToInput) : null, selectedItems.length <= maxChips ? selectedItems.map(function (selectedItem, index) {
1531
1524
  return React.createElement(SelectedItemTag, {
1532
1525
  ariaLabelChosen: ariaLabelChosenSingular,
@@ -1537,12 +1530,9 @@ var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1537
1530
  key: (selectedItem == null ? void 0 : selectedItem.label) + (typeof (selectedItem == null ? void 0 : selectedItem.value) === 'string' ? selectedItem.value : ''),
1538
1531
  readOnly: readOnly,
1539
1532
  removeSelectedItem: function removeSelectedItem() {
1540
- var _inputRef$current6;
1541
- handleListItemClicked({
1542
- clickedItem: selectedItem,
1543
- onChange: onChange
1544
- });
1545
- inputRef == null || (_inputRef$current6 = inputRef.current) == null || _inputRef$current6.focus();
1533
+ var _inputRef$current5;
1534
+ _removeSelectedItem(selectedItem);
1535
+ inputRef == null || (_inputRef$current5 = inputRef.current) == null || _inputRef$current5.focus();
1546
1536
  },
1547
1537
  selectedItem: selectedItem
1548
1538
  });
@@ -1557,13 +1547,14 @@ var MultiSelect = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1557
1547
  onKeyDown: function onKeyDown(e) {
1558
1548
  if (selectOnTab && isOpen && e.key === 'Tab') {
1559
1549
  var highlitedItem = listItems[highlightedIndex];
1560
- // we don't want to clear selection with tab
1561
- if (highlitedItem) {
1562
- handleListItemClicked({
1563
- clickedItem: highlitedItem,
1564
- onChange: onChange
1565
- });
1566
- }
1550
+ if (!highlitedItem) return;
1551
+ // Skip tab selection for select all or if item already is selected
1552
+ var shouldSkipTabSelection = clickedItemIsSelectAll(highlitedItem) || !clickedItemIsSelectAll(highlitedItem) && clickedItemIsInSelectedItems(highlitedItem);
1553
+ if (shouldSkipTabSelection) return;
1554
+ handleListItemClicked({
1555
+ clickedItem: highlitedItem,
1556
+ onChange: setSelectedItems
1557
+ });
1567
1558
  }
1568
1559
  }
1569
1560
  }, getDropdownProps({
@@ -1666,13 +1657,13 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1666
1657
  },
1667
1658
  itemToString: itemToString
1668
1659
  }),
1669
- closeMenu = _useSelect.closeMenu,
1670
1660
  isOpen = _useSelect.isOpen,
1671
1661
  getItemProps = _useSelect.getItemProps,
1672
1662
  getLabelProps = _useSelect.getLabelProps,
1673
1663
  getMenuProps = _useSelect.getMenuProps,
1674
1664
  getToggleButtonProps = _useSelect.getToggleButtonProps,
1675
1665
  highlightedIndex = _useSelect.highlightedIndex,
1666
+ selectItem = _useSelect.selectItem,
1676
1667
  reset = _useSelect.reset;
1677
1668
  // calculations for floating-UI popover position
1678
1669
  var _useFloating = useFloating({
@@ -1740,10 +1731,8 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
1740
1731
  var highlitedItem = normalizedItems[highlightedIndex];
1741
1732
  // we don't want to clear selection with tab
1742
1733
  if ((selectOnTab || selectOnBlur) && highlitedItem && highlitedItem !== selectedItem) {
1743
- onChange == null || onChange(highlitedItem);
1734
+ selectItem(highlitedItem);
1744
1735
  }
1745
- closeMenu();
1746
- e.preventDefault();
1747
1736
  }
1748
1737
  }
1749
1738
  }), {