@entur/dropdown 5.0.7 → 5.0.9-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,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';
@@ -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,
@@ -1500,11 +1510,20 @@ var useMultiselectUtils = function useMultiselectUtils(_ref) {
1500
1510
  var listItemsWithoutSelectAll = listItems.filter(function (item) {
1501
1511
  return item.value !== selectAll.value;
1502
1512
  });
1503
- var allListItemsAreSelected = listItemsWithoutSelectAll.filter(function (item) {
1504
- return !selectedItems.includes(item);
1505
- }).length === 0;
1506
- var someListItemsAreSelected = listItemsWithoutSelectAll.some(function (item) {
1507
- return selectedItems.includes(item);
1513
+ var unselectedItemsInListItems = listItemsWithoutSelectAll.filter(function (listItem) {
1514
+ return !selectedItems.some(function (selectedItem) {
1515
+ return selectedItem.value === listItem.value;
1516
+ });
1517
+ });
1518
+ var allListItemsAreSelected = !listItemsWithoutSelectAll.some(function (listItem) {
1519
+ return !selectedItems.some(function (selectedItem) {
1520
+ return selectedItem.value === listItem.value;
1521
+ });
1522
+ });
1523
+ var someListItemsAreSelected = listItemsWithoutSelectAll.some(function (listItem) {
1524
+ return selectedItems.some(function (selectedItem) {
1525
+ return selectedItem.value === listItem.value;
1526
+ });
1508
1527
  });
1509
1528
  var addClickedItemToSelectedItems = function addClickedItemToSelectedItems(clickedItem, onChange) {
1510
1529
  return onChange([].concat(selectedItems, [clickedItem]));
@@ -1545,14 +1564,15 @@ var useMultiselectUtils = function useMultiselectUtils(_ref) {
1545
1564
  return false;
1546
1565
  };
1547
1566
  var selectAllUnselectedItemsInListItems = function selectAllUnselectedItemsInListItems(onChange) {
1548
- onChange([].concat(selectedItems, listItemsWithoutSelectAll.filter(function (item) {
1549
- return !selectedItems.includes(item);
1550
- })));
1567
+ onChange([].concat(selectedItems, unselectedItemsInListItems));
1551
1568
  };
1552
1569
  var unselectAllListItems = function unselectAllListItems(onChange) {
1553
- onChange(selectedItems.filter(function (item) {
1554
- return !listItemsWithoutSelectAll.includes(item);
1555
- }));
1570
+ var selectedItemsWithoutItemsInListItems = selectedItems.filter(function (selectedItem) {
1571
+ return !listItemsWithoutSelectAll.some(function (listItem) {
1572
+ return listItem.value === selectedItem.value;
1573
+ });
1574
+ });
1575
+ onChange(selectedItemsWithoutItemsInListItems);
1556
1576
  };
1557
1577
  return {
1558
1578
  addClickedItemToSelectedItems: addClickedItemToSelectedItems,
@@ -1618,7 +1638,7 @@ var isVoiceOverClick = function isVoiceOverClick(clickEvent) {
1618
1638
  };
1619
1639
  /* end a11y utils */
1620
1640
 
1621
- 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", "style", "variant"];
1622
1642
  var SearchableDropdown = function SearchableDropdown(_ref) {
1623
1643
  var _selectedItem$label;
1624
1644
  var ariaLabelCloseList = _ref.ariaLabelCloseList,
@@ -1632,9 +1652,9 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1632
1652
  _ref$disableLabelAnim = _ref.disableLabelAnimation,
1633
1653
  disableLabelAnimation = _ref$disableLabelAnim === void 0 ? false : _ref$disableLabelAnim,
1634
1654
  feedback = _ref.feedback,
1635
- _ref$itemFilter = _ref.itemFilter,
1636
- itemFilter = _ref$itemFilter === void 0 ? lowerCaseFilterTest : _ref$itemFilter,
1637
1655
  initialItems = _ref.items,
1656
+ _ref$itemFilter = _ref.itemFilter,
1657
+ itemFilter = _ref$itemFilter === void 0 ? isFunctionWithQueryArgument(initialItems) ? noFilter : lowerCaseFilterTest : _ref$itemFilter,
1638
1658
  label = _ref.label,
1639
1659
  _ref$labelClearSelect = _ref.labelClearSelectedItem,
1640
1660
  labelClearSelectedItem = _ref$labelClearSelect === void 0 ? 'fjern valgt' : _ref$labelClearSelect,
@@ -1674,7 +1694,8 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1674
1694
  };
1675
1695
  var updateListItems = function updateListItems(_ref3) {
1676
1696
  var inputValue = _ref3.inputValue;
1677
- if (typeof initialItems === 'function') fetchItems(inputValue != null ? inputValue : EMPTY_INPUT); // fetch items only if user provides a function as items
1697
+ var shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
1698
+ if (shouldRefetchItems) fetchItems(inputValue != null ? inputValue : EMPTY_INPUT);
1678
1699
  filterListItems({
1679
1700
  inputValue: inputValue != null ? inputValue : EMPTY_INPUT
1680
1701
  });
@@ -1697,7 +1718,7 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1697
1718
  case useCombobox.stateChangeTypes.InputBlur:
1698
1719
  case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
1699
1720
  {
1700
- filterListItems({
1721
+ updateListItems({
1701
1722
  inputValue: EMPTY_INPUT
1702
1723
  });
1703
1724
  return _extends({}, changes, {
@@ -1804,16 +1825,14 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1804
1825
  prepend: prepend,
1805
1826
  readOnly: readOnly,
1806
1827
  variant: variant
1807
- }, rest), !hideSelectedItem && selectedItem && !inputValue && React.createElement("span", {
1808
- className: "eds-dropdown__selected-item__wrapper",
1809
- "aria-hidden": "true"
1810
- }, React.createElement("span", {
1811
- className: "eds-dropdown__selected-item",
1828
+ }, rest), !hideSelectedItem && selectedItem !== null && inputValue === '' && React.createElement("span", {
1829
+ className: "eds-dropdown--searchable__selected-item",
1830
+ "aria-hidden": "true",
1812
1831
  onClick: function onClick() {
1813
1832
  var _inputRef$current2;
1814
1833
  return (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.focus();
1815
1834
  }
1816
- }, selectedItem.label)), React.createElement("input", _extends({
1835
+ }, selectedItem.label), React.createElement("input", _extends({
1817
1836
  className: "eds-dropdown__input eds-form-control",
1818
1837
  disabled: readOnly || disabled,
1819
1838
  placeholder: (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : placeholder
@@ -1841,7 +1860,7 @@ var SearchableDropdown = function SearchableDropdown(_ref) {
1841
1860
  }));
1842
1861
  };
1843
1862
 
1844
- 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"];
1863
+ 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", "style", "variant", "ariaLabelChosenSingular", "ariaLabelChosenPlural", "ariaLabelCloseList", "ariaLabelJumpToInput", "ariaLabelOpenList", "ariaLabelRemoveSelected", "ariaLabelSelectedItem"];
1845
1864
  var MultiSelect = function MultiSelect(_ref) {
1846
1865
  var className = _ref.className,
1847
1866
  _ref$clearable = _ref.clearable,
@@ -1854,9 +1873,9 @@ var MultiSelect = function MultiSelect(_ref) {
1854
1873
  feedback = _ref.feedback,
1855
1874
  _ref$hideSelectAll = _ref.hideSelectAll,
1856
1875
  hideSelectAll = _ref$hideSelectAll === void 0 ? false : _ref$hideSelectAll,
1857
- _ref$itemFilter = _ref.itemFilter,
1858
- itemFilter = _ref$itemFilter === void 0 ? lowerCaseFilterTest : _ref$itemFilter,
1859
1876
  initialItems = _ref.items,
1877
+ _ref$itemFilter = _ref.itemFilter,
1878
+ itemFilter = _ref$itemFilter === void 0 ? isFunctionWithQueryArgument(initialItems) ? noFilter : lowerCaseFilterTest : _ref$itemFilter,
1860
1879
  label = _ref.label,
1861
1880
  _ref$labelAllItemsSel = _ref.labelAllItemsSelected,
1862
1881
  labelAllItemsSelected = _ref$labelAllItemsSel === void 0 ? 'Alle valgt' : _ref$labelAllItemsSel,
@@ -1875,7 +1894,8 @@ var MultiSelect = function MultiSelect(_ref) {
1875
1894
  placeholder = _ref.placeholder,
1876
1895
  _ref$readOnly = _ref.readOnly,
1877
1896
  readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1878
- selectedItems = _ref.selectedItems,
1897
+ _ref$selectedItems = _ref.selectedItems,
1898
+ selectedItems = _ref$selectedItems === void 0 ? [] : _ref$selectedItems,
1879
1899
  _ref$selectOnBlur = _ref.selectOnBlur,
1880
1900
  selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1881
1901
  style = _ref.style,
@@ -1901,6 +1921,10 @@ var MultiSelect = function MultiSelect(_ref) {
1901
1921
  lastRemovedItem = _React$useState2[0],
1902
1922
  setLastRemovedItem = _React$useState2[1];
1903
1923
  var inputRef = useRef(null);
1924
+ useEffect(function () {
1925
+ //@ts-expect-error this is done to aid developers debug wrong prop usage
1926
+ if (rest.selectedItem !== undefined) console.warn("Incorrect 'selectedItem' prop found, did you mean to use 'selectedItems?");
1927
+ }, []);
1904
1928
  var _useResolvedItems = useResolvedItems(initialItems, debounceTimeout),
1905
1929
  normalizedItems = _useResolvedItems.items,
1906
1930
  loading = _useResolvedItems.loading,
@@ -1930,7 +1954,8 @@ var MultiSelect = function MultiSelect(_ref) {
1930
1954
  };
1931
1955
  var updateListItems = function updateListItems(_ref3) {
1932
1956
  var inputValue = _ref3.inputValue;
1933
- if (typeof initialItems === 'function') fetchItems(inputValue != null ? inputValue : EMPTY_INPUT); // fetch items only if user provides a function as items
1957
+ var shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
1958
+ if (shouldRefetchItems) fetchItems(inputValue != null ? inputValue : EMPTY_INPUT);
1934
1959
  filterListItems({
1935
1960
  inputValue: inputValue != null ? inputValue : EMPTY_INPUT
1936
1961
  });
@@ -2033,6 +2058,9 @@ var MultiSelect = function MultiSelect(_ref) {
2033
2058
  // reset input value when leaving input field
2034
2059
  case useCombobox.stateChangeTypes.InputBlur:
2035
2060
  {
2061
+ updateListItems({
2062
+ inputValue: EMPTY_INPUT
2063
+ });
2036
2064
  return _extends({}, changes, {
2037
2065
  inputValue: EMPTY_INPUT
2038
2066
  });
@@ -2125,16 +2153,16 @@ var MultiSelect = function MultiSelect(_ref) {
2125
2153
  label: label,
2126
2154
  labelId: getLabelProps().id,
2127
2155
  labelProps: getLabelProps(),
2128
- readOnly: readOnly,
2129
- variant: variant
2130
- }, rest), React.createElement("div", {
2131
- className: classNames('eds-dropdown__selected-items-and-input', {
2132
- 'eds-dropdown__selected-items-and-input--filled': hasSelectedItems
2133
- }),
2134
2156
  onClick: function onClick(e) {
2135
2157
  var _inputRef$current4;
2136
2158
  if (e.target === e.currentTarget) (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.focus();
2137
- }
2159
+ },
2160
+ readOnly: readOnly,
2161
+ variant: variant
2162
+ }, rest), React.createElement("div", {
2163
+ className: classNames('eds-dropdown--multiselect__selected-items-and-input', {
2164
+ 'eds-dropdown--multiselect__selected-items-and-input--filled': hasSelectedItems
2165
+ })
2138
2166
  }, selectedItems.length < maxChips ? React.createElement(React.Fragment, null, selectedItems.length > 1 ? React.createElement(VisuallyHidden, {
2139
2167
  onClick: function onClick() {
2140
2168
  var _inputRef$current5;
@@ -2291,12 +2319,12 @@ var Dropdown = function Dropdown(_ref) {
2291
2319
  readOnly: readOnly,
2292
2320
  variant: variant
2293
2321
  }, rest), React.createElement("div", _extends({
2294
- className: "eds-dropdown__selected-item-button"
2322
+ className: "eds-dropdown__selected-item"
2295
2323
  }, getToggleButtonProps({
2296
2324
  id: undefined
2297
2325
  })), (_ref3 = (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : React.createElement("span", {
2298
- className: classNames('eds-dropdown__selected-item-button__placeholder', {
2299
- 'eds-dropdown__selected-item-button__placeholder--readonly': readOnly
2326
+ className: classNames('eds-dropdown__selected-item__placeholder', {
2327
+ 'eds-dropdown__selected-item__placeholder--readonly': readOnly
2300
2328
  })
2301
2329
  }, placeholder)) != null ? _ref3 : '')), React.createElement(DropdownList, {
2302
2330
  getItemProps: getItemProps,