TreeSelect.js 22 KB

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