TreeSelect.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
  2. import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
  3. import _typeof from "@babel/runtime/helpers/esm/typeof";
  4. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  5. import { createVNode as _createVNode, resolveDirective as _resolveDirective } from "vue";
  6. import OptionList from './OptionList';
  7. import { formatStrategyValues, SHOW_CHILD } from './utils/strategyUtil';
  8. import { useProvideSelectContext } from './TreeSelectContext';
  9. import { useProvideLegacySelectContext } from './LegacyContext';
  10. import useTreeData from './hooks/useTreeData';
  11. import { toArray, fillFieldNames, isNil } from './utils/valueUtil';
  12. import useCache from './hooks/useCache';
  13. import useDataEntities from './hooks/useDataEntities';
  14. import { fillAdditionalInfo, fillLegacyProps } from './utils/legacyUtil';
  15. import useCheckedKeys from './hooks/useCheckedKeys';
  16. import useFilterTreeData from './hooks/useFilterTreeData';
  17. import warningProps from './utils/warningPropsUtil';
  18. import { baseSelectPropsWithoutPrivate } from '../vc-select/BaseSelect';
  19. import { computed, defineComponent, ref, shallowRef, toRaw, toRef, toRefs, watchEffect } from 'vue';
  20. import omit from '../_util/omit';
  21. import PropTypes from '../_util/vue-types';
  22. import { BaseSelect } from '../vc-select';
  23. import { initDefaultProps } from '../_util/props-util';
  24. import useId from '../vc-select/hooks/useId';
  25. import useMergedState from '../_util/hooks/useMergedState';
  26. import { conductCheck } from '../vc-tree/utils/conductUtil';
  27. import { warning } from '../vc-util/warning';
  28. import { toReactive } from '../_util/toReactive';
  29. import useMaxLevel from '../vc-tree/useMaxLevel';
  30. export function treeSelectProps() {
  31. return _objectSpread(_objectSpread({}, omit(baseSelectPropsWithoutPrivate(), ['mode'])), {}, {
  32. prefixCls: String,
  33. id: String,
  34. value: {
  35. type: [String, Number, Object, Array]
  36. },
  37. defaultValue: {
  38. type: [String, Number, Object, Array]
  39. },
  40. onChange: {
  41. type: Function
  42. },
  43. searchValue: String,
  44. /** @deprecated Use `searchValue` instead */
  45. inputValue: String,
  46. onSearch: {
  47. type: Function
  48. },
  49. autoClearSearchValue: {
  50. type: Boolean,
  51. default: undefined
  52. },
  53. filterTreeNode: {
  54. type: [Boolean, Function],
  55. default: undefined
  56. },
  57. treeNodeFilterProp: String,
  58. // >>> Select
  59. onSelect: Function,
  60. onDeselect: Function,
  61. showCheckedStrategy: {
  62. type: String
  63. },
  64. treeNodeLabelProp: String,
  65. fieldNames: {
  66. type: Object
  67. },
  68. // >>> Mode
  69. multiple: {
  70. type: Boolean,
  71. default: undefined
  72. },
  73. treeCheckable: {
  74. type: Boolean,
  75. default: undefined
  76. },
  77. treeCheckStrictly: {
  78. type: Boolean,
  79. default: undefined
  80. },
  81. labelInValue: {
  82. type: Boolean,
  83. default: undefined
  84. },
  85. // >>> Data
  86. treeData: {
  87. type: Array
  88. },
  89. treeDataSimpleMode: {
  90. type: [Boolean, Object],
  91. default: undefined
  92. },
  93. loadData: {
  94. type: Function
  95. },
  96. treeLoadedKeys: {
  97. type: Array
  98. },
  99. onTreeLoad: {
  100. type: Function
  101. },
  102. // >>> Expanded
  103. treeDefaultExpandAll: {
  104. type: Boolean,
  105. default: undefined
  106. },
  107. treeExpandedKeys: {
  108. type: Array
  109. },
  110. treeDefaultExpandedKeys: {
  111. type: Array
  112. },
  113. onTreeExpand: {
  114. type: Function
  115. },
  116. // >>> Options
  117. virtual: {
  118. type: Boolean,
  119. default: undefined
  120. },
  121. listHeight: Number,
  122. listItemHeight: Number,
  123. onDropdownVisibleChange: {
  124. type: Function
  125. },
  126. // >>> Tree
  127. treeLine: {
  128. type: [Boolean, Object],
  129. default: undefined
  130. },
  131. treeIcon: PropTypes.any,
  132. showTreeIcon: {
  133. type: Boolean,
  134. default: undefined
  135. },
  136. switcherIcon: PropTypes.any,
  137. treeMotion: PropTypes.any,
  138. children: Array,
  139. showArrow: {
  140. type: Boolean,
  141. default: undefined
  142. },
  143. showSearch: {
  144. type: Boolean,
  145. default: undefined
  146. },
  147. open: {
  148. type: Boolean,
  149. default: undefined
  150. },
  151. defaultOpen: {
  152. type: Boolean,
  153. default: undefined
  154. },
  155. disabled: {
  156. type: Boolean,
  157. default: undefined
  158. },
  159. placeholder: PropTypes.any,
  160. maxTagPlaceholder: {
  161. type: Function
  162. },
  163. dropdownPopupAlign: PropTypes.any,
  164. customSlots: Object
  165. });
  166. }
  167. function isRawValue(value) {
  168. return !value || _typeof(value) !== 'object';
  169. }
  170. export default defineComponent({
  171. compatConfig: {
  172. MODE: 3
  173. },
  174. name: 'TreeSelect',
  175. inheritAttrs: false,
  176. props: initDefaultProps(treeSelectProps(), {
  177. treeNodeFilterProp: 'value',
  178. autoClearSearchValue: true,
  179. showCheckedStrategy: SHOW_CHILD,
  180. listHeight: 200,
  181. listItemHeight: 20,
  182. prefixCls: 'vc-tree-select'
  183. }),
  184. setup: function setup(props, _ref) {
  185. var attrs = _ref.attrs,
  186. expose = _ref.expose,
  187. slots = _ref.slots;
  188. var mergedId = useId(toRef(props, 'id'));
  189. var treeConduction = computed(function () {
  190. return props.treeCheckable && !props.treeCheckStrictly;
  191. });
  192. var mergedCheckable = computed(function () {
  193. return props.treeCheckable || props.treeCheckStrictly;
  194. });
  195. var mergedLabelInValue = computed(function () {
  196. return props.treeCheckStrictly || props.labelInValue;
  197. });
  198. var mergedMultiple = computed(function () {
  199. return mergedCheckable.value || props.multiple;
  200. });
  201. // ========================== Warning ===========================
  202. if (process.env.NODE_ENV !== 'production') {
  203. watchEffect(function () {
  204. warningProps(props);
  205. });
  206. }
  207. // ========================= FieldNames =========================
  208. var mergedFieldNames = computed(function () {
  209. return fillFieldNames(props.fieldNames);
  210. });
  211. // =========================== Search ===========================
  212. var _useMergedState = useMergedState('', {
  213. value: computed(function () {
  214. return props.searchValue !== undefined ? props.searchValue : props.inputValue;
  215. }),
  216. postState: function postState(search) {
  217. return search || '';
  218. }
  219. }),
  220. _useMergedState2 = _slicedToArray(_useMergedState, 2),
  221. mergedSearchValue = _useMergedState2[0],
  222. setSearchValue = _useMergedState2[1];
  223. var onInternalSearch = function onInternalSearch(searchText) {
  224. var _props$onSearch;
  225. setSearchValue(searchText);
  226. (_props$onSearch = props.onSearch) === null || _props$onSearch === void 0 ? void 0 : _props$onSearch.call(props, searchText);
  227. };
  228. // ============================ Data ============================
  229. // `useTreeData` only do convert of `children` or `simpleMode`.
  230. // Else will return origin `treeData` for perf consideration.
  231. // Do not do anything to loop the data.
  232. var mergedTreeData = useTreeData(toRef(props, 'treeData'), toRef(props, 'children'), toRef(props, 'treeDataSimpleMode'));
  233. var _useDataEntities = useDataEntities(mergedTreeData, mergedFieldNames),
  234. keyEntities = _useDataEntities.keyEntities,
  235. valueEntities = _useDataEntities.valueEntities;
  236. /** Get `missingRawValues` which not exist in the tree yet */
  237. var splitRawValues = function splitRawValues(newRawValues) {
  238. var missingRawValues = [];
  239. var existRawValues = [];
  240. // Keep missing value in the cache
  241. newRawValues.forEach(function (val) {
  242. if (valueEntities.value.has(val)) {
  243. existRawValues.push(val);
  244. } else {
  245. missingRawValues.push(val);
  246. }
  247. });
  248. return {
  249. missingRawValues: missingRawValues,
  250. existRawValues: existRawValues
  251. };
  252. };
  253. // Filtered Tree
  254. var filteredTreeData = useFilterTreeData(mergedTreeData, mergedSearchValue, {
  255. fieldNames: mergedFieldNames,
  256. treeNodeFilterProp: toRef(props, 'treeNodeFilterProp'),
  257. filterTreeNode: toRef(props, 'filterTreeNode')
  258. });
  259. // =========================== Label ============================
  260. var getLabel = function getLabel(item) {
  261. if (item) {
  262. if (props.treeNodeLabelProp) {
  263. return item[props.treeNodeLabelProp];
  264. }
  265. // Loop from fieldNames
  266. var titleList = mergedFieldNames.value._title;
  267. for (var i = 0; i < titleList.length; i += 1) {
  268. var title = item[titleList[i]];
  269. if (title !== undefined) {
  270. return title;
  271. }
  272. }
  273. }
  274. };
  275. // ========================= Wrap Value =========================
  276. var toLabeledValues = function toLabeledValues(draftValues) {
  277. var values = toArray(draftValues);
  278. return values.map(function (val) {
  279. if (isRawValue(val)) {
  280. return {
  281. value: val
  282. };
  283. }
  284. return val;
  285. });
  286. };
  287. var convert2LabelValues = function convert2LabelValues(draftValues) {
  288. var values = toLabeledValues(draftValues);
  289. return values.map(function (item) {
  290. var rawLabel = item.label;
  291. var rawValue = item.value,
  292. rawHalfChecked = item.halfChecked;
  293. var rawDisabled;
  294. var entity = valueEntities.value.get(rawValue);
  295. // Fill missing label & status
  296. if (entity) {
  297. var _rawLabel;
  298. rawLabel = (_rawLabel = rawLabel) !== null && _rawLabel !== void 0 ? _rawLabel : getLabel(entity.node);
  299. rawDisabled = entity.node.disabled;
  300. }
  301. return {
  302. label: rawLabel,
  303. value: rawValue,
  304. halfChecked: rawHalfChecked,
  305. disabled: rawDisabled
  306. };
  307. });
  308. };
  309. // =========================== Values ===========================
  310. var _useMergedState3 = useMergedState(props.defaultValue, {
  311. value: toRef(props, 'value')
  312. }),
  313. _useMergedState4 = _slicedToArray(_useMergedState3, 2),
  314. internalValue = _useMergedState4[0],
  315. setInternalValue = _useMergedState4[1];
  316. var rawMixedLabeledValues = computed(function () {
  317. return toLabeledValues(internalValue.value);
  318. });
  319. // Split value into full check and half check
  320. var rawLabeledValues = shallowRef([]);
  321. var rawHalfLabeledValues = shallowRef([]);
  322. watchEffect(function () {
  323. var fullCheckValues = [];
  324. var halfCheckValues = [];
  325. rawMixedLabeledValues.value.forEach(function (item) {
  326. if (item.halfChecked) {
  327. halfCheckValues.push(item);
  328. } else {
  329. fullCheckValues.push(item);
  330. }
  331. });
  332. rawLabeledValues.value = fullCheckValues;
  333. rawHalfLabeledValues.value = halfCheckValues;
  334. });
  335. // const [mergedValues] = useCache(rawLabeledValues);
  336. var rawValues = computed(function () {
  337. return rawLabeledValues.value.map(function (item) {
  338. return item.value;
  339. });
  340. });
  341. var _useMaxLevel = useMaxLevel(keyEntities),
  342. maxLevel = _useMaxLevel.maxLevel,
  343. levelEntities = _useMaxLevel.levelEntities;
  344. // Convert value to key. Will fill missed keys for conduct check.
  345. var _useCheckedKeys = useCheckedKeys(rawLabeledValues, rawHalfLabeledValues, treeConduction, keyEntities, maxLevel, levelEntities),
  346. _useCheckedKeys2 = _slicedToArray(_useCheckedKeys, 2),
  347. rawCheckedValues = _useCheckedKeys2[0],
  348. rawHalfCheckedValues = _useCheckedKeys2[1];
  349. // Convert rawCheckedKeys to check strategy related values
  350. var displayValues = computed(function () {
  351. // Collect keys which need to show
  352. var displayKeys = formatStrategyValues(rawCheckedValues.value, props.showCheckedStrategy, keyEntities.value, mergedFieldNames.value);
  353. // Convert to value and filled with label
  354. var values = displayKeys.map(function (key) {
  355. var _keyEntities$value$ke, _keyEntities$value$ke2, _keyEntities$value$ke3;
  356. return (_keyEntities$value$ke = (_keyEntities$value$ke2 = keyEntities.value[key]) === null || _keyEntities$value$ke2 === void 0 ? void 0 : (_keyEntities$value$ke3 = _keyEntities$value$ke2.node) === null || _keyEntities$value$ke3 === void 0 ? void 0 : _keyEntities$value$ke3[mergedFieldNames.value.value]) !== null && _keyEntities$value$ke !== void 0 ? _keyEntities$value$ke : key;
  357. });
  358. // Back fill with origin label
  359. var labeledValues = values.map(function (val) {
  360. var targetItem = rawLabeledValues.value.find(function (item) {
  361. return item.value === val;
  362. });
  363. return {
  364. value: val,
  365. label: targetItem === null || targetItem === void 0 ? void 0 : targetItem.label
  366. };
  367. });
  368. var rawDisplayValues = convert2LabelValues(labeledValues);
  369. var firstVal = rawDisplayValues[0];
  370. if (!mergedMultiple.value && firstVal && isNil(firstVal.value) && isNil(firstVal.label)) {
  371. return [];
  372. }
  373. return rawDisplayValues.map(function (item) {
  374. var _item$label;
  375. return _objectSpread(_objectSpread({}, item), {}, {
  376. label: (_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.value
  377. });
  378. });
  379. });
  380. var _useCache = useCache(displayValues),
  381. _useCache2 = _slicedToArray(_useCache, 1),
  382. cachedDisplayValues = _useCache2[0];
  383. // =========================== Change ===========================
  384. var triggerChange = function triggerChange(newRawValues, extra, source) {
  385. var labeledValues = convert2LabelValues(newRawValues);
  386. setInternalValue(labeledValues);
  387. // Clean up if needed
  388. if (props.autoClearSearchValue) {
  389. setSearchValue('');
  390. }
  391. // Generate rest parameters is costly, so only do it when necessary
  392. if (props.onChange) {
  393. var eventValues = newRawValues;
  394. if (treeConduction.value) {
  395. var formattedKeyList = formatStrategyValues(newRawValues, props.showCheckedStrategy, keyEntities.value, mergedFieldNames.value);
  396. eventValues = formattedKeyList.map(function (key) {
  397. var entity = valueEntities.value.get(key);
  398. return entity ? entity.node[mergedFieldNames.value.value] : key;
  399. });
  400. }
  401. var _ref2 = extra || {
  402. triggerValue: undefined,
  403. selected: undefined
  404. },
  405. triggerValue = _ref2.triggerValue,
  406. selected = _ref2.selected;
  407. var returnRawValues = eventValues;
  408. // We need fill half check back
  409. if (props.treeCheckStrictly) {
  410. var halfValues = rawHalfLabeledValues.value.filter(function (item) {
  411. return !eventValues.includes(item.value);
  412. });
  413. returnRawValues = [].concat(_toConsumableArray(returnRawValues), _toConsumableArray(halfValues));
  414. }
  415. var returnLabeledValues = convert2LabelValues(returnRawValues);
  416. var additionalInfo = {
  417. // [Legacy] Always return as array contains label & value
  418. preValue: rawLabeledValues.value,
  419. triggerValue: triggerValue
  420. };
  421. // [Legacy] Fill legacy data if user query.
  422. // This is expansive that we only fill when user query
  423. // https://github.com/react-component/tree-select/blob/fe33eb7c27830c9ac70cd1fdb1ebbe7bc679c16a/src/Select.jsx
  424. var showPosition = true;
  425. if (props.treeCheckStrictly || source === 'selection' && !selected) {
  426. showPosition = false;
  427. }
  428. fillAdditionalInfo(additionalInfo, triggerValue, newRawValues, mergedTreeData.value, showPosition, mergedFieldNames.value);
  429. if (mergedCheckable.value) {
  430. additionalInfo.checked = selected;
  431. } else {
  432. additionalInfo.selected = selected;
  433. }
  434. var returnValues = mergedLabelInValue.value ? returnLabeledValues : returnLabeledValues.map(function (item) {
  435. return item.value;
  436. });
  437. props.onChange(mergedMultiple.value ? returnValues : returnValues[0], mergedLabelInValue.value ? null : returnLabeledValues.map(function (item) {
  438. return item.label;
  439. }), additionalInfo);
  440. }
  441. };
  442. // ========================== Options ===========================
  443. /** Trigger by option list */
  444. var onOptionSelect = function onOptionSelect(selectedKey, _ref3) {
  445. var _node$mergedFieldName;
  446. var selected = _ref3.selected,
  447. source = _ref3.source;
  448. var keyEntitiesValue = toRaw(keyEntities.value);
  449. var valueEntitiesValue = toRaw(valueEntities.value);
  450. var entity = keyEntitiesValue[selectedKey];
  451. var node = entity === null || entity === void 0 ? void 0 : entity.node;
  452. var selectedValue = (_node$mergedFieldName = node === null || node === void 0 ? void 0 : node[mergedFieldNames.value.value]) !== null && _node$mergedFieldName !== void 0 ? _node$mergedFieldName : selectedKey;
  453. // Never be falsy but keep it safe
  454. if (!mergedMultiple.value) {
  455. // Single mode always set value
  456. triggerChange([selectedValue], {
  457. selected: true,
  458. triggerValue: selectedValue
  459. }, 'option');
  460. } else {
  461. var newRawValues = selected ? [].concat(_toConsumableArray(rawValues.value), [selectedValue]) : rawCheckedValues.value.filter(function (v) {
  462. return v !== selectedValue;
  463. });
  464. // Add keys if tree conduction
  465. if (treeConduction.value) {
  466. // Should keep missing values
  467. var _splitRawValues = splitRawValues(newRawValues),
  468. missingRawValues = _splitRawValues.missingRawValues,
  469. existRawValues = _splitRawValues.existRawValues;
  470. var keyList = existRawValues.map(function (val) {
  471. return valueEntitiesValue.get(val).key;
  472. });
  473. // Conduction by selected or not
  474. var checkedKeys;
  475. if (selected) {
  476. var _conductCheck = conductCheck(keyList, true, keyEntitiesValue, maxLevel.value, levelEntities.value);
  477. checkedKeys = _conductCheck.checkedKeys;
  478. } else {
  479. var _conductCheck2 = conductCheck(keyList, {
  480. checked: false,
  481. halfCheckedKeys: rawHalfCheckedValues.value
  482. }, keyEntitiesValue, maxLevel.value, levelEntities.value);
  483. checkedKeys = _conductCheck2.checkedKeys;
  484. }
  485. // Fill back of keys
  486. newRawValues = [].concat(_toConsumableArray(missingRawValues), _toConsumableArray(checkedKeys.map(function (key) {
  487. return keyEntitiesValue[key].node[mergedFieldNames.value.value];
  488. })));
  489. }
  490. triggerChange(newRawValues, {
  491. selected: selected,
  492. triggerValue: selectedValue
  493. }, source || 'option');
  494. }
  495. // Trigger select event
  496. if (selected || !mergedMultiple.value) {
  497. var _props$onSelect;
  498. (_props$onSelect = props.onSelect) === null || _props$onSelect === void 0 ? void 0 : _props$onSelect.call(props, selectedValue, fillLegacyProps(node));
  499. } else {
  500. var _props$onDeselect;
  501. (_props$onDeselect = props.onDeselect) === null || _props$onDeselect === void 0 ? void 0 : _props$onDeselect.call(props, selectedValue, fillLegacyProps(node));
  502. }
  503. };
  504. // ========================== Dropdown ==========================
  505. var onInternalDropdownVisibleChange = function onInternalDropdownVisibleChange(open) {
  506. if (props.onDropdownVisibleChange) {
  507. var legacyParam = {};
  508. Object.defineProperty(legacyParam, 'documentClickClose', {
  509. get: function get() {
  510. warning(false, 'Second param of `onDropdownVisibleChange` has been removed.');
  511. return false;
  512. }
  513. });
  514. props.onDropdownVisibleChange(open, legacyParam);
  515. }
  516. };
  517. // ====================== Display Change ========================
  518. var onDisplayValuesChange = function onDisplayValuesChange(newValues, info) {
  519. var newRawValues = newValues.map(function (item) {
  520. return item.value;
  521. });
  522. if (info.type === 'clear') {
  523. triggerChange(newRawValues, {}, 'selection');
  524. return;
  525. }
  526. // TreeSelect only have multiple mode which means display change only has remove
  527. if (info.values.length) {
  528. onOptionSelect(info.values[0].value, {
  529. selected: false,
  530. source: 'selection'
  531. });
  532. }
  533. };
  534. var _toRefs = toRefs(props),
  535. treeNodeFilterProp = _toRefs.treeNodeFilterProp,
  536. loadData = _toRefs.loadData,
  537. treeLoadedKeys = _toRefs.treeLoadedKeys,
  538. onTreeLoad = _toRefs.onTreeLoad,
  539. treeDefaultExpandAll = _toRefs.treeDefaultExpandAll,
  540. treeExpandedKeys = _toRefs.treeExpandedKeys,
  541. treeDefaultExpandedKeys = _toRefs.treeDefaultExpandedKeys,
  542. onTreeExpand = _toRefs.onTreeExpand,
  543. virtual = _toRefs.virtual,
  544. listHeight = _toRefs.listHeight,
  545. listItemHeight = _toRefs.listItemHeight,
  546. treeLine = _toRefs.treeLine,
  547. treeIcon = _toRefs.treeIcon,
  548. showTreeIcon = _toRefs.showTreeIcon,
  549. switcherIcon = _toRefs.switcherIcon,
  550. treeMotion = _toRefs.treeMotion,
  551. customSlots = _toRefs.customSlots;
  552. toRaw;
  553. useProvideLegacySelectContext(toReactive({
  554. checkable: mergedCheckable,
  555. loadData: loadData,
  556. treeLoadedKeys: treeLoadedKeys,
  557. onTreeLoad: onTreeLoad,
  558. checkedKeys: rawCheckedValues,
  559. halfCheckedKeys: rawHalfCheckedValues,
  560. treeDefaultExpandAll: treeDefaultExpandAll,
  561. treeExpandedKeys: treeExpandedKeys,
  562. treeDefaultExpandedKeys: treeDefaultExpandedKeys,
  563. onTreeExpand: onTreeExpand,
  564. treeIcon: treeIcon,
  565. treeMotion: treeMotion,
  566. showTreeIcon: showTreeIcon,
  567. switcherIcon: switcherIcon,
  568. treeLine: treeLine,
  569. treeNodeFilterProp: treeNodeFilterProp,
  570. keyEntities: keyEntities,
  571. customSlots: customSlots
  572. }));
  573. useProvideSelectContext(toReactive({
  574. virtual: virtual,
  575. listHeight: listHeight,
  576. listItemHeight: listItemHeight,
  577. treeData: filteredTreeData,
  578. fieldNames: mergedFieldNames,
  579. onSelect: onOptionSelect
  580. }));
  581. var selectRef = ref();
  582. expose({
  583. focus: function focus() {
  584. var _selectRef$value;
  585. (_selectRef$value = selectRef.value) === null || _selectRef$value === void 0 ? void 0 : _selectRef$value.focus();
  586. },
  587. blur: function blur() {
  588. var _selectRef$value2;
  589. (_selectRef$value2 = selectRef.value) === null || _selectRef$value2 === void 0 ? void 0 : _selectRef$value2.blur();
  590. },
  591. scrollTo: function scrollTo(arg) {
  592. var _selectRef$value3;
  593. (_selectRef$value3 = selectRef.value) === null || _selectRef$value3 === void 0 ? void 0 : _selectRef$value3.scrollTo(arg);
  594. }
  595. });
  596. return function () {
  597. var _props$dropdownMatchS;
  598. var restProps = omit(props, ['id', 'prefixCls',
  599. // Value
  600. 'value', 'defaultValue', 'onChange', 'onSelect', 'onDeselect',
  601. // Search
  602. 'searchValue', 'inputValue', 'onSearch', 'autoClearSearchValue', 'filterTreeNode', 'treeNodeFilterProp',
  603. // Selector
  604. 'showCheckedStrategy', 'treeNodeLabelProp',
  605. // Mode
  606. 'multiple', 'treeCheckable', 'treeCheckStrictly', 'labelInValue',
  607. // FieldNames
  608. 'fieldNames',
  609. // Data
  610. 'treeDataSimpleMode', 'treeData', 'children', 'loadData', 'treeLoadedKeys', 'onTreeLoad',
  611. // Expanded
  612. 'treeDefaultExpandAll', 'treeExpandedKeys', 'treeDefaultExpandedKeys', 'onTreeExpand',
  613. // Options
  614. 'virtual', 'listHeight', 'listItemHeight', 'onDropdownVisibleChange',
  615. // Tree
  616. 'treeLine', 'treeIcon', 'showTreeIcon', 'switcherIcon', 'treeMotion']);
  617. return _createVNode(BaseSelect, _objectSpread(_objectSpread(_objectSpread({
  618. "ref": selectRef
  619. }, attrs), restProps), {}, {
  620. "id": mergedId,
  621. "prefixCls": props.prefixCls,
  622. "mode": mergedMultiple.value ? 'multiple' : undefined,
  623. "displayValues": cachedDisplayValues.value,
  624. "onDisplayValuesChange": onDisplayValuesChange,
  625. "searchValue": mergedSearchValue.value,
  626. "onSearch": onInternalSearch,
  627. "OptionList": OptionList,
  628. "emptyOptions": !mergedTreeData.value.length,
  629. "onDropdownVisibleChange": onInternalDropdownVisibleChange,
  630. "tagRender": props.tagRender || slots.tagRender,
  631. "dropdownMatchSelectWidth": (_props$dropdownMatchS = props.dropdownMatchSelectWidth) !== null && _props$dropdownMatchS !== void 0 ? _props$dropdownMatchS : true
  632. }), slots);
  633. };
  634. }
  635. });