Select.js 24 KB

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