Select.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. var _typeof3 = require("@babel/runtime/helpers/typeof");
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  10. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  11. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  12. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  13. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  14. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  15. var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
  16. var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
  17. var React = _interopRequireWildcard(require("react"));
  18. var _BaseSelect = _interopRequireWildcard(require("./BaseSelect"));
  19. var _OptGroup = _interopRequireDefault(require("./OptGroup"));
  20. var _Option = _interopRequireDefault(require("./Option"));
  21. var _OptionList = _interopRequireDefault(require("./OptionList"));
  22. var _SelectContext = _interopRequireDefault(require("./SelectContext"));
  23. var _useCache3 = _interopRequireDefault(require("./hooks/useCache"));
  24. var _useFilterOptions = _interopRequireDefault(require("./hooks/useFilterOptions"));
  25. var _useId = _interopRequireDefault(require("./hooks/useId"));
  26. var _useOptions = _interopRequireDefault(require("./hooks/useOptions"));
  27. var _useRefFunc = _interopRequireDefault(require("./hooks/useRefFunc"));
  28. var _commonUtil = require("./utils/commonUtil");
  29. var _valueUtil = require("./utils/valueUtil");
  30. var _warningPropsUtil = _interopRequireWildcard(require("./utils/warningPropsUtil"));
  31. var _excluded = ["id", "mode", "prefixCls", "backfill", "fieldNames", "inputValue", "searchValue", "onSearch", "autoClearSearchValue", "onSelect", "onDeselect", "dropdownMatchSelectWidth", "filterOption", "filterSort", "optionFilterProp", "optionLabelProp", "options", "optionRender", "children", "defaultActiveFirstOption", "menuItemSelectedIcon", "virtual", "direction", "listHeight", "listItemHeight", "labelRender", "value", "defaultValue", "labelInValue", "onChange", "maxCount"];
  32. /**
  33. * To match accessibility requirement, we always provide an input in the component.
  34. * Other element will not set `tabIndex` to avoid `onBlur` sequence problem.
  35. * For focused select, we set `aria-live="polite"` to update the accessibility content.
  36. *
  37. * ref:
  38. * - keyboard: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#Keyboard_interactions
  39. *
  40. * New api:
  41. * - listHeight
  42. * - listItemHeight
  43. * - component
  44. *
  45. * Remove deprecated api:
  46. * - multiple
  47. * - tags
  48. * - combobox
  49. * - firstActiveValue
  50. * - dropdownMenuStyle
  51. * - openClassName (Not list in api)
  52. *
  53. * Update:
  54. * - `backfill` only support `combobox` mode
  55. * - `combobox` mode not support `labelInValue` since it's meaningless
  56. * - `getInputElement` only support `combobox` mode
  57. * - `onChange` return OptionData instead of ReactNode
  58. * - `filterOption` `onChange` `onSelect` accept OptionData instead of ReactNode
  59. * - `combobox` mode trigger `onChange` will get `undefined` if no `value` match in Option
  60. * - `combobox` mode not support `optionLabelProp`
  61. */
  62. function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
  63. function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
  64. var OMIT_DOM_PROPS = ['inputValue'];
  65. function isRawValue(value) {
  66. return !value || (0, _typeof2.default)(value) !== 'object';
  67. }
  68. var Select = /*#__PURE__*/React.forwardRef(function (props, ref) {
  69. var id = props.id,
  70. mode = props.mode,
  71. _props$prefixCls = props.prefixCls,
  72. prefixCls = _props$prefixCls === void 0 ? 'rc-select' : _props$prefixCls,
  73. backfill = props.backfill,
  74. fieldNames = props.fieldNames,
  75. inputValue = props.inputValue,
  76. searchValue = props.searchValue,
  77. onSearch = props.onSearch,
  78. _props$autoClearSearc = props.autoClearSearchValue,
  79. autoClearSearchValue = _props$autoClearSearc === void 0 ? true : _props$autoClearSearc,
  80. onSelect = props.onSelect,
  81. onDeselect = props.onDeselect,
  82. _props$dropdownMatchS = props.dropdownMatchSelectWidth,
  83. dropdownMatchSelectWidth = _props$dropdownMatchS === void 0 ? true : _props$dropdownMatchS,
  84. filterOption = props.filterOption,
  85. filterSort = props.filterSort,
  86. optionFilterProp = props.optionFilterProp,
  87. optionLabelProp = props.optionLabelProp,
  88. options = props.options,
  89. optionRender = props.optionRender,
  90. children = props.children,
  91. defaultActiveFirstOption = props.defaultActiveFirstOption,
  92. menuItemSelectedIcon = props.menuItemSelectedIcon,
  93. virtual = props.virtual,
  94. direction = props.direction,
  95. _props$listHeight = props.listHeight,
  96. listHeight = _props$listHeight === void 0 ? 200 : _props$listHeight,
  97. _props$listItemHeight = props.listItemHeight,
  98. listItemHeight = _props$listItemHeight === void 0 ? 20 : _props$listItemHeight,
  99. labelRender = props.labelRender,
  100. value = props.value,
  101. defaultValue = props.defaultValue,
  102. labelInValue = props.labelInValue,
  103. onChange = props.onChange,
  104. maxCount = props.maxCount,
  105. restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
  106. var mergedId = (0, _useId.default)(id);
  107. var multiple = (0, _BaseSelect.isMultiple)(mode);
  108. var childrenAsData = !!(!options && children);
  109. var mergedFilterOption = React.useMemo(function () {
  110. if (filterOption === undefined && mode === 'combobox') {
  111. return false;
  112. }
  113. return filterOption;
  114. }, [filterOption, mode]);
  115. // ========================= FieldNames =========================
  116. var mergedFieldNames = React.useMemo(function () {
  117. return (0, _valueUtil.fillFieldNames)(fieldNames, childrenAsData);
  118. }, /* eslint-disable react-hooks/exhaustive-deps */
  119. [
  120. // We stringify fieldNames to avoid unnecessary re-renders.
  121. JSON.stringify(fieldNames), childrenAsData]
  122. /* eslint-enable react-hooks/exhaustive-deps */);
  123. // =========================== Search ===========================
  124. var _useMergedState = (0, _useMergedState5.default)('', {
  125. value: searchValue !== undefined ? searchValue : inputValue,
  126. postState: function postState(search) {
  127. return search || '';
  128. }
  129. }),
  130. _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
  131. mergedSearchValue = _useMergedState2[0],
  132. setSearchValue = _useMergedState2[1];
  133. // =========================== Option ===========================
  134. var parsedOptions = (0, _useOptions.default)(options, children, mergedFieldNames, optionFilterProp, optionLabelProp);
  135. var valueOptions = parsedOptions.valueOptions,
  136. labelOptions = parsedOptions.labelOptions,
  137. mergedOptions = parsedOptions.options;
  138. // ========================= Wrap Value =========================
  139. var convert2LabelValues = React.useCallback(function (draftValues) {
  140. // Convert to array
  141. var valueList = (0, _commonUtil.toArray)(draftValues);
  142. // Convert to labelInValue type
  143. return valueList.map(function (val) {
  144. var rawValue;
  145. var rawLabel;
  146. var rawKey;
  147. var rawDisabled;
  148. var rawTitle;
  149. // Fill label & value
  150. if (isRawValue(val)) {
  151. rawValue = val;
  152. } else {
  153. var _val$value;
  154. rawKey = val.key;
  155. rawLabel = val.label;
  156. rawValue = (_val$value = val.value) !== null && _val$value !== void 0 ? _val$value : rawKey;
  157. }
  158. var option = valueOptions.get(rawValue);
  159. if (option) {
  160. var _option$key;
  161. // Fill missing props
  162. if (rawLabel === undefined) rawLabel = option === null || option === void 0 ? void 0 : option[optionLabelProp || mergedFieldNames.label];
  163. if (rawKey === undefined) rawKey = (_option$key = option === null || option === void 0 ? void 0 : option.key) !== null && _option$key !== void 0 ? _option$key : rawValue;
  164. rawDisabled = option === null || option === void 0 ? void 0 : option.disabled;
  165. rawTitle = option === null || option === void 0 ? void 0 : option.title;
  166. // Warning if label not same as provided
  167. if (process.env.NODE_ENV !== 'production' && !optionLabelProp) {
  168. var optionLabel = option === null || option === void 0 ? void 0 : option[mergedFieldNames.label];
  169. if (optionLabel !== undefined && ! /*#__PURE__*/React.isValidElement(optionLabel) && ! /*#__PURE__*/React.isValidElement(rawLabel) && optionLabel !== rawLabel) {
  170. (0, _warning.default)(false, '`label` of `value` is not same as `label` in Select options.');
  171. }
  172. }
  173. }
  174. return {
  175. label: rawLabel,
  176. value: rawValue,
  177. key: rawKey,
  178. disabled: rawDisabled,
  179. title: rawTitle
  180. };
  181. });
  182. }, [mergedFieldNames, optionLabelProp, valueOptions]);
  183. // =========================== Values ===========================
  184. var _useMergedState3 = (0, _useMergedState5.default)(defaultValue, {
  185. value: value
  186. }),
  187. _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2),
  188. internalValue = _useMergedState4[0],
  189. setInternalValue = _useMergedState4[1];
  190. // Merged value with LabelValueType
  191. var rawLabeledValues = React.useMemo(function () {
  192. var _values$;
  193. var newInternalValue = multiple && internalValue === null ? [] : internalValue;
  194. var values = convert2LabelValues(newInternalValue);
  195. // combobox no need save value when it's no value (exclude value equal 0)
  196. if (mode === 'combobox' && (0, _commonUtil.isComboNoValue)((_values$ = values[0]) === null || _values$ === void 0 ? void 0 : _values$.value)) {
  197. return [];
  198. }
  199. return values;
  200. }, [internalValue, convert2LabelValues, mode, multiple]);
  201. // Fill label with cache to avoid option remove
  202. var _useCache = (0, _useCache3.default)(rawLabeledValues, valueOptions),
  203. _useCache2 = (0, _slicedToArray2.default)(_useCache, 2),
  204. mergedValues = _useCache2[0],
  205. getMixedOption = _useCache2[1];
  206. var displayValues = React.useMemo(function () {
  207. // `null` need show as placeholder instead
  208. // https://github.com/ant-design/ant-design/issues/25057
  209. if (!mode && mergedValues.length === 1) {
  210. var firstValue = mergedValues[0];
  211. if (firstValue.value === null && (firstValue.label === null || firstValue.label === undefined)) {
  212. return [];
  213. }
  214. }
  215. return mergedValues.map(function (item) {
  216. var _ref;
  217. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
  218. label: (_ref = typeof labelRender === 'function' ? labelRender(item) : item.label) !== null && _ref !== void 0 ? _ref : item.value
  219. });
  220. });
  221. }, [mode, mergedValues, labelRender]);
  222. /** Convert `displayValues` to raw value type set */
  223. var rawValues = React.useMemo(function () {
  224. return new Set(mergedValues.map(function (val) {
  225. return val.value;
  226. }));
  227. }, [mergedValues]);
  228. React.useEffect(function () {
  229. if (mode === 'combobox') {
  230. var _mergedValues$;
  231. var strValue = (_mergedValues$ = mergedValues[0]) === null || _mergedValues$ === void 0 ? void 0 : _mergedValues$.value;
  232. setSearchValue((0, _commonUtil.hasValue)(strValue) ? String(strValue) : '');
  233. }
  234. }, [mergedValues]);
  235. // ======================= Display Option =======================
  236. // Create a placeholder item if not exist in `options`
  237. var createTagOption = (0, _useRefFunc.default)(function (val, label) {
  238. var mergedLabel = label !== null && label !== void 0 ? label : val;
  239. return (0, _defineProperty2.default)((0, _defineProperty2.default)({}, mergedFieldNames.value, val), mergedFieldNames.label, mergedLabel);
  240. });
  241. // Fill tag as option if mode is `tags`
  242. var filledTagOptions = React.useMemo(function () {
  243. if (mode !== 'tags') {
  244. return mergedOptions;
  245. }
  246. // >>> Tag mode
  247. var cloneOptions = (0, _toConsumableArray2.default)(mergedOptions);
  248. // Check if value exist in options (include new patch item)
  249. var existOptions = function existOptions(val) {
  250. return valueOptions.has(val);
  251. };
  252. // Fill current value as option
  253. (0, _toConsumableArray2.default)(mergedValues).sort(function (a, b) {
  254. return a.value < b.value ? -1 : 1;
  255. }).forEach(function (item) {
  256. var val = item.value;
  257. if (!existOptions(val)) {
  258. cloneOptions.push(createTagOption(val, item.label));
  259. }
  260. });
  261. return cloneOptions;
  262. }, [createTagOption, mergedOptions, valueOptions, mergedValues, mode]);
  263. var filteredOptions = (0, _useFilterOptions.default)(filledTagOptions, mergedFieldNames, mergedSearchValue, mergedFilterOption, optionFilterProp);
  264. // Fill options with search value if needed
  265. var filledSearchOptions = React.useMemo(function () {
  266. if (mode !== 'tags' || !mergedSearchValue || filteredOptions.some(function (item) {
  267. return item[optionFilterProp || 'value'] === mergedSearchValue;
  268. })) {
  269. return filteredOptions;
  270. }
  271. // ignore when search value equal select input value
  272. if (filteredOptions.some(function (item) {
  273. return item[mergedFieldNames.value] === mergedSearchValue;
  274. })) {
  275. return filteredOptions;
  276. }
  277. // Fill search value as option
  278. return [createTagOption(mergedSearchValue)].concat((0, _toConsumableArray2.default)(filteredOptions));
  279. }, [createTagOption, optionFilterProp, mode, filteredOptions, mergedSearchValue, mergedFieldNames]);
  280. var sorter = function sorter(inputOptions) {
  281. var sortedOptions = (0, _toConsumableArray2.default)(inputOptions).sort(function (a, b) {
  282. return filterSort(a, b, {
  283. searchValue: mergedSearchValue
  284. });
  285. });
  286. return sortedOptions.map(function (item) {
  287. if (Array.isArray(item.options)) {
  288. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
  289. options: item.options.length > 0 ? sorter(item.options) : item.options
  290. });
  291. }
  292. return item;
  293. });
  294. };
  295. var orderedFilteredOptions = React.useMemo(function () {
  296. if (!filterSort) {
  297. return filledSearchOptions;
  298. }
  299. return sorter(filledSearchOptions);
  300. }, [filledSearchOptions, filterSort, mergedSearchValue]);
  301. var displayOptions = React.useMemo(function () {
  302. return (0, _valueUtil.flattenOptions)(orderedFilteredOptions, {
  303. fieldNames: mergedFieldNames,
  304. childrenAsData: childrenAsData
  305. });
  306. }, [orderedFilteredOptions, mergedFieldNames, childrenAsData]);
  307. // =========================== Change ===========================
  308. var triggerChange = function triggerChange(values) {
  309. var labeledValues = convert2LabelValues(values);
  310. setInternalValue(labeledValues);
  311. if (onChange && (
  312. // Trigger event only when value changed
  313. labeledValues.length !== mergedValues.length || labeledValues.some(function (newVal, index) {
  314. var _mergedValues$index;
  315. return ((_mergedValues$index = mergedValues[index]) === null || _mergedValues$index === void 0 ? void 0 : _mergedValues$index.value) !== (newVal === null || newVal === void 0 ? void 0 : newVal.value);
  316. }))) {
  317. var returnValues = labelInValue ? labeledValues : labeledValues.map(function (v) {
  318. return v.value;
  319. });
  320. var returnOptions = labeledValues.map(function (v) {
  321. return (0, _valueUtil.injectPropsWithOption)(getMixedOption(v.value));
  322. });
  323. onChange(
  324. // Value
  325. multiple ? returnValues : returnValues[0],
  326. // Option
  327. multiple ? returnOptions : returnOptions[0]);
  328. }
  329. };
  330. // ======================= Accessibility ========================
  331. var _React$useState = React.useState(null),
  332. _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
  333. activeValue = _React$useState2[0],
  334. setActiveValue = _React$useState2[1];
  335. var _React$useState3 = React.useState(0),
  336. _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
  337. accessibilityIndex = _React$useState4[0],
  338. setAccessibilityIndex = _React$useState4[1];
  339. var mergedDefaultActiveFirstOption = defaultActiveFirstOption !== undefined ? defaultActiveFirstOption : mode !== 'combobox';
  340. var onActiveValue = React.useCallback(function (active, index) {
  341. var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  342. _ref3$source = _ref3.source,
  343. source = _ref3$source === void 0 ? 'keyboard' : _ref3$source;
  344. setAccessibilityIndex(index);
  345. if (backfill && mode === 'combobox' && active !== null && source === 'keyboard') {
  346. setActiveValue(String(active));
  347. }
  348. }, [backfill, mode]);
  349. // ========================= OptionList =========================
  350. var triggerSelect = function triggerSelect(val, selected, type) {
  351. var getSelectEnt = function getSelectEnt() {
  352. var _option$key2;
  353. var option = getMixedOption(val);
  354. return [labelInValue ? {
  355. label: option === null || option === void 0 ? void 0 : option[mergedFieldNames.label],
  356. value: val,
  357. key: (_option$key2 = option === null || option === void 0 ? void 0 : option.key) !== null && _option$key2 !== void 0 ? _option$key2 : val
  358. } : val, (0, _valueUtil.injectPropsWithOption)(option)];
  359. };
  360. if (selected && onSelect) {
  361. var _getSelectEnt = getSelectEnt(),
  362. _getSelectEnt2 = (0, _slicedToArray2.default)(_getSelectEnt, 2),
  363. wrappedValue = _getSelectEnt2[0],
  364. _option = _getSelectEnt2[1];
  365. onSelect(wrappedValue, _option);
  366. } else if (!selected && onDeselect && type !== 'clear') {
  367. var _getSelectEnt3 = getSelectEnt(),
  368. _getSelectEnt4 = (0, _slicedToArray2.default)(_getSelectEnt3, 2),
  369. _wrappedValue = _getSelectEnt4[0],
  370. _option2 = _getSelectEnt4[1];
  371. onDeselect(_wrappedValue, _option2);
  372. }
  373. };
  374. // Used for OptionList selection
  375. var onInternalSelect = (0, _useRefFunc.default)(function (val, info) {
  376. var cloneValues;
  377. // Single mode always trigger select only with option list
  378. var mergedSelect = multiple ? info.selected : true;
  379. if (mergedSelect) {
  380. cloneValues = multiple ? [].concat((0, _toConsumableArray2.default)(mergedValues), [val]) : [val];
  381. } else {
  382. cloneValues = mergedValues.filter(function (v) {
  383. return v.value !== val;
  384. });
  385. }
  386. triggerChange(cloneValues);
  387. triggerSelect(val, mergedSelect);
  388. // Clean search value if single or configured
  389. if (mode === 'combobox') {
  390. // setSearchValue(String(val));
  391. setActiveValue('');
  392. } else if (!_BaseSelect.isMultiple || autoClearSearchValue) {
  393. setSearchValue('');
  394. setActiveValue('');
  395. }
  396. });
  397. // ======================= Display Change =======================
  398. // BaseSelect display values change
  399. var onDisplayValuesChange = function onDisplayValuesChange(nextValues, info) {
  400. triggerChange(nextValues);
  401. var type = info.type,
  402. values = info.values;
  403. if (type === 'remove' || type === 'clear') {
  404. values.forEach(function (item) {
  405. triggerSelect(item.value, false, type);
  406. });
  407. }
  408. };
  409. // =========================== Search ===========================
  410. var onInternalSearch = function onInternalSearch(searchText, info) {
  411. setSearchValue(searchText);
  412. setActiveValue(null);
  413. // [Submit] Tag mode should flush input
  414. if (info.source === 'submit') {
  415. var formatted = (searchText || '').trim();
  416. // prevent empty tags from appearing when you click the Enter button
  417. if (formatted) {
  418. var newRawValues = Array.from(new Set([].concat((0, _toConsumableArray2.default)(rawValues), [formatted])));
  419. triggerChange(newRawValues);
  420. triggerSelect(formatted, true);
  421. setSearchValue('');
  422. }
  423. return;
  424. }
  425. if (info.source !== 'blur') {
  426. if (mode === 'combobox') {
  427. triggerChange(searchText);
  428. }
  429. onSearch === null || onSearch === void 0 || onSearch(searchText);
  430. }
  431. };
  432. var onInternalSearchSplit = function onInternalSearchSplit(words) {
  433. var patchValues = words;
  434. if (mode !== 'tags') {
  435. patchValues = words.map(function (word) {
  436. var opt = labelOptions.get(word);
  437. return opt === null || opt === void 0 ? void 0 : opt.value;
  438. }).filter(function (val) {
  439. return val !== undefined;
  440. });
  441. }
  442. var newRawValues = Array.from(new Set([].concat((0, _toConsumableArray2.default)(rawValues), (0, _toConsumableArray2.default)(patchValues))));
  443. triggerChange(newRawValues);
  444. newRawValues.forEach(function (newRawValue) {
  445. triggerSelect(newRawValue, true);
  446. });
  447. };
  448. // ========================== Context ===========================
  449. var selectContext = React.useMemo(function () {
  450. var realVirtual = virtual !== false && dropdownMatchSelectWidth !== false;
  451. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, parsedOptions), {}, {
  452. flattenOptions: displayOptions,
  453. onActiveValue: onActiveValue,
  454. defaultActiveFirstOption: mergedDefaultActiveFirstOption,
  455. onSelect: onInternalSelect,
  456. menuItemSelectedIcon: menuItemSelectedIcon,
  457. rawValues: rawValues,
  458. fieldNames: mergedFieldNames,
  459. virtual: realVirtual,
  460. direction: direction,
  461. listHeight: listHeight,
  462. listItemHeight: listItemHeight,
  463. childrenAsData: childrenAsData,
  464. maxCount: maxCount,
  465. optionRender: optionRender
  466. });
  467. }, [maxCount, parsedOptions, displayOptions, onActiveValue, mergedDefaultActiveFirstOption, onInternalSelect, menuItemSelectedIcon, rawValues, mergedFieldNames, virtual, dropdownMatchSelectWidth, direction, listHeight, listItemHeight, childrenAsData, optionRender]);
  468. // ========================== Warning ===========================
  469. if (process.env.NODE_ENV !== 'production') {
  470. (0, _warningPropsUtil.default)(props);
  471. (0, _warningPropsUtil.warningNullOptions)(mergedOptions, mergedFieldNames);
  472. }
  473. // ==============================================================
  474. // == Render ==
  475. // ==============================================================
  476. return /*#__PURE__*/React.createElement(_SelectContext.default.Provider, {
  477. value: selectContext
  478. }, /*#__PURE__*/React.createElement(_BaseSelect.default, (0, _extends2.default)({}, restProps, {
  479. // >>> MISC
  480. id: mergedId,
  481. prefixCls: prefixCls,
  482. ref: ref,
  483. omitDomProps: OMIT_DOM_PROPS,
  484. mode: mode
  485. // >>> Values
  486. ,
  487. displayValues: displayValues,
  488. onDisplayValuesChange: onDisplayValuesChange
  489. // >>> Trigger
  490. ,
  491. direction: direction
  492. // >>> Search
  493. ,
  494. searchValue: mergedSearchValue,
  495. onSearch: onInternalSearch,
  496. autoClearSearchValue: autoClearSearchValue,
  497. onSearchSplit: onInternalSearchSplit,
  498. dropdownMatchSelectWidth: dropdownMatchSelectWidth
  499. // >>> OptionList
  500. ,
  501. OptionList: _OptionList.default,
  502. emptyOptions: !displayOptions.length
  503. // >>> Accessibility
  504. ,
  505. activeValue: activeValue,
  506. activeDescendantId: "".concat(mergedId, "_list_").concat(accessibilityIndex)
  507. })));
  508. });
  509. if (process.env.NODE_ENV !== 'production') {
  510. Select.displayName = 'Select';
  511. }
  512. var TypedSelect = Select;
  513. TypedSelect.Option = _Option.default;
  514. TypedSelect.OptGroup = _OptGroup.default;
  515. var _default = exports.default = TypedSelect;