mirror of
https://github.com/idanoo/GoScrobble.git
synced 2024-11-25 09:55:15 +00:00
2692 lines
90 KiB
JavaScript
2692 lines
90 KiB
JavaScript
import _extends from '@babel/runtime/helpers/esm/extends';
|
|
import { a as _objectSpread2, s as supportsPassiveEvents, b as clearIndicatorCSS, d as containerCSS, e as css$1, f as dropdownIndicatorCSS, g as groupCSS, h as groupHeadingCSS, i as indicatorsContainerCSS, j as indicatorSeparatorCSS, k as inputCSS, l as loadingIndicatorCSS, m as loadingMessageCSS, n as menuCSS, o as menuListCSS, p as menuPortalCSS, q as multiValueCSS, r as multiValueLabelCSS, t as multiValueRemoveCSS, u as noOptionsMessageCSS, v as optionCSS, w as placeholderCSS, x as css$2, y as valueContainerCSS, z as isTouchCapable, A as isMobileDevice, _ as _createSuper, B as classNames, C as defaultComponents, D as isDocumentElement, E as cleanValue, F as scrollIntoView, G as noop, M as MenuPlacer } from './index-4bd03571.esm.js';
|
|
import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';
|
|
import _createClass from '@babel/runtime/helpers/esm/createClass';
|
|
import _inherits from '@babel/runtime/helpers/esm/inherits';
|
|
import _toConsumableArray from '@babel/runtime/helpers/esm/toConsumableArray';
|
|
import React, { useMemo, useRef, useCallback, useEffect, Component } from 'react';
|
|
import { jsx, css } from '@emotion/react';
|
|
import memoizeOne from 'memoize-one';
|
|
import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';
|
|
|
|
function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
|
|
|
var _ref = process.env.NODE_ENV === "production" ? {
|
|
name: "7pg0cj-a11yText",
|
|
styles: "label:a11yText;z-index:9999;border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;width:1px;position:absolute;overflow:hidden;padding:0;white-space:nowrap"
|
|
} : {
|
|
name: "1f43avz-a11yText-A11yText",
|
|
styles: "label:a11yText;z-index:9999;border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;width:1px;position:absolute;overflow:hidden;padding:0;white-space:nowrap;label:A11yText;",
|
|
map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkExMXlUZXh0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFJIiwiZmlsZSI6IkExMXlUZXh0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbi8qKiBAanN4IGpzeCAqL1xuaW1wb3J0IHsgdHlwZSBFbGVtZW50Q29uZmlnIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsganN4IH0gZnJvbSAnQGVtb3Rpb24vcmVhY3QnO1xuXG4vLyBBc3Npc3RpdmUgdGV4dCB0byBkZXNjcmliZSB2aXN1YWwgZWxlbWVudHMuIEhpZGRlbiBmb3Igc2lnaHRlZCB1c2Vycy5cbmNvbnN0IEExMXlUZXh0ID0gKHByb3BzOiBFbGVtZW50Q29uZmlnPCdzcGFuJz4pID0+IChcbiAgPHNwYW5cbiAgICBjc3M9e3tcbiAgICAgIGxhYmVsOiAnYTExeVRleHQnLFxuICAgICAgekluZGV4OiA5OTk5LFxuICAgICAgYm9yZGVyOiAwLFxuICAgICAgY2xpcDogJ3JlY3QoMXB4LCAxcHgsIDFweCwgMXB4KScsXG4gICAgICBoZWlnaHQ6IDEsXG4gICAgICB3aWR0aDogMSxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgIH19XG4gICAgey4uLnByb3BzfVxuICAvPlxuKTtcblxuZXhwb3J0IGRlZmF1bHQgQTExeVRleHQ7XG4iXX0= */",
|
|
toString: _EMOTION_STRINGIFIED_CSS_ERROR__
|
|
};
|
|
|
|
var A11yText = function A11yText(props) {
|
|
return jsx("span", _extends({
|
|
css: _ref
|
|
}, props));
|
|
};
|
|
|
|
var defaultAriaLiveMessages = {
|
|
guidance: function guidance(props) {
|
|
var isSearchable = props.isSearchable,
|
|
isMulti = props.isMulti,
|
|
isDisabled = props.isDisabled,
|
|
tabSelectsValue = props.tabSelectsValue,
|
|
context = props.context;
|
|
|
|
switch (context) {
|
|
case 'menu':
|
|
return "Use Up and Down to choose options".concat(isDisabled ? '' : ', press Enter to select the currently focused option', ", press Escape to exit the menu").concat(tabSelectsValue ? ', press Tab to select the option and exit the menu' : '', ".");
|
|
|
|
case 'input':
|
|
return "".concat(props['aria-label'] || 'Select', " is focused ").concat(isSearchable ? ',type to refine list' : '', ", press Down to open the menu, ").concat(isMulti ? ' press left to focus selected values' : '');
|
|
|
|
case 'value':
|
|
return 'Use left and right to toggle between focused values, press Backspace to remove the currently focused value';
|
|
|
|
default:
|
|
return '';
|
|
}
|
|
},
|
|
onChange: function onChange(props) {
|
|
var action = props.action,
|
|
_props$label = props.label,
|
|
label = _props$label === void 0 ? '' : _props$label,
|
|
isDisabled = props.isDisabled;
|
|
|
|
switch (action) {
|
|
case 'deselect-option':
|
|
case 'pop-value':
|
|
case 'remove-value':
|
|
return "option ".concat(label, ", deselected.");
|
|
|
|
case 'select-option':
|
|
return isDisabled ? "option ".concat(label, " is disabled. Select another option.") : "option ".concat(label, ", selected.");
|
|
|
|
default:
|
|
return '';
|
|
}
|
|
},
|
|
onFocus: function onFocus(props) {
|
|
var context = props.context,
|
|
_props$focused = props.focused,
|
|
focused = _props$focused === void 0 ? {} : _props$focused,
|
|
options = props.options,
|
|
_props$label2 = props.label,
|
|
label = _props$label2 === void 0 ? '' : _props$label2,
|
|
selectValue = props.selectValue,
|
|
isDisabled = props.isDisabled,
|
|
isSelected = props.isSelected;
|
|
|
|
var getArrayIndex = function getArrayIndex(arr, item) {
|
|
return arr && arr.length ? "".concat(arr.indexOf(item) + 1, " of ").concat(arr.length) : '';
|
|
};
|
|
|
|
if (context === 'value' && selectValue) {
|
|
return "value ".concat(label, " focused, ").concat(getArrayIndex(selectValue, focused), ".");
|
|
}
|
|
|
|
if (context === 'menu') {
|
|
var disabled = isDisabled ? ' disabled' : '';
|
|
var status = "".concat(isSelected ? 'selected' : 'focused').concat(disabled);
|
|
return "option ".concat(label, " ").concat(status, ", ").concat(getArrayIndex(options, focused), ".");
|
|
}
|
|
|
|
return '';
|
|
},
|
|
onFilter: function onFilter(props) {
|
|
var inputValue = props.inputValue,
|
|
resultsMessage = props.resultsMessage;
|
|
return "".concat(resultsMessage).concat(inputValue ? ' for search term ' + inputValue : '', ".");
|
|
}
|
|
};
|
|
|
|
var LiveRegion = function LiveRegion(props) {
|
|
var ariaSelection = props.ariaSelection,
|
|
focusedOption = props.focusedOption,
|
|
focusedValue = props.focusedValue,
|
|
focusableOptions = props.focusableOptions,
|
|
isFocused = props.isFocused,
|
|
selectValue = props.selectValue,
|
|
selectProps = props.selectProps;
|
|
var ariaLiveMessages = selectProps.ariaLiveMessages,
|
|
getOptionLabel = selectProps.getOptionLabel,
|
|
inputValue = selectProps.inputValue,
|
|
isMulti = selectProps.isMulti,
|
|
isOptionDisabled = selectProps.isOptionDisabled,
|
|
isSearchable = selectProps.isSearchable,
|
|
menuIsOpen = selectProps.menuIsOpen,
|
|
options = selectProps.options,
|
|
screenReaderStatus = selectProps.screenReaderStatus,
|
|
tabSelectsValue = selectProps.tabSelectsValue;
|
|
var ariaLabel = selectProps['aria-label'];
|
|
var ariaLive = selectProps['aria-live']; // Update aria live message configuration when prop changes
|
|
|
|
var messages = useMemo(function () {
|
|
return _objectSpread2(_objectSpread2({}, defaultAriaLiveMessages), ariaLiveMessages || {});
|
|
}, [ariaLiveMessages]); // Update aria live selected option when prop changes
|
|
|
|
var ariaSelected = useMemo(function () {
|
|
var message = '';
|
|
|
|
if (ariaSelection && messages.onChange) {
|
|
var option = ariaSelection.option,
|
|
removedValue = ariaSelection.removedValue,
|
|
value = ariaSelection.value; // select-option when !isMulti does not return option so we assume selected option is value
|
|
|
|
var asOption = function asOption(val) {
|
|
return !Array.isArray(val) ? val : null;
|
|
};
|
|
|
|
var selected = removedValue || option || asOption(value);
|
|
|
|
var onChangeProps = _objectSpread2({
|
|
isDisabled: selected && isOptionDisabled(selected),
|
|
label: selected ? getOptionLabel(selected) : ''
|
|
}, ariaSelection);
|
|
|
|
message = messages.onChange(onChangeProps);
|
|
}
|
|
|
|
return message;
|
|
}, [ariaSelection, isOptionDisabled, getOptionLabel, messages]);
|
|
var ariaFocused = useMemo(function () {
|
|
var focusMsg = '';
|
|
var focused = focusedOption || focusedValue;
|
|
var isSelected = !!(focusedOption && selectValue && selectValue.includes(focusedOption));
|
|
|
|
if (focused && messages.onFocus) {
|
|
var onFocusProps = {
|
|
focused: focused,
|
|
label: getOptionLabel(focused),
|
|
isDisabled: isOptionDisabled(focused),
|
|
isSelected: isSelected,
|
|
options: options,
|
|
context: focused === focusedOption ? 'menu' : 'value',
|
|
selectValue: selectValue
|
|
};
|
|
focusMsg = messages.onFocus(onFocusProps);
|
|
}
|
|
|
|
return focusMsg;
|
|
}, [focusedOption, focusedValue, getOptionLabel, isOptionDisabled, messages, options, selectValue]);
|
|
var ariaResults = useMemo(function () {
|
|
var resultsMsg = '';
|
|
|
|
if (menuIsOpen && options.length && messages.onFilter) {
|
|
var resultsMessage = screenReaderStatus({
|
|
count: focusableOptions.length
|
|
});
|
|
resultsMsg = messages.onFilter({
|
|
inputValue: inputValue,
|
|
resultsMessage: resultsMessage
|
|
});
|
|
}
|
|
|
|
return resultsMsg;
|
|
}, [focusableOptions, inputValue, menuIsOpen, messages, options, screenReaderStatus]);
|
|
var ariaGuidance = useMemo(function () {
|
|
var guidanceMsg = '';
|
|
|
|
if (messages.guidance) {
|
|
var context = focusedValue ? 'value' : menuIsOpen ? 'menu' : 'input';
|
|
guidanceMsg = messages.guidance({
|
|
'aria-label': ariaLabel,
|
|
context: context,
|
|
isDisabled: focusedOption && isOptionDisabled(focusedOption),
|
|
isMulti: isMulti,
|
|
isSearchable: isSearchable,
|
|
tabSelectsValue: tabSelectsValue
|
|
});
|
|
}
|
|
|
|
return guidanceMsg;
|
|
}, [ariaLabel, focusedOption, focusedValue, isMulti, isOptionDisabled, isSearchable, menuIsOpen, messages, tabSelectsValue]);
|
|
var ariaContext = "".concat(ariaFocused, " ").concat(ariaResults, " ").concat(ariaGuidance);
|
|
return jsx(A11yText, {
|
|
"aria-live": ariaLive,
|
|
"aria-atomic": "false",
|
|
"aria-relevant": "additions text"
|
|
}, isFocused && jsx(React.Fragment, null, jsx("span", {
|
|
id: "aria-selection"
|
|
}, ariaSelected), jsx("span", {
|
|
id: "aria-context"
|
|
}, ariaContext)));
|
|
};
|
|
|
|
var diacritics = [{
|
|
base: 'A',
|
|
letters: "A\u24B6\uFF21\xC0\xC1\xC2\u1EA6\u1EA4\u1EAA\u1EA8\xC3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\xC4\u01DE\u1EA2\xC5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F"
|
|
}, {
|
|
base: 'AA',
|
|
letters: "\uA732"
|
|
}, {
|
|
base: 'AE',
|
|
letters: "\xC6\u01FC\u01E2"
|
|
}, {
|
|
base: 'AO',
|
|
letters: "\uA734"
|
|
}, {
|
|
base: 'AU',
|
|
letters: "\uA736"
|
|
}, {
|
|
base: 'AV',
|
|
letters: "\uA738\uA73A"
|
|
}, {
|
|
base: 'AY',
|
|
letters: "\uA73C"
|
|
}, {
|
|
base: 'B',
|
|
letters: "B\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181"
|
|
}, {
|
|
base: 'C',
|
|
letters: "C\u24B8\uFF23\u0106\u0108\u010A\u010C\xC7\u1E08\u0187\u023B\uA73E"
|
|
}, {
|
|
base: 'D',
|
|
letters: "D\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779"
|
|
}, {
|
|
base: 'DZ',
|
|
letters: "\u01F1\u01C4"
|
|
}, {
|
|
base: 'Dz',
|
|
letters: "\u01F2\u01C5"
|
|
}, {
|
|
base: 'E',
|
|
letters: "E\u24BA\uFF25\xC8\xC9\xCA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\xCB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E"
|
|
}, {
|
|
base: 'F',
|
|
letters: "F\u24BB\uFF26\u1E1E\u0191\uA77B"
|
|
}, {
|
|
base: 'G',
|
|
letters: "G\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E"
|
|
}, {
|
|
base: 'H',
|
|
letters: "H\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D"
|
|
}, {
|
|
base: 'I',
|
|
letters: "I\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197"
|
|
}, {
|
|
base: 'J',
|
|
letters: "J\u24BF\uFF2A\u0134\u0248"
|
|
}, {
|
|
base: 'K',
|
|
letters: "K\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2"
|
|
}, {
|
|
base: 'L',
|
|
letters: "L\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780"
|
|
}, {
|
|
base: 'LJ',
|
|
letters: "\u01C7"
|
|
}, {
|
|
base: 'Lj',
|
|
letters: "\u01C8"
|
|
}, {
|
|
base: 'M',
|
|
letters: "M\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C"
|
|
}, {
|
|
base: 'N',
|
|
letters: "N\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4"
|
|
}, {
|
|
base: 'NJ',
|
|
letters: "\u01CA"
|
|
}, {
|
|
base: 'Nj',
|
|
letters: "\u01CB"
|
|
}, {
|
|
base: 'O',
|
|
letters: "O\u24C4\uFF2F\xD2\xD3\xD4\u1ED2\u1ED0\u1ED6\u1ED4\xD5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\xD6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\xD8\u01FE\u0186\u019F\uA74A\uA74C"
|
|
}, {
|
|
base: 'OI',
|
|
letters: "\u01A2"
|
|
}, {
|
|
base: 'OO',
|
|
letters: "\uA74E"
|
|
}, {
|
|
base: 'OU',
|
|
letters: "\u0222"
|
|
}, {
|
|
base: 'P',
|
|
letters: "P\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754"
|
|
}, {
|
|
base: 'Q',
|
|
letters: "Q\u24C6\uFF31\uA756\uA758\u024A"
|
|
}, {
|
|
base: 'R',
|
|
letters: "R\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782"
|
|
}, {
|
|
base: 'S',
|
|
letters: "S\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784"
|
|
}, {
|
|
base: 'T',
|
|
letters: "T\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786"
|
|
}, {
|
|
base: 'TZ',
|
|
letters: "\uA728"
|
|
}, {
|
|
base: 'U',
|
|
letters: "U\u24CA\uFF35\xD9\xDA\xDB\u0168\u1E78\u016A\u1E7A\u016C\xDC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244"
|
|
}, {
|
|
base: 'V',
|
|
letters: "V\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245"
|
|
}, {
|
|
base: 'VY',
|
|
letters: "\uA760"
|
|
}, {
|
|
base: 'W',
|
|
letters: "W\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72"
|
|
}, {
|
|
base: 'X',
|
|
letters: "X\u24CD\uFF38\u1E8A\u1E8C"
|
|
}, {
|
|
base: 'Y',
|
|
letters: "Y\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE"
|
|
}, {
|
|
base: 'Z',
|
|
letters: "Z\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762"
|
|
}, {
|
|
base: 'a',
|
|
letters: "a\u24D0\uFF41\u1E9A\xE0\xE1\xE2\u1EA7\u1EA5\u1EAB\u1EA9\xE3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\xE4\u01DF\u1EA3\xE5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250"
|
|
}, {
|
|
base: 'aa',
|
|
letters: "\uA733"
|
|
}, {
|
|
base: 'ae',
|
|
letters: "\xE6\u01FD\u01E3"
|
|
}, {
|
|
base: 'ao',
|
|
letters: "\uA735"
|
|
}, {
|
|
base: 'au',
|
|
letters: "\uA737"
|
|
}, {
|
|
base: 'av',
|
|
letters: "\uA739\uA73B"
|
|
}, {
|
|
base: 'ay',
|
|
letters: "\uA73D"
|
|
}, {
|
|
base: 'b',
|
|
letters: "b\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253"
|
|
}, {
|
|
base: 'c',
|
|
letters: "c\u24D2\uFF43\u0107\u0109\u010B\u010D\xE7\u1E09\u0188\u023C\uA73F\u2184"
|
|
}, {
|
|
base: 'd',
|
|
letters: "d\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A"
|
|
}, {
|
|
base: 'dz',
|
|
letters: "\u01F3\u01C6"
|
|
}, {
|
|
base: 'e',
|
|
letters: "e\u24D4\uFF45\xE8\xE9\xEA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\xEB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD"
|
|
}, {
|
|
base: 'f',
|
|
letters: "f\u24D5\uFF46\u1E1F\u0192\uA77C"
|
|
}, {
|
|
base: 'g',
|
|
letters: "g\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F"
|
|
}, {
|
|
base: 'h',
|
|
letters: "h\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265"
|
|
}, {
|
|
base: 'hv',
|
|
letters: "\u0195"
|
|
}, {
|
|
base: 'i',
|
|
letters: "i\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131"
|
|
}, {
|
|
base: 'j',
|
|
letters: "j\u24D9\uFF4A\u0135\u01F0\u0249"
|
|
}, {
|
|
base: 'k',
|
|
letters: "k\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3"
|
|
}, {
|
|
base: 'l',
|
|
letters: "l\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747"
|
|
}, {
|
|
base: 'lj',
|
|
letters: "\u01C9"
|
|
}, {
|
|
base: 'm',
|
|
letters: "m\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F"
|
|
}, {
|
|
base: 'n',
|
|
letters: "n\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5"
|
|
}, {
|
|
base: 'nj',
|
|
letters: "\u01CC"
|
|
}, {
|
|
base: 'o',
|
|
letters: "o\u24DE\uFF4F\xF2\xF3\xF4\u1ED3\u1ED1\u1ED7\u1ED5\xF5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\xF6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\xF8\u01FF\u0254\uA74B\uA74D\u0275"
|
|
}, {
|
|
base: 'oi',
|
|
letters: "\u01A3"
|
|
}, {
|
|
base: 'ou',
|
|
letters: "\u0223"
|
|
}, {
|
|
base: 'oo',
|
|
letters: "\uA74F"
|
|
}, {
|
|
base: 'p',
|
|
letters: "p\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755"
|
|
}, {
|
|
base: 'q',
|
|
letters: "q\u24E0\uFF51\u024B\uA757\uA759"
|
|
}, {
|
|
base: 'r',
|
|
letters: "r\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783"
|
|
}, {
|
|
base: 's',
|
|
letters: "s\u24E2\uFF53\xDF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B"
|
|
}, {
|
|
base: 't',
|
|
letters: "t\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787"
|
|
}, {
|
|
base: 'tz',
|
|
letters: "\uA729"
|
|
}, {
|
|
base: 'u',
|
|
letters: "u\u24E4\uFF55\xF9\xFA\xFB\u0169\u1E79\u016B\u1E7B\u016D\xFC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289"
|
|
}, {
|
|
base: 'v',
|
|
letters: "v\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C"
|
|
}, {
|
|
base: 'vy',
|
|
letters: "\uA761"
|
|
}, {
|
|
base: 'w',
|
|
letters: "w\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73"
|
|
}, {
|
|
base: 'x',
|
|
letters: "x\u24E7\uFF58\u1E8B\u1E8D"
|
|
}, {
|
|
base: 'y',
|
|
letters: "y\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF"
|
|
}, {
|
|
base: 'z',
|
|
letters: "z\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763"
|
|
}];
|
|
var anyDiacritic = new RegExp('[' + diacritics.map(function (d) {
|
|
return d.letters;
|
|
}).join('') + ']', 'g');
|
|
var diacriticToBase = {};
|
|
|
|
for (var i = 0; i < diacritics.length; i++) {
|
|
var diacritic = diacritics[i];
|
|
|
|
for (var j = 0; j < diacritic.letters.length; j++) {
|
|
diacriticToBase[diacritic.letters[j]] = diacritic.base;
|
|
}
|
|
}
|
|
|
|
var stripDiacritics = function stripDiacritics(str) {
|
|
return str.replace(anyDiacritic, function (match) {
|
|
return diacriticToBase[match];
|
|
});
|
|
};
|
|
|
|
var memoizedStripDiacriticsForInput = memoizeOne(stripDiacritics);
|
|
|
|
var trimString = function trimString(str) {
|
|
return str.replace(/^\s+|\s+$/g, '');
|
|
};
|
|
|
|
var defaultStringify = function defaultStringify(option) {
|
|
return "".concat(option.label, " ").concat(option.value);
|
|
};
|
|
|
|
var createFilter = function createFilter(config) {
|
|
return function (option, rawInput) {
|
|
var _ignoreCase$ignoreAcc = _objectSpread2({
|
|
ignoreCase: true,
|
|
ignoreAccents: true,
|
|
stringify: defaultStringify,
|
|
trim: true,
|
|
matchFrom: 'any'
|
|
}, config),
|
|
ignoreCase = _ignoreCase$ignoreAcc.ignoreCase,
|
|
ignoreAccents = _ignoreCase$ignoreAcc.ignoreAccents,
|
|
stringify = _ignoreCase$ignoreAcc.stringify,
|
|
trim = _ignoreCase$ignoreAcc.trim,
|
|
matchFrom = _ignoreCase$ignoreAcc.matchFrom;
|
|
|
|
var input = trim ? trimString(rawInput) : rawInput;
|
|
var candidate = trim ? trimString(stringify(option)) : stringify(option);
|
|
|
|
if (ignoreCase) {
|
|
input = input.toLowerCase();
|
|
candidate = candidate.toLowerCase();
|
|
}
|
|
|
|
if (ignoreAccents) {
|
|
input = memoizedStripDiacriticsForInput(input);
|
|
candidate = stripDiacritics(candidate);
|
|
}
|
|
|
|
return matchFrom === 'start' ? candidate.substr(0, input.length) === input : candidate.indexOf(input) > -1;
|
|
};
|
|
};
|
|
|
|
function DummyInput(_ref) {
|
|
_ref.in;
|
|
_ref.out;
|
|
_ref.onExited;
|
|
_ref.appear;
|
|
_ref.enter;
|
|
_ref.exit;
|
|
var innerRef = _ref.innerRef;
|
|
_ref.emotion;
|
|
var props = _objectWithoutProperties(_ref, ["in", "out", "onExited", "appear", "enter", "exit", "innerRef", "emotion"]);
|
|
|
|
return jsx("input", _extends({
|
|
ref: innerRef
|
|
}, props, {
|
|
css: /*#__PURE__*/css({
|
|
label: 'dummyInput',
|
|
// get rid of any default styles
|
|
background: 0,
|
|
border: 0,
|
|
fontSize: 'inherit',
|
|
outline: 0,
|
|
padding: 0,
|
|
// important! without `width` browsers won't allow focus
|
|
width: 1,
|
|
// remove cursor on desktop
|
|
color: 'transparent',
|
|
// remove cursor on mobile whilst maintaining "scroll into view" behaviour
|
|
left: -100,
|
|
opacity: 0,
|
|
position: 'relative',
|
|
transform: 'scale(0)'
|
|
}, process.env.NODE_ENV === "production" ? "" : ";label:DummyInput;", process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkR1bW15SW5wdXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUJNIiwiZmlsZSI6IkR1bW15SW5wdXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuLyoqIEBqc3gganN4ICovXG5pbXBvcnQgeyBqc3ggfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIER1bW15SW5wdXQoe1xuICBpbjogaW5Qcm9wLFxuICBvdXQsXG4gIG9uRXhpdGVkLFxuICBhcHBlYXIsXG4gIGVudGVyLFxuICBleGl0LFxuICBpbm5lclJlZixcbiAgZW1vdGlvbixcbiAgLi4ucHJvcHNcbn06IGFueSkge1xuICByZXR1cm4gKFxuICAgIDxpbnB1dFxuICAgICAgcmVmPXtpbm5lclJlZn1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAgIGNzcz17e1xuICAgICAgICBsYWJlbDogJ2R1bW15SW5wdXQnLFxuICAgICAgICAvLyBnZXQgcmlkIG9mIGFueSBkZWZhdWx0IHN0eWxlc1xuICAgICAgICBiYWNrZ3JvdW5kOiAwLFxuICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgIGZvbnRTaXplOiAnaW5oZXJpdCcsXG4gICAgICAgIG91dGxpbmU6IDAsXG4gICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgIC8vIGltcG9ydGFudCEgd2l0aG91dCBgd2lkdGhgIGJyb3dzZXJzIHdvbid0IGFsbG93IGZvY3VzXG4gICAgICAgIHdpZHRoOiAxLFxuXG4gICAgICAgIC8vIHJlbW92ZSBjdXJzb3Igb24gZGVza3RvcFxuICAgICAgICBjb2xvcjogJ3RyYW5zcGFyZW50JyxcblxuICAgICAgICAvLyByZW1vdmUgY3Vyc29yIG9uIG1vYmlsZSB3aGlsc3QgbWFpbnRhaW5pbmcgXCJzY3JvbGwgaW50byB2aWV3XCIgYmVoYXZpb3VyXG4gICAgICAgIGxlZnQ6IC0xMDAsXG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZSgwKScsXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59XG4iXX0= */")
|
|
}));
|
|
}
|
|
|
|
var cancelScroll = function cancelScroll(event) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
};
|
|
|
|
function useScrollCapture(_ref) {
|
|
var isEnabled = _ref.isEnabled,
|
|
onBottomArrive = _ref.onBottomArrive,
|
|
onBottomLeave = _ref.onBottomLeave,
|
|
onTopArrive = _ref.onTopArrive,
|
|
onTopLeave = _ref.onTopLeave;
|
|
var isBottom = useRef(false);
|
|
var isTop = useRef(false);
|
|
var touchStart = useRef(0);
|
|
var scrollTarget = useRef(null);
|
|
var handleEventDelta = useCallback(function (event, delta) {
|
|
// Reference should never be `null` at this point, but flow complains otherwise
|
|
if (scrollTarget.current === null) return;
|
|
var _scrollTarget$current = scrollTarget.current,
|
|
scrollTop = _scrollTarget$current.scrollTop,
|
|
scrollHeight = _scrollTarget$current.scrollHeight,
|
|
clientHeight = _scrollTarget$current.clientHeight;
|
|
var target = scrollTarget.current;
|
|
var isDeltaPositive = delta > 0;
|
|
var availableScroll = scrollHeight - clientHeight - scrollTop;
|
|
var shouldCancelScroll = false; // reset bottom/top flags
|
|
|
|
if (availableScroll > delta && isBottom.current) {
|
|
if (onBottomLeave) onBottomLeave(event);
|
|
isBottom.current = false;
|
|
}
|
|
|
|
if (isDeltaPositive && isTop.current) {
|
|
if (onTopLeave) onTopLeave(event);
|
|
isTop.current = false;
|
|
} // bottom limit
|
|
|
|
|
|
if (isDeltaPositive && delta > availableScroll) {
|
|
if (onBottomArrive && !isBottom.current) {
|
|
onBottomArrive(event);
|
|
}
|
|
|
|
target.scrollTop = scrollHeight;
|
|
shouldCancelScroll = true;
|
|
isBottom.current = true; // top limit
|
|
} else if (!isDeltaPositive && -delta > scrollTop) {
|
|
if (onTopArrive && !isTop.current) {
|
|
onTopArrive(event);
|
|
}
|
|
|
|
target.scrollTop = 0;
|
|
shouldCancelScroll = true;
|
|
isTop.current = true;
|
|
} // cancel scroll
|
|
|
|
|
|
if (shouldCancelScroll) {
|
|
cancelScroll(event);
|
|
}
|
|
}, []);
|
|
var onWheel = useCallback(function (event) {
|
|
handleEventDelta(event, event.deltaY);
|
|
}, [handleEventDelta]);
|
|
var onTouchStart = useCallback(function (event) {
|
|
// set touch start so we can calculate touchmove delta
|
|
touchStart.current = event.changedTouches[0].clientY;
|
|
}, []);
|
|
var onTouchMove = useCallback(function (event) {
|
|
var deltaY = touchStart.current - event.changedTouches[0].clientY;
|
|
handleEventDelta(event, deltaY);
|
|
}, [handleEventDelta]);
|
|
var startListening = useCallback(function (el) {
|
|
// bail early if no element is available to attach to
|
|
if (!el) return;
|
|
var notPassive = supportsPassiveEvents ? {
|
|
passive: false
|
|
} : false; // all the if statements are to appease Flow 😢
|
|
|
|
if (typeof el.addEventListener === 'function') {
|
|
el.addEventListener('wheel', onWheel, notPassive);
|
|
}
|
|
|
|
if (typeof el.addEventListener === 'function') {
|
|
el.addEventListener('touchstart', onTouchStart, notPassive);
|
|
}
|
|
|
|
if (typeof el.addEventListener === 'function') {
|
|
el.addEventListener('touchmove', onTouchMove, notPassive);
|
|
}
|
|
}, [onTouchMove, onTouchStart, onWheel]);
|
|
var stopListening = useCallback(function (el) {
|
|
// bail early if no element is available to detach from
|
|
if (!el) return; // all the if statements are to appease Flow 😢
|
|
|
|
if (typeof el.removeEventListener === 'function') {
|
|
el.removeEventListener('wheel', onWheel, false);
|
|
}
|
|
|
|
if (typeof el.removeEventListener === 'function') {
|
|
el.removeEventListener('touchstart', onTouchStart, false);
|
|
}
|
|
|
|
if (typeof el.removeEventListener === 'function') {
|
|
el.removeEventListener('touchmove', onTouchMove, false);
|
|
}
|
|
}, [onTouchMove, onTouchStart, onWheel]);
|
|
useEffect(function () {
|
|
if (!isEnabled) return;
|
|
var element = scrollTarget.current;
|
|
startListening(element);
|
|
return function () {
|
|
stopListening(element);
|
|
};
|
|
}, [isEnabled, startListening, stopListening]);
|
|
return function (element) {
|
|
scrollTarget.current = element;
|
|
};
|
|
}
|
|
|
|
var STYLE_KEYS = ['boxSizing', 'height', 'overflow', 'paddingRight', 'position'];
|
|
var LOCK_STYLES = {
|
|
boxSizing: 'border-box',
|
|
// account for possible declaration `width: 100%;` on body
|
|
overflow: 'hidden',
|
|
position: 'relative',
|
|
height: '100%'
|
|
};
|
|
|
|
function preventTouchMove(e) {
|
|
e.preventDefault();
|
|
}
|
|
|
|
function allowTouchMove(e) {
|
|
e.stopPropagation();
|
|
}
|
|
|
|
function preventInertiaScroll() {
|
|
var top = this.scrollTop;
|
|
var totalScroll = this.scrollHeight;
|
|
var currentScroll = top + this.offsetHeight;
|
|
|
|
if (top === 0) {
|
|
this.scrollTop = 1;
|
|
} else if (currentScroll === totalScroll) {
|
|
this.scrollTop = top - 1;
|
|
}
|
|
} // `ontouchstart` check works on most browsers
|
|
// `maxTouchPoints` works on IE10/11 and Surface
|
|
|
|
|
|
function isTouchDevice() {
|
|
return 'ontouchstart' in window || navigator.maxTouchPoints;
|
|
}
|
|
|
|
var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
|
|
var activeScrollLocks = 0;
|
|
var listenerOptions = {
|
|
capture: false,
|
|
passive: false
|
|
};
|
|
function useScrollLock(_ref) {
|
|
var isEnabled = _ref.isEnabled,
|
|
_ref$accountForScroll = _ref.accountForScrollbars,
|
|
accountForScrollbars = _ref$accountForScroll === void 0 ? true : _ref$accountForScroll;
|
|
var originalStyles = useRef({});
|
|
var scrollTarget = useRef(null);
|
|
var addScrollLock = useCallback(function (touchScrollTarget) {
|
|
if (!canUseDOM) return;
|
|
var target = document.body;
|
|
var targetStyle = target && target.style;
|
|
|
|
if (accountForScrollbars) {
|
|
// store any styles already applied to the body
|
|
STYLE_KEYS.forEach(function (key) {
|
|
var val = targetStyle && targetStyle[key];
|
|
originalStyles.current[key] = val;
|
|
});
|
|
} // apply the lock styles and padding if this is the first scroll lock
|
|
|
|
|
|
if (accountForScrollbars && activeScrollLocks < 1) {
|
|
var currentPadding = parseInt(originalStyles.current.paddingRight, 10) || 0;
|
|
var clientWidth = document.body ? document.body.clientWidth : 0;
|
|
var adjustedPadding = window.innerWidth - clientWidth + currentPadding || 0;
|
|
Object.keys(LOCK_STYLES).forEach(function (key) {
|
|
var val = LOCK_STYLES[key];
|
|
|
|
if (targetStyle) {
|
|
targetStyle[key] = val;
|
|
}
|
|
});
|
|
|
|
if (targetStyle) {
|
|
targetStyle.paddingRight = "".concat(adjustedPadding, "px");
|
|
}
|
|
} // account for touch devices
|
|
|
|
|
|
if (target && isTouchDevice()) {
|
|
// Mobile Safari ignores { overflow: hidden } declaration on the body.
|
|
target.addEventListener('touchmove', preventTouchMove, listenerOptions); // Allow scroll on provided target
|
|
|
|
if (touchScrollTarget) {
|
|
touchScrollTarget.addEventListener('touchstart', preventInertiaScroll, listenerOptions);
|
|
touchScrollTarget.addEventListener('touchmove', allowTouchMove, listenerOptions);
|
|
}
|
|
} // increment active scroll locks
|
|
|
|
|
|
activeScrollLocks += 1;
|
|
}, []);
|
|
var removeScrollLock = useCallback(function (touchScrollTarget) {
|
|
if (!canUseDOM) return;
|
|
var target = document.body;
|
|
var targetStyle = target && target.style; // safely decrement active scroll locks
|
|
|
|
activeScrollLocks = Math.max(activeScrollLocks - 1, 0); // reapply original body styles, if any
|
|
|
|
if (accountForScrollbars && activeScrollLocks < 1) {
|
|
STYLE_KEYS.forEach(function (key) {
|
|
var val = originalStyles.current[key];
|
|
|
|
if (targetStyle) {
|
|
targetStyle[key] = val;
|
|
}
|
|
});
|
|
} // remove touch listeners
|
|
|
|
|
|
if (target && isTouchDevice()) {
|
|
target.removeEventListener('touchmove', preventTouchMove, listenerOptions);
|
|
|
|
if (touchScrollTarget) {
|
|
touchScrollTarget.removeEventListener('touchstart', preventInertiaScroll, listenerOptions);
|
|
touchScrollTarget.removeEventListener('touchmove', allowTouchMove, listenerOptions);
|
|
}
|
|
}
|
|
}, []);
|
|
useEffect(function () {
|
|
if (!isEnabled) return;
|
|
var element = scrollTarget.current;
|
|
addScrollLock(element);
|
|
return function () {
|
|
removeScrollLock(element);
|
|
};
|
|
}, [isEnabled, addScrollLock, removeScrollLock]);
|
|
return function (element) {
|
|
scrollTarget.current = element;
|
|
};
|
|
}
|
|
|
|
function _EMOTION_STRINGIFIED_CSS_ERROR__$1() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
|
|
|
var blurSelectInput = function blurSelectInput() {
|
|
return document.activeElement && document.activeElement.blur();
|
|
};
|
|
|
|
var _ref2 = process.env.NODE_ENV === "production" ? {
|
|
name: "1kfdb0e",
|
|
styles: "position:fixed;left:0;bottom:0;right:0;top:0"
|
|
} : {
|
|
name: "bp8cua-ScrollManager",
|
|
styles: "position:fixed;left:0;bottom:0;right:0;top:0;label:ScrollManager;",
|
|
map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcm9sbE1hbmFnZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0RVIiwiZmlsZSI6IlNjcm9sbE1hbmFnZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuLyoqIEBqc3gganN4ICovXG5pbXBvcnQgeyBqc3ggfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XG5pbXBvcnQgUmVhY3QsIHsgdHlwZSBFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZVNjcm9sbENhcHR1cmUgZnJvbSAnLi91c2VTY3JvbGxDYXB0dXJlJztcbmltcG9ydCB1c2VTY3JvbGxMb2NrIGZyb20gJy4vdXNlU2Nyb2xsTG9jayc7XG5cbnR5cGUgUmVmQ2FsbGJhY2s8VD4gPSAoVCB8IG51bGwpID0+IHZvaWQ7XG5cbnR5cGUgUHJvcHMgPSB7XG4gIGNoaWxkcmVuOiAoUmVmQ2FsbGJhY2s8SFRNTEVsZW1lbnQ+KSA9PiBFbGVtZW50PCo+LFxuICBsb2NrRW5hYmxlZDogYm9vbGVhbixcbiAgY2FwdHVyZUVuYWJsZWQ6IGJvb2xlYW4sXG4gIG9uQm90dG9tQXJyaXZlPzogKGV2ZW50OiBTeW50aGV0aWNFdmVudDxIVE1MRWxlbWVudD4pID0+IHZvaWQsXG4gIG9uQm90dG9tTGVhdmU/OiAoZXZlbnQ6IFN5bnRoZXRpY0V2ZW50PEhUTUxFbGVtZW50PikgPT4gdm9pZCxcbiAgb25Ub3BBcnJpdmU/OiAoZXZlbnQ6IFN5bnRoZXRpY0V2ZW50PEhUTUxFbGVtZW50PikgPT4gdm9pZCxcbiAgb25Ub3BMZWF2ZT86IChldmVudDogU3ludGhldGljRXZlbnQ8SFRNTEVsZW1lbnQ+KSA9PiB2b2lkLFxufTtcblxuY29uc3QgYmx1clNlbGVjdElucHV0ID0gKCkgPT5cbiAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2Nyb2xsTWFuYWdlcih7XG4gIGNoaWxkcmVuLFxuICBsb2NrRW5hYmxlZCxcbiAgY2FwdHVyZUVuYWJsZWQgPSB0cnVlLFxuICBvbkJvdHRvbUFycml2ZSxcbiAgb25Cb3R0b21MZWF2ZSxcbiAgb25Ub3BBcnJpdmUsXG4gIG9uVG9wTGVhdmUsXG59OiBQcm9wcykge1xuICBjb25zdCBzZXRTY3JvbGxDYXB0dXJlVGFyZ2V0ID0gdXNlU2Nyb2xsQ2FwdHVyZSh7XG4gICAgaXNFbmFibGVkOiBjYXB0dXJlRW5hYmxlZCxcbiAgICBvbkJvdHRvbUFycml2ZSxcbiAgICBvbkJvdHRvbUxlYXZlLFxuICAgIG9uVG9wQXJyaXZlLFxuICAgIG9uVG9wTGVhdmUsXG4gIH0pO1xuICBjb25zdCBzZXRTY3JvbGxMb2NrVGFyZ2V0ID0gdXNlU2Nyb2xsTG9jayh7IGlzRW5hYmxlZDogbG9ja0VuYWJsZWQgfSk7XG5cbiAgY29uc3QgdGFyZ2V0UmVmID0gZWxlbWVudCA9PiB7XG4gICAgc2V0U2Nyb2xsQ2FwdHVyZVRhcmdldChlbGVtZW50KTtcbiAgICBzZXRTY3JvbGxMb2NrVGFyZ2V0KGVsZW1lbnQpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAge2xvY2tFbmFibGVkICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIG9uQ2xpY2s9e2JsdXJTZWxlY3RJbnB1dH1cbiAgICAgICAgICBjc3M9e3sgcG9zaXRpb246ICdmaXhlZCcsIGxlZnQ6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDAsIHRvcDogMCB9fVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHtjaGlsZHJlbih0YXJnZXRSZWYpfVxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICk7XG59XG4iXX0= */",
|
|
toString: _EMOTION_STRINGIFIED_CSS_ERROR__$1
|
|
};
|
|
|
|
function ScrollManager(_ref) {
|
|
var children = _ref.children,
|
|
lockEnabled = _ref.lockEnabled,
|
|
_ref$captureEnabled = _ref.captureEnabled,
|
|
captureEnabled = _ref$captureEnabled === void 0 ? true : _ref$captureEnabled,
|
|
onBottomArrive = _ref.onBottomArrive,
|
|
onBottomLeave = _ref.onBottomLeave,
|
|
onTopArrive = _ref.onTopArrive,
|
|
onTopLeave = _ref.onTopLeave;
|
|
var setScrollCaptureTarget = useScrollCapture({
|
|
isEnabled: captureEnabled,
|
|
onBottomArrive: onBottomArrive,
|
|
onBottomLeave: onBottomLeave,
|
|
onTopArrive: onTopArrive,
|
|
onTopLeave: onTopLeave
|
|
});
|
|
var setScrollLockTarget = useScrollLock({
|
|
isEnabled: lockEnabled
|
|
});
|
|
|
|
var targetRef = function targetRef(element) {
|
|
setScrollCaptureTarget(element);
|
|
setScrollLockTarget(element);
|
|
};
|
|
|
|
return jsx(React.Fragment, null, lockEnabled && jsx("div", {
|
|
onClick: blurSelectInput,
|
|
css: _ref2
|
|
}), children(targetRef));
|
|
}
|
|
|
|
var formatGroupLabel = function formatGroupLabel(group) {
|
|
return group.label;
|
|
};
|
|
var getOptionLabel = function getOptionLabel(option) {
|
|
return option.label;
|
|
};
|
|
var getOptionValue = function getOptionValue(option) {
|
|
return option.value;
|
|
};
|
|
var isOptionDisabled = function isOptionDisabled(option) {
|
|
return !!option.isDisabled;
|
|
};
|
|
|
|
var defaultStyles = {
|
|
clearIndicator: clearIndicatorCSS,
|
|
container: containerCSS,
|
|
control: css$1,
|
|
dropdownIndicator: dropdownIndicatorCSS,
|
|
group: groupCSS,
|
|
groupHeading: groupHeadingCSS,
|
|
indicatorsContainer: indicatorsContainerCSS,
|
|
indicatorSeparator: indicatorSeparatorCSS,
|
|
input: inputCSS,
|
|
loadingIndicator: loadingIndicatorCSS,
|
|
loadingMessage: loadingMessageCSS,
|
|
menu: menuCSS,
|
|
menuList: menuListCSS,
|
|
menuPortal: menuPortalCSS,
|
|
multiValue: multiValueCSS,
|
|
multiValueLabel: multiValueLabelCSS,
|
|
multiValueRemove: multiValueRemoveCSS,
|
|
noOptionsMessage: noOptionsMessageCSS,
|
|
option: optionCSS,
|
|
placeholder: placeholderCSS,
|
|
singleValue: css$2,
|
|
valueContainer: valueContainerCSS
|
|
}; // Merge Utility
|
|
// Allows consumers to extend a base Select with additional styles
|
|
|
|
function mergeStyles(source) {
|
|
var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
|
|
// initialize with source styles
|
|
var styles = _objectSpread2({}, source); // massage in target styles
|
|
|
|
|
|
Object.keys(target).forEach(function (key) {
|
|
if (source[key]) {
|
|
styles[key] = function (rsCss, props) {
|
|
return target[key](source[key](rsCss, props), props);
|
|
};
|
|
} else {
|
|
styles[key] = target[key];
|
|
}
|
|
});
|
|
return styles;
|
|
}
|
|
|
|
var colors = {
|
|
primary: '#2684FF',
|
|
primary75: '#4C9AFF',
|
|
primary50: '#B2D4FF',
|
|
primary25: '#DEEBFF',
|
|
danger: '#DE350B',
|
|
dangerLight: '#FFBDAD',
|
|
neutral0: 'hsl(0, 0%, 100%)',
|
|
neutral5: 'hsl(0, 0%, 95%)',
|
|
neutral10: 'hsl(0, 0%, 90%)',
|
|
neutral20: 'hsl(0, 0%, 80%)',
|
|
neutral30: 'hsl(0, 0%, 70%)',
|
|
neutral40: 'hsl(0, 0%, 60%)',
|
|
neutral50: 'hsl(0, 0%, 50%)',
|
|
neutral60: 'hsl(0, 0%, 40%)',
|
|
neutral70: 'hsl(0, 0%, 30%)',
|
|
neutral80: 'hsl(0, 0%, 20%)',
|
|
neutral90: 'hsl(0, 0%, 10%)'
|
|
};
|
|
var borderRadius = 4; // Used to calculate consistent margin/padding on elements
|
|
|
|
var baseUnit = 4; // The minimum height of the control
|
|
|
|
var controlHeight = 38; // The amount of space between the control and menu */
|
|
|
|
var menuGutter = baseUnit * 2;
|
|
var spacing = {
|
|
baseUnit: baseUnit,
|
|
controlHeight: controlHeight,
|
|
menuGutter: menuGutter
|
|
};
|
|
var defaultTheme = {
|
|
borderRadius: borderRadius,
|
|
colors: colors,
|
|
spacing: spacing
|
|
};
|
|
|
|
var defaultProps = {
|
|
'aria-live': 'polite',
|
|
backspaceRemovesValue: true,
|
|
blurInputOnSelect: isTouchCapable(),
|
|
captureMenuScroll: !isTouchCapable(),
|
|
closeMenuOnSelect: true,
|
|
closeMenuOnScroll: false,
|
|
components: {},
|
|
controlShouldRenderValue: true,
|
|
escapeClearsValue: false,
|
|
filterOption: createFilter(),
|
|
formatGroupLabel: formatGroupLabel,
|
|
getOptionLabel: getOptionLabel,
|
|
getOptionValue: getOptionValue,
|
|
isDisabled: false,
|
|
isLoading: false,
|
|
isMulti: false,
|
|
isRtl: false,
|
|
isSearchable: true,
|
|
isOptionDisabled: isOptionDisabled,
|
|
loadingMessage: function loadingMessage() {
|
|
return 'Loading...';
|
|
},
|
|
maxMenuHeight: 300,
|
|
minMenuHeight: 140,
|
|
menuIsOpen: false,
|
|
menuPlacement: 'bottom',
|
|
menuPosition: 'absolute',
|
|
menuShouldBlockScroll: false,
|
|
menuShouldScrollIntoView: !isMobileDevice(),
|
|
noOptionsMessage: function noOptionsMessage() {
|
|
return 'No options';
|
|
},
|
|
openMenuOnFocus: false,
|
|
openMenuOnClick: true,
|
|
options: [],
|
|
pageSize: 5,
|
|
placeholder: 'Select...',
|
|
screenReaderStatus: function screenReaderStatus(_ref) {
|
|
var count = _ref.count;
|
|
return "".concat(count, " result").concat(count !== 1 ? 's' : '', " available");
|
|
},
|
|
styles: {},
|
|
tabIndex: '0',
|
|
tabSelectsValue: true
|
|
};
|
|
|
|
function toCategorizedOption(props, option, selectValue, index) {
|
|
var isDisabled = _isOptionDisabled(props, option, selectValue);
|
|
|
|
var isSelected = _isOptionSelected(props, option, selectValue);
|
|
|
|
var label = getOptionLabel$1(props, option);
|
|
var value = getOptionValue$1(props, option);
|
|
return {
|
|
type: 'option',
|
|
data: option,
|
|
isDisabled: isDisabled,
|
|
isSelected: isSelected,
|
|
label: label,
|
|
value: value,
|
|
index: index
|
|
};
|
|
}
|
|
|
|
function buildCategorizedOptions(props, selectValue) {
|
|
return props.options.map(function (groupOrOption, groupOrOptionIndex) {
|
|
if (groupOrOption.options) {
|
|
var categorizedOptions = groupOrOption.options.map(function (option, optionIndex) {
|
|
return toCategorizedOption(props, option, selectValue, optionIndex);
|
|
}).filter(function (categorizedOption) {
|
|
return isFocusable(props, categorizedOption);
|
|
});
|
|
return categorizedOptions.length > 0 ? {
|
|
type: 'group',
|
|
data: groupOrOption,
|
|
options: categorizedOptions,
|
|
index: groupOrOptionIndex
|
|
} : undefined;
|
|
}
|
|
|
|
var categorizedOption = toCategorizedOption(props, groupOrOption, selectValue, groupOrOptionIndex);
|
|
return isFocusable(props, categorizedOption) ? categorizedOption : undefined;
|
|
}) // Flow limitation (see https://github.com/facebook/flow/issues/1414)
|
|
.filter(function (categorizedOption) {
|
|
return !!categorizedOption;
|
|
});
|
|
}
|
|
|
|
function buildFocusableOptionsFromCategorizedOptions(categorizedOptions) {
|
|
return categorizedOptions.reduce(function (optionsAccumulator, categorizedOption) {
|
|
if (categorizedOption.type === 'group') {
|
|
optionsAccumulator.push.apply(optionsAccumulator, _toConsumableArray(categorizedOption.options.map(function (option) {
|
|
return option.data;
|
|
})));
|
|
} else {
|
|
optionsAccumulator.push(categorizedOption.data);
|
|
}
|
|
|
|
return optionsAccumulator;
|
|
}, []);
|
|
}
|
|
|
|
function buildFocusableOptions(props, selectValue) {
|
|
return buildFocusableOptionsFromCategorizedOptions(buildCategorizedOptions(props, selectValue));
|
|
}
|
|
|
|
function isFocusable(props, categorizedOption) {
|
|
var _props$inputValue = props.inputValue,
|
|
inputValue = _props$inputValue === void 0 ? '' : _props$inputValue;
|
|
var data = categorizedOption.data,
|
|
isSelected = categorizedOption.isSelected,
|
|
label = categorizedOption.label,
|
|
value = categorizedOption.value;
|
|
return (!shouldHideSelectedOptions(props) || !isSelected) && _filterOption(props, {
|
|
label: label,
|
|
value: value,
|
|
data: data
|
|
}, inputValue);
|
|
}
|
|
|
|
function getNextFocusedValue(state, nextSelectValue) {
|
|
var focusedValue = state.focusedValue,
|
|
lastSelectValue = state.selectValue;
|
|
var lastFocusedIndex = lastSelectValue.indexOf(focusedValue);
|
|
|
|
if (lastFocusedIndex > -1) {
|
|
var nextFocusedIndex = nextSelectValue.indexOf(focusedValue);
|
|
|
|
if (nextFocusedIndex > -1) {
|
|
// the focused value is still in the selectValue, return it
|
|
return focusedValue;
|
|
} else if (lastFocusedIndex < nextSelectValue.length) {
|
|
// the focusedValue is not present in the next selectValue array by
|
|
// reference, so return the new value at the same index
|
|
return nextSelectValue[lastFocusedIndex];
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
function getNextFocusedOption(state, options) {
|
|
var lastFocusedOption = state.focusedOption;
|
|
return lastFocusedOption && options.indexOf(lastFocusedOption) > -1 ? lastFocusedOption : options[0];
|
|
}
|
|
|
|
var getOptionLabel$1 = function getOptionLabel(props, data) {
|
|
return props.getOptionLabel(data);
|
|
};
|
|
|
|
var getOptionValue$1 = function getOptionValue(props, data) {
|
|
return props.getOptionValue(data);
|
|
};
|
|
|
|
function _isOptionDisabled(props, option, selectValue) {
|
|
return typeof props.isOptionDisabled === 'function' ? props.isOptionDisabled(option, selectValue) : false;
|
|
}
|
|
|
|
function _isOptionSelected(props, option, selectValue) {
|
|
if (selectValue.indexOf(option) > -1) return true;
|
|
|
|
if (typeof props.isOptionSelected === 'function') {
|
|
return props.isOptionSelected(option, selectValue);
|
|
}
|
|
|
|
var candidate = getOptionValue$1(props, option);
|
|
return selectValue.some(function (i) {
|
|
return getOptionValue$1(props, i) === candidate;
|
|
});
|
|
}
|
|
|
|
function _filterOption(props, option, inputValue) {
|
|
return props.filterOption ? props.filterOption(option, inputValue) : true;
|
|
}
|
|
|
|
var shouldHideSelectedOptions = function shouldHideSelectedOptions(props) {
|
|
var hideSelectedOptions = props.hideSelectedOptions,
|
|
isMulti = props.isMulti;
|
|
if (hideSelectedOptions === undefined) return isMulti;
|
|
return hideSelectedOptions;
|
|
};
|
|
|
|
var instanceId = 1;
|
|
|
|
var Select = /*#__PURE__*/function (_Component) {
|
|
_inherits(Select, _Component);
|
|
|
|
var _super = _createSuper(Select);
|
|
|
|
// Misc. Instance Properties
|
|
// ------------------------------
|
|
// TODO
|
|
// Refs
|
|
// ------------------------------
|
|
// Lifecycle
|
|
// ------------------------------
|
|
function Select(_props) {
|
|
var _this;
|
|
|
|
_classCallCheck(this, Select);
|
|
|
|
_this = _super.call(this, _props);
|
|
_this.state = {
|
|
ariaSelection: null,
|
|
focusedOption: null,
|
|
focusedValue: null,
|
|
inputIsHidden: false,
|
|
isFocused: false,
|
|
selectValue: [],
|
|
clearFocusValueOnUpdate: false,
|
|
inputIsHiddenAfterUpdate: undefined,
|
|
prevProps: undefined
|
|
};
|
|
_this.blockOptionHover = false;
|
|
_this.isComposing = false;
|
|
_this.commonProps = void 0;
|
|
_this.initialTouchX = 0;
|
|
_this.initialTouchY = 0;
|
|
_this.instancePrefix = '';
|
|
_this.openAfterFocus = false;
|
|
_this.scrollToFocusedOptionOnUpdate = false;
|
|
_this.userIsDragging = void 0;
|
|
_this.controlRef = null;
|
|
|
|
_this.getControlRef = function (ref) {
|
|
_this.controlRef = ref;
|
|
};
|
|
|
|
_this.focusedOptionRef = null;
|
|
|
|
_this.getFocusedOptionRef = function (ref) {
|
|
_this.focusedOptionRef = ref;
|
|
};
|
|
|
|
_this.menuListRef = null;
|
|
|
|
_this.getMenuListRef = function (ref) {
|
|
_this.menuListRef = ref;
|
|
};
|
|
|
|
_this.inputRef = null;
|
|
|
|
_this.getInputRef = function (ref) {
|
|
_this.inputRef = ref;
|
|
};
|
|
|
|
_this.focus = _this.focusInput;
|
|
_this.blur = _this.blurInput;
|
|
|
|
_this.onChange = function (newValue, actionMeta) {
|
|
var _this$props = _this.props,
|
|
onChange = _this$props.onChange,
|
|
name = _this$props.name;
|
|
actionMeta.name = name;
|
|
|
|
_this.ariaOnChange(newValue, actionMeta);
|
|
|
|
onChange(newValue, actionMeta);
|
|
};
|
|
|
|
_this.setValue = function (newValue) {
|
|
var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'set-value';
|
|
var option = arguments.length > 2 ? arguments[2] : undefined;
|
|
var _this$props2 = _this.props,
|
|
closeMenuOnSelect = _this$props2.closeMenuOnSelect,
|
|
isMulti = _this$props2.isMulti;
|
|
|
|
_this.onInputChange('', {
|
|
action: 'set-value'
|
|
});
|
|
|
|
if (closeMenuOnSelect) {
|
|
_this.setState({
|
|
inputIsHiddenAfterUpdate: !isMulti
|
|
});
|
|
|
|
_this.onMenuClose();
|
|
} // when the select value should change, we should reset focusedValue
|
|
|
|
|
|
_this.setState({
|
|
clearFocusValueOnUpdate: true
|
|
});
|
|
|
|
_this.onChange(newValue, {
|
|
action: action,
|
|
option: option
|
|
});
|
|
};
|
|
|
|
_this.selectOption = function (newValue) {
|
|
var _this$props3 = _this.props,
|
|
blurInputOnSelect = _this$props3.blurInputOnSelect,
|
|
isMulti = _this$props3.isMulti,
|
|
name = _this$props3.name;
|
|
var selectValue = _this.state.selectValue;
|
|
|
|
var deselected = isMulti && _this.isOptionSelected(newValue, selectValue);
|
|
|
|
var isDisabled = _this.isOptionDisabled(newValue, selectValue);
|
|
|
|
if (deselected) {
|
|
var candidate = _this.getOptionValue(newValue);
|
|
|
|
_this.setValue(selectValue.filter(function (i) {
|
|
return _this.getOptionValue(i) !== candidate;
|
|
}), 'deselect-option', newValue);
|
|
} else if (!isDisabled) {
|
|
// Select option if option is not disabled
|
|
if (isMulti) {
|
|
_this.setValue([].concat(_toConsumableArray(selectValue), [newValue]), 'select-option', newValue);
|
|
} else {
|
|
_this.setValue(newValue, 'select-option');
|
|
}
|
|
} else {
|
|
_this.ariaOnChange(newValue, {
|
|
action: 'select-option',
|
|
name: name
|
|
});
|
|
|
|
return;
|
|
}
|
|
|
|
if (blurInputOnSelect) {
|
|
_this.blurInput();
|
|
}
|
|
};
|
|
|
|
_this.removeValue = function (removedValue) {
|
|
var isMulti = _this.props.isMulti;
|
|
var selectValue = _this.state.selectValue;
|
|
|
|
var candidate = _this.getOptionValue(removedValue);
|
|
|
|
var newValueArray = selectValue.filter(function (i) {
|
|
return _this.getOptionValue(i) !== candidate;
|
|
});
|
|
var newValue = isMulti ? newValueArray : newValueArray[0] || null;
|
|
|
|
_this.onChange(newValue, {
|
|
action: 'remove-value',
|
|
removedValue: removedValue
|
|
});
|
|
|
|
_this.focusInput();
|
|
};
|
|
|
|
_this.clearValue = function () {
|
|
var selectValue = _this.state.selectValue;
|
|
|
|
_this.onChange(_this.props.isMulti ? [] : null, {
|
|
action: 'clear',
|
|
removedValues: selectValue
|
|
});
|
|
};
|
|
|
|
_this.popValue = function () {
|
|
var isMulti = _this.props.isMulti;
|
|
var selectValue = _this.state.selectValue;
|
|
var lastSelectedValue = selectValue[selectValue.length - 1];
|
|
var newValueArray = selectValue.slice(0, selectValue.length - 1);
|
|
var newValue = isMulti ? newValueArray : newValueArray[0] || null;
|
|
|
|
_this.onChange(newValue, {
|
|
action: 'pop-value',
|
|
removedValue: lastSelectedValue
|
|
});
|
|
};
|
|
|
|
_this.getValue = function () {
|
|
return _this.state.selectValue;
|
|
};
|
|
|
|
_this.cx = function () {
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return classNames.apply(void 0, [_this.props.classNamePrefix].concat(args));
|
|
};
|
|
|
|
_this.getOptionLabel = function (data) {
|
|
return getOptionLabel$1(_this.props, data);
|
|
};
|
|
|
|
_this.getOptionValue = function (data) {
|
|
return getOptionValue$1(_this.props, data);
|
|
};
|
|
|
|
_this.getStyles = function (key, props) {
|
|
var base = defaultStyles[key](props);
|
|
base.boxSizing = 'border-box';
|
|
var custom = _this.props.styles[key];
|
|
return custom ? custom(base, props) : base;
|
|
};
|
|
|
|
_this.getElementId = function (element) {
|
|
return "".concat(_this.instancePrefix, "-").concat(element);
|
|
};
|
|
|
|
_this.getComponents = function () {
|
|
return defaultComponents(_this.props);
|
|
};
|
|
|
|
_this.buildCategorizedOptions = function () {
|
|
return buildCategorizedOptions(_this.props, _this.state.selectValue);
|
|
};
|
|
|
|
_this.getCategorizedOptions = function () {
|
|
return _this.props.menuIsOpen ? _this.buildCategorizedOptions() : [];
|
|
};
|
|
|
|
_this.buildFocusableOptions = function () {
|
|
return buildFocusableOptionsFromCategorizedOptions(_this.buildCategorizedOptions());
|
|
};
|
|
|
|
_this.getFocusableOptions = function () {
|
|
return _this.props.menuIsOpen ? _this.buildFocusableOptions() : [];
|
|
};
|
|
|
|
_this.ariaOnChange = function (value, actionMeta) {
|
|
_this.setState({
|
|
ariaSelection: _objectSpread2({
|
|
value: value
|
|
}, actionMeta)
|
|
});
|
|
};
|
|
|
|
_this.onMenuMouseDown = function (event) {
|
|
if (event.button !== 0) {
|
|
return;
|
|
}
|
|
|
|
event.stopPropagation();
|
|
event.preventDefault();
|
|
|
|
_this.focusInput();
|
|
};
|
|
|
|
_this.onMenuMouseMove = function (event) {
|
|
_this.blockOptionHover = false;
|
|
};
|
|
|
|
_this.onControlMouseDown = function (event) {
|
|
var openMenuOnClick = _this.props.openMenuOnClick;
|
|
|
|
if (!_this.state.isFocused) {
|
|
if (openMenuOnClick) {
|
|
_this.openAfterFocus = true;
|
|
}
|
|
|
|
_this.focusInput();
|
|
} else if (!_this.props.menuIsOpen) {
|
|
if (openMenuOnClick) {
|
|
_this.openMenu('first');
|
|
}
|
|
} else {
|
|
if ( // $FlowFixMe
|
|
event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') {
|
|
_this.onMenuClose();
|
|
}
|
|
}
|
|
|
|
if ( // $FlowFixMe
|
|
event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') {
|
|
event.preventDefault();
|
|
}
|
|
};
|
|
|
|
_this.onDropdownIndicatorMouseDown = function (event) {
|
|
// ignore mouse events that weren't triggered by the primary button
|
|
if (event && event.type === 'mousedown' && event.button !== 0) {
|
|
return;
|
|
}
|
|
|
|
if (_this.props.isDisabled) return;
|
|
var _this$props4 = _this.props,
|
|
isMulti = _this$props4.isMulti,
|
|
menuIsOpen = _this$props4.menuIsOpen;
|
|
|
|
_this.focusInput();
|
|
|
|
if (menuIsOpen) {
|
|
_this.setState({
|
|
inputIsHiddenAfterUpdate: !isMulti
|
|
});
|
|
|
|
_this.onMenuClose();
|
|
} else {
|
|
_this.openMenu('first');
|
|
}
|
|
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
};
|
|
|
|
_this.onClearIndicatorMouseDown = function (event) {
|
|
// ignore mouse events that weren't triggered by the primary button
|
|
if (event && event.type === 'mousedown' && event.button !== 0) {
|
|
return;
|
|
}
|
|
|
|
_this.clearValue();
|
|
|
|
event.stopPropagation();
|
|
_this.openAfterFocus = false;
|
|
|
|
if (event.type === 'touchend') {
|
|
_this.focusInput();
|
|
} else {
|
|
setTimeout(function () {
|
|
return _this.focusInput();
|
|
});
|
|
}
|
|
};
|
|
|
|
_this.onScroll = function (event) {
|
|
if (typeof _this.props.closeMenuOnScroll === 'boolean') {
|
|
if (event.target instanceof HTMLElement && isDocumentElement(event.target)) {
|
|
_this.props.onMenuClose();
|
|
}
|
|
} else if (typeof _this.props.closeMenuOnScroll === 'function') {
|
|
if (_this.props.closeMenuOnScroll(event)) {
|
|
_this.props.onMenuClose();
|
|
}
|
|
}
|
|
};
|
|
|
|
_this.onCompositionStart = function () {
|
|
_this.isComposing = true;
|
|
};
|
|
|
|
_this.onCompositionEnd = function () {
|
|
_this.isComposing = false;
|
|
};
|
|
|
|
_this.onTouchStart = function (_ref2) {
|
|
var touches = _ref2.touches;
|
|
var touch = touches && touches.item(0);
|
|
|
|
if (!touch) {
|
|
return;
|
|
}
|
|
|
|
_this.initialTouchX = touch.clientX;
|
|
_this.initialTouchY = touch.clientY;
|
|
_this.userIsDragging = false;
|
|
};
|
|
|
|
_this.onTouchMove = function (_ref3) {
|
|
var touches = _ref3.touches;
|
|
var touch = touches && touches.item(0);
|
|
|
|
if (!touch) {
|
|
return;
|
|
}
|
|
|
|
var deltaX = Math.abs(touch.clientX - _this.initialTouchX);
|
|
var deltaY = Math.abs(touch.clientY - _this.initialTouchY);
|
|
var moveThreshold = 5;
|
|
_this.userIsDragging = deltaX > moveThreshold || deltaY > moveThreshold;
|
|
};
|
|
|
|
_this.onTouchEnd = function (event) {
|
|
if (_this.userIsDragging) return; // close the menu if the user taps outside
|
|
// we're checking on event.target here instead of event.currentTarget, because we want to assert information
|
|
// on events on child elements, not the document (which we've attached this handler to).
|
|
|
|
if (_this.controlRef && !_this.controlRef.contains(event.target) && _this.menuListRef && !_this.menuListRef.contains(event.target)) {
|
|
_this.blurInput();
|
|
} // reset move vars
|
|
|
|
|
|
_this.initialTouchX = 0;
|
|
_this.initialTouchY = 0;
|
|
};
|
|
|
|
_this.onControlTouchEnd = function (event) {
|
|
if (_this.userIsDragging) return;
|
|
|
|
_this.onControlMouseDown(event);
|
|
};
|
|
|
|
_this.onClearIndicatorTouchEnd = function (event) {
|
|
if (_this.userIsDragging) return;
|
|
|
|
_this.onClearIndicatorMouseDown(event);
|
|
};
|
|
|
|
_this.onDropdownIndicatorTouchEnd = function (event) {
|
|
if (_this.userIsDragging) return;
|
|
|
|
_this.onDropdownIndicatorMouseDown(event);
|
|
};
|
|
|
|
_this.handleInputChange = function (event) {
|
|
var inputValue = event.currentTarget.value;
|
|
|
|
_this.setState({
|
|
inputIsHiddenAfterUpdate: false
|
|
});
|
|
|
|
_this.onInputChange(inputValue, {
|
|
action: 'input-change'
|
|
});
|
|
|
|
if (!_this.props.menuIsOpen) {
|
|
_this.onMenuOpen();
|
|
}
|
|
};
|
|
|
|
_this.onInputFocus = function (event) {
|
|
if (_this.props.onFocus) {
|
|
_this.props.onFocus(event);
|
|
}
|
|
|
|
_this.setState({
|
|
inputIsHiddenAfterUpdate: false,
|
|
isFocused: true
|
|
});
|
|
|
|
if (_this.openAfterFocus || _this.props.openMenuOnFocus) {
|
|
_this.openMenu('first');
|
|
}
|
|
|
|
_this.openAfterFocus = false;
|
|
};
|
|
|
|
_this.onInputBlur = function (event) {
|
|
if (_this.menuListRef && _this.menuListRef.contains(document.activeElement)) {
|
|
_this.inputRef.focus();
|
|
|
|
return;
|
|
}
|
|
|
|
if (_this.props.onBlur) {
|
|
_this.props.onBlur(event);
|
|
}
|
|
|
|
_this.onInputChange('', {
|
|
action: 'input-blur'
|
|
});
|
|
|
|
_this.onMenuClose();
|
|
|
|
_this.setState({
|
|
focusedValue: null,
|
|
isFocused: false
|
|
});
|
|
};
|
|
|
|
_this.onOptionHover = function (focusedOption) {
|
|
if (_this.blockOptionHover || _this.state.focusedOption === focusedOption) {
|
|
return;
|
|
}
|
|
|
|
_this.setState({
|
|
focusedOption: focusedOption
|
|
});
|
|
};
|
|
|
|
_this.shouldHideSelectedOptions = function () {
|
|
return shouldHideSelectedOptions(_this.props);
|
|
};
|
|
|
|
_this.onKeyDown = function (event) {
|
|
var _this$props5 = _this.props,
|
|
isMulti = _this$props5.isMulti,
|
|
backspaceRemovesValue = _this$props5.backspaceRemovesValue,
|
|
escapeClearsValue = _this$props5.escapeClearsValue,
|
|
inputValue = _this$props5.inputValue,
|
|
isClearable = _this$props5.isClearable,
|
|
isDisabled = _this$props5.isDisabled,
|
|
menuIsOpen = _this$props5.menuIsOpen,
|
|
onKeyDown = _this$props5.onKeyDown,
|
|
tabSelectsValue = _this$props5.tabSelectsValue,
|
|
openMenuOnFocus = _this$props5.openMenuOnFocus;
|
|
var _this$state = _this.state,
|
|
focusedOption = _this$state.focusedOption,
|
|
focusedValue = _this$state.focusedValue,
|
|
selectValue = _this$state.selectValue;
|
|
if (isDisabled) return;
|
|
|
|
if (typeof onKeyDown === 'function') {
|
|
onKeyDown(event);
|
|
|
|
if (event.defaultPrevented) {
|
|
return;
|
|
}
|
|
} // Block option hover events when the user has just pressed a key
|
|
|
|
|
|
_this.blockOptionHover = true;
|
|
|
|
switch (event.key) {
|
|
case 'ArrowLeft':
|
|
if (!isMulti || inputValue) return;
|
|
|
|
_this.focusValue('previous');
|
|
|
|
break;
|
|
|
|
case 'ArrowRight':
|
|
if (!isMulti || inputValue) return;
|
|
|
|
_this.focusValue('next');
|
|
|
|
break;
|
|
|
|
case 'Delete':
|
|
case 'Backspace':
|
|
if (inputValue) return;
|
|
|
|
if (focusedValue) {
|
|
_this.removeValue(focusedValue);
|
|
} else {
|
|
if (!backspaceRemovesValue) return;
|
|
|
|
if (isMulti) {
|
|
_this.popValue();
|
|
} else if (isClearable) {
|
|
_this.clearValue();
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case 'Tab':
|
|
if (_this.isComposing) return;
|
|
|
|
if (event.shiftKey || !menuIsOpen || !tabSelectsValue || !focusedOption || // don't capture the event if the menu opens on focus and the focused
|
|
// option is already selected; it breaks the flow of navigation
|
|
openMenuOnFocus && _this.isOptionSelected(focusedOption, selectValue)) {
|
|
return;
|
|
}
|
|
|
|
_this.selectOption(focusedOption);
|
|
|
|
break;
|
|
|
|
case 'Enter':
|
|
if (event.keyCode === 229) {
|
|
// ignore the keydown event from an Input Method Editor(IME)
|
|
// ref. https://www.w3.org/TR/uievents/#determine-keydown-keyup-keyCode
|
|
break;
|
|
}
|
|
|
|
if (menuIsOpen) {
|
|
if (!focusedOption) return;
|
|
if (_this.isComposing) return;
|
|
|
|
_this.selectOption(focusedOption);
|
|
|
|
break;
|
|
}
|
|
|
|
return;
|
|
|
|
case 'Escape':
|
|
if (menuIsOpen) {
|
|
_this.setState({
|
|
inputIsHiddenAfterUpdate: false
|
|
});
|
|
|
|
_this.onInputChange('', {
|
|
action: 'menu-close'
|
|
});
|
|
|
|
_this.onMenuClose();
|
|
} else if (isClearable && escapeClearsValue) {
|
|
_this.clearValue();
|
|
}
|
|
|
|
break;
|
|
|
|
case ' ':
|
|
// space
|
|
if (inputValue) {
|
|
return;
|
|
}
|
|
|
|
if (!menuIsOpen) {
|
|
_this.openMenu('first');
|
|
|
|
break;
|
|
}
|
|
|
|
if (!focusedOption) return;
|
|
|
|
_this.selectOption(focusedOption);
|
|
|
|
break;
|
|
|
|
case 'ArrowUp':
|
|
if (menuIsOpen) {
|
|
_this.focusOption('up');
|
|
} else {
|
|
_this.openMenu('last');
|
|
}
|
|
|
|
break;
|
|
|
|
case 'ArrowDown':
|
|
if (menuIsOpen) {
|
|
_this.focusOption('down');
|
|
} else {
|
|
_this.openMenu('first');
|
|
}
|
|
|
|
break;
|
|
|
|
case 'PageUp':
|
|
if (!menuIsOpen) return;
|
|
|
|
_this.focusOption('pageup');
|
|
|
|
break;
|
|
|
|
case 'PageDown':
|
|
if (!menuIsOpen) return;
|
|
|
|
_this.focusOption('pagedown');
|
|
|
|
break;
|
|
|
|
case 'Home':
|
|
if (!menuIsOpen) return;
|
|
|
|
_this.focusOption('first');
|
|
|
|
break;
|
|
|
|
case 'End':
|
|
if (!menuIsOpen) return;
|
|
|
|
_this.focusOption('last');
|
|
|
|
break;
|
|
|
|
default:
|
|
return;
|
|
}
|
|
|
|
event.preventDefault();
|
|
};
|
|
|
|
_this.instancePrefix = 'react-select-' + (_this.props.instanceId || ++instanceId);
|
|
_this.state.selectValue = cleanValue(_props.value);
|
|
return _this;
|
|
}
|
|
|
|
_createClass(Select, [{
|
|
key: "componentDidMount",
|
|
value: function componentDidMount() {
|
|
this.startListeningComposition();
|
|
this.startListeningToTouch();
|
|
|
|
if (this.props.closeMenuOnScroll && document && document.addEventListener) {
|
|
// Listen to all scroll events, and filter them out inside of 'onScroll'
|
|
document.addEventListener('scroll', this.onScroll, true);
|
|
}
|
|
|
|
if (this.props.autoFocus) {
|
|
this.focusInput();
|
|
}
|
|
}
|
|
}, {
|
|
key: "componentDidUpdate",
|
|
value: function componentDidUpdate(prevProps) {
|
|
var _this$props6 = this.props,
|
|
isDisabled = _this$props6.isDisabled,
|
|
menuIsOpen = _this$props6.menuIsOpen;
|
|
var isFocused = this.state.isFocused;
|
|
|
|
if ( // ensure focus is restored correctly when the control becomes enabled
|
|
isFocused && !isDisabled && prevProps.isDisabled || // ensure focus is on the Input when the menu opens
|
|
isFocused && menuIsOpen && !prevProps.menuIsOpen) {
|
|
this.focusInput();
|
|
}
|
|
|
|
if (isFocused && isDisabled && !prevProps.isDisabled) {
|
|
// ensure select state gets blurred in case Select is programatically disabled while focused
|
|
this.setState({
|
|
isFocused: false
|
|
}, this.onMenuClose);
|
|
} // scroll the focused option into view if necessary
|
|
|
|
|
|
if (this.menuListRef && this.focusedOptionRef && this.scrollToFocusedOptionOnUpdate) {
|
|
scrollIntoView(this.menuListRef, this.focusedOptionRef);
|
|
this.scrollToFocusedOptionOnUpdate = false;
|
|
}
|
|
}
|
|
}, {
|
|
key: "componentWillUnmount",
|
|
value: function componentWillUnmount() {
|
|
this.stopListeningComposition();
|
|
this.stopListeningToTouch();
|
|
document.removeEventListener('scroll', this.onScroll, true);
|
|
} // ==============================
|
|
// Consumer Handlers
|
|
// ==============================
|
|
|
|
}, {
|
|
key: "onMenuOpen",
|
|
value: function onMenuOpen() {
|
|
this.props.onMenuOpen();
|
|
}
|
|
}, {
|
|
key: "onMenuClose",
|
|
value: function onMenuClose() {
|
|
this.onInputChange('', {
|
|
action: 'menu-close'
|
|
});
|
|
this.props.onMenuClose();
|
|
}
|
|
}, {
|
|
key: "onInputChange",
|
|
value: function onInputChange(newValue, actionMeta) {
|
|
this.props.onInputChange(newValue, actionMeta);
|
|
} // ==============================
|
|
// Methods
|
|
// ==============================
|
|
|
|
}, {
|
|
key: "focusInput",
|
|
value: function focusInput() {
|
|
if (!this.inputRef) return;
|
|
this.inputRef.focus();
|
|
}
|
|
}, {
|
|
key: "blurInput",
|
|
value: function blurInput() {
|
|
if (!this.inputRef) return;
|
|
this.inputRef.blur();
|
|
} // aliased for consumers
|
|
|
|
}, {
|
|
key: "openMenu",
|
|
value: function openMenu(focusOption) {
|
|
var _this2 = this;
|
|
|
|
var _this$state2 = this.state,
|
|
selectValue = _this$state2.selectValue,
|
|
isFocused = _this$state2.isFocused;
|
|
var focusableOptions = this.buildFocusableOptions();
|
|
var openAtIndex = focusOption === 'first' ? 0 : focusableOptions.length - 1;
|
|
|
|
if (!this.props.isMulti) {
|
|
var selectedIndex = focusableOptions.indexOf(selectValue[0]);
|
|
|
|
if (selectedIndex > -1) {
|
|
openAtIndex = selectedIndex;
|
|
}
|
|
} // only scroll if the menu isn't already open
|
|
|
|
|
|
this.scrollToFocusedOptionOnUpdate = !(isFocused && this.menuListRef);
|
|
this.setState({
|
|
inputIsHiddenAfterUpdate: false,
|
|
focusedValue: null,
|
|
focusedOption: focusableOptions[openAtIndex]
|
|
}, function () {
|
|
return _this2.onMenuOpen();
|
|
});
|
|
}
|
|
}, {
|
|
key: "focusValue",
|
|
value: function focusValue(direction) {
|
|
var _this$state3 = this.state,
|
|
selectValue = _this$state3.selectValue,
|
|
focusedValue = _this$state3.focusedValue; // Only multiselects support value focusing
|
|
|
|
if (!this.props.isMulti) return;
|
|
this.setState({
|
|
focusedOption: null
|
|
});
|
|
var focusedIndex = selectValue.indexOf(focusedValue);
|
|
|
|
if (!focusedValue) {
|
|
focusedIndex = -1;
|
|
}
|
|
|
|
var lastIndex = selectValue.length - 1;
|
|
var nextFocus = -1;
|
|
if (!selectValue.length) return;
|
|
|
|
switch (direction) {
|
|
case 'previous':
|
|
if (focusedIndex === 0) {
|
|
// don't cycle from the start to the end
|
|
nextFocus = 0;
|
|
} else if (focusedIndex === -1) {
|
|
// if nothing is focused, focus the last value first
|
|
nextFocus = lastIndex;
|
|
} else {
|
|
nextFocus = focusedIndex - 1;
|
|
}
|
|
|
|
break;
|
|
|
|
case 'next':
|
|
if (focusedIndex > -1 && focusedIndex < lastIndex) {
|
|
nextFocus = focusedIndex + 1;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
this.setState({
|
|
inputIsHidden: nextFocus !== -1,
|
|
focusedValue: selectValue[nextFocus]
|
|
});
|
|
}
|
|
}, {
|
|
key: "focusOption",
|
|
value: function focusOption() {
|
|
var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'first';
|
|
var pageSize = this.props.pageSize;
|
|
var focusedOption = this.state.focusedOption;
|
|
var options = this.getFocusableOptions();
|
|
if (!options.length) return;
|
|
var nextFocus = 0; // handles 'first'
|
|
|
|
var focusedIndex = options.indexOf(focusedOption);
|
|
|
|
if (!focusedOption) {
|
|
focusedIndex = -1;
|
|
}
|
|
|
|
if (direction === 'up') {
|
|
nextFocus = focusedIndex > 0 ? focusedIndex - 1 : options.length - 1;
|
|
} else if (direction === 'down') {
|
|
nextFocus = (focusedIndex + 1) % options.length;
|
|
} else if (direction === 'pageup') {
|
|
nextFocus = focusedIndex - pageSize;
|
|
if (nextFocus < 0) nextFocus = 0;
|
|
} else if (direction === 'pagedown') {
|
|
nextFocus = focusedIndex + pageSize;
|
|
if (nextFocus > options.length - 1) nextFocus = options.length - 1;
|
|
} else if (direction === 'last') {
|
|
nextFocus = options.length - 1;
|
|
}
|
|
|
|
this.scrollToFocusedOptionOnUpdate = true;
|
|
this.setState({
|
|
focusedOption: options[nextFocus],
|
|
focusedValue: null
|
|
});
|
|
}
|
|
}, {
|
|
key: "getTheme",
|
|
value: // ==============================
|
|
// Getters
|
|
// ==============================
|
|
function getTheme() {
|
|
// Use the default theme if there are no customizations.
|
|
if (!this.props.theme) {
|
|
return defaultTheme;
|
|
} // If the theme prop is a function, assume the function
|
|
// knows how to merge the passed-in default theme with
|
|
// its own modifications.
|
|
|
|
|
|
if (typeof this.props.theme === 'function') {
|
|
return this.props.theme(defaultTheme);
|
|
} // Otherwise, if a plain theme object was passed in,
|
|
// overlay it with the default theme.
|
|
|
|
|
|
return _objectSpread2(_objectSpread2({}, defaultTheme), this.props.theme);
|
|
}
|
|
}, {
|
|
key: "getCommonProps",
|
|
value: function getCommonProps() {
|
|
var clearValue = this.clearValue,
|
|
cx = this.cx,
|
|
getStyles = this.getStyles,
|
|
getValue = this.getValue,
|
|
selectOption = this.selectOption,
|
|
setValue = this.setValue,
|
|
props = this.props;
|
|
var isMulti = props.isMulti,
|
|
isRtl = props.isRtl,
|
|
options = props.options;
|
|
var hasValue = this.hasValue();
|
|
return {
|
|
clearValue: clearValue,
|
|
cx: cx,
|
|
getStyles: getStyles,
|
|
getValue: getValue,
|
|
hasValue: hasValue,
|
|
isMulti: isMulti,
|
|
isRtl: isRtl,
|
|
options: options,
|
|
selectOption: selectOption,
|
|
selectProps: props,
|
|
setValue: setValue,
|
|
theme: this.getTheme()
|
|
};
|
|
}
|
|
}, {
|
|
key: "hasValue",
|
|
value: function hasValue() {
|
|
var selectValue = this.state.selectValue;
|
|
return selectValue.length > 0;
|
|
}
|
|
}, {
|
|
key: "hasOptions",
|
|
value: function hasOptions() {
|
|
return !!this.getFocusableOptions().length;
|
|
}
|
|
}, {
|
|
key: "isClearable",
|
|
value: function isClearable() {
|
|
var _this$props7 = this.props,
|
|
isClearable = _this$props7.isClearable,
|
|
isMulti = _this$props7.isMulti; // single select, by default, IS NOT clearable
|
|
// multi select, by default, IS clearable
|
|
|
|
if (isClearable === undefined) return isMulti;
|
|
return isClearable;
|
|
}
|
|
}, {
|
|
key: "isOptionDisabled",
|
|
value: function isOptionDisabled(option, selectValue) {
|
|
return _isOptionDisabled(this.props, option, selectValue);
|
|
}
|
|
}, {
|
|
key: "isOptionSelected",
|
|
value: function isOptionSelected(option, selectValue) {
|
|
return _isOptionSelected(this.props, option, selectValue);
|
|
}
|
|
}, {
|
|
key: "filterOption",
|
|
value: function filterOption(option, inputValue) {
|
|
return _filterOption(this.props, option, inputValue);
|
|
}
|
|
}, {
|
|
key: "formatOptionLabel",
|
|
value: function formatOptionLabel(data, context) {
|
|
if (typeof this.props.formatOptionLabel === 'function') {
|
|
var inputValue = this.props.inputValue;
|
|
var selectValue = this.state.selectValue;
|
|
return this.props.formatOptionLabel(data, {
|
|
context: context,
|
|
inputValue: inputValue,
|
|
selectValue: selectValue
|
|
});
|
|
} else {
|
|
return this.getOptionLabel(data);
|
|
}
|
|
}
|
|
}, {
|
|
key: "formatGroupLabel",
|
|
value: function formatGroupLabel(data) {
|
|
return this.props.formatGroupLabel(data);
|
|
} // ==============================
|
|
// Mouse Handlers
|
|
// ==============================
|
|
|
|
}, {
|
|
key: "startListeningComposition",
|
|
value: // ==============================
|
|
// Composition Handlers
|
|
// ==============================
|
|
function startListeningComposition() {
|
|
if (document && document.addEventListener) {
|
|
document.addEventListener('compositionstart', this.onCompositionStart, false);
|
|
document.addEventListener('compositionend', this.onCompositionEnd, false);
|
|
}
|
|
}
|
|
}, {
|
|
key: "stopListeningComposition",
|
|
value: function stopListeningComposition() {
|
|
if (document && document.removeEventListener) {
|
|
document.removeEventListener('compositionstart', this.onCompositionStart);
|
|
document.removeEventListener('compositionend', this.onCompositionEnd);
|
|
}
|
|
}
|
|
}, {
|
|
key: "startListeningToTouch",
|
|
value: // ==============================
|
|
// Touch Handlers
|
|
// ==============================
|
|
function startListeningToTouch() {
|
|
if (document && document.addEventListener) {
|
|
document.addEventListener('touchstart', this.onTouchStart, false);
|
|
document.addEventListener('touchmove', this.onTouchMove, false);
|
|
document.addEventListener('touchend', this.onTouchEnd, false);
|
|
}
|
|
}
|
|
}, {
|
|
key: "stopListeningToTouch",
|
|
value: function stopListeningToTouch() {
|
|
if (document && document.removeEventListener) {
|
|
document.removeEventListener('touchstart', this.onTouchStart);
|
|
document.removeEventListener('touchmove', this.onTouchMove);
|
|
document.removeEventListener('touchend', this.onTouchEnd);
|
|
}
|
|
}
|
|
}, {
|
|
key: "renderInput",
|
|
value: // ==============================
|
|
// Renderers
|
|
// ==============================
|
|
function renderInput() {
|
|
var _this$props8 = this.props,
|
|
isDisabled = _this$props8.isDisabled,
|
|
isSearchable = _this$props8.isSearchable,
|
|
inputId = _this$props8.inputId,
|
|
inputValue = _this$props8.inputValue,
|
|
tabIndex = _this$props8.tabIndex,
|
|
form = _this$props8.form;
|
|
|
|
var _this$getComponents = this.getComponents(),
|
|
Input = _this$getComponents.Input;
|
|
|
|
var inputIsHidden = this.state.inputIsHidden;
|
|
var commonProps = this.commonProps;
|
|
var id = inputId || this.getElementId('input'); // aria attributes makes the JSX "noisy", separated for clarity
|
|
|
|
var ariaAttributes = {
|
|
'aria-autocomplete': 'list',
|
|
'aria-label': this.props['aria-label'],
|
|
'aria-labelledby': this.props['aria-labelledby']
|
|
};
|
|
|
|
if (!isSearchable) {
|
|
// use a dummy input to maintain focus/blur functionality
|
|
return /*#__PURE__*/React.createElement(DummyInput, _extends({
|
|
id: id,
|
|
innerRef: this.getInputRef,
|
|
onBlur: this.onInputBlur,
|
|
onChange: noop,
|
|
onFocus: this.onInputFocus,
|
|
readOnly: true,
|
|
disabled: isDisabled,
|
|
tabIndex: tabIndex,
|
|
form: form,
|
|
value: ""
|
|
}, ariaAttributes));
|
|
}
|
|
|
|
return /*#__PURE__*/React.createElement(Input, _extends({}, commonProps, {
|
|
autoCapitalize: "none",
|
|
autoComplete: "off",
|
|
autoCorrect: "off",
|
|
id: id,
|
|
innerRef: this.getInputRef,
|
|
isDisabled: isDisabled,
|
|
isHidden: inputIsHidden,
|
|
onBlur: this.onInputBlur,
|
|
onChange: this.handleInputChange,
|
|
onFocus: this.onInputFocus,
|
|
spellCheck: "false",
|
|
tabIndex: tabIndex,
|
|
form: form,
|
|
type: "text",
|
|
value: inputValue
|
|
}, ariaAttributes));
|
|
}
|
|
}, {
|
|
key: "renderPlaceholderOrValue",
|
|
value: function renderPlaceholderOrValue() {
|
|
var _this3 = this;
|
|
|
|
var _this$getComponents2 = this.getComponents(),
|
|
MultiValue = _this$getComponents2.MultiValue,
|
|
MultiValueContainer = _this$getComponents2.MultiValueContainer,
|
|
MultiValueLabel = _this$getComponents2.MultiValueLabel,
|
|
MultiValueRemove = _this$getComponents2.MultiValueRemove,
|
|
SingleValue = _this$getComponents2.SingleValue,
|
|
Placeholder = _this$getComponents2.Placeholder;
|
|
|
|
var commonProps = this.commonProps;
|
|
var _this$props9 = this.props,
|
|
controlShouldRenderValue = _this$props9.controlShouldRenderValue,
|
|
isDisabled = _this$props9.isDisabled,
|
|
isMulti = _this$props9.isMulti,
|
|
inputValue = _this$props9.inputValue,
|
|
placeholder = _this$props9.placeholder;
|
|
var _this$state4 = this.state,
|
|
selectValue = _this$state4.selectValue,
|
|
focusedValue = _this$state4.focusedValue,
|
|
isFocused = _this$state4.isFocused;
|
|
|
|
if (!this.hasValue() || !controlShouldRenderValue) {
|
|
return inputValue ? null : /*#__PURE__*/React.createElement(Placeholder, _extends({}, commonProps, {
|
|
key: "placeholder",
|
|
isDisabled: isDisabled,
|
|
isFocused: isFocused
|
|
}), placeholder);
|
|
}
|
|
|
|
if (isMulti) {
|
|
var selectValues = selectValue.map(function (opt, index) {
|
|
var isOptionFocused = opt === focusedValue;
|
|
return /*#__PURE__*/React.createElement(MultiValue, _extends({}, commonProps, {
|
|
components: {
|
|
Container: MultiValueContainer,
|
|
Label: MultiValueLabel,
|
|
Remove: MultiValueRemove
|
|
},
|
|
isFocused: isOptionFocused,
|
|
isDisabled: isDisabled,
|
|
key: "".concat(_this3.getOptionValue(opt)).concat(index),
|
|
index: index,
|
|
removeProps: {
|
|
onClick: function onClick() {
|
|
return _this3.removeValue(opt);
|
|
},
|
|
onTouchEnd: function onTouchEnd() {
|
|
return _this3.removeValue(opt);
|
|
},
|
|
onMouseDown: function onMouseDown(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
},
|
|
data: opt
|
|
}), _this3.formatOptionLabel(opt, 'value'));
|
|
});
|
|
return selectValues;
|
|
}
|
|
|
|
if (inputValue) {
|
|
return null;
|
|
}
|
|
|
|
var singleValue = selectValue[0];
|
|
return /*#__PURE__*/React.createElement(SingleValue, _extends({}, commonProps, {
|
|
data: singleValue,
|
|
isDisabled: isDisabled
|
|
}), this.formatOptionLabel(singleValue, 'value'));
|
|
}
|
|
}, {
|
|
key: "renderClearIndicator",
|
|
value: function renderClearIndicator() {
|
|
var _this$getComponents3 = this.getComponents(),
|
|
ClearIndicator = _this$getComponents3.ClearIndicator;
|
|
|
|
var commonProps = this.commonProps;
|
|
var _this$props10 = this.props,
|
|
isDisabled = _this$props10.isDisabled,
|
|
isLoading = _this$props10.isLoading;
|
|
var isFocused = this.state.isFocused;
|
|
|
|
if (!this.isClearable() || !ClearIndicator || isDisabled || !this.hasValue() || isLoading) {
|
|
return null;
|
|
}
|
|
|
|
var innerProps = {
|
|
onMouseDown: this.onClearIndicatorMouseDown,
|
|
onTouchEnd: this.onClearIndicatorTouchEnd,
|
|
'aria-hidden': 'true'
|
|
};
|
|
return /*#__PURE__*/React.createElement(ClearIndicator, _extends({}, commonProps, {
|
|
innerProps: innerProps,
|
|
isFocused: isFocused
|
|
}));
|
|
}
|
|
}, {
|
|
key: "renderLoadingIndicator",
|
|
value: function renderLoadingIndicator() {
|
|
var _this$getComponents4 = this.getComponents(),
|
|
LoadingIndicator = _this$getComponents4.LoadingIndicator;
|
|
|
|
var commonProps = this.commonProps;
|
|
var _this$props11 = this.props,
|
|
isDisabled = _this$props11.isDisabled,
|
|
isLoading = _this$props11.isLoading;
|
|
var isFocused = this.state.isFocused;
|
|
if (!LoadingIndicator || !isLoading) return null;
|
|
var innerProps = {
|
|
'aria-hidden': 'true'
|
|
};
|
|
return /*#__PURE__*/React.createElement(LoadingIndicator, _extends({}, commonProps, {
|
|
innerProps: innerProps,
|
|
isDisabled: isDisabled,
|
|
isFocused: isFocused
|
|
}));
|
|
}
|
|
}, {
|
|
key: "renderIndicatorSeparator",
|
|
value: function renderIndicatorSeparator() {
|
|
var _this$getComponents5 = this.getComponents(),
|
|
DropdownIndicator = _this$getComponents5.DropdownIndicator,
|
|
IndicatorSeparator = _this$getComponents5.IndicatorSeparator; // separator doesn't make sense without the dropdown indicator
|
|
|
|
|
|
if (!DropdownIndicator || !IndicatorSeparator) return null;
|
|
var commonProps = this.commonProps;
|
|
var isDisabled = this.props.isDisabled;
|
|
var isFocused = this.state.isFocused;
|
|
return /*#__PURE__*/React.createElement(IndicatorSeparator, _extends({}, commonProps, {
|
|
isDisabled: isDisabled,
|
|
isFocused: isFocused
|
|
}));
|
|
}
|
|
}, {
|
|
key: "renderDropdownIndicator",
|
|
value: function renderDropdownIndicator() {
|
|
var _this$getComponents6 = this.getComponents(),
|
|
DropdownIndicator = _this$getComponents6.DropdownIndicator;
|
|
|
|
if (!DropdownIndicator) return null;
|
|
var commonProps = this.commonProps;
|
|
var isDisabled = this.props.isDisabled;
|
|
var isFocused = this.state.isFocused;
|
|
var innerProps = {
|
|
onMouseDown: this.onDropdownIndicatorMouseDown,
|
|
onTouchEnd: this.onDropdownIndicatorTouchEnd,
|
|
'aria-hidden': 'true'
|
|
};
|
|
return /*#__PURE__*/React.createElement(DropdownIndicator, _extends({}, commonProps, {
|
|
innerProps: innerProps,
|
|
isDisabled: isDisabled,
|
|
isFocused: isFocused
|
|
}));
|
|
}
|
|
}, {
|
|
key: "renderMenu",
|
|
value: function renderMenu() {
|
|
var _this4 = this;
|
|
|
|
var _this$getComponents7 = this.getComponents(),
|
|
Group = _this$getComponents7.Group,
|
|
GroupHeading = _this$getComponents7.GroupHeading,
|
|
Menu = _this$getComponents7.Menu,
|
|
MenuList = _this$getComponents7.MenuList,
|
|
MenuPortal = _this$getComponents7.MenuPortal,
|
|
LoadingMessage = _this$getComponents7.LoadingMessage,
|
|
NoOptionsMessage = _this$getComponents7.NoOptionsMessage,
|
|
Option = _this$getComponents7.Option;
|
|
|
|
var commonProps = this.commonProps;
|
|
var focusedOption = this.state.focusedOption;
|
|
var _this$props12 = this.props,
|
|
captureMenuScroll = _this$props12.captureMenuScroll,
|
|
inputValue = _this$props12.inputValue,
|
|
isLoading = _this$props12.isLoading,
|
|
loadingMessage = _this$props12.loadingMessage,
|
|
minMenuHeight = _this$props12.minMenuHeight,
|
|
maxMenuHeight = _this$props12.maxMenuHeight,
|
|
menuIsOpen = _this$props12.menuIsOpen,
|
|
menuPlacement = _this$props12.menuPlacement,
|
|
menuPosition = _this$props12.menuPosition,
|
|
menuPortalTarget = _this$props12.menuPortalTarget,
|
|
menuShouldBlockScroll = _this$props12.menuShouldBlockScroll,
|
|
menuShouldScrollIntoView = _this$props12.menuShouldScrollIntoView,
|
|
noOptionsMessage = _this$props12.noOptionsMessage,
|
|
onMenuScrollToTop = _this$props12.onMenuScrollToTop,
|
|
onMenuScrollToBottom = _this$props12.onMenuScrollToBottom;
|
|
if (!menuIsOpen) return null; // TODO: Internal Option Type here
|
|
|
|
var render = function render(props, id) {
|
|
var type = props.type,
|
|
data = props.data,
|
|
isDisabled = props.isDisabled,
|
|
isSelected = props.isSelected,
|
|
label = props.label,
|
|
value = props.value;
|
|
var isFocused = focusedOption === data;
|
|
var onHover = isDisabled ? undefined : function () {
|
|
return _this4.onOptionHover(data);
|
|
};
|
|
var onSelect = isDisabled ? undefined : function () {
|
|
return _this4.selectOption(data);
|
|
};
|
|
var optionId = "".concat(_this4.getElementId('option'), "-").concat(id);
|
|
var innerProps = {
|
|
id: optionId,
|
|
onClick: onSelect,
|
|
onMouseMove: onHover,
|
|
onMouseOver: onHover,
|
|
tabIndex: -1
|
|
};
|
|
return /*#__PURE__*/React.createElement(Option, _extends({}, commonProps, {
|
|
innerProps: innerProps,
|
|
data: data,
|
|
isDisabled: isDisabled,
|
|
isSelected: isSelected,
|
|
key: optionId,
|
|
label: label,
|
|
type: type,
|
|
value: value,
|
|
isFocused: isFocused,
|
|
innerRef: isFocused ? _this4.getFocusedOptionRef : undefined
|
|
}), _this4.formatOptionLabel(props.data, 'menu'));
|
|
};
|
|
|
|
var menuUI;
|
|
|
|
if (this.hasOptions()) {
|
|
menuUI = this.getCategorizedOptions().map(function (item) {
|
|
if (item.type === 'group') {
|
|
var data = item.data,
|
|
options = item.options,
|
|
groupIndex = item.index;
|
|
var groupId = "".concat(_this4.getElementId('group'), "-").concat(groupIndex);
|
|
var headingId = "".concat(groupId, "-heading");
|
|
return /*#__PURE__*/React.createElement(Group, _extends({}, commonProps, {
|
|
key: groupId,
|
|
data: data,
|
|
options: options,
|
|
Heading: GroupHeading,
|
|
headingProps: {
|
|
id: headingId,
|
|
data: item.data
|
|
},
|
|
label: _this4.formatGroupLabel(item.data)
|
|
}), item.options.map(function (option) {
|
|
return render(option, "".concat(groupIndex, "-").concat(option.index));
|
|
}));
|
|
} else if (item.type === 'option') {
|
|
return render(item, "".concat(item.index));
|
|
}
|
|
});
|
|
} else if (isLoading) {
|
|
var message = loadingMessage({
|
|
inputValue: inputValue
|
|
});
|
|
if (message === null) return null;
|
|
menuUI = /*#__PURE__*/React.createElement(LoadingMessage, commonProps, message);
|
|
} else {
|
|
var _message = noOptionsMessage({
|
|
inputValue: inputValue
|
|
});
|
|
|
|
if (_message === null) return null;
|
|
menuUI = /*#__PURE__*/React.createElement(NoOptionsMessage, commonProps, _message);
|
|
}
|
|
|
|
var menuPlacementProps = {
|
|
minMenuHeight: minMenuHeight,
|
|
maxMenuHeight: maxMenuHeight,
|
|
menuPlacement: menuPlacement,
|
|
menuPosition: menuPosition,
|
|
menuShouldScrollIntoView: menuShouldScrollIntoView
|
|
};
|
|
var menuElement = /*#__PURE__*/React.createElement(MenuPlacer, _extends({}, commonProps, menuPlacementProps), function (_ref4) {
|
|
var ref = _ref4.ref,
|
|
_ref4$placerProps = _ref4.placerProps,
|
|
placement = _ref4$placerProps.placement,
|
|
maxHeight = _ref4$placerProps.maxHeight;
|
|
return /*#__PURE__*/React.createElement(Menu, _extends({}, commonProps, menuPlacementProps, {
|
|
innerRef: ref,
|
|
innerProps: {
|
|
onMouseDown: _this4.onMenuMouseDown,
|
|
onMouseMove: _this4.onMenuMouseMove
|
|
},
|
|
isLoading: isLoading,
|
|
placement: placement
|
|
}), /*#__PURE__*/React.createElement(ScrollManager, {
|
|
captureEnabled: captureMenuScroll,
|
|
onTopArrive: onMenuScrollToTop,
|
|
onBottomArrive: onMenuScrollToBottom,
|
|
lockEnabled: menuShouldBlockScroll
|
|
}, function (scrollTargetRef) {
|
|
return /*#__PURE__*/React.createElement(MenuList, _extends({}, commonProps, {
|
|
innerRef: function innerRef(instance) {
|
|
_this4.getMenuListRef(instance);
|
|
|
|
scrollTargetRef(instance);
|
|
},
|
|
isLoading: isLoading,
|
|
maxHeight: maxHeight,
|
|
focusedOption: focusedOption
|
|
}), menuUI);
|
|
}));
|
|
}); // positioning behaviour is almost identical for portalled and fixed,
|
|
// so we use the same component. the actual portalling logic is forked
|
|
// within the component based on `menuPosition`
|
|
|
|
return menuPortalTarget || menuPosition === 'fixed' ? /*#__PURE__*/React.createElement(MenuPortal, _extends({}, commonProps, {
|
|
appendTo: menuPortalTarget,
|
|
controlElement: this.controlRef,
|
|
menuPlacement: menuPlacement,
|
|
menuPosition: menuPosition
|
|
}), menuElement) : menuElement;
|
|
}
|
|
}, {
|
|
key: "renderFormField",
|
|
value: function renderFormField() {
|
|
var _this5 = this;
|
|
|
|
var _this$props13 = this.props,
|
|
delimiter = _this$props13.delimiter,
|
|
isDisabled = _this$props13.isDisabled,
|
|
isMulti = _this$props13.isMulti,
|
|
name = _this$props13.name;
|
|
var selectValue = this.state.selectValue;
|
|
if (!name || isDisabled) return;
|
|
|
|
if (isMulti) {
|
|
if (delimiter) {
|
|
var value = selectValue.map(function (opt) {
|
|
return _this5.getOptionValue(opt);
|
|
}).join(delimiter);
|
|
return /*#__PURE__*/React.createElement("input", {
|
|
name: name,
|
|
type: "hidden",
|
|
value: value
|
|
});
|
|
} else {
|
|
var input = selectValue.length > 0 ? selectValue.map(function (opt, i) {
|
|
return /*#__PURE__*/React.createElement("input", {
|
|
key: "i-".concat(i),
|
|
name: name,
|
|
type: "hidden",
|
|
value: _this5.getOptionValue(opt)
|
|
});
|
|
}) : /*#__PURE__*/React.createElement("input", {
|
|
name: name,
|
|
type: "hidden"
|
|
});
|
|
return /*#__PURE__*/React.createElement("div", null, input);
|
|
}
|
|
} else {
|
|
var _value = selectValue[0] ? this.getOptionValue(selectValue[0]) : '';
|
|
|
|
return /*#__PURE__*/React.createElement("input", {
|
|
name: name,
|
|
type: "hidden",
|
|
value: _value
|
|
});
|
|
}
|
|
}
|
|
}, {
|
|
key: "renderLiveRegion",
|
|
value: function renderLiveRegion() {
|
|
var commonProps = this.commonProps;
|
|
var _this$state5 = this.state,
|
|
ariaSelection = _this$state5.ariaSelection,
|
|
focusedOption = _this$state5.focusedOption,
|
|
focusedValue = _this$state5.focusedValue,
|
|
isFocused = _this$state5.isFocused,
|
|
selectValue = _this$state5.selectValue;
|
|
var focusableOptions = this.getFocusableOptions();
|
|
return /*#__PURE__*/React.createElement(LiveRegion, _extends({}, commonProps, {
|
|
ariaSelection: ariaSelection,
|
|
focusedOption: focusedOption,
|
|
focusedValue: focusedValue,
|
|
isFocused: isFocused,
|
|
selectValue: selectValue,
|
|
focusableOptions: focusableOptions
|
|
}));
|
|
}
|
|
}, {
|
|
key: "render",
|
|
value: function render() {
|
|
var _this$getComponents8 = this.getComponents(),
|
|
Control = _this$getComponents8.Control,
|
|
IndicatorsContainer = _this$getComponents8.IndicatorsContainer,
|
|
SelectContainer = _this$getComponents8.SelectContainer,
|
|
ValueContainer = _this$getComponents8.ValueContainer;
|
|
|
|
var _this$props14 = this.props,
|
|
className = _this$props14.className,
|
|
id = _this$props14.id,
|
|
isDisabled = _this$props14.isDisabled,
|
|
menuIsOpen = _this$props14.menuIsOpen;
|
|
var isFocused = this.state.isFocused;
|
|
var commonProps = this.commonProps = this.getCommonProps();
|
|
return /*#__PURE__*/React.createElement(SelectContainer, _extends({}, commonProps, {
|
|
className: className,
|
|
innerProps: {
|
|
id: id,
|
|
onKeyDown: this.onKeyDown
|
|
},
|
|
isDisabled: isDisabled,
|
|
isFocused: isFocused
|
|
}), this.renderLiveRegion(), /*#__PURE__*/React.createElement(Control, _extends({}, commonProps, {
|
|
innerRef: this.getControlRef,
|
|
innerProps: {
|
|
onMouseDown: this.onControlMouseDown,
|
|
onTouchEnd: this.onControlTouchEnd
|
|
},
|
|
isDisabled: isDisabled,
|
|
isFocused: isFocused,
|
|
menuIsOpen: menuIsOpen
|
|
}), /*#__PURE__*/React.createElement(ValueContainer, _extends({}, commonProps, {
|
|
isDisabled: isDisabled
|
|
}), this.renderPlaceholderOrValue(), this.renderInput()), /*#__PURE__*/React.createElement(IndicatorsContainer, _extends({}, commonProps, {
|
|
isDisabled: isDisabled
|
|
}), this.renderClearIndicator(), this.renderLoadingIndicator(), this.renderIndicatorSeparator(), this.renderDropdownIndicator())), this.renderMenu(), this.renderFormField());
|
|
}
|
|
}], [{
|
|
key: "getDerivedStateFromProps",
|
|
value: function getDerivedStateFromProps(props, state) {
|
|
var prevProps = state.prevProps,
|
|
clearFocusValueOnUpdate = state.clearFocusValueOnUpdate,
|
|
inputIsHiddenAfterUpdate = state.inputIsHiddenAfterUpdate;
|
|
var options = props.options,
|
|
value = props.value,
|
|
menuIsOpen = props.menuIsOpen,
|
|
inputValue = props.inputValue;
|
|
var newMenuOptionsState = {};
|
|
|
|
if (prevProps && (value !== prevProps.value || options !== prevProps.options || menuIsOpen !== prevProps.menuIsOpen || inputValue !== prevProps.inputValue)) {
|
|
var selectValue = cleanValue(value);
|
|
var focusableOptions = menuIsOpen ? buildFocusableOptions(props, selectValue) : [];
|
|
var focusedValue = clearFocusValueOnUpdate ? getNextFocusedValue(state, selectValue) : null;
|
|
var focusedOption = getNextFocusedOption(state, focusableOptions);
|
|
newMenuOptionsState = {
|
|
selectValue: selectValue,
|
|
focusedOption: focusedOption,
|
|
focusedValue: focusedValue,
|
|
clearFocusValueOnUpdate: false
|
|
};
|
|
} // some updates should toggle the state of the input visibility
|
|
|
|
|
|
var newInputIsHiddenState = inputIsHiddenAfterUpdate != null && props !== prevProps ? {
|
|
inputIsHidden: inputIsHiddenAfterUpdate,
|
|
inputIsHiddenAfterUpdate: undefined
|
|
} : {};
|
|
return _objectSpread2(_objectSpread2(_objectSpread2({}, newMenuOptionsState), newInputIsHiddenState), {}, {
|
|
prevProps: props
|
|
});
|
|
}
|
|
}]);
|
|
|
|
return Select;
|
|
}(Component);
|
|
|
|
Select.defaultProps = defaultProps;
|
|
|
|
export { Select as S, getOptionLabel as a, defaultProps as b, createFilter as c, defaultTheme as d, getOptionValue as g, mergeStyles as m };
|