@entur/dropdown 5.0.8 → 5.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { mergeRefs, debounce, useRandomId, warnAboutMissingStyles } from '@entur/utils';
2
- import React, { useState, useRef } from 'react';
2
+ import React, { useState, useRef, useEffect } from 'react';
3
3
  import Downshift, { useSelect, useCombobox, useMultipleSelection } from 'downshift';
4
4
  import classNames from 'classnames';
5
5
  import { BaseFormControl, VariantProvider, FeedbackText, Checkbox } from '@entur/form';
@@ -835,7 +835,7 @@ debounceTimeout) {
835
835
  return isItemsFunction ? itemsOrItemsResolver : function () {
836
836
  return Promise.resolve(itemsOrItemsResolver);
837
837
  };
838
- }, [isItemsFunction]);
838
+ }, [itemsOrItemsResolver, isItemsFunction]);
839
839
  var _React$useReducer = React.useReducer(reducer, {
840
840
  items: isItemsFunction ? [] : itemsOrItemsResolver,
841
841
  loading: false
@@ -1313,7 +1313,7 @@ var DropdownList = function DropdownList(_ref) {
1313
1313
  className: "eds-dropdown__list__item__text"
1314
1314
  }, item.label, React.createElement(VisuallyHidden, null, isItemSelected(item) ? ariaLabelSelectedItem : '')), item.icons && React.createElement("span", null, item.icons.map(function (Icon) {
1315
1315
  return React.createElement(Icon, {
1316
- key: Icon.displayName,
1316
+ key: item.label + item.value + Icon.displayName,
1317
1317
  inline: true,
1318
1318
  className: "eds-dropdown__list__item__icon"
1319
1319
  });
@@ -1407,7 +1407,7 @@ var FieldAppend$1 = function FieldAppend(_ref3) {
1407
1407
  selectedItems = _ref3.selectedItems;
1408
1408
  if (loading) {
1409
1409
  return React.createElement("div", {
1410
- className: 'eds-dropdown-appendix__toggle-button--loading-dots'
1410
+ className: 'eds-dropdown__appendix__toggle-button--loading-dots'
1411
1411
  }, React.createElement(LoadingDots, {
1412
1412
  "aria-label": loadingText
1413
1413
  }));
@@ -1416,13 +1416,13 @@ var FieldAppend$1 = function FieldAppend(_ref3) {
1416
1416
  return null;
1417
1417
  }
1418
1418
  return React.createElement("div", {
1419
- className: "eds-dropdown-appendix"
1419
+ className: "eds-dropdown__appendix"
1420
1420
  }, clearable && (selectedItems == null ? void 0 : selectedItems.length) > 0 && selectedItems[0] !== null && React.createElement(React.Fragment, null, React.createElement(ClearableButton, {
1421
1421
  onClear: onClear,
1422
1422
  focusable: true,
1423
1423
  labelClearSelectedItems: labelClearSelectedItems
1424
1424
  }), React.createElement("div", {
1425
- className: "eds-dropdown-appendix__divider"
1425
+ className: "eds-dropdown__appendix__divider"
1426
1426
  })), React.createElement(ToggleButton, {
1427
1427
  "aria-hidden": ariaHiddenToggleButton,
1428
1428
  ariaLabelCloseList: ariaLabelCloseList,
@@ -1442,9 +1442,9 @@ var ClearableButton = function ClearableButton(_ref4) {
1442
1442
  "aria-hidden": "true",
1443
1443
  placement: "top",
1444
1444
  content: labelClearSelectedItems,
1445
- className: "eds-dropdown-appendix__clear-button__tooltip"
1445
+ className: "eds-dropdown__appendix__clear-button__tooltip"
1446
1446
  }, React.createElement(IconButton, {
1447
- className: "eds-dropdown-appendix__clear-button",
1447
+ className: "eds-dropdown__appendix__clear-button",
1448
1448
  type: "button",
1449
1449
  tabIndex: focusable ? 0 : 1,
1450
1450
  onClick: onClear,
@@ -1465,8 +1465,8 @@ var ToggleButton = function ToggleButton(_ref5) {
1465
1465
  _ref5$focusable = _ref5.focusable,
1466
1466
  focusable = _ref5$focusable === void 0 ? false : _ref5$focusable;
1467
1467
  return React.createElement(IconButton, _extends({}, getToggleButtonProps({
1468
- className: classNames('eds-dropdown-appendix__toggle-button', {
1469
- 'eds-dropdown-appendix__toggle-button--open': isOpen
1468
+ className: classNames('eds-dropdown__appendix__toggle-button', {
1469
+ 'eds-dropdown__appendix__toggle-button--open': isOpen
1470
1470
  }),
1471
1471
  'aria-labelledby': undefined
1472
1472
  }), {
@@ -1489,9 +1489,19 @@ function lowerCaseFilterTest(item, input) {
1489
1489
  var inputRegex = new RegExp(sanitizeEscapeCharacters, 'i');
1490
1490
  return inputRegex.test(item.label);
1491
1491
  }
1492
+ function noFilter(
1493
+ //@ts-expect-error only here to comply with dropdown filter API
1494
+ item,
1495
+ //@ts-expect-error only here to comply with dropdown filter API
1496
+ input) {
1497
+ return true;
1498
+ }
1492
1499
  var itemToString = function itemToString(item) {
1493
1500
  return item ? item.label : '';
1494
1501
  };
1502
+ var isFunctionWithQueryArgument = function isFunctionWithQueryArgument(object) {
1503
+ return typeof object === 'function' && object.length > 0;
1504
+ };
1495
1505
  var useMultiselectUtils = function useMultiselectUtils(_ref) {
1496
1506
  var listItems = _ref.listItems,
1497
1507
  selectedItems = _ref.selectedItems,
@@ -1628,7 +1638,7 @@ var isVoiceOverClick = function isVoiceOverClick(clickEvent) {
1628
1638
  };
1629
1639
  /* end a11y utils */
1630
1640
 
1631
- 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"];
1641
+ var _excluded$3 = ["ariaLabelCloseList", "ariaLabelOpenList", "className", "clearable", "debounceTimeout", "disabled", "disableLabelAnimation", "feedback", "items", "itemFilter", "label", "labelClearSelectedItem", "listStyle", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "selectOnTab", "style", "variant"];
1632
1642
  var SearchableDropdown = function SearchableDropdown(_ref) {
1633
1643
  var _selectedItem$label;
1634
1644
  var ariaLabelCloseList = _ref.ariaLabelCloseList,
@@ -1642,9 +1652,9 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1642
1652
  _ref$disableLabelAnim = _ref.disableLabelAnimation,
1643
1653
  disableLabelAnimation = _ref$disableLabelAnim === void 0 ? false : _ref$disableLabelAnim,
1644
1654
  feedback = _ref.feedback,
1645
- _ref$itemFilter = _ref.itemFilter,
1646
- itemFilter = _ref$itemFilter === void 0 ? lowerCaseFilterTest : _ref$itemFilter,
1647
1655
  initialItems = _ref.items,
1656
+ _ref$itemFilter = _ref.itemFilter,
1657
+ itemFilter = _ref$itemFilter === void 0 ? isFunctionWithQueryArgument(initialItems) ? noFilter : lowerCaseFilterTest : _ref$itemFilter,
1648
1658
  label = _ref.label,
1649
1659
  _ref$labelClearSelect = _ref.labelClearSelectedItem,
1650
1660
  labelClearSelectedItem = _ref$labelClearSelect === void 0 ? 'fjern valgt' : _ref$labelClearSelect,
@@ -1658,6 +1668,8 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1658
1668
  value = _ref.selectedItem,
1659
1669
  _ref$selectOnBlur = _ref.selectOnBlur,
1660
1670
  selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1671
+ _ref$selectOnTab = _ref.selectOnTab,
1672
+ selectOnTab = _ref$selectOnTab === void 0 ? false : _ref$selectOnTab,
1661
1673
  style = _ref.style,
1662
1674
  _ref$variant = _ref.variant,
1663
1675
  variant = _ref$variant === void 0 ? 'info' : _ref$variant,
@@ -1684,7 +1696,8 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1684
1696
  };
1685
1697
  var updateListItems = function updateListItems(_ref3) {
1686
1698
  var inputValue = _ref3.inputValue;
1687
- if (typeof initialItems === 'function') fetchItems(inputValue != null ? inputValue : EMPTY_INPUT); // fetch items only if user provides a function as items
1699
+ var shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
1700
+ if (shouldRefetchItems) fetchItems(inputValue != null ? inputValue : EMPTY_INPUT);
1688
1701
  filterListItems({
1689
1702
  inputValue: inputValue != null ? inputValue : EMPTY_INPUT
1690
1703
  });
@@ -1707,7 +1720,7 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1707
1720
  case useCombobox.stateChangeTypes.InputBlur:
1708
1721
  case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
1709
1722
  {
1710
- filterListItems({
1723
+ updateListItems({
1711
1724
  inputValue: EMPTY_INPUT
1712
1725
  });
1713
1726
  return _extends({}, changes, {
@@ -1814,16 +1827,14 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1814
1827
  prepend: prepend,
1815
1828
  readOnly: readOnly,
1816
1829
  variant: variant
1817
- }, rest), !hideSelectedItem && selectedItem && !inputValue && React.createElement("span", {
1818
- className: "eds-dropdown__selected-item__wrapper",
1819
- "aria-hidden": "true"
1820
- }, React.createElement("span", {
1821
- className: "eds-dropdown__selected-item",
1830
+ }, rest), !hideSelectedItem && selectedItem !== null && inputValue === '' && React.createElement("span", {
1831
+ className: "eds-dropdown--searchable__selected-item",
1832
+ "aria-hidden": "true",
1822
1833
  onClick: function onClick() {
1823
1834
  var _inputRef$current2;
1824
1835
  return (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.focus();
1825
1836
  }
1826
- }, selectedItem.label)), React.createElement("input", _extends({
1837
+ }, selectedItem.label), React.createElement("input", _extends({
1827
1838
  className: "eds-dropdown__input eds-form-control",
1828
1839
  disabled: readOnly || disabled,
1829
1840
  placeholder: (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : placeholder
@@ -1837,6 +1848,9 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1837
1848
  onFocus: function onFocus() {
1838
1849
  setHideSelectedItem(true);
1839
1850
  },
1851
+ onKeyDown: function onKeyDown(e) {
1852
+ if (selectOnTab && e.key === 'Tab') onChange == null ? void 0 : onChange(listItems[highlightedIndex]);
1853
+ },
1840
1854
  ref: inputRef
1841
1855
  })))), React.createElement(DropdownList, {
1842
1856
  isOpen: isOpen,
@@ -1851,7 +1865,7 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1851
1865
  }));
1852
1866
  };
1853
1867
 
1854
- var _excluded$2 = ["className", "clearable", "clearInputOnSelect", "debounceTimeout", "disabled", "feedback", "hideSelectAll", "itemFilter", "items", "label", "labelAllItemsSelected", "labelClearAllItems", "labelSelectAll", "listStyle", "loadingText", "maxChips", "noMatchesText", "onChange", "placeholder", "readOnly", "selectedItems", "selectOnBlur", "style", "variant", "ariaLabelChosenSingular", "ariaLabelChosenPlural", "ariaLabelCloseList", "ariaLabelJumpToInput", "ariaLabelOpenList", "ariaLabelRemoveSelected", "ariaLabelSelectedItem"];
1868
+ var _excluded$2 = ["className", "clearable", "clearInputOnSelect", "debounceTimeout", "disabled", "feedback", "hideSelectAll", "items", "itemFilter", "label", "labelAllItemsSelected", "labelClearAllItems", "labelSelectAll", "listStyle", "loadingText", "maxChips", "noMatchesText", "onChange", "placeholder", "readOnly", "selectedItems", "selectOnBlur", "selectOnTab", "style", "variant", "ariaLabelChosenSingular", "ariaLabelChosenPlural", "ariaLabelCloseList", "ariaLabelJumpToInput", "ariaLabelOpenList", "ariaLabelRemoveSelected", "ariaLabelSelectedItem"];
1855
1869
  var MultiSelect = function MultiSelect(_ref) {
1856
1870
  var className = _ref.className,
1857
1871
  _ref$clearable = _ref.clearable,
@@ -1864,9 +1878,9 @@ var MultiSelect = function MultiSelect(_ref) {
1864
1878
  feedback = _ref.feedback,
1865
1879
  _ref$hideSelectAll = _ref.hideSelectAll,
1866
1880
  hideSelectAll = _ref$hideSelectAll === void 0 ? false : _ref$hideSelectAll,
1867
- _ref$itemFilter = _ref.itemFilter,
1868
- itemFilter = _ref$itemFilter === void 0 ? lowerCaseFilterTest : _ref$itemFilter,
1869
1881
  initialItems = _ref.items,
1882
+ _ref$itemFilter = _ref.itemFilter,
1883
+ itemFilter = _ref$itemFilter === void 0 ? isFunctionWithQueryArgument(initialItems) ? noFilter : lowerCaseFilterTest : _ref$itemFilter,
1870
1884
  label = _ref.label,
1871
1885
  _ref$labelAllItemsSel = _ref.labelAllItemsSelected,
1872
1886
  labelAllItemsSelected = _ref$labelAllItemsSel === void 0 ? 'Alle valgt' : _ref$labelAllItemsSel,
@@ -1885,9 +1899,12 @@ var MultiSelect = function MultiSelect(_ref) {
1885
1899
  placeholder = _ref.placeholder,
1886
1900
  _ref$readOnly = _ref.readOnly,
1887
1901
  readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1888
- selectedItems = _ref.selectedItems,
1902
+ _ref$selectedItems = _ref.selectedItems,
1903
+ selectedItems = _ref$selectedItems === void 0 ? [] : _ref$selectedItems,
1889
1904
  _ref$selectOnBlur = _ref.selectOnBlur,
1890
1905
  selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1906
+ _ref$selectOnTab = _ref.selectOnTab,
1907
+ selectOnTab = _ref$selectOnTab === void 0 ? false : _ref$selectOnTab,
1891
1908
  style = _ref.style,
1892
1909
  _ref$variant = _ref.variant,
1893
1910
  variant = _ref$variant === void 0 ? 'info' : _ref$variant,
@@ -1911,6 +1928,10 @@ var MultiSelect = function MultiSelect(_ref) {
1911
1928
  lastRemovedItem = _React$useState2[0],
1912
1929
  setLastRemovedItem = _React$useState2[1];
1913
1930
  var inputRef = useRef(null);
1931
+ useEffect(function () {
1932
+ //@ts-expect-error this is done to aid developers debug wrong prop usage
1933
+ if (rest.selectedItem !== undefined) console.warn("Incorrect 'selectedItem' prop found, did you mean to use 'selectedItems?");
1934
+ }, []);
1914
1935
  var _useResolvedItems = useResolvedItems(initialItems, debounceTimeout),
1915
1936
  normalizedItems = _useResolvedItems.items,
1916
1937
  loading = _useResolvedItems.loading,
@@ -1940,9 +1961,7 @@ var MultiSelect = function MultiSelect(_ref) {
1940
1961
  };
1941
1962
  var updateListItems = function updateListItems(_ref3) {
1942
1963
  var inputValue = _ref3.inputValue;
1943
- var shouldRefetchItems =
1944
- // fetch items only if user provides a function with inputValue argument as items
1945
- typeof initialItems === 'function' && initialItems.length > 0; // Function.length == number of arguments
1964
+ var shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
1946
1965
  if (shouldRefetchItems) fetchItems(inputValue != null ? inputValue : EMPTY_INPUT);
1947
1966
  filterListItems({
1948
1967
  inputValue: inputValue != null ? inputValue : EMPTY_INPUT
@@ -2046,6 +2065,9 @@ var MultiSelect = function MultiSelect(_ref) {
2046
2065
  // reset input value when leaving input field
2047
2066
  case useCombobox.stateChangeTypes.InputBlur:
2048
2067
  {
2068
+ updateListItems({
2069
+ inputValue: EMPTY_INPUT
2070
+ });
2049
2071
  return _extends({}, changes, {
2050
2072
  inputValue: EMPTY_INPUT
2051
2073
  });
@@ -2138,16 +2160,16 @@ var MultiSelect = function MultiSelect(_ref) {
2138
2160
  label: label,
2139
2161
  labelId: getLabelProps().id,
2140
2162
  labelProps: getLabelProps(),
2141
- readOnly: readOnly,
2142
- variant: variant
2143
- }, rest), React.createElement("div", {
2144
- className: classNames('eds-dropdown__selected-items-and-input', {
2145
- 'eds-dropdown__selected-items-and-input--filled': hasSelectedItems
2146
- }),
2147
2163
  onClick: function onClick(e) {
2148
2164
  var _inputRef$current4;
2149
2165
  if (e.target === e.currentTarget) (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.focus();
2150
- }
2166
+ },
2167
+ readOnly: readOnly,
2168
+ variant: variant
2169
+ }, rest), React.createElement("div", {
2170
+ className: classNames('eds-dropdown--multiselect__selected-items-and-input', {
2171
+ 'eds-dropdown--multiselect__selected-items-and-input--filled': hasSelectedItems
2172
+ })
2151
2173
  }, selectedItems.length < maxChips ? React.createElement(React.Fragment, null, selectedItems.length > 1 ? React.createElement(VisuallyHidden, {
2152
2174
  onClick: function onClick() {
2153
2175
  var _inputRef$current5;
@@ -2184,14 +2206,22 @@ var MultiSelect = function MultiSelect(_ref) {
2184
2206
  placeholder: placeholder,
2185
2207
  className: "eds-dropdown__input eds-form-control",
2186
2208
  disabled: readOnly || disabled
2187
- }, getInputProps(getDropdownProps({
2209
+ }, getInputProps(_extends({
2210
+ onKeyDown: function onKeyDown(e) {
2211
+ if (selectOnTab && e.key === 'Tab') handleListItemClicked({
2212
+ clickedItem: listItems[highlightedIndex],
2213
+ onChange: onChange,
2214
+ setLastRemovedItem: setLastRemovedItem
2215
+ });
2216
+ }
2217
+ }, getDropdownProps({
2188
2218
  onClick: function onClick(e) {
2189
2219
  if (!isOpen && isVoiceOverClick(e)) openMenu();
2190
2220
  },
2191
2221
  preventKeyAction: isOpen,
2192
2222
  ref: inputRef,
2193
2223
  value: inputValue != null ? inputValue : EMPTY_INPUT
2194
- })))))), React.createElement(DropdownList, {
2224
+ }))))))), React.createElement(DropdownList, {
2195
2225
  ariaLabelChosenSingular: ariaLabelChosenSingular,
2196
2226
  ariaLabelSelectedItem: ariaLabelSelectedItem,
2197
2227
  getItemProps: getItemProps,
@@ -2209,7 +2239,7 @@ var MultiSelect = function MultiSelect(_ref) {
2209
2239
  }));
2210
2240
  };
2211
2241
 
2212
- var _excluded$1 = ["ariaLabelCloseList", "ariaLabelOpenList", "className", "clearable", "disabled", "disableLabelAnimation", "feedback", "items", "label", "labelClearSelectedItem", "listStyle", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "style", "variant"];
2242
+ var _excluded$1 = ["ariaLabelCloseList", "ariaLabelOpenList", "className", "clearable", "disabled", "disableLabelAnimation", "feedback", "items", "label", "labelClearSelectedItem", "listStyle", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "selectOnTab", "style", "variant"];
2213
2243
  var Dropdown = function Dropdown(_ref) {
2214
2244
  var _ref3, _selectedItem$label;
2215
2245
  var ariaLabelCloseList = _ref.ariaLabelCloseList,
@@ -2235,6 +2265,8 @@ var Dropdown = function Dropdown(_ref) {
2235
2265
  selectedItem = _ref.selectedItem,
2236
2266
  _ref$selectOnBlur = _ref.selectOnBlur,
2237
2267
  selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
2268
+ _ref$selectOnTab = _ref.selectOnTab,
2269
+ selectOnTab = _ref$selectOnTab === void 0 ? false : _ref$selectOnTab,
2238
2270
  style = _ref.style,
2239
2271
  _ref$variant = _ref.variant,
2240
2272
  variant = _ref$variant === void 0 ? 'info' : _ref$variant,
@@ -2304,12 +2336,15 @@ var Dropdown = function Dropdown(_ref) {
2304
2336
  readOnly: readOnly,
2305
2337
  variant: variant
2306
2338
  }, rest), React.createElement("div", _extends({
2307
- className: "eds-dropdown__selected-item-button"
2339
+ className: "eds-dropdown__selected-item"
2308
2340
  }, getToggleButtonProps({
2309
- id: undefined
2341
+ id: undefined,
2342
+ onKeyDown: function onKeyDown(e) {
2343
+ if (selectOnTab && e.key === 'Tab') onChange == null ? void 0 : onChange(normalizedItems[highlightedIndex]);
2344
+ }
2310
2345
  })), (_ref3 = (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : React.createElement("span", {
2311
- className: classNames('eds-dropdown__selected-item-button__placeholder', {
2312
- 'eds-dropdown__selected-item-button__placeholder--readonly': readOnly
2346
+ className: classNames('eds-dropdown__selected-item__placeholder', {
2347
+ 'eds-dropdown__selected-item__placeholder--readonly': readOnly
2313
2348
  })
2314
2349
  }, placeholder)) != null ? _ref3 : '')), React.createElement(DropdownList, {
2315
2350
  getItemProps: getItemProps,