downshift 9.3.2 → 9.4.0-alpha.1
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.
- package/dist/downshift.cjs.cjs +617 -698
- package/dist/downshift.d.ts +49 -55
- package/dist/downshift.esm.mjs +618 -699
- package/dist/downshift.native.cjs.cjs +575 -653
- package/dist/downshift.nativeweb.cjs.cjs +615 -693
- package/dist/downshift.types.d.ts +205 -0
- package/dist/downshift.umd.js +621 -702
- package/dist/downshift.umd.js.map +1 -1
- package/dist/downshift.umd.min.js +1 -1
- package/dist/downshift.umd.min.js.map +1 -1
- package/dist/hooks/testUtils/MemoizedItem.d.ts +10 -0
- package/dist/hooks/testUtils/fixtures.d.ts +16 -0
- package/dist/hooks/testUtils/index.d.ts +4 -0
- package/dist/hooks/testUtils/interactions.d.ts +16 -0
- package/dist/hooks/testUtils/testCases.d.ts +2 -0
- package/dist/hooks/useCombobox/__tests__/utils/index.d.ts +5 -0
- package/dist/hooks/useCombobox/__tests__/utils/interactions.d.ts +6 -0
- package/dist/hooks/useCombobox/__tests__/utils/renderCombobox.d.ts +72 -0
- package/dist/hooks/useCombobox/__tests__/utils/renderUseCombobox.d.ts +2 -0
- package/dist/hooks/useCombobox/index.d.ts +4 -94
- package/dist/hooks/useCombobox/index.types.d.ts +302 -0
- package/dist/hooks/useCombobox/reducer.d.ts +4 -1
- package/dist/hooks/useCombobox/stateChangeTypes.d.ts +24 -23
- package/dist/hooks/useCombobox/utils/getInitialState.d.ts +10 -0
- package/dist/hooks/useCombobox/utils/index.d.ts +3 -0
- package/dist/hooks/useCombobox/{utils.d.ts → utils/propTypes.d.ts} +2 -30
- package/dist/hooks/useCombobox/utils/useControlledReducer.d.ts +16 -0
- package/dist/hooks/useMultipleSelection/index.d.ts +25 -13
- package/dist/hooks/useMultipleSelection/index.types.d.ts +117 -0
- package/dist/hooks/useMultipleSelection/reducer.d.ts +1 -1
- package/dist/hooks/useMultipleSelection/utils.d.ts +14 -15
- package/dist/hooks/useSelect/__tests__/utils/getItemIndexByCharacter.d.ts +7 -0
- package/dist/hooks/useSelect/__tests__/utils/index.d.ts +6 -0
- package/dist/hooks/useSelect/__tests__/utils/renderSelect.d.ts +71 -0
- package/dist/hooks/useSelect/__tests__/utils/renderUseSelect.d.ts +2 -0
- package/dist/hooks/useSelect/__tests__/utils/stateChangeTestCases.d.ts +182 -0
- package/dist/hooks/useSelect/index.d.ts +4 -71
- package/dist/hooks/useSelect/index.types.d.ts +266 -0
- package/dist/hooks/useSelect/reducer.d.ts +4 -1
- package/dist/hooks/useSelect/stateChangeTypes.d.ts +23 -22
- package/dist/hooks/useSelect/utils/index.d.ts +0 -1
- package/dist/hooks/useTagGroup/__tests__/utils/renderTagGroup.d.ts +1 -1
- package/dist/hooks/useTagGroup/index.types.d.ts +10 -13
- package/dist/hooks/useTagGroup/reducer.d.ts +4 -2
- package/dist/hooks/useTagGroup/utils/index.d.ts +3 -1
- package/dist/hooks/utils/__tests__/dropdownDefaultProps.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/getChangesOnSelection.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/getDefaultHighlightedIndex.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/getDefaultValue.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/getHighlightedIndexOnOpen.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/getInitialValue.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/getItemAndIndex.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/isDropdownStateEqual.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useA11yMessageStatus.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useControlPropsValidator.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useControlledReducer.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useElementIds.legacy.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useElementIds.r18.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useEnhancedReducer.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useGetterPropsCalledChecker.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useIsInitialMount.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useMouseAndTouchTracker.test.d.ts +1 -0
- package/dist/hooks/utils/__tests__/useScrollIntoView.test.d.ts +1 -0
- package/dist/hooks/utils/callOnChangeProps.d.ts +4 -0
- package/dist/hooks/utils/dropdownDefaultProps.d.ts +13 -0
- package/dist/hooks/{utils.dropdown/defaultStateValues.d.ts → utils/dropdownDefaultStateValues.d.ts} +2 -2
- package/dist/hooks/{utils.dropdown/propTypes.d.ts → utils/dropdownPropTypes.d.ts} +1 -1
- package/dist/hooks/utils/getChangesOnSelection.d.ts +17 -0
- package/dist/hooks/utils/getDefaultHighlightedIndex.d.ts +7 -0
- package/dist/hooks/utils/getDefaultValue.d.ts +8 -0
- package/dist/hooks/utils/getHighlightedIndexOnOpen.d.ts +16 -0
- package/dist/hooks/utils/getInitialState.d.ts +23 -0
- package/dist/hooks/utils/getInitialValue.d.ts +14 -0
- package/dist/hooks/utils/index.d.ts +24 -0
- package/dist/hooks/utils/index.types.d.ts +26 -0
- package/dist/hooks/utils/isDropdownStateEqual.d.ts +16 -0
- package/dist/hooks/utils/reducer.d.ts +27 -0
- package/dist/hooks/utils/useControlPropsValidator.d.ts +6 -0
- package/dist/hooks/utils/useControlledReducer.d.ts +13 -0
- package/dist/hooks/utils/useEnhancedReducer.d.ts +15 -0
- package/dist/hooks/utils/useGetterPropsCalledChecker.d.ts +2 -0
- package/dist/hooks/utils/useMouseAndTouchTracker.d.ts +15 -0
- package/dist/hooks/utils/useScrollIntoView.d.ts +11 -0
- package/dist/index.d.ts +1 -1
- package/dist/utils/__tests__/callAllEventHandlers.test.d.ts +1 -0
- package/dist/utils/__tests__/debounce.test.d.ts +1 -0
- package/dist/utils/__tests__/generateId.r18.test.d.ts +1 -0
- package/dist/utils/__tests__/generateId.test.d.ts +1 -0
- package/dist/utils/__tests__/getHighlightedIndex.test.d.ts +1 -0
- package/dist/utils/__tests__/getNonDisabledIndex.test.d.ts +1 -0
- package/dist/utils/__tests__/getState.test.d.ts +1 -0
- package/dist/utils/__tests__/handleRefs.test.d.ts +1 -0
- package/dist/utils/__tests__/normalizeArrowKey.test.d.ts +1 -0
- package/dist/utils/__tests__/scrollIntoView.test.d.ts +1 -0
- package/dist/utils/__tests__/setA11yStatus.test.d.ts +1 -0
- package/dist/utils/__tests__/targetWithinDownshift.test.d.ts +1 -0
- package/dist/utils/__tests__/useLatestRef.test.d.ts +1 -0
- package/dist/utils/__tests__/validateControlledUnchanged.test.d.ts +1 -0
- package/dist/utils/__tests__/validatePropTypes.test.d.ts +1 -0
- package/dist/utils/getHighlightedIndex.d.ts +11 -0
- package/dist/utils/getNonDisabledIndex.d.ts +11 -0
- package/dist/utils/getState.d.ts +12 -0
- package/dist/utils/handleRefs.d.ts +2 -0
- package/dist/{utils-ts → utils}/index.d.ts +5 -1
- package/dist/utils/normalizeArrowKey.d.ts +6 -0
- package/dist/utils/targetWithinDownshift.d.ts +12 -0
- package/dist/utils/validateControlledUnchanged.d.ts +1 -0
- package/dist/utils/validatePropTypes.d.ts +2 -0
- package/dist/utils.legacy.d.ts +54 -0
- package/flow-typed/npm/downshift_v2.x.x.js.flow +87 -62
- package/package.json +2 -4
- package/preact/dist/downshift.cjs.cjs +617 -698
- package/preact/dist/downshift.cjs.js +4265 -0
- package/preact/dist/downshift.esm.js +4238 -0
- package/preact/dist/downshift.esm.mjs +618 -699
- package/preact/dist/downshift.umd.js +617 -698
- package/preact/dist/downshift.umd.js.map +1 -1
- package/preact/dist/downshift.umd.min.js +1 -1
- package/preact/dist/downshift.umd.min.js.map +1 -1
- package/typings/index.d.ts +13 -21
- package/dist/hooks/reducer.d.ts +0 -1
- package/dist/hooks/useSelect/utils/defaultProps.d.ts +0 -8
- package/dist/hooks/utils-ts/callOnChangeProps.d.ts +0 -2
- package/dist/hooks/utils-ts/getDefaultValue.d.ts +0 -2
- package/dist/hooks/utils-ts/getInitialValue.d.ts +0 -2
- package/dist/hooks/utils-ts/index.d.ts +0 -11
- package/dist/hooks/utils-ts/stateReducer.d.ts +0 -6
- package/dist/hooks/utils-ts/useControlledReducer.d.ts +0 -12
- package/dist/hooks/utils-ts/useEnhancedReducer.d.ts +0 -13
- package/dist/hooks/utils.d.ts +0 -58
- package/dist/hooks/utils.dropdown/defaultProps.d.ts +0 -9
- package/dist/hooks/utils.dropdown/index.d.ts +0 -3
- package/dist/utils-ts/getState.d.ts +0 -22
- package/dist/utils-ts/handleRefs.d.ts +0 -2
- package/dist/utils-ts/validatePropTypes.d.ts +0 -2
- package/dist/utils.d.ts +0 -123
- package/typings/index.legacy.d.ts +0 -888
- /package/dist/hooks/{utils-ts/__tests__/getItemAndIndex.test.d.ts → useCombobox/utils/__tests__/getInitialState.test.d.ts} +0 -0
- /package/dist/hooks/{utils.dropdown/__tests__/useElementIds.legacy.test.d.ts → useCombobox/utils/__tests__/useControlledReducer.test.d.ts} +0 -0
- /package/dist/hooks/{utils.dropdown/__tests__/useElementIds.r18.test.d.ts → useSelect/utils/__tests__/getItemIndexByCharacterKey.test.d.ts} +0 -0
- /package/dist/{utils-ts/__tests__/getState.test.d.ts → hooks/utils/__tests__/callOnChangeProps.test.d.ts} +0 -0
- /package/dist/{utils-ts/__tests__/handleRefs.test.d.ts → hooks/utils/__tests__/capitalizeString.test.d.ts} +0 -0
- /package/dist/hooks/{utils-ts → utils}/capitalizeString.d.ts +0 -0
- /package/dist/hooks/{utils-ts → utils}/getItemAndIndex.d.ts +0 -0
- /package/dist/hooks/{utils-ts → utils}/propTypes.d.ts +0 -0
- /package/dist/hooks/{utils-ts → utils}/useA11yMessageStatus.d.ts +0 -0
- /package/dist/hooks/{utils.dropdown → utils}/useElementIds.d.ts +0 -0
- /package/dist/hooks/{utils-ts → utils}/useIsInitialMount.d.ts +0 -0
- /package/dist/{utils-ts → utils}/callAllEventHandlers.d.ts +0 -0
- /package/dist/{utils-ts → utils}/debounce.d.ts +0 -0
- /package/dist/{utils-ts → utils}/generateId.d.ts +0 -0
- /package/dist/{utils-ts → utils}/noop.d.ts +0 -0
- /package/dist/{utils-ts → utils}/scrollIntoView.d.ts +0 -0
- /package/dist/{utils-ts → utils}/setA11yStatus.d.ts +0 -0
- /package/dist/{utils-ts → utils}/useLatestRef.d.ts +0 -0
package/dist/downshift.umd.js
CHANGED
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
var propTypes$
|
|
60
|
+
var propTypes$5 = {exports: {}};
|
|
61
61
|
|
|
62
62
|
var reactIs$1 = {exports: {}};
|
|
63
63
|
|
|
@@ -1129,7 +1129,7 @@
|
|
|
1129
1129
|
var hasRequiredPropTypes;
|
|
1130
1130
|
|
|
1131
1131
|
function requirePropTypes () {
|
|
1132
|
-
if (hasRequiredPropTypes) return propTypes$
|
|
1132
|
+
if (hasRequiredPropTypes) return propTypes$5.exports;
|
|
1133
1133
|
hasRequiredPropTypes = 1;
|
|
1134
1134
|
{
|
|
1135
1135
|
var ReactIs = requireReactIs$1();
|
|
@@ -1137,9 +1137,9 @@
|
|
|
1137
1137
|
// By explicitly using `prop-types` you are opting into new development behavior.
|
|
1138
1138
|
// http://fb.me/prop-types-in-prod
|
|
1139
1139
|
var throwOnDirectAccess = true;
|
|
1140
|
-
propTypes$
|
|
1140
|
+
propTypes$5.exports = /*@__PURE__*/ requireFactoryWithTypeCheckers()(ReactIs.isElement, throwOnDirectAccess);
|
|
1141
1141
|
}
|
|
1142
|
-
return propTypes$
|
|
1142
|
+
return propTypes$5.exports;
|
|
1143
1143
|
}
|
|
1144
1144
|
|
|
1145
1145
|
var propTypesExports = /*@__PURE__*/ requirePropTypes();
|
|
@@ -1462,7 +1462,7 @@
|
|
|
1462
1462
|
return ref;
|
|
1463
1463
|
}
|
|
1464
1464
|
|
|
1465
|
-
function handleRefs
|
|
1465
|
+
function handleRefs() {
|
|
1466
1466
|
for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
1467
1467
|
refs[_key] = arguments[_key];
|
|
1468
1468
|
}
|
|
@@ -1484,7 +1484,7 @@
|
|
|
1484
1484
|
* @param fns the event handler functions
|
|
1485
1485
|
* @return the event handler to add to an element
|
|
1486
1486
|
*/
|
|
1487
|
-
function callAllEventHandlers
|
|
1487
|
+
function callAllEventHandlers() {
|
|
1488
1488
|
for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
1489
1489
|
fns[_key] = arguments[_key];
|
|
1490
1490
|
}
|
|
@@ -1506,7 +1506,7 @@
|
|
|
1506
1506
|
* function once after the time given has passed since
|
|
1507
1507
|
* it was last called.
|
|
1508
1508
|
*/
|
|
1509
|
-
function debounce
|
|
1509
|
+
function debounce(fn, time) {
|
|
1510
1510
|
var timeoutId;
|
|
1511
1511
|
function cancel() {
|
|
1512
1512
|
if (timeoutId) {
|
|
@@ -1527,7 +1527,7 @@
|
|
|
1527
1527
|
return wrapper;
|
|
1528
1528
|
}
|
|
1529
1529
|
|
|
1530
|
-
var cleanupStatus = debounce
|
|
1530
|
+
var cleanupStatus = debounce(function (document) {
|
|
1531
1531
|
getStatusDiv(document).textContent = '';
|
|
1532
1532
|
}, 500);
|
|
1533
1533
|
|
|
@@ -1608,6 +1608,8 @@
|
|
|
1608
1608
|
}
|
|
1609
1609
|
var keys = Object.keys(state);
|
|
1610
1610
|
return keys.reduce(function (newState, key) {
|
|
1611
|
+
// state keys could be in props, but with value undefined, which means they should be ignored.
|
|
1612
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
1611
1613
|
if (props[key] !== undefined) {
|
|
1612
1614
|
newState[key] = props[key];
|
|
1613
1615
|
}
|
|
@@ -1638,93 +1640,149 @@
|
|
|
1638
1640
|
}
|
|
1639
1641
|
|
|
1640
1642
|
/**
|
|
1641
|
-
*
|
|
1642
|
-
*
|
|
1643
|
-
*
|
|
1644
|
-
* passed.
|
|
1645
|
-
* @param {Function} cb the callback
|
|
1646
|
-
* @return {Function} a function
|
|
1647
|
-
*/
|
|
1648
|
-
function cbToCb(cb) {
|
|
1649
|
-
return typeof cb === 'function' ? cb : noop;
|
|
1650
|
-
}
|
|
1651
|
-
|
|
1652
|
-
/**
|
|
1653
|
-
* @param {HTMLElement} parent the parent node
|
|
1654
|
-
* @param {HTMLElement} child the child node
|
|
1655
|
-
* @param {Window} environment The window context where downshift renders.
|
|
1656
|
-
* @return {Boolean} whether the parent is the child or the child is in the parent
|
|
1643
|
+
* Normalizes the 'key' property of a KeyboardEvent in IE/Edge
|
|
1644
|
+
* @param event a keyboardEvent object
|
|
1645
|
+
* @return keyboard key
|
|
1657
1646
|
*/
|
|
1658
|
-
function
|
|
1659
|
-
var
|
|
1660
|
-
|
|
1647
|
+
function normalizeArrowKey(event) {
|
|
1648
|
+
var key = event.key,
|
|
1649
|
+
keyCode = event.keyCode;
|
|
1650
|
+
/* istanbul ignore next (ie) */
|
|
1651
|
+
if (keyCode >= 37 && keyCode <= 40 && !key.startsWith('Arrow')) {
|
|
1652
|
+
return "Arrow" + key;
|
|
1653
|
+
}
|
|
1654
|
+
return key;
|
|
1661
1655
|
}
|
|
1662
1656
|
|
|
1663
1657
|
/**
|
|
1664
|
-
*
|
|
1665
|
-
*
|
|
1666
|
-
*
|
|
1667
|
-
* @param
|
|
1668
|
-
* @param
|
|
1669
|
-
* @
|
|
1658
|
+
* Returns the next non-disabled highlightedIndex value.
|
|
1659
|
+
*
|
|
1660
|
+
* @param start The current highlightedIndex.
|
|
1661
|
+
* @param backwards If true, it will search backwards from the start.
|
|
1662
|
+
* @param items The items array.
|
|
1663
|
+
* @param isItemDisabled Function that tells if an item is disabled or not.
|
|
1664
|
+
* @param circular If the search reaches the end, if it can search again starting from the other end.
|
|
1665
|
+
* @returns The next non-disabled index.
|
|
1670
1666
|
*/
|
|
1671
|
-
function
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
if (timeoutId) {
|
|
1675
|
-
clearTimeout(timeoutId);
|
|
1676
|
-
}
|
|
1667
|
+
function getNonDisabledIndex(start, backwards, items, isItemDisabled, circular) {
|
|
1668
|
+
if (circular === void 0) {
|
|
1669
|
+
circular = false;
|
|
1677
1670
|
}
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1671
|
+
var count = items.length;
|
|
1672
|
+
if (backwards) {
|
|
1673
|
+
for (var index = start; index >= 0; index--) {
|
|
1674
|
+
if (!isItemDisabled(items[index], index)) {
|
|
1675
|
+
return index;
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1678
|
+
} else {
|
|
1679
|
+
for (var _index = start; _index < count; _index++) {
|
|
1680
|
+
if (!isItemDisabled(items[_index], _index)) {
|
|
1681
|
+
return _index;
|
|
1682
|
+
}
|
|
1681
1683
|
}
|
|
1682
|
-
cancel();
|
|
1683
|
-
timeoutId = setTimeout(function () {
|
|
1684
|
-
timeoutId = null;
|
|
1685
|
-
fn.apply(void 0, args);
|
|
1686
|
-
}, time);
|
|
1687
1684
|
}
|
|
1688
|
-
|
|
1689
|
-
|
|
1685
|
+
if (circular) {
|
|
1686
|
+
return getNonDisabledIndex(backwards ? count - 1 : 0, backwards, items, isItemDisabled);
|
|
1687
|
+
}
|
|
1688
|
+
return -1;
|
|
1690
1689
|
}
|
|
1691
1690
|
|
|
1692
1691
|
/**
|
|
1693
|
-
*
|
|
1694
|
-
*
|
|
1695
|
-
*
|
|
1696
|
-
* @param
|
|
1697
|
-
* @
|
|
1692
|
+
* Returns the next non-disabled highlightedIndex value.
|
|
1693
|
+
*
|
|
1694
|
+
* @param start The current highlightedIndex.
|
|
1695
|
+
* @param offset The offset from the current highlightedIndex to start searching.
|
|
1696
|
+
* @param items The items array.
|
|
1697
|
+
* @param isItemDisabled Function that tells if an item is disabled or not.
|
|
1698
|
+
* @param circular If the search reaches the end, if it can search again starting from the other end.
|
|
1699
|
+
* @returns The next highlightedIndex.
|
|
1698
1700
|
*/
|
|
1699
|
-
function
|
|
1700
|
-
|
|
1701
|
-
|
|
1701
|
+
function getHighlightedIndex(start, offset, items, isItemDisabled, circular) {
|
|
1702
|
+
if (circular === void 0) {
|
|
1703
|
+
circular = false;
|
|
1702
1704
|
}
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1705
|
+
var count = items.length;
|
|
1706
|
+
if (count === 0) {
|
|
1707
|
+
return -1;
|
|
1708
|
+
}
|
|
1709
|
+
var itemsLastIndex = count - 1;
|
|
1710
|
+
if (typeof start !== 'number' || start < 0 || start > itemsLastIndex) {
|
|
1711
|
+
start = offset > 0 ? -1 : itemsLastIndex + 1;
|
|
1712
|
+
}
|
|
1713
|
+
var current = start + offset;
|
|
1714
|
+
if (current < 0) {
|
|
1715
|
+
current = circular ? itemsLastIndex : 0;
|
|
1716
|
+
} else if (current > itemsLastIndex) {
|
|
1717
|
+
current = circular ? 0 : itemsLastIndex;
|
|
1718
|
+
}
|
|
1719
|
+
var highlightedIndex = getNonDisabledIndex(current, offset < 0, items, isItemDisabled, circular);
|
|
1720
|
+
if (highlightedIndex === -1) {
|
|
1721
|
+
return start >= count ? -1 : start;
|
|
1722
|
+
}
|
|
1723
|
+
return highlightedIndex;
|
|
1724
|
+
}
|
|
1725
|
+
|
|
1726
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1727
|
+
|
|
1728
|
+
// eslint-disable-next-line import/no-mutable-exports
|
|
1729
|
+
var validateControlledUnchanged = noop;
|
|
1730
|
+
/* istanbul ignore next */
|
|
1731
|
+
{
|
|
1732
|
+
validateControlledUnchanged = function validateControlledUnchanged(state, prevProps, nextProps) {
|
|
1733
|
+
var warningDescription = "This prop should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled Downshift element for the lifetime of the component. More info: https://github.com/downshift-js/downshift#control-props";
|
|
1734
|
+
Object.keys(state).forEach(function (propKey) {
|
|
1735
|
+
if (prevProps[propKey] !== undefined && nextProps[propKey] === undefined) {
|
|
1736
|
+
// eslint-disable-next-line no-console
|
|
1737
|
+
console.error("downshift: A component has changed the controlled prop \"" + propKey + "\" to be uncontrolled. " + warningDescription);
|
|
1738
|
+
} else if (prevProps[propKey] === undefined && nextProps[propKey] !== undefined) {
|
|
1739
|
+
// eslint-disable-next-line no-console
|
|
1740
|
+
console.error("downshift: A component has changed the uncontrolled prop \"" + propKey + "\" to be controlled. " + warningDescription);
|
|
1710
1741
|
}
|
|
1711
|
-
return event.preventDownshiftDefault || event.hasOwnProperty('nativeEvent') && event.nativeEvent.preventDownshiftDefault;
|
|
1712
1742
|
});
|
|
1713
1743
|
};
|
|
1714
1744
|
}
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1745
|
+
|
|
1746
|
+
/**
|
|
1747
|
+
* Checks if event target is within the downshift elements.
|
|
1748
|
+
*
|
|
1749
|
+
* @param target Target to check.
|
|
1750
|
+
* @param downshiftElements The elements that form downshift (list, toggle button etc).
|
|
1751
|
+
* @param environment The window context where downshift renders.
|
|
1752
|
+
* @param checkActiveElement Whether to also check activeElement.
|
|
1753
|
+
*
|
|
1754
|
+
* @returns Whether or not the target is within downshift elements.
|
|
1755
|
+
*/
|
|
1756
|
+
function targetWithinDownshift(target, downshiftElements, environment, checkActiveElement) {
|
|
1757
|
+
if (checkActiveElement === void 0) {
|
|
1758
|
+
checkActiveElement = true;
|
|
1718
1759
|
}
|
|
1719
|
-
return function (
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1760
|
+
return !!environment && downshiftElements.some(function (contextNode) {
|
|
1761
|
+
return contextNode && (isOrContainsNode(contextNode, target, environment) || checkActiveElement && isOrContainsNode(contextNode, environment.document.activeElement, environment));
|
|
1762
|
+
});
|
|
1763
|
+
}
|
|
1764
|
+
|
|
1765
|
+
/**
|
|
1766
|
+
* @param parent the parent node
|
|
1767
|
+
* @param child the child node
|
|
1768
|
+
* @param environment The window context where downshift renders.
|
|
1769
|
+
* @return Whether the parent is the child or the child is in the parent
|
|
1770
|
+
*/
|
|
1771
|
+
function isOrContainsNode(parent, child, environment) {
|
|
1772
|
+
var result = parent === child || child instanceof environment.Node && parent.contains(child);
|
|
1773
|
+
return result;
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
/**
|
|
1777
|
+
* Accepts a parameter and returns it if it's a function
|
|
1778
|
+
* or a noop function if it's not. This allows us to
|
|
1779
|
+
* accept a callback, but not worry about it if it's not
|
|
1780
|
+
* passed.
|
|
1781
|
+
* @param {Function} cb the callback
|
|
1782
|
+
* @return {Function} a function
|
|
1783
|
+
*/
|
|
1784
|
+
function cbToCb(cb) {
|
|
1785
|
+
return typeof cb === 'function' ? cb : noop;
|
|
1728
1786
|
}
|
|
1729
1787
|
|
|
1730
1788
|
/**
|
|
@@ -1813,34 +1871,6 @@
|
|
|
1813
1871
|
return result;
|
|
1814
1872
|
}
|
|
1815
1873
|
|
|
1816
|
-
/**
|
|
1817
|
-
* This determines whether a prop is a "controlled prop" meaning it is
|
|
1818
|
-
* state which is controlled by the outside of this component rather
|
|
1819
|
-
* than within this component.
|
|
1820
|
-
*
|
|
1821
|
-
* @param {Object} props The props that may contain controlled values.
|
|
1822
|
-
* @param {String} key the key to check
|
|
1823
|
-
* @return {Boolean} whether it is a controlled controlled prop
|
|
1824
|
-
*/
|
|
1825
|
-
function isControlledProp(props, key) {
|
|
1826
|
-
return props[key] !== undefined;
|
|
1827
|
-
}
|
|
1828
|
-
|
|
1829
|
-
/**
|
|
1830
|
-
* Normalizes the 'key' property of a KeyboardEvent in IE/Edge
|
|
1831
|
-
* @param {Object} event a keyboardEvent object
|
|
1832
|
-
* @return {String} keyboard key
|
|
1833
|
-
*/
|
|
1834
|
-
function normalizeArrowKey(event) {
|
|
1835
|
-
var key = event.key,
|
|
1836
|
-
keyCode = event.keyCode;
|
|
1837
|
-
/* istanbul ignore next (ie) */
|
|
1838
|
-
if (keyCode >= 37 && keyCode <= 40 && key.indexOf('Arrow') !== 0) {
|
|
1839
|
-
return "Arrow" + key;
|
|
1840
|
-
}
|
|
1841
|
-
return key;
|
|
1842
|
-
}
|
|
1843
|
-
|
|
1844
1874
|
/**
|
|
1845
1875
|
* Simple check if the value passed is object literal
|
|
1846
1876
|
* @param {*} obj any things
|
|
@@ -1850,112 +1880,6 @@
|
|
|
1850
1880
|
return Object.prototype.toString.call(obj) === '[object Object]';
|
|
1851
1881
|
}
|
|
1852
1882
|
|
|
1853
|
-
/**
|
|
1854
|
-
* Returns the next non-disabled highlightedIndex value.
|
|
1855
|
-
*
|
|
1856
|
-
* @param {number} start The current highlightedIndex.
|
|
1857
|
-
* @param {number} offset The offset from the current highlightedIndex to start searching.
|
|
1858
|
-
* @param {unknown[]} items The items array.
|
|
1859
|
-
* @param {(item: unknown, index: number) => boolean} isItemDisabled Function that tells if an item is disabled or not.
|
|
1860
|
-
* @param {boolean?} circular If the search reaches the end, if it can search again starting from the other end.
|
|
1861
|
-
* @returns {number} The next highlightedIndex.
|
|
1862
|
-
*/
|
|
1863
|
-
function getHighlightedIndex(start, offset, items, isItemDisabled, circular) {
|
|
1864
|
-
if (circular === void 0) {
|
|
1865
|
-
circular = false;
|
|
1866
|
-
}
|
|
1867
|
-
var count = items.length;
|
|
1868
|
-
if (count === 0) {
|
|
1869
|
-
return -1;
|
|
1870
|
-
}
|
|
1871
|
-
var itemsLastIndex = count - 1;
|
|
1872
|
-
if (typeof start !== 'number' || start < 0 || start > itemsLastIndex) {
|
|
1873
|
-
start = offset > 0 ? -1 : itemsLastIndex + 1;
|
|
1874
|
-
}
|
|
1875
|
-
var current = start + offset;
|
|
1876
|
-
if (current < 0) {
|
|
1877
|
-
current = circular ? itemsLastIndex : 0;
|
|
1878
|
-
} else if (current > itemsLastIndex) {
|
|
1879
|
-
current = circular ? 0 : itemsLastIndex;
|
|
1880
|
-
}
|
|
1881
|
-
var highlightedIndex = getNonDisabledIndex(current, offset < 0, items, isItemDisabled, circular);
|
|
1882
|
-
if (highlightedIndex === -1) {
|
|
1883
|
-
return start >= count ? -1 : start;
|
|
1884
|
-
}
|
|
1885
|
-
return highlightedIndex;
|
|
1886
|
-
}
|
|
1887
|
-
|
|
1888
|
-
/**
|
|
1889
|
-
* Returns the next non-disabled highlightedIndex value.
|
|
1890
|
-
*
|
|
1891
|
-
* @param {number} start The current highlightedIndex.
|
|
1892
|
-
* @param {boolean} backwards If true, it will search backwards from the start.
|
|
1893
|
-
* @param {unknown[]} items The items array.
|
|
1894
|
-
* @param {(item: unknown, index: number) => boolean} isItemDisabled Function that tells if an item is disabled or not.
|
|
1895
|
-
* @param {boolean} circular If the search reaches the end, if it can search again starting from the other end.
|
|
1896
|
-
* @returns {number} The next non-disabled index.
|
|
1897
|
-
*/
|
|
1898
|
-
function getNonDisabledIndex(start, backwards, items, isItemDisabled, circular) {
|
|
1899
|
-
if (circular === void 0) {
|
|
1900
|
-
circular = false;
|
|
1901
|
-
}
|
|
1902
|
-
var count = items.length;
|
|
1903
|
-
if (backwards) {
|
|
1904
|
-
for (var index = start; index >= 0; index--) {
|
|
1905
|
-
if (!isItemDisabled(items[index], index)) {
|
|
1906
|
-
return index;
|
|
1907
|
-
}
|
|
1908
|
-
}
|
|
1909
|
-
} else {
|
|
1910
|
-
for (var _index = start; _index < count; _index++) {
|
|
1911
|
-
if (!isItemDisabled(items[_index], _index)) {
|
|
1912
|
-
return _index;
|
|
1913
|
-
}
|
|
1914
|
-
}
|
|
1915
|
-
}
|
|
1916
|
-
if (circular) {
|
|
1917
|
-
return getNonDisabledIndex(backwards ? count - 1 : 0, backwards, items, isItemDisabled);
|
|
1918
|
-
}
|
|
1919
|
-
return -1;
|
|
1920
|
-
}
|
|
1921
|
-
|
|
1922
|
-
/**
|
|
1923
|
-
* Checks if event target is within the downshift elements.
|
|
1924
|
-
*
|
|
1925
|
-
* @param {EventTarget} target Target to check.
|
|
1926
|
-
* @param {HTMLElement[]} downshiftElements The elements that form downshift (list, toggle button etc).
|
|
1927
|
-
* @param {Window} environment The window context where downshift renders.
|
|
1928
|
-
* @param {boolean} checkActiveElement Whether to also check activeElement.
|
|
1929
|
-
*
|
|
1930
|
-
* @returns {boolean} Whether or not the target is within downshift elements.
|
|
1931
|
-
*/
|
|
1932
|
-
function targetWithinDownshift(target, downshiftElements, environment, checkActiveElement) {
|
|
1933
|
-
if (checkActiveElement === void 0) {
|
|
1934
|
-
checkActiveElement = true;
|
|
1935
|
-
}
|
|
1936
|
-
return environment && downshiftElements.some(function (contextNode) {
|
|
1937
|
-
return contextNode && (isOrContainsNode(contextNode, target, environment) || checkActiveElement && isOrContainsNode(contextNode, environment.document.activeElement, environment));
|
|
1938
|
-
});
|
|
1939
|
-
}
|
|
1940
|
-
|
|
1941
|
-
// eslint-disable-next-line import/no-mutable-exports
|
|
1942
|
-
var validateControlledUnchanged = noop;
|
|
1943
|
-
/* istanbul ignore next */
|
|
1944
|
-
{
|
|
1945
|
-
validateControlledUnchanged = function validateControlledUnchanged(state, prevProps, nextProps) {
|
|
1946
|
-
var warningDescription = "This prop should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled Downshift element for the lifetime of the component. More info: https://github.com/downshift-js/downshift#control-props";
|
|
1947
|
-
Object.keys(state).forEach(function (propKey) {
|
|
1948
|
-
if (prevProps[propKey] !== undefined && nextProps[propKey] === undefined) {
|
|
1949
|
-
// eslint-disable-next-line no-console
|
|
1950
|
-
console.error("downshift: A component has changed the controlled prop \"" + propKey + "\" to be uncontrolled. " + warningDescription);
|
|
1951
|
-
} else if (prevProps[propKey] === undefined && nextProps[propKey] !== undefined) {
|
|
1952
|
-
// eslint-disable-next-line no-console
|
|
1953
|
-
console.error("downshift: A component has changed the uncontrolled prop \"" + propKey + "\" to be controlled. " + warningDescription);
|
|
1954
|
-
}
|
|
1955
|
-
});
|
|
1956
|
-
};
|
|
1957
|
-
}
|
|
1958
|
-
|
|
1959
1883
|
var _excluded$4 = ["refKey", "ref"],
|
|
1960
1884
|
_excluded2$4 = ["onClick", "onPress", "onKeyDown", "onKeyUp", "onBlur"],
|
|
1961
1885
|
_excluded3$3 = ["onKeyDown", "onBlur", "onChange", "onInput", "onChangeText"],
|
|
@@ -2106,7 +2030,7 @@
|
|
|
2106
2030
|
}
|
|
2107
2031
|
newStateToSet[key];
|
|
2108
2032
|
// if it's coming from props, then we don't care to set it internally
|
|
2109
|
-
if (
|
|
2033
|
+
if (_this.props[key] === undefined) {
|
|
2110
2034
|
nextState[key] = newStateToSet[key];
|
|
2111
2035
|
}
|
|
2112
2036
|
});
|
|
@@ -2836,7 +2760,7 @@
|
|
|
2836
2760
|
validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps);
|
|
2837
2761
|
}
|
|
2838
2762
|
}
|
|
2839
|
-
if (
|
|
2763
|
+
if (this.props.selectedItem !== undefined && this.props.selectedItemChanged(prevProps.selectedItem, this.props.selectedItem)) {
|
|
2840
2764
|
this.internalSetState({
|
|
2841
2765
|
type: controlledPropUpdatedSelectedItem,
|
|
2842
2766
|
inputValue: this.props.itemToString(this.props.selectedItem)
|
|
@@ -3019,7 +2943,7 @@
|
|
|
3019
2943
|
changes[key] = newState[key];
|
|
3020
2944
|
}
|
|
3021
2945
|
}
|
|
3022
|
-
if (props.onStateChange && Object.keys(changes).length) {
|
|
2946
|
+
if (typeof props.onStateChange === 'function' && Object.keys(changes).length) {
|
|
3023
2947
|
props.onStateChange(_extends({
|
|
3024
2948
|
type: type
|
|
3025
2949
|
}, changes));
|
|
@@ -3045,50 +2969,53 @@
|
|
|
3045
2969
|
* two reducers, one from downshift and an optional one from the user.
|
|
3046
2970
|
* Also calls the onChange handlers for state values that have changed.
|
|
3047
2971
|
*
|
|
3048
|
-
* @param
|
|
3049
|
-
* @param
|
|
3050
|
-
* @param
|
|
3051
|
-
* @param
|
|
3052
|
-
* @returns
|
|
2972
|
+
* @param reducer Reducer function from downshift.
|
|
2973
|
+
* @param props The hook props, also passed to createInitialState.
|
|
2974
|
+
* @param createInitialState Function that returns the initial state.
|
|
2975
|
+
* @param isStateEqual Function that checks if a previous state is equal to the next.
|
|
2976
|
+
* @returns An array with the state and an action dispatcher.
|
|
3053
2977
|
*/
|
|
3054
2978
|
function useEnhancedReducer(reducer, props, createInitialState, isStateEqual) {
|
|
3055
|
-
var prevStateRef = React__namespace.useRef(
|
|
3056
|
-
var actionRef = React__namespace.useRef(
|
|
3057
|
-
var propsRef = useLatestRef(props);
|
|
2979
|
+
var prevStateRef = React__namespace.useRef({});
|
|
2980
|
+
var actionRef = React__namespace.useRef();
|
|
3058
2981
|
var enhancedReducer = React__namespace.useCallback(function (state, action) {
|
|
3059
2982
|
actionRef.current = action;
|
|
3060
|
-
state = getState(state,
|
|
3061
|
-
var changes = reducer(state,
|
|
3062
|
-
var newState =
|
|
2983
|
+
state = getState(state, action.props);
|
|
2984
|
+
var changes = reducer(state, action);
|
|
2985
|
+
var newState = action.props.stateReducer(state, _extends({}, action, {
|
|
3063
2986
|
changes: changes
|
|
3064
2987
|
}));
|
|
3065
2988
|
return _extends({}, state, newState);
|
|
3066
|
-
}, [
|
|
2989
|
+
}, [reducer]);
|
|
3067
2990
|
var _React$useReducer = React__namespace.useReducer(enhancedReducer, props, createInitialState),
|
|
3068
2991
|
state = _React$useReducer[0],
|
|
3069
2992
|
dispatch = _React$useReducer[1];
|
|
2993
|
+
var propsRef = useLatestRef(props);
|
|
2994
|
+
var dispatchWithProps = React__namespace.useCallback(function (action) {
|
|
2995
|
+
return dispatch(_extends({}, action, {
|
|
2996
|
+
props: propsRef.current
|
|
2997
|
+
}));
|
|
2998
|
+
}, [propsRef]);
|
|
3070
2999
|
var action = actionRef.current;
|
|
3071
3000
|
React__namespace.useEffect(function () {
|
|
3072
|
-
var
|
|
3073
|
-
var
|
|
3074
|
-
var shouldCallOnChangeProps = action && prevStateRef.current && !isStateEqual(prevState, state);
|
|
3001
|
+
var prevState = getState(prevStateRef.current, action == null ? void 0 : action.props);
|
|
3002
|
+
var shouldCallOnChangeProps = action && !isStateEqual(prevState, state);
|
|
3075
3003
|
if (shouldCallOnChangeProps) {
|
|
3076
|
-
callOnChangeProps(action,
|
|
3004
|
+
callOnChangeProps(action, action.props, prevState, state);
|
|
3077
3005
|
}
|
|
3078
3006
|
prevStateRef.current = state;
|
|
3079
|
-
}, [state, action, isStateEqual
|
|
3080
|
-
return [state,
|
|
3007
|
+
}, [state, action, isStateEqual]);
|
|
3008
|
+
return [state, dispatchWithProps];
|
|
3081
3009
|
}
|
|
3082
3010
|
|
|
3083
3011
|
/**
|
|
3084
3012
|
* Wraps the useEnhancedReducer and applies the controlled prop values before
|
|
3085
3013
|
* returning the new state.
|
|
3086
|
-
*
|
|
3087
|
-
* @param
|
|
3088
|
-
* @param
|
|
3089
|
-
* @param
|
|
3090
|
-
* @
|
|
3091
|
-
* @returns {Array} An array with the state and an action dispatcher.
|
|
3014
|
+
* @param reducer Reducer function from downshift.
|
|
3015
|
+
* @param props The hook props, also passed to createInitialState.
|
|
3016
|
+
* @param createInitialState Function that returns the initial state.
|
|
3017
|
+
* @param isStateEqual Function that checks if a previous state is equal to the next.
|
|
3018
|
+
* @returns An array with the state and an action dispatcher.
|
|
3092
3019
|
*/
|
|
3093
3020
|
function useControlledReducer$1(reducer, props, createInitialState, isStateEqual) {
|
|
3094
3021
|
var _useEnhancedReducer = useEnhancedReducer(reducer, props, createInitialState, isStateEqual),
|
|
@@ -3141,16 +3068,8 @@
|
|
|
3141
3068
|
return isInitialMountRef.current;
|
|
3142
3069
|
}
|
|
3143
3070
|
|
|
3144
|
-
/**
|
|
3145
|
-
* Default state reducer that returns the changes.
|
|
3146
|
-
*
|
|
3147
|
-
*/
|
|
3148
|
-
function stateReducer(_s, a) {
|
|
3149
|
-
return a.changes;
|
|
3150
|
-
}
|
|
3151
|
-
|
|
3152
3071
|
// Shared between all exports.
|
|
3153
|
-
var propTypes$
|
|
3072
|
+
var propTypes$4 = {
|
|
3154
3073
|
environment: PropTypes.shape({
|
|
3155
3074
|
addEventListener: PropTypes.func.isRequired,
|
|
3156
3075
|
removeEventListener: PropTypes.func.isRequired,
|
|
@@ -3166,30 +3085,47 @@
|
|
|
3166
3085
|
stateReducer: PropTypes.func
|
|
3167
3086
|
};
|
|
3168
3087
|
|
|
3169
|
-
|
|
3170
|
-
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
|
|
3174
|
-
|
|
3088
|
+
/**
|
|
3089
|
+
* Returns the default value based on the defaultProp and defaultStateValue.
|
|
3090
|
+
*
|
|
3091
|
+
* @param defaultProp The default prop value.
|
|
3092
|
+
* @param defaultStateValue The default state value.
|
|
3093
|
+
* @returns The resolved default value.
|
|
3094
|
+
*/
|
|
3095
|
+
function getDefaultValue(defaultProp, defaultStateValue) {
|
|
3096
|
+
return defaultProp === undefined ? defaultStateValue : defaultProp;
|
|
3175
3097
|
}
|
|
3176
3098
|
|
|
3177
|
-
|
|
3178
|
-
|
|
3099
|
+
/**
|
|
3100
|
+
* Returns the initial value for a state variable, based on the following precedence:
|
|
3101
|
+
* 1. The controlled value (if it's not undefined)
|
|
3102
|
+
* 2. The initialValue (if it's not undefined)
|
|
3103
|
+
* 3. The defaultValue (if it's not undefined)
|
|
3104
|
+
* 4. The defaultStateValue
|
|
3105
|
+
*
|
|
3106
|
+
* @param value The controlled value of the state variable.
|
|
3107
|
+
* @param initialValue The initial value of the state variable.
|
|
3108
|
+
* @param defaultValue The default value of the state variable.
|
|
3109
|
+
* @param defaultStateValue The default state value to use if all other values are undefined.
|
|
3110
|
+
* @returns The initial value for the state variable.
|
|
3111
|
+
*/
|
|
3112
|
+
function getInitialValue(value, initialValue, defaultValue, defaultStateValue) {
|
|
3179
3113
|
if (value !== undefined) {
|
|
3180
3114
|
return value;
|
|
3181
3115
|
}
|
|
3182
|
-
var initialValue = props["initial" + capitalizeString(propKey)];
|
|
3183
3116
|
if (initialValue !== undefined) {
|
|
3184
3117
|
return initialValue;
|
|
3185
3118
|
}
|
|
3186
|
-
|
|
3119
|
+
if (defaultValue !== undefined) {
|
|
3120
|
+
return defaultValue;
|
|
3121
|
+
}
|
|
3122
|
+
return defaultStateValue;
|
|
3187
3123
|
}
|
|
3188
3124
|
|
|
3189
3125
|
/**
|
|
3190
3126
|
* Debounced call for updating the a11y message.
|
|
3191
3127
|
*/
|
|
3192
|
-
var updateA11yStatus = debounce
|
|
3128
|
+
var updateA11yStatus = debounce(function (status, document) {
|
|
3193
3129
|
setStatus(status, document);
|
|
3194
3130
|
}, 200);
|
|
3195
3131
|
|
|
@@ -3225,7 +3161,7 @@
|
|
|
3225
3161
|
}
|
|
3226
3162
|
|
|
3227
3163
|
// Shared between useSelect, useCombobox, Downshift.
|
|
3228
|
-
var
|
|
3164
|
+
var dropdownPropTypes = _extends({}, propTypes$4, {
|
|
3229
3165
|
getA11yStatusMessage: PropTypes.func,
|
|
3230
3166
|
highlightedIndex: PropTypes.number,
|
|
3231
3167
|
defaultHighlightedIndex: PropTypes.number,
|
|
@@ -3248,62 +3184,145 @@
|
|
|
3248
3184
|
scrollIntoView: PropTypes.func
|
|
3249
3185
|
});
|
|
3250
3186
|
|
|
3251
|
-
var
|
|
3187
|
+
var dropdownDefaultProps = {
|
|
3252
3188
|
itemToString: function itemToString(item) {
|
|
3253
3189
|
return item ? String(item) : '';
|
|
3254
3190
|
},
|
|
3255
3191
|
itemToKey: function itemToKey(item) {
|
|
3256
3192
|
return item;
|
|
3257
3193
|
},
|
|
3258
|
-
|
|
3194
|
+
isItemDisabled: function isItemDisabled(_item) {
|
|
3195
|
+
return false;
|
|
3196
|
+
},
|
|
3197
|
+
stateReducer: function stateReducer(_state, actionAndChanges) {
|
|
3198
|
+
return actionAndChanges.changes;
|
|
3199
|
+
},
|
|
3259
3200
|
scrollIntoView: scrollIntoView,
|
|
3260
3201
|
environment: /* istanbul ignore next (ssr) */
|
|
3261
3202
|
typeof window === 'undefined' || false ? undefined : window
|
|
3262
3203
|
};
|
|
3263
3204
|
|
|
3264
|
-
var
|
|
3205
|
+
var dropdownDefaultStateValues = {
|
|
3265
3206
|
highlightedIndex: -1,
|
|
3266
3207
|
isOpen: false,
|
|
3267
3208
|
selectedItem: null,
|
|
3268
3209
|
inputValue: ''
|
|
3269
3210
|
};
|
|
3270
3211
|
|
|
3271
|
-
//
|
|
3272
|
-
var
|
|
3273
|
-
|
|
3274
|
-
|
|
3212
|
+
// https://github.com/downshift-js/downshift/issues/1674#issuecomment-3924320872
|
|
3213
|
+
var SafeReact$1 = _extends({}, React__namespace);
|
|
3214
|
+
var reactUseId$1 = SafeReact$1.useId;
|
|
3215
|
+
var useElementIds$1 = typeof reactUseId$1 === 'function' ? useElementIdsR18$1 : useElementIdsLegacy$1;
|
|
3216
|
+
function useElementIdsR18$1(_ref) {
|
|
3217
|
+
var id = _ref.id,
|
|
3218
|
+
labelId = _ref.labelId,
|
|
3219
|
+
menuId = _ref.menuId,
|
|
3220
|
+
getItemId = _ref.getItemId,
|
|
3221
|
+
toggleButtonId = _ref.toggleButtonId,
|
|
3222
|
+
inputId = _ref.inputId;
|
|
3223
|
+
var reactId = "downshift-" + reactUseId$1();
|
|
3224
|
+
if (!id) {
|
|
3225
|
+
id = reactId;
|
|
3226
|
+
}
|
|
3227
|
+
var elementIds = React__namespace.useMemo(function () {
|
|
3228
|
+
return {
|
|
3229
|
+
labelId: labelId != null ? labelId : id + "-label",
|
|
3230
|
+
menuId: menuId != null ? menuId : id + "-menu",
|
|
3231
|
+
getItemId: getItemId != null ? getItemId : function (index) {
|
|
3232
|
+
return id + "-item-" + index;
|
|
3233
|
+
},
|
|
3234
|
+
toggleButtonId: toggleButtonId != null ? toggleButtonId : id + "-toggle-button",
|
|
3235
|
+
inputId: inputId != null ? inputId : id + "-input"
|
|
3236
|
+
};
|
|
3237
|
+
}, [getItemId, id, inputId, labelId, menuId, toggleButtonId]);
|
|
3238
|
+
return elementIds;
|
|
3275
3239
|
}
|
|
3276
|
-
function
|
|
3277
|
-
var
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3281
|
-
|
|
3282
|
-
|
|
3283
|
-
|
|
3284
|
-
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3240
|
+
function useElementIdsLegacy$1(_ref2) {
|
|
3241
|
+
var id = _ref2.id,
|
|
3242
|
+
labelId = _ref2.labelId,
|
|
3243
|
+
menuId = _ref2.menuId,
|
|
3244
|
+
getItemId = _ref2.getItemId,
|
|
3245
|
+
toggleButtonId = _ref2.toggleButtonId,
|
|
3246
|
+
inputId = _ref2.inputId;
|
|
3247
|
+
var baseIdRef = React__namespace.useRef(id != null ? id : "downshift-" + generateId());
|
|
3248
|
+
var baseId = baseIdRef.current;
|
|
3249
|
+
var elementIds = React__namespace.useMemo(function () {
|
|
3250
|
+
return {
|
|
3251
|
+
labelId: labelId != null ? labelId : baseId + "-label",
|
|
3252
|
+
menuId: menuId != null ? menuId : baseId + "-menu",
|
|
3253
|
+
getItemId: getItemId != null ? getItemId : function (index) {
|
|
3254
|
+
return baseId + "-item-" + index;
|
|
3255
|
+
},
|
|
3256
|
+
toggleButtonId: toggleButtonId != null ? toggleButtonId : baseId + "-toggle-button",
|
|
3257
|
+
inputId: inputId != null ? inputId : baseId + "-input"
|
|
3258
|
+
};
|
|
3259
|
+
}, [getItemId, inputId, labelId, menuId, toggleButtonId, baseId]);
|
|
3260
|
+
return elementIds;
|
|
3289
3261
|
}
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3262
|
+
|
|
3263
|
+
/**
|
|
3264
|
+
* Returns the new highlightedIndex based on the defaultHighlightedIndex prop, if it's not disabled.
|
|
3265
|
+
*
|
|
3266
|
+
* @param props Props passed to the hook.
|
|
3267
|
+
* @returns The highlighted index.
|
|
3268
|
+
*/
|
|
3269
|
+
function getDefaultHighlightedIndex(items, isItemDisabled, defaultHighlightedIndex) {
|
|
3270
|
+
var highlightedIndex = getDefaultValue(defaultHighlightedIndex, dropdownDefaultStateValues.highlightedIndex);
|
|
3271
|
+
if (items[highlightedIndex] && isItemDisabled(items[highlightedIndex], highlightedIndex)) {
|
|
3272
|
+
return -1;
|
|
3273
|
+
}
|
|
3274
|
+
return highlightedIndex;
|
|
3275
|
+
}
|
|
3276
|
+
|
|
3277
|
+
/**
|
|
3278
|
+
* Handles selection on Enter / Alt + ArrowUp. Closes the menu and resets the highlighted index, unless there is a highlighted.
|
|
3279
|
+
* In that case, selects the item and resets to defaults for open state and highlighted idex.
|
|
3280
|
+
*
|
|
3281
|
+
* @param props The Dropdown props.
|
|
3282
|
+
* @param highlightedIndex The index from the state.
|
|
3283
|
+
* @param inputValue Also return the input value for state.
|
|
3284
|
+
* @returns The changes for the state.
|
|
3285
|
+
*/
|
|
3286
|
+
function getChangesOnSelection(items, itemToString, defaultIsOpen, defaultHighlightedIndex, highlightedIndex, inputValue) {
|
|
3287
|
+
var shouldSelect = items.length && highlightedIndex >= 0;
|
|
3288
|
+
return _extends({
|
|
3289
|
+
isOpen: false,
|
|
3290
|
+
highlightedIndex: -1
|
|
3291
|
+
}, shouldSelect && _extends({
|
|
3292
|
+
selectedItem: items[highlightedIndex],
|
|
3293
|
+
isOpen: getDefaultValue(defaultIsOpen, dropdownDefaultStateValues.isOpen),
|
|
3294
|
+
highlightedIndex: getDefaultValue(defaultHighlightedIndex, dropdownDefaultStateValues.highlightedIndex)
|
|
3295
|
+
}, inputValue && {
|
|
3296
|
+
inputValue: itemToString(items[highlightedIndex])
|
|
3297
|
+
}));
|
|
3298
|
+
}
|
|
3299
|
+
|
|
3300
|
+
/* eslint-disable max-params */
|
|
3301
|
+
/**
|
|
3302
|
+
* Returns the highlighted index when the menu is opened.
|
|
3303
|
+
* Takes into account the initialHighlightedIndex, defaultHighlightedIndex,
|
|
3304
|
+
* selectedItem, and the open direction offset.
|
|
3305
|
+
*
|
|
3306
|
+
* @param items The list of items.
|
|
3307
|
+
* @param initialHighlightedIndex The initial highlighted index prop.
|
|
3308
|
+
* @param defaultHighlightedIndex The default highlighted index prop.
|
|
3309
|
+
* @param isItemDisabled Callback to determine if an item is disabled.
|
|
3310
|
+
* @param itemToKey Callback to get a unique key from an item.
|
|
3311
|
+
* @param selectedItem The currently selected item.
|
|
3312
|
+
* @param highlightedIndex The current highlighted index from state.
|
|
3313
|
+
* @param offset The direction of navigation: positive opens downward, negative opens upward.
|
|
3314
|
+
* @returns The new highlighted index.
|
|
3315
|
+
*/
|
|
3316
|
+
function getHighlightedIndexOnOpen(items, initialHighlightedIndex, defaultHighlightedIndex, isItemDisabled, itemToKey, selectedItem, highlightedIndex, offset) {
|
|
3298
3317
|
if (items.length === 0) {
|
|
3299
3318
|
return -1;
|
|
3300
3319
|
}
|
|
3301
3320
|
|
|
3302
3321
|
// initialHighlightedIndex will give value to highlightedIndex on initial state only.
|
|
3303
|
-
if (initialHighlightedIndex !== undefined && highlightedIndex === initialHighlightedIndex && !isItemDisabled(items[initialHighlightedIndex], initialHighlightedIndex)) {
|
|
3322
|
+
if (initialHighlightedIndex !== undefined && highlightedIndex === initialHighlightedIndex && items[initialHighlightedIndex] && !isItemDisabled(items[initialHighlightedIndex], initialHighlightedIndex)) {
|
|
3304
3323
|
return initialHighlightedIndex;
|
|
3305
3324
|
}
|
|
3306
|
-
if (defaultHighlightedIndex !== undefined && !isItemDisabled(items[defaultHighlightedIndex], defaultHighlightedIndex)) {
|
|
3325
|
+
if (defaultHighlightedIndex !== undefined && items[defaultHighlightedIndex] && !isItemDisabled(items[defaultHighlightedIndex], defaultHighlightedIndex)) {
|
|
3307
3326
|
return defaultHighlightedIndex;
|
|
3308
3327
|
}
|
|
3309
3328
|
if (selectedItem) {
|
|
@@ -3311,21 +3330,71 @@
|
|
|
3311
3330
|
return itemToKey(selectedItem) === itemToKey(item);
|
|
3312
3331
|
});
|
|
3313
3332
|
}
|
|
3314
|
-
if (offset < 0 && !isItemDisabled(items[items.length - 1], items.length - 1)) {
|
|
3333
|
+
if (offset < 0 && items[items.length - 1] && !isItemDisabled(items[items.length - 1], items.length - 1)) {
|
|
3315
3334
|
return items.length - 1;
|
|
3316
3335
|
}
|
|
3317
|
-
if (offset > 0 && !isItemDisabled(items[0], 0)) {
|
|
3336
|
+
if (offset > 0 && items[0] && !isItemDisabled(items[0], 0)) {
|
|
3318
3337
|
return 0;
|
|
3319
3338
|
}
|
|
3320
3339
|
return -1;
|
|
3321
3340
|
}
|
|
3341
|
+
|
|
3342
|
+
function getInitialState$3(props) {
|
|
3343
|
+
var selectedItem = getInitialValue(props.selectedItem, props.initialSelectedItem, props.defaultSelectedItem, dropdownDefaultStateValues.selectedItem);
|
|
3344
|
+
var isOpen = getInitialValue(props.isOpen, props.initialIsOpen, props.defaultIsOpen, dropdownDefaultStateValues.isOpen);
|
|
3345
|
+
var highlightedIndex = getInitialHighlightedIndex(props);
|
|
3346
|
+
var inputValue = getInitialValue(props.inputValue, props.initialInputValue, props.defaultInputValue, dropdownDefaultStateValues.inputValue);
|
|
3347
|
+
return {
|
|
3348
|
+
highlightedIndex: highlightedIndex < 0 && selectedItem && isOpen ? props.items.findIndex(function (item) {
|
|
3349
|
+
return props.itemToKey(item) === props.itemToKey(selectedItem);
|
|
3350
|
+
}) : highlightedIndex,
|
|
3351
|
+
isOpen: isOpen,
|
|
3352
|
+
selectedItem: selectedItem,
|
|
3353
|
+
inputValue: inputValue
|
|
3354
|
+
};
|
|
3355
|
+
}
|
|
3356
|
+
|
|
3357
|
+
/**
|
|
3358
|
+
* Returns the new highlightedIndex based on the initialHighlightedIndex prop, if not disabled.
|
|
3359
|
+
* @param props Props from useCombobox or useSelect.
|
|
3360
|
+
* @returns The highlighted index.
|
|
3361
|
+
*/
|
|
3362
|
+
function getInitialHighlightedIndex(props) {
|
|
3363
|
+
var highlightedIndex = getInitialValue(props.highlightedIndex, props.initialHighlightedIndex, props.defaultHighlightedIndex, dropdownDefaultStateValues.highlightedIndex);
|
|
3364
|
+
if (highlightedIndex > -1 && props.items[highlightedIndex] && props.isItemDisabled(props.items[highlightedIndex], highlightedIndex)) {
|
|
3365
|
+
return -1;
|
|
3366
|
+
}
|
|
3367
|
+
return highlightedIndex;
|
|
3368
|
+
}
|
|
3369
|
+
|
|
3370
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3371
|
+
// eslint-disable-next-line import/no-mutable-exports
|
|
3372
|
+
var useControlPropsValidator = noop;
|
|
3373
|
+
/* istanbul ignore next */
|
|
3374
|
+
{
|
|
3375
|
+
useControlPropsValidator = function useControlPropsValidator(_ref) {
|
|
3376
|
+
var props = _ref.props,
|
|
3377
|
+
state = _ref.state;
|
|
3378
|
+
// used for checking when props are moving from controlled to uncontrolled.
|
|
3379
|
+
var prevPropsRef = React__namespace.useRef(props);
|
|
3380
|
+
var isInitialMount = useIsInitialMount();
|
|
3381
|
+
React__namespace.useEffect(function () {
|
|
3382
|
+
if (isInitialMount) {
|
|
3383
|
+
return;
|
|
3384
|
+
}
|
|
3385
|
+
validateControlledUnchanged(state, prevPropsRef.current, props);
|
|
3386
|
+
prevPropsRef.current = props;
|
|
3387
|
+
}, [state, props, isInitialMount]);
|
|
3388
|
+
};
|
|
3389
|
+
}
|
|
3390
|
+
|
|
3322
3391
|
/**
|
|
3323
3392
|
* Tracks mouse and touch events, such as mouseDown, touchMove and touchEnd.
|
|
3324
3393
|
*
|
|
3325
|
-
* @param
|
|
3326
|
-
* @param
|
|
3327
|
-
* @param
|
|
3328
|
-
* @returns
|
|
3394
|
+
* @param environment The environment to add the event listeners to, for instance window.
|
|
3395
|
+
* @param handleBlur The function that is called if mouseDown or touchEnd occured outside the downshiftElements.
|
|
3396
|
+
* @param downshiftRefs The refs for the elements that should not trigger a blur action from mouseDown or touchEnd.
|
|
3397
|
+
* @returns The mouse and touch events information.
|
|
3329
3398
|
*/
|
|
3330
3399
|
function useMouseAndTouchTracker(environment, handleBlur, downshiftRefs) {
|
|
3331
3400
|
var mouseAndTouchTrackersRef = React__namespace.useRef({
|
|
@@ -3389,8 +3458,8 @@
|
|
|
3389
3458
|
/**
|
|
3390
3459
|
* Custom hook that checks if getter props are called correctly.
|
|
3391
3460
|
*
|
|
3392
|
-
* @param
|
|
3393
|
-
* @returns
|
|
3461
|
+
* @param propKeys Getter prop names to be handled.
|
|
3462
|
+
* @returns Setter function called inside getter props to set call information.
|
|
3394
3463
|
*/
|
|
3395
3464
|
/* istanbul ignore next */
|
|
3396
3465
|
{
|
|
@@ -3429,117 +3498,55 @@
|
|
|
3429
3498
|
elementRef: elementRef
|
|
3430
3499
|
};
|
|
3431
3500
|
}, []);
|
|
3432
|
-
return setGetterPropCallInfo;
|
|
3433
|
-
};
|
|
3434
|
-
}
|
|
3435
|
-
function useScrollIntoView(_ref) {
|
|
3436
|
-
var highlightedIndex = _ref.highlightedIndex,
|
|
3437
|
-
isOpen = _ref.isOpen,
|
|
3438
|
-
itemRefs = _ref.itemRefs,
|
|
3439
|
-
getItemNodeFromIndex = _ref.getItemNodeFromIndex,
|
|
3440
|
-
menuElement = _ref.menuElement,
|
|
3441
|
-
scrollIntoViewProp = _ref.scrollIntoView;
|
|
3442
|
-
// used not to scroll on highlight by mouse.
|
|
3443
|
-
var shouldScrollRef = React__namespace.useRef(true);
|
|
3444
|
-
// Scroll on highlighted item if change comes from keyboard.
|
|
3445
|
-
useIsomorphicLayoutEffect(function () {
|
|
3446
|
-
if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) {
|
|
3447
|
-
return;
|
|
3448
|
-
}
|
|
3449
|
-
if (shouldScrollRef.current === false) {
|
|
3450
|
-
shouldScrollRef.current = true;
|
|
3451
|
-
} else {
|
|
3452
|
-
scrollIntoViewProp(getItemNodeFromIndex(highlightedIndex), menuElement);
|
|
3453
|
-
}
|
|
3454
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
3455
|
-
}, [highlightedIndex]);
|
|
3456
|
-
return shouldScrollRef;
|
|
3457
|
-
}
|
|
3458
|
-
|
|
3459
|
-
// eslint-disable-next-line import/no-mutable-exports
|
|
3460
|
-
var useControlPropsValidator = noop;
|
|
3461
|
-
/* istanbul ignore next */
|
|
3462
|
-
{
|
|
3463
|
-
useControlPropsValidator = function useControlPropsValidator(_ref2) {
|
|
3464
|
-
var props = _ref2.props,
|
|
3465
|
-
state = _ref2.state;
|
|
3466
|
-
// used for checking when props are moving from controlled to uncontrolled.
|
|
3467
|
-
var prevPropsRef = React__namespace.useRef(props);
|
|
3468
|
-
var isInitialMount = useIsInitialMount();
|
|
3469
|
-
React__namespace.useEffect(function () {
|
|
3470
|
-
if (isInitialMount) {
|
|
3471
|
-
return;
|
|
3472
|
-
}
|
|
3473
|
-
validateControlledUnchanged(state, prevPropsRef.current, props);
|
|
3474
|
-
prevPropsRef.current = props;
|
|
3475
|
-
}, [state, props, isInitialMount]);
|
|
3476
|
-
};
|
|
3477
|
-
}
|
|
3478
|
-
|
|
3479
|
-
/**
|
|
3480
|
-
* Handles selection on Enter / Alt + ArrowUp. Closes the menu and resets the highlighted index, unless there is a highlighted.
|
|
3481
|
-
* In that case, selects the item and resets to defaults for open state and highlighted idex.
|
|
3482
|
-
* @param {Object} props The useCombobox props.
|
|
3483
|
-
* @param {number} highlightedIndex The index from the state.
|
|
3484
|
-
* @param {boolean} inputValue Also return the input value for state.
|
|
3485
|
-
* @returns The changes for the state.
|
|
3486
|
-
*/
|
|
3487
|
-
function getChangesOnSelection(props, highlightedIndex, inputValue) {
|
|
3488
|
-
var _props$items;
|
|
3489
|
-
if (inputValue === void 0) {
|
|
3490
|
-
inputValue = true;
|
|
3491
|
-
}
|
|
3492
|
-
var shouldSelect = ((_props$items = props.items) == null ? void 0 : _props$items.length) && highlightedIndex >= 0;
|
|
3493
|
-
return _extends({
|
|
3494
|
-
isOpen: false,
|
|
3495
|
-
highlightedIndex: -1
|
|
3496
|
-
}, shouldSelect && _extends({
|
|
3497
|
-
selectedItem: props.items[highlightedIndex],
|
|
3498
|
-
isOpen: getDefaultValue$1(props, 'isOpen', defaultStateValues$1),
|
|
3499
|
-
highlightedIndex: getDefaultValue$1(props, 'highlightedIndex', defaultStateValues$1)
|
|
3500
|
-
}, inputValue && {
|
|
3501
|
-
inputValue: props.itemToString(props.items[highlightedIndex])
|
|
3502
|
-
}));
|
|
3503
|
-
}
|
|
3504
|
-
|
|
3505
|
-
/**
|
|
3506
|
-
* Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item.
|
|
3507
|
-
* Used by useSelect and useCombobox.
|
|
3508
|
-
*
|
|
3509
|
-
* @param {Object} prevState
|
|
3510
|
-
* @param {Object} newState
|
|
3511
|
-
* @returns {boolean} Wheather the states are deeply equal.
|
|
3512
|
-
*/
|
|
3513
|
-
function isDropdownsStateEqual(prevState, newState) {
|
|
3514
|
-
return prevState.isOpen === newState.isOpen && prevState.inputValue === newState.inputValue && prevState.highlightedIndex === newState.highlightedIndex && prevState.selectedItem === newState.selectedItem;
|
|
3501
|
+
return setGetterPropCallInfo;
|
|
3502
|
+
};
|
|
3515
3503
|
}
|
|
3516
3504
|
|
|
3505
|
+
// istanbul ignore next
|
|
3506
|
+
var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? React__namespace.useLayoutEffect : React__namespace.useEffect;
|
|
3507
|
+
|
|
3517
3508
|
/**
|
|
3518
|
-
*
|
|
3519
|
-
*
|
|
3520
|
-
* @param
|
|
3521
|
-
* @
|
|
3509
|
+
* Utility hook that scrolls an item from a menu into view.
|
|
3510
|
+
* @param scrollIntoView The function that does the scroll.
|
|
3511
|
+
* @param highlightedIndex The index of the item that should be scrolled.
|
|
3512
|
+
* @param isOpen If the menu is open or not.
|
|
3513
|
+
* @param menuElement The menu element.
|
|
3514
|
+
* @param itemElements The object containing item elements.
|
|
3515
|
+
* @param getItemId The function to get the item id from index.
|
|
3516
|
+
* @returns Function that when called prevents the scroll.
|
|
3522
3517
|
*/
|
|
3523
|
-
function
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3518
|
+
function useScrollIntoView(scrollIntoView, highlightedIndex, isOpen, menuElement, itemElements, getItemId) {
|
|
3519
|
+
// used not to scroll on highlight by mouse.
|
|
3520
|
+
var shouldScrollRef = React__namespace.useRef(true);
|
|
3521
|
+
// Scroll on highlighted item if change comes from keyboard.
|
|
3522
|
+
useIsomorphicLayoutEffect(function () {
|
|
3523
|
+
if (highlightedIndex < 0 || !isOpen || !Object.keys(itemElements).length) {
|
|
3524
|
+
return;
|
|
3525
|
+
}
|
|
3526
|
+
if (shouldScrollRef.current) {
|
|
3527
|
+
var itemElement = itemElements[getItemId(highlightedIndex)];
|
|
3528
|
+
if (itemElement && menuElement) {
|
|
3529
|
+
scrollIntoView(itemElement, menuElement);
|
|
3530
|
+
}
|
|
3531
|
+
} else {
|
|
3532
|
+
shouldScrollRef.current = true;
|
|
3533
|
+
}
|
|
3534
|
+
}, [highlightedIndex]);
|
|
3535
|
+
return React__namespace.useCallback(function preventScroll() {
|
|
3536
|
+
shouldScrollRef.current = false;
|
|
3537
|
+
}, []);
|
|
3529
3538
|
}
|
|
3530
3539
|
|
|
3531
3540
|
/**
|
|
3532
|
-
*
|
|
3541
|
+
* Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item.
|
|
3542
|
+
* Used by useSelect and useCombobox.
|
|
3533
3543
|
*
|
|
3534
|
-
* @param
|
|
3535
|
-
* @
|
|
3544
|
+
* @param prevState The previous dropdown state.
|
|
3545
|
+
* @param newState The new dropdown state.
|
|
3546
|
+
* @returns Wheather the states are deeply equal.
|
|
3536
3547
|
*/
|
|
3537
|
-
function
|
|
3538
|
-
|
|
3539
|
-
if (highlightedIndex > -1 && props.isItemDisabled(props.items[highlightedIndex], highlightedIndex)) {
|
|
3540
|
-
return -1;
|
|
3541
|
-
}
|
|
3542
|
-
return highlightedIndex;
|
|
3548
|
+
function isDropdownStateEqual(prevState, newState) {
|
|
3549
|
+
return prevState.isOpen === newState.isOpen && prevState.inputValue === newState.inputValue && prevState.highlightedIndex === newState.highlightedIndex && prevState.selectedItem === newState.selectedItem;
|
|
3543
3550
|
}
|
|
3544
3551
|
|
|
3545
3552
|
function downshiftCommonReducer(state, props, action, stateChangeTypes) {
|
|
@@ -3560,13 +3567,13 @@
|
|
|
3560
3567
|
case stateChangeTypes.FunctionToggleMenu:
|
|
3561
3568
|
changes = {
|
|
3562
3569
|
isOpen: !state.isOpen,
|
|
3563
|
-
highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0)
|
|
3570
|
+
highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props.items, props.initialHighlightedIndex, props.defaultHighlightedIndex, props.isItemDisabled, props.itemToKey, state.selectedItem, state.highlightedIndex, 0)
|
|
3564
3571
|
};
|
|
3565
3572
|
break;
|
|
3566
3573
|
case stateChangeTypes.FunctionOpenMenu:
|
|
3567
3574
|
changes = {
|
|
3568
3575
|
isOpen: true,
|
|
3569
|
-
highlightedIndex: getHighlightedIndexOnOpen(props, state, 0)
|
|
3576
|
+
highlightedIndex: getHighlightedIndexOnOpen(props.items, props.initialHighlightedIndex, props.defaultHighlightedIndex, props.isItemDisabled, props.itemToKey, state.selectedItem, state.highlightedIndex, 0)
|
|
3570
3577
|
};
|
|
3571
3578
|
break;
|
|
3572
3579
|
case stateChangeTypes.FunctionCloseMenu:
|
|
@@ -3575,9 +3582,12 @@
|
|
|
3575
3582
|
};
|
|
3576
3583
|
break;
|
|
3577
3584
|
case stateChangeTypes.FunctionSetHighlightedIndex:
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
3585
|
+
{
|
|
3586
|
+
var highlightedIndex = action.highlightedIndex;
|
|
3587
|
+
changes = {
|
|
3588
|
+
highlightedIndex: props.isItemDisabled(props.items[highlightedIndex], highlightedIndex) ? -1 : highlightedIndex
|
|
3589
|
+
};
|
|
3590
|
+
}
|
|
3581
3591
|
break;
|
|
3582
3592
|
case stateChangeTypes.FunctionSetInputValue:
|
|
3583
3593
|
changes = {
|
|
@@ -3586,10 +3596,10 @@
|
|
|
3586
3596
|
break;
|
|
3587
3597
|
case stateChangeTypes.FunctionReset:
|
|
3588
3598
|
changes = {
|
|
3589
|
-
highlightedIndex: getDefaultHighlightedIndex(props),
|
|
3590
|
-
isOpen: getDefaultValue
|
|
3591
|
-
selectedItem: getDefaultValue
|
|
3592
|
-
inputValue: getDefaultValue
|
|
3599
|
+
highlightedIndex: getDefaultHighlightedIndex(props.items, props.isItemDisabled, props.defaultHighlightedIndex),
|
|
3600
|
+
isOpen: getDefaultValue(props.defaultIsOpen, dropdownDefaultStateValues.isOpen),
|
|
3601
|
+
selectedItem: getDefaultValue(props.defaultSelectedItem, dropdownDefaultStateValues.selectedItem),
|
|
3602
|
+
inputValue: getDefaultValue(props.defaultInputValue, dropdownDefaultStateValues.inputValue)
|
|
3593
3603
|
};
|
|
3594
3604
|
break;
|
|
3595
3605
|
default:
|
|
@@ -3599,17 +3609,11 @@
|
|
|
3599
3609
|
}
|
|
3600
3610
|
/* eslint-enable complexity */
|
|
3601
3611
|
|
|
3602
|
-
var propTypes$3 = _extends({},
|
|
3612
|
+
var propTypes$3 = _extends({}, dropdownPropTypes, {
|
|
3603
3613
|
items: PropTypes.array.isRequired,
|
|
3604
3614
|
isItemDisabled: PropTypes.func
|
|
3605
3615
|
});
|
|
3606
3616
|
|
|
3607
|
-
var defaultProps$2 = _extends({}, defaultProps$3, {
|
|
3608
|
-
isItemDisabled: function isItemDisabled() {
|
|
3609
|
-
return false;
|
|
3610
|
-
}
|
|
3611
|
-
});
|
|
3612
|
-
|
|
3613
3617
|
function getItemIndexByCharacterKey(_ref) {
|
|
3614
3618
|
var keysSoFar = _ref.keysSoFar,
|
|
3615
3619
|
highlightedIndex = _ref.highlightedIndex,
|
|
@@ -3678,16 +3682,15 @@
|
|
|
3678
3682
|
});
|
|
3679
3683
|
|
|
3680
3684
|
/* eslint-disable complexity */
|
|
3681
|
-
function downshiftSelectReducer(state,
|
|
3682
|
-
var _props$items;
|
|
3685
|
+
function downshiftSelectReducer(state, action) {
|
|
3683
3686
|
var type = action.type,
|
|
3684
|
-
|
|
3687
|
+
props = action.props;
|
|
3685
3688
|
var changes;
|
|
3686
3689
|
switch (type) {
|
|
3687
3690
|
case ItemClick$1:
|
|
3688
3691
|
changes = {
|
|
3689
|
-
isOpen: getDefaultValue
|
|
3690
|
-
highlightedIndex: getDefaultHighlightedIndex(props),
|
|
3692
|
+
isOpen: getDefaultValue(props.defaultIsOpen, dropdownDefaultStateValues.isOpen),
|
|
3693
|
+
highlightedIndex: getDefaultHighlightedIndex(props.items, props.isItemDisabled, props.defaultHighlightedIndex),
|
|
3691
3694
|
selectedItem: props.items[action.index]
|
|
3692
3695
|
};
|
|
3693
3696
|
break;
|
|
@@ -3714,7 +3717,8 @@
|
|
|
3714
3717
|
break;
|
|
3715
3718
|
case ToggleButtonKeyDownArrowDown:
|
|
3716
3719
|
{
|
|
3717
|
-
var
|
|
3720
|
+
var altKey = action.altKey;
|
|
3721
|
+
var _highlightedIndex = state.isOpen ? getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props.items, props.initialHighlightedIndex, props.defaultHighlightedIndex, props.isItemDisabled, props.itemToKey, state.selectedItem, state.highlightedIndex, 1);
|
|
3718
3722
|
changes = {
|
|
3719
3723
|
highlightedIndex: _highlightedIndex,
|
|
3720
3724
|
isOpen: true
|
|
@@ -3722,20 +3726,23 @@
|
|
|
3722
3726
|
}
|
|
3723
3727
|
break;
|
|
3724
3728
|
case ToggleButtonKeyDownArrowUp:
|
|
3725
|
-
|
|
3726
|
-
|
|
3727
|
-
|
|
3728
|
-
|
|
3729
|
-
|
|
3730
|
-
highlightedIndex:
|
|
3731
|
-
|
|
3732
|
-
|
|
3729
|
+
{
|
|
3730
|
+
var _altKey = action.altKey;
|
|
3731
|
+
if (state.isOpen && _altKey) {
|
|
3732
|
+
changes = getChangesOnSelection(props.items, props.itemToString, props.defaultIsOpen, props.defaultHighlightedIndex, state.highlightedIndex, false);
|
|
3733
|
+
} else {
|
|
3734
|
+
var _highlightedIndex2 = state.isOpen ? getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled) : getHighlightedIndexOnOpen(props.items, props.initialHighlightedIndex, props.defaultHighlightedIndex, props.isItemDisabled, props.itemToKey, state.selectedItem, state.highlightedIndex, -1);
|
|
3735
|
+
changes = {
|
|
3736
|
+
highlightedIndex: _highlightedIndex2,
|
|
3737
|
+
isOpen: true
|
|
3738
|
+
};
|
|
3739
|
+
}
|
|
3733
3740
|
}
|
|
3734
3741
|
break;
|
|
3735
3742
|
// only triggered when menu is open.
|
|
3736
3743
|
case ToggleButtonKeyDownEnter:
|
|
3737
3744
|
case ToggleButtonKeyDownSpaceButton:
|
|
3738
|
-
changes = getChangesOnSelection(props, state.highlightedIndex, false);
|
|
3745
|
+
changes = getChangesOnSelection(props.items, props.itemToString, props.defaultIsOpen, props.defaultHighlightedIndex, state.highlightedIndex, false);
|
|
3739
3746
|
break;
|
|
3740
3747
|
case ToggleButtonKeyDownHome:
|
|
3741
3748
|
changes = {
|
|
@@ -3769,7 +3776,7 @@
|
|
|
3769
3776
|
changes = _extends({
|
|
3770
3777
|
isOpen: false,
|
|
3771
3778
|
highlightedIndex: -1
|
|
3772
|
-
}, state.highlightedIndex >= 0 &&
|
|
3779
|
+
}, state.highlightedIndex >= 0 && props.items.length && {
|
|
3773
3780
|
selectedItem: props.items[state.highlightedIndex]
|
|
3774
3781
|
});
|
|
3775
3782
|
break;
|
|
@@ -3785,60 +3792,9 @@
|
|
|
3785
3792
|
}
|
|
3786
3793
|
/* eslint-enable complexity */
|
|
3787
3794
|
|
|
3788
|
-
// https://github.com/downshift-js/downshift/issues/1674#issuecomment-3924320872
|
|
3789
|
-
var SafeReact$1 = _extends({}, React__namespace);
|
|
3790
|
-
var reactUseId$1 = SafeReact$1.useId;
|
|
3791
|
-
var useElementIds$1 = typeof reactUseId$1 === 'function' ? useElementIdsR18$1 : useElementIdsLegacy$1;
|
|
3792
|
-
function useElementIdsR18$1(_ref) {
|
|
3793
|
-
var id = _ref.id,
|
|
3794
|
-
labelId = _ref.labelId,
|
|
3795
|
-
menuId = _ref.menuId,
|
|
3796
|
-
getItemId = _ref.getItemId,
|
|
3797
|
-
toggleButtonId = _ref.toggleButtonId,
|
|
3798
|
-
inputId = _ref.inputId;
|
|
3799
|
-
var reactId = "downshift-" + reactUseId$1();
|
|
3800
|
-
if (!id) {
|
|
3801
|
-
id = reactId;
|
|
3802
|
-
}
|
|
3803
|
-
var elementIds = React__namespace.useMemo(function () {
|
|
3804
|
-
return {
|
|
3805
|
-
labelId: labelId != null ? labelId : id + "-label",
|
|
3806
|
-
menuId: menuId != null ? menuId : id + "-menu",
|
|
3807
|
-
getItemId: getItemId != null ? getItemId : function (index) {
|
|
3808
|
-
return id + "-item-" + index;
|
|
3809
|
-
},
|
|
3810
|
-
toggleButtonId: toggleButtonId != null ? toggleButtonId : id + "-toggle-button",
|
|
3811
|
-
inputId: inputId != null ? inputId : id + "-input"
|
|
3812
|
-
};
|
|
3813
|
-
}, [getItemId, id, inputId, labelId, menuId, toggleButtonId]);
|
|
3814
|
-
return elementIds;
|
|
3815
|
-
}
|
|
3816
|
-
function useElementIdsLegacy$1(_ref2) {
|
|
3817
|
-
var id = _ref2.id,
|
|
3818
|
-
labelId = _ref2.labelId,
|
|
3819
|
-
menuId = _ref2.menuId,
|
|
3820
|
-
getItemId = _ref2.getItemId,
|
|
3821
|
-
toggleButtonId = _ref2.toggleButtonId,
|
|
3822
|
-
inputId = _ref2.inputId;
|
|
3823
|
-
var baseIdRef = React__namespace.useRef(id != null ? id : "downshift-" + generateId());
|
|
3824
|
-
var baseId = baseIdRef.current;
|
|
3825
|
-
var elementIds = React__namespace.useMemo(function () {
|
|
3826
|
-
return {
|
|
3827
|
-
labelId: labelId != null ? labelId : baseId + "-label",
|
|
3828
|
-
menuId: menuId != null ? menuId : baseId + "-menu",
|
|
3829
|
-
getItemId: getItemId != null ? getItemId : function (index) {
|
|
3830
|
-
return baseId + "-item-" + index;
|
|
3831
|
-
},
|
|
3832
|
-
toggleButtonId: toggleButtonId != null ? toggleButtonId : baseId + "-toggle-button",
|
|
3833
|
-
inputId: inputId != null ? inputId : baseId + "-input"
|
|
3834
|
-
};
|
|
3835
|
-
}, [getItemId, inputId, labelId, menuId, toggleButtonId, baseId]);
|
|
3836
|
-
return elementIds;
|
|
3837
|
-
}
|
|
3838
|
-
|
|
3839
3795
|
var _excluded$3 = ["onClick"],
|
|
3840
|
-
_excluded2$3 = ["onMouseLeave", "refKey", "ref"],
|
|
3841
|
-
_excluded3$2 = ["onBlur", "onClick", "onPress", "onKeyDown", "refKey", "ref"],
|
|
3796
|
+
_excluded2$3 = ["onMouseLeave", "refKey", "ref", "aria-label"],
|
|
3797
|
+
_excluded3$2 = ["onBlur", "onClick", "onPress", "onKeyDown", "refKey", "ref", "disabled"],
|
|
3842
3798
|
_excluded4$1 = ["item", "index", "onMouseMove", "onClick", "onMouseDown", "onPress", "refKey", "disabled", "ref"];
|
|
3843
3799
|
useSelect.stateChangeTypes = stateChangeTypes$3;
|
|
3844
3800
|
function useSelect(userProps) {
|
|
@@ -3847,22 +3803,23 @@
|
|
|
3847
3803
|
}
|
|
3848
3804
|
validatePropTypes$1(userProps, useSelect, propTypes$3);
|
|
3849
3805
|
// Props defaults and destructuring.
|
|
3850
|
-
var props = _extends({},
|
|
3806
|
+
var props = _extends({}, dropdownDefaultProps, userProps);
|
|
3851
3807
|
var scrollIntoView = props.scrollIntoView,
|
|
3852
3808
|
environment = props.environment,
|
|
3853
3809
|
getA11yStatusMessage = props.getA11yStatusMessage;
|
|
3854
3810
|
// Initial state depending on controlled props.
|
|
3855
|
-
var _useControlledReducer = useControlledReducer$1(downshiftSelectReducer, props, getInitialState$3,
|
|
3811
|
+
var _useControlledReducer = useControlledReducer$1(downshiftSelectReducer, props, getInitialState$3, isDropdownStateEqual),
|
|
3856
3812
|
state = _useControlledReducer[0],
|
|
3857
3813
|
dispatch = _useControlledReducer[1];
|
|
3858
3814
|
var isOpen = state.isOpen,
|
|
3859
3815
|
highlightedIndex = state.highlightedIndex,
|
|
3860
3816
|
selectedItem = state.selectedItem,
|
|
3861
3817
|
inputValue = state.inputValue;
|
|
3862
|
-
|
|
3818
|
+
|
|
3819
|
+
// Element refs.
|
|
3863
3820
|
var toggleButtonRef = React.useRef(null);
|
|
3864
3821
|
var menuRef = React.useRef(null);
|
|
3865
|
-
var
|
|
3822
|
+
var itemsRef = React.useRef({});
|
|
3866
3823
|
|
|
3867
3824
|
// used to keep the inputValue clearTimeout object between renders.
|
|
3868
3825
|
var clearTimeoutRef = React.useRef(null);
|
|
@@ -3874,24 +3831,12 @@
|
|
|
3874
3831
|
props: props
|
|
3875
3832
|
});
|
|
3876
3833
|
|
|
3877
|
-
// Some utils.
|
|
3878
|
-
var getItemNodeFromIndex = React.useCallback(function (index) {
|
|
3879
|
-
return itemRefs.current[elementIds.getItemId(index)];
|
|
3880
|
-
}, [elementIds]);
|
|
3881
|
-
|
|
3882
3834
|
// Effects.
|
|
3883
3835
|
// Adds an a11y aria live status message if getA11yStatusMessage is passed.
|
|
3884
3836
|
useA11yMessageStatus(getA11yStatusMessage, state, [isOpen, highlightedIndex, selectedItem, inputValue], environment);
|
|
3885
3837
|
// Scroll on highlighted item if change comes from keyboard.
|
|
3886
|
-
var
|
|
3887
|
-
|
|
3888
|
-
highlightedIndex: highlightedIndex,
|
|
3889
|
-
isOpen: isOpen,
|
|
3890
|
-
itemRefs: itemRefs,
|
|
3891
|
-
scrollIntoView: scrollIntoView,
|
|
3892
|
-
getItemNodeFromIndex: getItemNodeFromIndex
|
|
3893
|
-
});
|
|
3894
|
-
// Sets cleanup for the keysSoFar callback, debounded after 500ms.
|
|
3838
|
+
var preventScroll = useScrollIntoView(scrollIntoView, highlightedIndex, isOpen, menuRef.current, itemsRef.current, elementIds.getItemId);
|
|
3839
|
+
// Sets cleanup for the keysSoFar callback, debounced after 500ms.
|
|
3895
3840
|
React.useEffect(function () {
|
|
3896
3841
|
// init the clean function here as we need access to dispatch.
|
|
3897
3842
|
clearTimeoutRef.current = debounce(function (outerDispatch) {
|
|
@@ -3903,7 +3848,8 @@
|
|
|
3903
3848
|
|
|
3904
3849
|
// Cancel any pending debounced calls on mount
|
|
3905
3850
|
return function () {
|
|
3906
|
-
|
|
3851
|
+
var _clearTimeoutRef$curr;
|
|
3852
|
+
(_clearTimeoutRef$curr = clearTimeoutRef.current) == null || _clearTimeoutRef$curr.cancel();
|
|
3907
3853
|
};
|
|
3908
3854
|
}, []);
|
|
3909
3855
|
// Invokes the keysSoFar callback set up above.
|
|
@@ -3911,7 +3857,7 @@
|
|
|
3911
3857
|
if (!inputValue) {
|
|
3912
3858
|
return;
|
|
3913
3859
|
}
|
|
3914
|
-
clearTimeoutRef.current(dispatch);
|
|
3860
|
+
clearTimeoutRef.current == null || clearTimeoutRef.current(dispatch);
|
|
3915
3861
|
}, [dispatch, inputValue]);
|
|
3916
3862
|
useControlPropsValidator({
|
|
3917
3863
|
props: props,
|
|
@@ -3919,7 +3865,7 @@
|
|
|
3919
3865
|
});
|
|
3920
3866
|
// Focus the toggle button on first render if required.
|
|
3921
3867
|
React.useEffect(function () {
|
|
3922
|
-
var focusOnOpen = getInitialValue
|
|
3868
|
+
var focusOnOpen = getInitialValue(props.isOpen, props.initialIsOpen, props.defaultIsOpen, dropdownDefaultStateValues.isOpen);
|
|
3923
3869
|
if (focusOnOpen && toggleButtonRef.current) {
|
|
3924
3870
|
toggleButtonRef.current.focus();
|
|
3925
3871
|
}
|
|
@@ -3940,7 +3886,7 @@
|
|
|
3940
3886
|
// Reset itemRefs on close.
|
|
3941
3887
|
React.useEffect(function () {
|
|
3942
3888
|
if (!isOpen) {
|
|
3943
|
-
|
|
3889
|
+
itemsRef.current = {};
|
|
3944
3890
|
}
|
|
3945
3891
|
}, [isOpen]);
|
|
3946
3892
|
|
|
@@ -4025,50 +3971,11 @@
|
|
|
4025
3971
|
};
|
|
4026
3972
|
}, [dispatch, latest]);
|
|
4027
3973
|
|
|
4028
|
-
// Action functions.
|
|
4029
|
-
var toggleMenu = React.useCallback(function () {
|
|
4030
|
-
dispatch({
|
|
4031
|
-
type: FunctionToggleMenu$1
|
|
4032
|
-
});
|
|
4033
|
-
}, [dispatch]);
|
|
4034
|
-
var closeMenu = React.useCallback(function () {
|
|
4035
|
-
dispatch({
|
|
4036
|
-
type: FunctionCloseMenu$1
|
|
4037
|
-
});
|
|
4038
|
-
}, [dispatch]);
|
|
4039
|
-
var openMenu = React.useCallback(function () {
|
|
4040
|
-
dispatch({
|
|
4041
|
-
type: FunctionOpenMenu$1
|
|
4042
|
-
});
|
|
4043
|
-
}, [dispatch]);
|
|
4044
|
-
var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
|
|
4045
|
-
dispatch({
|
|
4046
|
-
type: FunctionSetHighlightedIndex$1,
|
|
4047
|
-
highlightedIndex: newHighlightedIndex
|
|
4048
|
-
});
|
|
4049
|
-
}, [dispatch]);
|
|
4050
|
-
var selectItem = React.useCallback(function (newSelectedItem) {
|
|
4051
|
-
dispatch({
|
|
4052
|
-
type: FunctionSelectItem$1,
|
|
4053
|
-
selectedItem: newSelectedItem
|
|
4054
|
-
});
|
|
4055
|
-
}, [dispatch]);
|
|
4056
|
-
var reset = React.useCallback(function () {
|
|
4057
|
-
dispatch({
|
|
4058
|
-
type: FunctionReset$2
|
|
4059
|
-
});
|
|
4060
|
-
}, [dispatch]);
|
|
4061
|
-
var setInputValue = React.useCallback(function (newInputValue) {
|
|
4062
|
-
dispatch({
|
|
4063
|
-
type: FunctionSetInputValue$1,
|
|
4064
|
-
inputValue: newInputValue
|
|
4065
|
-
});
|
|
4066
|
-
}, [dispatch]);
|
|
4067
3974
|
// Getter functions.
|
|
4068
|
-
var getLabelProps = React.useCallback(function (
|
|
4069
|
-
var _ref =
|
|
3975
|
+
var getLabelProps = React.useCallback(function (labelProps) {
|
|
3976
|
+
var _ref = labelProps != null ? labelProps : {},
|
|
4070
3977
|
onClick = _ref.onClick,
|
|
4071
|
-
|
|
3978
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
|
|
4072
3979
|
var labelHandleClick = function labelHandleClick() {
|
|
4073
3980
|
var _toggleButtonRef$curr;
|
|
4074
3981
|
(_toggleButtonRef$curr = toggleButtonRef.current) == null || _toggleButtonRef$curr.focus();
|
|
@@ -4077,17 +3984,18 @@
|
|
|
4077
3984
|
id: elementIds.labelId,
|
|
4078
3985
|
htmlFor: elementIds.toggleButtonId,
|
|
4079
3986
|
onClick: callAllEventHandlers(onClick, labelHandleClick)
|
|
4080
|
-
},
|
|
3987
|
+
}, rest);
|
|
4081
3988
|
}, [elementIds]);
|
|
4082
|
-
var getMenuProps = React.useCallback(function (
|
|
3989
|
+
var getMenuProps = React.useCallback(function (menuProps, otherProps) {
|
|
4083
3990
|
var _extends2;
|
|
4084
|
-
var _ref2 =
|
|
3991
|
+
var _ref2 = menuProps != null ? menuProps : {},
|
|
4085
3992
|
onMouseLeave = _ref2.onMouseLeave,
|
|
4086
3993
|
_ref2$refKey = _ref2.refKey,
|
|
4087
3994
|
refKey = _ref2$refKey === void 0 ? 'ref' : _ref2$refKey,
|
|
4088
3995
|
ref = _ref2.ref,
|
|
3996
|
+
ariaLabel = _ref2['aria-label'],
|
|
4089
3997
|
rest = _objectWithoutPropertiesLoose(_ref2, _excluded2$3);
|
|
4090
|
-
var _ref3 =
|
|
3998
|
+
var _ref3 = otherProps != null ? otherProps : {},
|
|
4091
3999
|
_ref3$suppressRefErro = _ref3.suppressRefError,
|
|
4092
4000
|
suppressRefError = _ref3$suppressRefErro === void 0 ? false : _ref3$suppressRefErro;
|
|
4093
4001
|
var menuHandleMouseLeave = function menuHandleMouseLeave() {
|
|
@@ -4098,11 +4006,11 @@
|
|
|
4098
4006
|
setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef);
|
|
4099
4007
|
return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) {
|
|
4100
4008
|
menuRef.current = menuNode;
|
|
4101
|
-
}), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-
|
|
4009
|
+
}), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-label'] = ariaLabel, _extends2['aria-labelledby'] = ariaLabel ? undefined : "" + elementIds.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, menuHandleMouseLeave), _extends2), rest);
|
|
4102
4010
|
}, [dispatch, setGetterPropCallInfo, elementIds]);
|
|
4103
|
-
var getToggleButtonProps = React.useCallback(function (
|
|
4011
|
+
var getToggleButtonProps = React.useCallback(function (toggleButtonProps, otherProps) {
|
|
4104
4012
|
var _extends3;
|
|
4105
|
-
var _ref4 =
|
|
4013
|
+
var _ref4 = toggleButtonProps != null ? toggleButtonProps : {},
|
|
4106
4014
|
onBlur = _ref4.onBlur,
|
|
4107
4015
|
onClick = _ref4.onClick;
|
|
4108
4016
|
_ref4.onPress;
|
|
@@ -4110,8 +4018,9 @@
|
|
|
4110
4018
|
_ref4$refKey = _ref4.refKey,
|
|
4111
4019
|
refKey = _ref4$refKey === void 0 ? 'ref' : _ref4$refKey,
|
|
4112
4020
|
ref = _ref4.ref,
|
|
4021
|
+
disabled = _ref4.disabled,
|
|
4113
4022
|
rest = _objectWithoutPropertiesLoose(_ref4, _excluded3$2);
|
|
4114
|
-
var _ref5 =
|
|
4023
|
+
var _ref5 = otherProps != null ? otherProps : {},
|
|
4115
4024
|
_ref5$suppressRefErro = _ref5.suppressRefError,
|
|
4116
4025
|
suppressRefError = _ref5$suppressRefErro === void 0 ? false : _ref5$suppressRefErro;
|
|
4117
4026
|
var latestState = latest.current.state;
|
|
@@ -4129,9 +4038,9 @@
|
|
|
4129
4038
|
};
|
|
4130
4039
|
var toggleButtonHandleKeyDown = function toggleButtonHandleKeyDown(event) {
|
|
4131
4040
|
var key = normalizeArrowKey(event);
|
|
4132
|
-
if (key && toggleButtonKeyDownHandlers
|
|
4041
|
+
if (key && key in toggleButtonKeyDownHandlers) {
|
|
4133
4042
|
toggleButtonKeyDownHandlers[key](event);
|
|
4134
|
-
} else if (
|
|
4043
|
+
} else if (/^\S{1}$/.test(key)) {
|
|
4135
4044
|
dispatch({
|
|
4136
4045
|
type: ToggleButtonKeyDownCharacter,
|
|
4137
4046
|
key: key
|
|
@@ -4140,20 +4049,22 @@
|
|
|
4140
4049
|
};
|
|
4141
4050
|
var toggleProps = _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (toggleButtonNode) {
|
|
4142
4051
|
toggleButtonRef.current = toggleButtonNode;
|
|
4143
|
-
}), _extends3['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends3['aria-controls'] = elementIds.menuId, _extends3['aria-expanded'] = latest.current.state.isOpen, _extends3['aria-haspopup'] = 'listbox', _extends3['aria-labelledby'] = rest
|
|
4144
|
-
if (!
|
|
4052
|
+
}), _extends3['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends3['aria-controls'] = elementIds.menuId, _extends3['aria-expanded'] = latest.current.state.isOpen, _extends3['aria-haspopup'] = 'listbox', _extends3['aria-labelledby'] = rest['aria-label'] ? undefined : "" + elementIds.labelId, _extends3.id = elementIds.toggleButtonId, _extends3.role = 'combobox', _extends3.tabIndex = 0, _extends3.onBlur = callAllEventHandlers(onBlur, toggleButtonHandleBlur), _extends3.disabled = disabled, _extends3), rest);
|
|
4053
|
+
if (!disabled) {
|
|
4145
4054
|
/* istanbul ignore if (react-native) */
|
|
4146
4055
|
{
|
|
4147
|
-
|
|
4148
|
-
|
|
4056
|
+
Object.assign(toggleProps, {
|
|
4057
|
+
onClick: callAllEventHandlers(onClick, toggleButtonHandleClick),
|
|
4058
|
+
onKeyDown: callAllEventHandlers(onKeyDown, toggleButtonHandleKeyDown)
|
|
4059
|
+
});
|
|
4149
4060
|
}
|
|
4150
4061
|
}
|
|
4151
4062
|
setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef);
|
|
4152
4063
|
return toggleProps;
|
|
4153
4064
|
}, [dispatch, elementIds, latest, mouseAndTouchTrackers, setGetterPropCallInfo, toggleButtonKeyDownHandlers]);
|
|
4154
|
-
var getItemProps = React.useCallback(function (
|
|
4065
|
+
var getItemProps = React.useCallback(function (itemProps) {
|
|
4155
4066
|
var _extends4;
|
|
4156
|
-
var _ref6 =
|
|
4067
|
+
var _ref6 = itemProps != null ? itemProps : {},
|
|
4157
4068
|
itemProp = _ref6.item,
|
|
4158
4069
|
indexProp = _ref6.index,
|
|
4159
4070
|
onMouseMove = _ref6.onMouseMove,
|
|
@@ -4179,7 +4090,7 @@
|
|
|
4179
4090
|
if (mouseAndTouchTrackers.isTouchEnd || index === latestState.highlightedIndex) {
|
|
4180
4091
|
return;
|
|
4181
4092
|
}
|
|
4182
|
-
|
|
4093
|
+
preventScroll();
|
|
4183
4094
|
dispatch({
|
|
4184
4095
|
type: ItemMouseMove$1,
|
|
4185
4096
|
index: index,
|
|
@@ -4196,21 +4107,61 @@
|
|
|
4196
4107
|
return e.preventDefault();
|
|
4197
4108
|
}; // keep focus on the toggle after item click select.
|
|
4198
4109
|
|
|
4199
|
-
var
|
|
4110
|
+
var resultItemProps = _extends((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (itemNode) {
|
|
4200
4111
|
if (itemNode) {
|
|
4201
|
-
|
|
4112
|
+
itemsRef.current[elementIds.getItemId(index)] = itemNode;
|
|
4202
4113
|
}
|
|
4203
|
-
}), _extends4['aria-disabled'] = disabled, _extends4['aria-selected'] = item === latestState.selectedItem, _extends4.id = elementIds.getItemId(index), _extends4.role = 'option', _extends4), rest);
|
|
4114
|
+
}), _extends4['aria-disabled'] = disabled, _extends4['aria-selected'] = item === latestState.selectedItem, _extends4.id = elementIds.getItemId(index), _extends4.role = 'option', _extends4.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove), _extends4.onMouseDown = callAllEventHandlers(onMouseDown, itemHandleMouseDown), _extends4), rest);
|
|
4204
4115
|
if (!disabled) {
|
|
4205
4116
|
/* istanbul ignore next (react-native) */
|
|
4206
4117
|
{
|
|
4207
|
-
|
|
4118
|
+
Object.assign(resultItemProps, {
|
|
4119
|
+
onClick: callAllEventHandlers(onClick, itemHandleClick)
|
|
4120
|
+
});
|
|
4208
4121
|
}
|
|
4209
4122
|
}
|
|
4210
|
-
|
|
4211
|
-
|
|
4212
|
-
|
|
4213
|
-
|
|
4123
|
+
return resultItemProps;
|
|
4124
|
+
}, [latest, elementIds, mouseAndTouchTrackers, preventScroll, dispatch]);
|
|
4125
|
+
|
|
4126
|
+
// Action functions.
|
|
4127
|
+
var toggleMenu = React.useCallback(function () {
|
|
4128
|
+
dispatch({
|
|
4129
|
+
type: FunctionToggleMenu$1
|
|
4130
|
+
});
|
|
4131
|
+
}, [dispatch]);
|
|
4132
|
+
var closeMenu = React.useCallback(function () {
|
|
4133
|
+
dispatch({
|
|
4134
|
+
type: FunctionCloseMenu$1
|
|
4135
|
+
});
|
|
4136
|
+
}, [dispatch]);
|
|
4137
|
+
var openMenu = React.useCallback(function () {
|
|
4138
|
+
dispatch({
|
|
4139
|
+
type: FunctionOpenMenu$1
|
|
4140
|
+
});
|
|
4141
|
+
}, [dispatch]);
|
|
4142
|
+
var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
|
|
4143
|
+
dispatch({
|
|
4144
|
+
type: FunctionSetHighlightedIndex$1,
|
|
4145
|
+
highlightedIndex: newHighlightedIndex
|
|
4146
|
+
});
|
|
4147
|
+
}, [dispatch]);
|
|
4148
|
+
var selectItem = React.useCallback(function (newSelectedItem) {
|
|
4149
|
+
dispatch({
|
|
4150
|
+
type: FunctionSelectItem$1,
|
|
4151
|
+
selectedItem: newSelectedItem
|
|
4152
|
+
});
|
|
4153
|
+
}, [dispatch]);
|
|
4154
|
+
var reset = React.useCallback(function () {
|
|
4155
|
+
dispatch({
|
|
4156
|
+
type: FunctionReset$2
|
|
4157
|
+
});
|
|
4158
|
+
}, [dispatch]);
|
|
4159
|
+
var setInputValue = React.useCallback(function (newInputValue) {
|
|
4160
|
+
dispatch({
|
|
4161
|
+
type: FunctionSetInputValue$1,
|
|
4162
|
+
inputValue: newInputValue
|
|
4163
|
+
});
|
|
4164
|
+
}, [dispatch]);
|
|
4214
4165
|
return {
|
|
4215
4166
|
// prop getters.
|
|
4216
4167
|
getToggleButtonProps: getToggleButtonProps,
|
|
@@ -4233,6 +4184,18 @@
|
|
|
4233
4184
|
};
|
|
4234
4185
|
}
|
|
4235
4186
|
|
|
4187
|
+
function getInitialState$2(props) {
|
|
4188
|
+
var initialState = getInitialState$3(props);
|
|
4189
|
+
var selectedItem = initialState.selectedItem;
|
|
4190
|
+
var inputValue = initialState.inputValue;
|
|
4191
|
+
if (inputValue === '' && selectedItem && props.defaultInputValue === undefined && props.initialInputValue === undefined && props.inputValue === undefined) {
|
|
4192
|
+
inputValue = props.itemToString(selectedItem);
|
|
4193
|
+
}
|
|
4194
|
+
return _extends({}, initialState, {
|
|
4195
|
+
inputValue: inputValue
|
|
4196
|
+
});
|
|
4197
|
+
}
|
|
4198
|
+
|
|
4236
4199
|
var InputKeyDownArrowDown = '__input_keydown_arrow_down__' ;
|
|
4237
4200
|
var InputKeyDownArrowUp = '__input_keydown_arrow_up__' ;
|
|
4238
4201
|
var InputKeyDownEscape = '__input_keydown_escape__' ;
|
|
@@ -4284,27 +4247,6 @@
|
|
|
4284
4247
|
ToggleButtonClick: ToggleButtonClick
|
|
4285
4248
|
});
|
|
4286
4249
|
|
|
4287
|
-
function getInitialState$2(props) {
|
|
4288
|
-
var initialState = getInitialState$3(props);
|
|
4289
|
-
var selectedItem = initialState.selectedItem;
|
|
4290
|
-
var inputValue = initialState.inputValue;
|
|
4291
|
-
if (inputValue === '' && selectedItem && props.defaultInputValue === undefined && props.initialInputValue === undefined && props.inputValue === undefined) {
|
|
4292
|
-
inputValue = props.itemToString(selectedItem);
|
|
4293
|
-
}
|
|
4294
|
-
return _extends({}, initialState, {
|
|
4295
|
-
inputValue: inputValue
|
|
4296
|
-
});
|
|
4297
|
-
}
|
|
4298
|
-
var propTypes$2 = _extends({}, propTypes$4, {
|
|
4299
|
-
items: PropTypes.array.isRequired,
|
|
4300
|
-
isItemDisabled: PropTypes.func,
|
|
4301
|
-
inputValue: PropTypes.string,
|
|
4302
|
-
defaultInputValue: PropTypes.string,
|
|
4303
|
-
initialInputValue: PropTypes.string,
|
|
4304
|
-
inputId: PropTypes.string,
|
|
4305
|
-
onInputValueChange: PropTypes.func
|
|
4306
|
-
});
|
|
4307
|
-
|
|
4308
4250
|
/**
|
|
4309
4251
|
* The useCombobox version of useControlledReducer, which also
|
|
4310
4252
|
* checks if the controlled prop selectedItem changed between
|
|
@@ -4312,20 +4254,20 @@
|
|
|
4312
4254
|
* string equivalent. It uses the common useEnhancedReducer to
|
|
4313
4255
|
* compute the rest of the state.
|
|
4314
4256
|
*
|
|
4315
|
-
* @param
|
|
4316
|
-
* @param
|
|
4317
|
-
* @param
|
|
4318
|
-
* @param
|
|
4319
|
-
* @returns
|
|
4257
|
+
* @param reducer Reducer function from downshift.
|
|
4258
|
+
* @param props The hook props, also passed to createInitialState.
|
|
4259
|
+
* @param createInitialState Function that returns the initial state.
|
|
4260
|
+
* @param isStateEqual Function that checks if a previous state is equal to the next.
|
|
4261
|
+
* @returns An array with the state and an action dispatcher.
|
|
4320
4262
|
*/
|
|
4321
4263
|
function useControlledReducer(reducer, props, createInitialState, isStateEqual) {
|
|
4322
|
-
var previousSelectedItemRef = React.useRef();
|
|
4264
|
+
var previousSelectedItemRef = React.useRef(null);
|
|
4323
4265
|
var _useEnhancedReducer = useEnhancedReducer(reducer, props, createInitialState, isStateEqual),
|
|
4324
4266
|
state = _useEnhancedReducer[0],
|
|
4325
4267
|
dispatch = _useEnhancedReducer[1];
|
|
4326
4268
|
var isInitialMount = useIsInitialMount();
|
|
4327
4269
|
React.useEffect(function () {
|
|
4328
|
-
if (
|
|
4270
|
+
if (props.selectedItem === undefined) {
|
|
4329
4271
|
return;
|
|
4330
4272
|
}
|
|
4331
4273
|
if (!isInitialMount // on first mount we already have the proper inputValue for a initial selected item.
|
|
@@ -4343,23 +4285,27 @@
|
|
|
4343
4285
|
}, [state.selectedItem, props.selectedItem]);
|
|
4344
4286
|
return [getState(state, props), dispatch];
|
|
4345
4287
|
}
|
|
4346
|
-
|
|
4347
|
-
|
|
4348
|
-
|
|
4349
|
-
|
|
4288
|
+
|
|
4289
|
+
var propTypes$2 = _extends({}, dropdownPropTypes, {
|
|
4290
|
+
items: PropTypes.array.isRequired,
|
|
4291
|
+
isItemDisabled: PropTypes.func,
|
|
4292
|
+
inputValue: PropTypes.string,
|
|
4293
|
+
defaultInputValue: PropTypes.string,
|
|
4294
|
+
initialInputValue: PropTypes.string,
|
|
4295
|
+
inputId: PropTypes.string,
|
|
4296
|
+
onInputValueChange: PropTypes.func
|
|
4350
4297
|
});
|
|
4351
4298
|
|
|
4352
4299
|
/* eslint-disable complexity */
|
|
4353
|
-
function downshiftUseComboboxReducer(state,
|
|
4354
|
-
var _props$items;
|
|
4300
|
+
function downshiftUseComboboxReducer(state, action) {
|
|
4355
4301
|
var type = action.type,
|
|
4356
|
-
|
|
4302
|
+
props = action.props;
|
|
4357
4303
|
var changes;
|
|
4358
4304
|
switch (type) {
|
|
4359
4305
|
case ItemClick:
|
|
4360
4306
|
changes = {
|
|
4361
|
-
isOpen: getDefaultValue
|
|
4362
|
-
highlightedIndex: getDefaultHighlightedIndex(props),
|
|
4307
|
+
isOpen: getDefaultValue(props.defaultIsOpen, dropdownDefaultStateValues.isOpen),
|
|
4308
|
+
highlightedIndex: getDefaultHighlightedIndex(props.items, props.isItemDisabled, props.defaultHighlightedIndex),
|
|
4363
4309
|
selectedItem: props.items[action.index],
|
|
4364
4310
|
inputValue: props.itemToString(props.items[action.index])
|
|
4365
4311
|
};
|
|
@@ -4371,15 +4317,15 @@
|
|
|
4371
4317
|
};
|
|
4372
4318
|
} else {
|
|
4373
4319
|
changes = {
|
|
4374
|
-
highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1),
|
|
4320
|
+
highlightedIndex: action.altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props.items, props.initialHighlightedIndex, props.defaultHighlightedIndex, props.isItemDisabled, props.itemToKey, state.selectedItem, state.highlightedIndex, 1),
|
|
4375
4321
|
isOpen: props.items.length >= 0
|
|
4376
4322
|
};
|
|
4377
4323
|
}
|
|
4378
4324
|
break;
|
|
4379
4325
|
case InputKeyDownArrowUp:
|
|
4380
4326
|
if (state.isOpen) {
|
|
4381
|
-
if (altKey) {
|
|
4382
|
-
changes = getChangesOnSelection(props, state.highlightedIndex);
|
|
4327
|
+
if (action.altKey) {
|
|
4328
|
+
changes = getChangesOnSelection(props.items, props.itemToString, props.defaultIsOpen, props.defaultHighlightedIndex, state.highlightedIndex, true);
|
|
4383
4329
|
} else {
|
|
4384
4330
|
changes = {
|
|
4385
4331
|
highlightedIndex: getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled, true)
|
|
@@ -4387,13 +4333,13 @@
|
|
|
4387
4333
|
}
|
|
4388
4334
|
} else {
|
|
4389
4335
|
changes = {
|
|
4390
|
-
highlightedIndex: getHighlightedIndexOnOpen(props, state, -1),
|
|
4336
|
+
highlightedIndex: getHighlightedIndexOnOpen(props.items, props.initialHighlightedIndex, props.defaultHighlightedIndex, props.isItemDisabled, props.itemToKey, state.selectedItem, state.highlightedIndex, -1),
|
|
4391
4337
|
isOpen: props.items.length >= 0
|
|
4392
4338
|
};
|
|
4393
4339
|
}
|
|
4394
4340
|
break;
|
|
4395
4341
|
case InputKeyDownEnter:
|
|
4396
|
-
changes = getChangesOnSelection(props, state.highlightedIndex);
|
|
4342
|
+
changes = getChangesOnSelection(props.items, props.itemToString, props.defaultIsOpen, props.defaultHighlightedIndex, state.highlightedIndex, true);
|
|
4397
4343
|
break;
|
|
4398
4344
|
case InputKeyDownEscape:
|
|
4399
4345
|
changes = _extends({
|
|
@@ -4428,7 +4374,7 @@
|
|
|
4428
4374
|
changes = _extends({
|
|
4429
4375
|
isOpen: false,
|
|
4430
4376
|
highlightedIndex: -1
|
|
4431
|
-
}, state.highlightedIndex >= 0 &&
|
|
4377
|
+
}, state.highlightedIndex >= 0 && props.items.length && action.selectItem && {
|
|
4432
4378
|
selectedItem: props.items[state.highlightedIndex],
|
|
4433
4379
|
inputValue: props.itemToString(props.items[state.highlightedIndex])
|
|
4434
4380
|
});
|
|
@@ -4436,14 +4382,14 @@
|
|
|
4436
4382
|
case InputChange:
|
|
4437
4383
|
changes = {
|
|
4438
4384
|
isOpen: true,
|
|
4439
|
-
highlightedIndex: getDefaultHighlightedIndex(props),
|
|
4385
|
+
highlightedIndex: getDefaultHighlightedIndex(props.items, props.isItemDisabled, props.defaultHighlightedIndex),
|
|
4440
4386
|
inputValue: action.inputValue
|
|
4441
4387
|
};
|
|
4442
4388
|
break;
|
|
4443
4389
|
case InputClick:
|
|
4444
4390
|
changes = {
|
|
4445
4391
|
isOpen: !state.isOpen,
|
|
4446
|
-
highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0)
|
|
4392
|
+
highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props.items, props.initialHighlightedIndex, props.defaultHighlightedIndex, props.isItemDisabled, props.itemToKey, state.selectedItem, state.highlightedIndex, 0)
|
|
4447
4393
|
};
|
|
4448
4394
|
break;
|
|
4449
4395
|
case FunctionSelectItem:
|
|
@@ -4464,10 +4410,10 @@
|
|
|
4464
4410
|
}
|
|
4465
4411
|
/* eslint-enable complexity */
|
|
4466
4412
|
|
|
4467
|
-
var _excluded$2 = ["onMouseLeave", "refKey", "ref"],
|
|
4413
|
+
var _excluded$2 = ["onMouseLeave", "refKey", "ref", "aria-label"],
|
|
4468
4414
|
_excluded2$2 = ["item", "index", "refKey", "ref", "onMouseMove", "onMouseDown", "onClick", "onPress", "disabled"],
|
|
4469
|
-
_excluded3$1 = ["onClick", "onPress", "refKey", "ref"],
|
|
4470
|
-
_excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "onClick", "refKey", "ref"];
|
|
4415
|
+
_excluded3$1 = ["onClick", "onPress", "refKey", "ref", "disabled"],
|
|
4416
|
+
_excluded4 = ["aria-label", "disabled", "onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "onClick", "refKey", "ref"];
|
|
4471
4417
|
useCombobox.stateChangeTypes = stateChangeTypes$2;
|
|
4472
4418
|
function useCombobox(userProps) {
|
|
4473
4419
|
if (userProps === void 0) {
|
|
@@ -4475,13 +4421,13 @@
|
|
|
4475
4421
|
}
|
|
4476
4422
|
validatePropTypes$1(userProps, useCombobox, propTypes$2);
|
|
4477
4423
|
// Props defaults and destructuring.
|
|
4478
|
-
var props = _extends({},
|
|
4424
|
+
var props = _extends({}, dropdownDefaultProps, userProps);
|
|
4479
4425
|
var items = props.items,
|
|
4480
4426
|
scrollIntoView = props.scrollIntoView,
|
|
4481
4427
|
environment = props.environment,
|
|
4482
4428
|
getA11yStatusMessage = props.getA11yStatusMessage;
|
|
4483
4429
|
// Initial state depending on controlled props.
|
|
4484
|
-
var _useControlledReducer = useControlledReducer(downshiftUseComboboxReducer, props, getInitialState$2,
|
|
4430
|
+
var _useControlledReducer = useControlledReducer(downshiftUseComboboxReducer, props, getInitialState$2, isDropdownStateEqual),
|
|
4485
4431
|
state = _useControlledReducer[0],
|
|
4486
4432
|
dispatch = _useControlledReducer[1];
|
|
4487
4433
|
var isOpen = state.isOpen,
|
|
@@ -4491,7 +4437,7 @@
|
|
|
4491
4437
|
|
|
4492
4438
|
// Element refs.
|
|
4493
4439
|
var menuRef = React.useRef(null);
|
|
4494
|
-
var
|
|
4440
|
+
var itemsRef = React.useRef({});
|
|
4495
4441
|
var inputRef = React.useRef(null);
|
|
4496
4442
|
var toggleButtonRef = React.useRef(null);
|
|
4497
4443
|
var isInitialMount = useIsInitialMount();
|
|
@@ -4505,29 +4451,19 @@
|
|
|
4505
4451
|
state: state,
|
|
4506
4452
|
props: props
|
|
4507
4453
|
});
|
|
4508
|
-
var getItemNodeFromIndex = React.useCallback(function (index) {
|
|
4509
|
-
return itemRefs.current[elementIds.getItemId(index)];
|
|
4510
|
-
}, [elementIds]);
|
|
4511
4454
|
|
|
4512
4455
|
// Effects.
|
|
4513
4456
|
// Adds an a11y aria live status message if getA11yStatusMessage is passed.
|
|
4514
4457
|
useA11yMessageStatus(getA11yStatusMessage, state, [isOpen, highlightedIndex, selectedItem, inputValue], environment);
|
|
4515
4458
|
// Scroll on highlighted item if change comes from keyboard.
|
|
4516
|
-
var
|
|
4517
|
-
menuElement: menuRef.current,
|
|
4518
|
-
highlightedIndex: highlightedIndex,
|
|
4519
|
-
isOpen: isOpen,
|
|
4520
|
-
itemRefs: itemRefs,
|
|
4521
|
-
scrollIntoView: scrollIntoView,
|
|
4522
|
-
getItemNodeFromIndex: getItemNodeFromIndex
|
|
4523
|
-
});
|
|
4459
|
+
var preventScroll = useScrollIntoView(scrollIntoView, highlightedIndex, isOpen, menuRef.current, itemsRef.current, elementIds.getItemId);
|
|
4524
4460
|
useControlPropsValidator({
|
|
4525
|
-
|
|
4526
|
-
|
|
4461
|
+
state: state,
|
|
4462
|
+
props: props
|
|
4527
4463
|
});
|
|
4528
4464
|
// Focus the input on first render if required.
|
|
4529
4465
|
React.useEffect(function () {
|
|
4530
|
-
var focusOnOpen = getInitialValue
|
|
4466
|
+
var focusOnOpen = getInitialValue(props.isOpen, props.initialIsOpen, props.defaultIsOpen, dropdownDefaultStateValues.isOpen);
|
|
4531
4467
|
if (focusOnOpen && inputRef.current) {
|
|
4532
4468
|
inputRef.current.focus();
|
|
4533
4469
|
}
|
|
@@ -4553,13 +4489,13 @@
|
|
|
4553
4489
|
// Reset itemRefs on close.
|
|
4554
4490
|
React.useEffect(function () {
|
|
4555
4491
|
if (!isOpen) {
|
|
4556
|
-
|
|
4492
|
+
itemsRef.current = {};
|
|
4557
4493
|
}
|
|
4558
4494
|
}, [isOpen]);
|
|
4559
4495
|
// Reset itemRefs on close.
|
|
4560
4496
|
React.useEffect(function () {
|
|
4561
4497
|
var _inputRef$current;
|
|
4562
|
-
if (!isOpen || !(environment != null && environment.document) || !(
|
|
4498
|
+
if (!isOpen || !(environment != null && environment.document) || !((_inputRef$current = inputRef.current) != null && _inputRef$current.focus)) {
|
|
4563
4499
|
return;
|
|
4564
4500
|
}
|
|
4565
4501
|
if (environment.document.activeElement !== inputRef.current) {
|
|
@@ -4649,29 +4585,30 @@
|
|
|
4649
4585
|
htmlFor: elementIds.inputId
|
|
4650
4586
|
}, labelProps);
|
|
4651
4587
|
}, [elementIds]);
|
|
4652
|
-
var getMenuProps = React.useCallback(function (
|
|
4588
|
+
var getMenuProps = React.useCallback(function (menuProps, otherProps) {
|
|
4653
4589
|
var _extends2;
|
|
4654
|
-
var _ref =
|
|
4590
|
+
var _ref = menuProps != null ? menuProps : {},
|
|
4655
4591
|
onMouseLeave = _ref.onMouseLeave,
|
|
4656
4592
|
_ref$refKey = _ref.refKey,
|
|
4657
4593
|
refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey,
|
|
4658
4594
|
ref = _ref.ref,
|
|
4595
|
+
ariaLabel = _ref['aria-label'],
|
|
4659
4596
|
rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
|
|
4660
|
-
var _ref2 =
|
|
4597
|
+
var _ref2 = otherProps != null ? otherProps : {},
|
|
4661
4598
|
_ref2$suppressRefErro = _ref2.suppressRefError,
|
|
4662
4599
|
suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro;
|
|
4663
4600
|
setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef);
|
|
4664
4601
|
return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) {
|
|
4665
4602
|
menuRef.current = menuNode;
|
|
4666
|
-
}), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-
|
|
4603
|
+
}), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-label'] = ariaLabel, _extends2['aria-labelledby'] = ariaLabel ? undefined : "" + elementIds.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, function () {
|
|
4667
4604
|
dispatch({
|
|
4668
4605
|
type: MenuMouseLeave
|
|
4669
4606
|
});
|
|
4670
4607
|
}), _extends2), rest);
|
|
4671
4608
|
}, [dispatch, setGetterPropCallInfo, elementIds]);
|
|
4672
|
-
var getItemProps = React.useCallback(function (
|
|
4609
|
+
var getItemProps = React.useCallback(function (itemProps) {
|
|
4673
4610
|
var _extends3, _ref4;
|
|
4674
|
-
var _ref3 =
|
|
4611
|
+
var _ref3 = itemProps != null ? itemProps : {},
|
|
4675
4612
|
itemProp = _ref3.item,
|
|
4676
4613
|
indexProp = _ref3.index,
|
|
4677
4614
|
_ref3$refKey = _ref3.refKey,
|
|
@@ -4699,7 +4636,7 @@
|
|
|
4699
4636
|
if (mouseAndTouchTrackers.isTouchEnd || index === latestState.highlightedIndex) {
|
|
4700
4637
|
return;
|
|
4701
4638
|
}
|
|
4702
|
-
|
|
4639
|
+
preventScroll();
|
|
4703
4640
|
dispatch({
|
|
4704
4641
|
type: ItemMouseMove,
|
|
4705
4642
|
index: index,
|
|
@@ -4718,21 +4655,22 @@
|
|
|
4718
4655
|
|
|
4719
4656
|
return _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (itemNode) {
|
|
4720
4657
|
if (itemNode) {
|
|
4721
|
-
|
|
4658
|
+
itemsRef.current[elementIds.getItemId(index)] = itemNode;
|
|
4722
4659
|
}
|
|
4723
4660
|
}), _extends3['aria-disabled'] = disabled, _extends3['aria-selected'] = index === latestState.highlightedIndex, _extends3.id = elementIds.getItemId(index), _extends3.role = 'option', _extends3), !disabled && (_ref4 = {}, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, itemHandleClick), _ref4), {
|
|
4724
4661
|
onMouseMove: callAllEventHandlers(onMouseMove, itemHandleMouseMove),
|
|
4725
4662
|
onMouseDown: callAllEventHandlers(onMouseDown, itemHandleMouseDown)
|
|
4726
4663
|
}, rest);
|
|
4727
|
-
}, [dispatch, elementIds, latest, mouseAndTouchTrackers,
|
|
4728
|
-
var getToggleButtonProps = React.useCallback(function (
|
|
4664
|
+
}, [dispatch, elementIds, latest, mouseAndTouchTrackers, preventScroll]);
|
|
4665
|
+
var getToggleButtonProps = React.useCallback(function (toggleButtonProps) {
|
|
4729
4666
|
var _extends4;
|
|
4730
|
-
var _ref5 =
|
|
4667
|
+
var _ref5 = toggleButtonProps != null ? toggleButtonProps : {},
|
|
4731
4668
|
onClick = _ref5.onClick;
|
|
4732
4669
|
_ref5.onPress;
|
|
4733
4670
|
var _ref5$refKey = _ref5.refKey,
|
|
4734
4671
|
refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey,
|
|
4735
4672
|
ref = _ref5.ref,
|
|
4673
|
+
disabled = _ref5.disabled,
|
|
4736
4674
|
rest = _objectWithoutPropertiesLoose(_ref5, _excluded3$1);
|
|
4737
4675
|
var latestState = latest.current.state;
|
|
4738
4676
|
var toggleButtonHandleClick = function toggleButtonHandleClick() {
|
|
@@ -4742,13 +4680,17 @@
|
|
|
4742
4680
|
};
|
|
4743
4681
|
return _extends((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (toggleButtonNode) {
|
|
4744
4682
|
toggleButtonRef.current = toggleButtonNode;
|
|
4745
|
-
}), _extends4['aria-controls'] = elementIds.menuId, _extends4['aria-expanded'] = latestState.isOpen, _extends4.id = elementIds.toggleButtonId, _extends4.tabIndex = -1, _extends4), !
|
|
4683
|
+
}), _extends4['aria-controls'] = elementIds.menuId, _extends4['aria-expanded'] = latestState.isOpen, _extends4.id = elementIds.toggleButtonId, _extends4.tabIndex = -1, _extends4), !disabled && _extends({}, {
|
|
4746
4684
|
onClick: callAllEventHandlers(onClick, toggleButtonHandleClick)
|
|
4747
|
-
}),
|
|
4685
|
+
}), {
|
|
4686
|
+
disabled: disabled
|
|
4687
|
+
}, rest);
|
|
4748
4688
|
}, [dispatch, latest, elementIds]);
|
|
4749
|
-
var getInputProps = React.useCallback(function (
|
|
4689
|
+
var getInputProps = React.useCallback(function (inputProps, otherProps) {
|
|
4750
4690
|
var _extends5;
|
|
4751
|
-
var _ref6 =
|
|
4691
|
+
var _ref6 = inputProps != null ? inputProps : {},
|
|
4692
|
+
ariaLabel = _ref6['aria-label'],
|
|
4693
|
+
disabled = _ref6.disabled,
|
|
4752
4694
|
onKeyDown = _ref6.onKeyDown,
|
|
4753
4695
|
onChange = _ref6.onChange,
|
|
4754
4696
|
onInput = _ref6.onInput,
|
|
@@ -4759,15 +4701,16 @@
|
|
|
4759
4701
|
refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey,
|
|
4760
4702
|
ref = _ref6.ref,
|
|
4761
4703
|
rest = _objectWithoutPropertiesLoose(_ref6, _excluded4);
|
|
4762
|
-
var _ref7 =
|
|
4704
|
+
var _ref7 = otherProps != null ? otherProps : {},
|
|
4763
4705
|
_ref7$suppressRefErro = _ref7.suppressRefError,
|
|
4764
4706
|
suppressRefError = _ref7$suppressRefErro === void 0 ? false : _ref7$suppressRefErro;
|
|
4765
4707
|
setGetterPropCallInfo('getInputProps', suppressRefError, refKey, inputRef);
|
|
4766
4708
|
var latestState = latest.current.state;
|
|
4767
4709
|
var inputHandleKeyDown = function inputHandleKeyDown(event) {
|
|
4768
4710
|
var key = normalizeArrowKey(event);
|
|
4769
|
-
if (key && inputKeyDownHandlers
|
|
4770
|
-
|
|
4711
|
+
if (key && key in inputKeyDownHandlers) {
|
|
4712
|
+
var validKey = key;
|
|
4713
|
+
inputKeyDownHandlers[validKey](event);
|
|
4771
4714
|
}
|
|
4772
4715
|
};
|
|
4773
4716
|
var inputHandleChange = function inputHandleChange(event) {
|
|
@@ -4795,13 +4738,13 @@
|
|
|
4795
4738
|
/* istanbul ignore next (preact) */
|
|
4796
4739
|
var onChangeKey = 'onChange';
|
|
4797
4740
|
var eventHandlers = {};
|
|
4798
|
-
if (!
|
|
4741
|
+
if (!disabled) {
|
|
4799
4742
|
var _eventHandlers;
|
|
4800
4743
|
eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onClick = callAllEventHandlers(onClick, inputHandleClick), _eventHandlers);
|
|
4801
4744
|
}
|
|
4802
4745
|
return _extends((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) {
|
|
4803
4746
|
inputRef.current = inputNode;
|
|
4804
|
-
}), _extends5['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIds.menuId, _extends5['aria-expanded'] = latestState.isOpen, _extends5['aria-labelledby'] =
|
|
4747
|
+
}), _extends5['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIds.menuId, _extends5['aria-expanded'] = latestState.isOpen, _extends5['aria-labelledby'] = ariaLabel ? undefined : elementIds.labelId, _extends5['aria-label'] = ariaLabel, _extends5.autoComplete = 'off', _extends5.disabled = disabled, _extends5.id = elementIds.inputId, _extends5.role = 'combobox', _extends5.value = latestState.inputValue, _extends5), eventHandlers, rest);
|
|
4805
4748
|
}, [dispatch, elementIds, environment, inputKeyDownHandlers, latest, mouseAndTouchTrackers, setGetterPropCallInfo]);
|
|
4806
4749
|
|
|
4807
4750
|
// returns
|
|
@@ -4871,31 +4814,6 @@
|
|
|
4871
4814
|
selectedItems: []
|
|
4872
4815
|
};
|
|
4873
4816
|
|
|
4874
|
-
/**
|
|
4875
|
-
* Returns the initial value for a state key in the following order:
|
|
4876
|
-
* 1. controlled prop, 2. initial prop, 3. default prop, 4. default
|
|
4877
|
-
* value from Downshift.
|
|
4878
|
-
*
|
|
4879
|
-
* @param {Object} props Props passed to the hook.
|
|
4880
|
-
* @param {string} propKey Props key to generate the value for.
|
|
4881
|
-
* @returns {any} The initial value for that prop.
|
|
4882
|
-
*/
|
|
4883
|
-
function getInitialValue(props, propKey) {
|
|
4884
|
-
return getInitialValue$1(props, propKey, defaultStateValues);
|
|
4885
|
-
}
|
|
4886
|
-
|
|
4887
|
-
/**
|
|
4888
|
-
* Returns the default value for a state key in the following order:
|
|
4889
|
-
* 1. controlled prop, 2. default prop, 3. default value from Downshift.
|
|
4890
|
-
*
|
|
4891
|
-
* @param {Object} props Props passed to the hook.
|
|
4892
|
-
* @param {string} propKey Props key to generate the value for.
|
|
4893
|
-
* @returns {any} The initial value for that prop.
|
|
4894
|
-
*/
|
|
4895
|
-
function getDefaultValue(props, propKey) {
|
|
4896
|
-
return getDefaultValue$1(props, propKey, defaultStateValues);
|
|
4897
|
-
}
|
|
4898
|
-
|
|
4899
4817
|
/**
|
|
4900
4818
|
* Gets the initial state based on the provided props. It uses initial, default
|
|
4901
4819
|
* and controlled props related to state in order to compute the initial value.
|
|
@@ -4904,8 +4822,8 @@
|
|
|
4904
4822
|
* @returns {Object} The initial state.
|
|
4905
4823
|
*/
|
|
4906
4824
|
function getInitialState$1(props) {
|
|
4907
|
-
var activeIndex = getInitialValue(props,
|
|
4908
|
-
var selectedItems = getInitialValue(props,
|
|
4825
|
+
var activeIndex = getInitialValue(props.activeIndex, props.initialActiveIndex, props.defaultActiveIndex, defaultStateValues.activeIndex);
|
|
4826
|
+
var selectedItems = getInitialValue(props.selectedItems, props.initialSelectedItems, props.defaultSelectedItems, defaultStateValues.selectedItems);
|
|
4909
4827
|
return {
|
|
4910
4828
|
activeIndex: activeIndex,
|
|
4911
4829
|
selectedItems: selectedItems
|
|
@@ -4949,9 +4867,9 @@
|
|
|
4949
4867
|
return prevState.selectedItems === newState.selectedItems && prevState.activeIndex === newState.activeIndex;
|
|
4950
4868
|
}
|
|
4951
4869
|
var propTypes$1 = {
|
|
4952
|
-
stateReducer:
|
|
4953
|
-
itemToKey:
|
|
4954
|
-
environment:
|
|
4870
|
+
stateReducer: dropdownPropTypes.stateReducer,
|
|
4871
|
+
itemToKey: dropdownPropTypes.itemToKey,
|
|
4872
|
+
environment: dropdownPropTypes.environment,
|
|
4955
4873
|
selectedItems: PropTypes.array,
|
|
4956
4874
|
initialSelectedItems: PropTypes.array,
|
|
4957
4875
|
defaultSelectedItems: PropTypes.array,
|
|
@@ -4965,9 +4883,9 @@
|
|
|
4965
4883
|
keyNavigationPrevious: PropTypes.string
|
|
4966
4884
|
};
|
|
4967
4885
|
var defaultProps = {
|
|
4968
|
-
itemToKey:
|
|
4969
|
-
stateReducer:
|
|
4970
|
-
environment:
|
|
4886
|
+
itemToKey: dropdownDefaultProps.itemToKey,
|
|
4887
|
+
stateReducer: dropdownDefaultProps.stateReducer,
|
|
4888
|
+
environment: dropdownDefaultProps.environment,
|
|
4971
4889
|
keyNavigationNext: 'ArrowRight',
|
|
4972
4890
|
keyNavigationPrevious: 'ArrowLeft'
|
|
4973
4891
|
};
|
|
@@ -5013,10 +4931,11 @@
|
|
|
5013
4931
|
});
|
|
5014
4932
|
|
|
5015
4933
|
/* eslint-disable complexity */
|
|
5016
|
-
function downshiftMultipleSelectionReducer(state,
|
|
4934
|
+
function downshiftMultipleSelectionReducer(state, action) {
|
|
5017
4935
|
var type = action.type,
|
|
5018
4936
|
index = action.index,
|
|
5019
|
-
selectedItem = action.selectedItem
|
|
4937
|
+
selectedItem = action.selectedItem,
|
|
4938
|
+
props = action.props;
|
|
5020
4939
|
var activeIndex = state.activeIndex,
|
|
5021
4940
|
selectedItems = state.selectedItems;
|
|
5022
4941
|
var changes;
|
|
@@ -5113,8 +5032,8 @@
|
|
|
5113
5032
|
}
|
|
5114
5033
|
case FunctionReset:
|
|
5115
5034
|
changes = {
|
|
5116
|
-
activeIndex: getDefaultValue(props,
|
|
5117
|
-
selectedItems: getDefaultValue(props,
|
|
5035
|
+
activeIndex: getDefaultValue(props.defaultActiveIndex, defaultStateValues.activeIndex),
|
|
5036
|
+
selectedItems: getDefaultValue(props.defaultSelectedItems, defaultStateValues.selectedItems)
|
|
5118
5037
|
};
|
|
5119
5038
|
break;
|
|
5120
5039
|
default:
|
|
@@ -5346,7 +5265,7 @@
|
|
|
5346
5265
|
TagRemoveClick: TagRemoveClick
|
|
5347
5266
|
});
|
|
5348
5267
|
|
|
5349
|
-
function useTagGroupReducer(state,
|
|
5268
|
+
function useTagGroupReducer(state, action) {
|
|
5350
5269
|
var type = action.type;
|
|
5351
5270
|
var changes;
|
|
5352
5271
|
switch (type) {
|
|
@@ -5584,7 +5503,7 @@
|
|
|
5584
5503
|
'aria-atomic': 'false',
|
|
5585
5504
|
'aria-relevant': 'additions',
|
|
5586
5505
|
role: 'listbox',
|
|
5587
|
-
onKeyDown: callAllEventHandlers
|
|
5506
|
+
onKeyDown: callAllEventHandlers(onKeyDown, handleKeyDown)
|
|
5588
5507
|
}, rest);
|
|
5589
5508
|
return tagGroupProps;
|
|
5590
5509
|
}, [dispatch, elementIds.tagGroupId]);
|
|
@@ -5609,11 +5528,11 @@
|
|
|
5609
5528
|
var tagId = elementIds.getTagId(index);
|
|
5610
5529
|
return _extends((_extends2 = {
|
|
5611
5530
|
'aria-describedby': A11Y_DESCRIPTION_ELEMENT_ID
|
|
5612
|
-
}, _extends2[refKey] = handleRefs
|
|
5531
|
+
}, _extends2[refKey] = handleRefs(ref, function (itemNode) {
|
|
5613
5532
|
if (itemNode) {
|
|
5614
5533
|
itemRefs.current[tagId] = itemNode;
|
|
5615
5534
|
}
|
|
5616
|
-
}), _extends2['aria-labelledby'] = tagId, _extends2.role = 'option', _extends2.id = tagId, _extends2.onClick = callAllEventHandlers
|
|
5535
|
+
}), _extends2['aria-labelledby'] = tagId, _extends2.role = 'option', _extends2.id = tagId, _extends2.onClick = callAllEventHandlers(onClick, handleClick), _extends2.tabIndex = latestState.activeIndex === index ? 0 : -1, _extends2), rest);
|
|
5617
5536
|
}, [dispatch, elementIds, latest, itemRefs]);
|
|
5618
5537
|
var getTagRemoveProps = React.useCallback(function (options) {
|
|
5619
5538
|
var index = options.index,
|
|
@@ -5635,7 +5554,7 @@
|
|
|
5635
5554
|
id: tagRemoveId,
|
|
5636
5555
|
tabIndex: -1,
|
|
5637
5556
|
'aria-labelledby': tagRemoveId + " " + tagId,
|
|
5638
|
-
onClick: callAllEventHandlers
|
|
5557
|
+
onClick: callAllEventHandlers(onClick, handleClick)
|
|
5639
5558
|
}, rest);
|
|
5640
5559
|
}, [elementIds, dispatch]);
|
|
5641
5560
|
|