BaseSelect.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = exports.baseSelectPropsWithoutPrivate = void 0;
  7. exports.isMultiple = isMultiple;
  8. var _vue = require("vue");
  9. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  10. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  11. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  12. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  13. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  14. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  15. var _valueUtil = require("./utils/valueUtil");
  16. var _SelectTrigger = _interopRequireDefault(require("./SelectTrigger"));
  17. var _Selector = _interopRequireDefault(require("./Selector"));
  18. var _useSelectTriggerControl = _interopRequireDefault(require("./hooks/useSelectTriggerControl"));
  19. var _useDelayReset3 = _interopRequireDefault(require("./hooks/useDelayReset"));
  20. var _TransBtn = _interopRequireDefault(require("./TransBtn"));
  21. var _useLock3 = _interopRequireDefault(require("./hooks/useLock"));
  22. var _useBaseProps = require("./hooks/useBaseProps");
  23. var _vueTypes = _interopRequireDefault(require("../_util/vue-types"));
  24. var _propsUtil = require("../_util/props-util");
  25. var _isMobile = _interopRequireDefault(require("../vc-util/isMobile"));
  26. var _KeyCode = _interopRequireDefault(require("../_util/KeyCode"));
  27. var _toReactive = require("../_util/toReactive");
  28. var _classNames3 = _interopRequireDefault(require("../_util/classNames"));
  29. var _createRef = _interopRequireDefault(require("../_util/createRef"));
  30. var _LegacyContext = _interopRequireDefault(require("../vc-tree-select/LegacyContext"));
  31. var _vnode = require("../_util/vnode");
  32. var _excluded = ["prefixCls", "id", "open", "defaultOpen", "mode", "showSearch", "searchValue", "onSearch", "allowClear", "clearIcon", "showArrow", "inputIcon", "disabled", "loading", "getInputElement", "getPopupContainer", "placement", "animation", "transitionName", "dropdownStyle", "dropdownClassName", "dropdownMatchSelectWidth", "dropdownRender", "dropdownAlign", "showAction", "direction", "tokenSeparators", "tagRender", "optionLabelRender", "onPopupScroll", "onDropdownVisibleChange", "onFocus", "onBlur", "onKeyup", "onKeydown", "onMousedown", "onClear", "omitDomProps", "getRawInputElement", "displayValues", "onDisplayValuesChange", "emptyOptions", "activeDescendantId", "activeValue", "OptionList"];
  33. var DEFAULT_OMIT_PROPS = ['value', 'onChange', 'removeIcon', 'placeholder', 'autofocus', 'maxTagCount', 'maxTagTextLength', 'maxTagPlaceholder', 'choiceTransitionName', 'onInputKeyDown', 'onPopupScroll', 'tabindex', 'OptionList', 'notFoundContent'];
  34. var baseSelectPrivateProps = function baseSelectPrivateProps() {
  35. return {
  36. prefixCls: String,
  37. id: String,
  38. omitDomProps: Array,
  39. // >>> Value
  40. displayValues: Array,
  41. onDisplayValuesChange: Function,
  42. // >>> Active
  43. /** Current dropdown list active item string value */
  44. activeValue: String,
  45. /** Link search input with target element */
  46. activeDescendantId: String,
  47. onActiveValueChange: Function,
  48. // >>> Search
  49. searchValue: String,
  50. /** Trigger onSearch, return false to prevent trigger open event */
  51. onSearch: Function,
  52. /** Trigger when search text match the `tokenSeparators`. Will provide split content */
  53. onSearchSplit: Function,
  54. maxLength: Number,
  55. OptionList: _vueTypes.default.any,
  56. /** Tell if provided `options` is empty */
  57. emptyOptions: Boolean
  58. };
  59. };
  60. var baseSelectPropsWithoutPrivate = function baseSelectPropsWithoutPrivate() {
  61. return {
  62. showSearch: {
  63. type: Boolean,
  64. default: undefined
  65. },
  66. tagRender: {
  67. type: Function
  68. },
  69. optionLabelRender: {
  70. type: Function
  71. },
  72. direction: {
  73. type: String
  74. },
  75. // MISC
  76. tabindex: Number,
  77. autofocus: Boolean,
  78. notFoundContent: _vueTypes.default.any,
  79. placeholder: _vueTypes.default.any,
  80. onClear: Function,
  81. choiceTransitionName: String,
  82. // >>> Mode
  83. mode: String,
  84. // >>> Status
  85. disabled: {
  86. type: Boolean,
  87. default: undefined
  88. },
  89. loading: {
  90. type: Boolean,
  91. default: undefined
  92. },
  93. // >>> Open
  94. open: {
  95. type: Boolean,
  96. default: undefined
  97. },
  98. defaultOpen: {
  99. type: Boolean,
  100. default: undefined
  101. },
  102. onDropdownVisibleChange: {
  103. type: Function
  104. },
  105. // >>> Customize Input
  106. /** @private Internal usage. Do not use in your production. */
  107. getInputElement: {
  108. type: Function
  109. },
  110. /** @private Internal usage. Do not use in your production. */
  111. getRawInputElement: {
  112. type: Function
  113. },
  114. // >>> Selector
  115. maxTagTextLength: Number,
  116. maxTagCount: {
  117. type: [String, Number]
  118. },
  119. maxTagPlaceholder: _vueTypes.default.any,
  120. // >>> Search
  121. tokenSeparators: {
  122. type: Array
  123. },
  124. // >>> Icons
  125. allowClear: {
  126. type: Boolean,
  127. default: undefined
  128. },
  129. showArrow: {
  130. type: Boolean,
  131. default: undefined
  132. },
  133. inputIcon: _vueTypes.default.any,
  134. /** Clear all icon */
  135. clearIcon: _vueTypes.default.any,
  136. /** Selector remove icon */
  137. removeIcon: _vueTypes.default.any,
  138. // >>> Dropdown
  139. animation: String,
  140. transitionName: String,
  141. dropdownStyle: {
  142. type: Object
  143. },
  144. dropdownClassName: String,
  145. dropdownMatchSelectWidth: {
  146. type: [Boolean, Number],
  147. default: undefined
  148. },
  149. dropdownRender: {
  150. type: Function
  151. },
  152. dropdownAlign: Object,
  153. placement: {
  154. type: String
  155. },
  156. getPopupContainer: {
  157. type: Function
  158. },
  159. // >>> Focus
  160. showAction: {
  161. type: Array
  162. },
  163. onBlur: {
  164. type: Function
  165. },
  166. onFocus: {
  167. type: Function
  168. },
  169. // >>> Rest Events
  170. onKeyup: Function,
  171. onKeydown: Function,
  172. onMousedown: Function,
  173. onPopupScroll: Function,
  174. onInputKeyDown: Function,
  175. onMouseenter: Function,
  176. onMouseleave: Function,
  177. onClick: Function
  178. };
  179. };
  180. exports.baseSelectPropsWithoutPrivate = baseSelectPropsWithoutPrivate;
  181. var baseSelectProps = function baseSelectProps() {
  182. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, baseSelectPrivateProps()), baseSelectPropsWithoutPrivate());
  183. };
  184. function isMultiple(mode) {
  185. return mode === 'tags' || mode === 'multiple';
  186. }
  187. var _default2 = (0, _vue.defineComponent)({
  188. compatConfig: {
  189. MODE: 3
  190. },
  191. name: 'BaseSelect',
  192. inheritAttrs: false,
  193. props: (0, _propsUtil.initDefaultProps)(baseSelectProps(), {
  194. showAction: [],
  195. notFoundContent: 'Not Found'
  196. }),
  197. setup: function setup(props, _ref) {
  198. var attrs = _ref.attrs,
  199. expose = _ref.expose,
  200. slots = _ref.slots;
  201. var multiple = (0, _vue.computed)(function () {
  202. return isMultiple(props.mode);
  203. });
  204. var mergedShowSearch = (0, _vue.computed)(function () {
  205. return props.showSearch !== undefined ? props.showSearch : multiple.value || props.mode === 'combobox';
  206. });
  207. var mobile = (0, _vue.ref)(false);
  208. (0, _vue.onMounted)(function () {
  209. mobile.value = (0, _isMobile.default)();
  210. });
  211. var legacyTreeSelectContext = (0, _LegacyContext.default)();
  212. // ============================== Refs ==============================
  213. var containerRef = (0, _vue.ref)(null);
  214. var selectorDomRef = (0, _createRef.default)();
  215. var triggerRef = (0, _vue.ref)(null);
  216. var selectorRef = (0, _vue.ref)(null);
  217. var listRef = (0, _vue.ref)(null);
  218. /** Used for component focused management */
  219. var _useDelayReset = (0, _useDelayReset3.default)(),
  220. _useDelayReset2 = (0, _slicedToArray2.default)(_useDelayReset, 3),
  221. mockFocused = _useDelayReset2[0],
  222. setMockFocused = _useDelayReset2[1],
  223. cancelSetMockFocused = _useDelayReset2[2];
  224. var focus = function focus() {
  225. var _selectorRef$value;
  226. (_selectorRef$value = selectorRef.value) === null || _selectorRef$value === void 0 ? void 0 : _selectorRef$value.focus();
  227. };
  228. var blur = function blur() {
  229. var _selectorRef$value2;
  230. (_selectorRef$value2 = selectorRef.value) === null || _selectorRef$value2 === void 0 ? void 0 : _selectorRef$value2.blur();
  231. };
  232. expose({
  233. focus: focus,
  234. blur: blur,
  235. scrollTo: function scrollTo(arg) {
  236. var _listRef$value;
  237. return (_listRef$value = listRef.value) === null || _listRef$value === void 0 ? void 0 : _listRef$value.scrollTo(arg);
  238. }
  239. });
  240. var mergedSearchValue = (0, _vue.computed)(function () {
  241. var _props$displayValues$;
  242. if (props.mode !== 'combobox') {
  243. return props.searchValue;
  244. }
  245. var val = (_props$displayValues$ = props.displayValues[0]) === null || _props$displayValues$ === void 0 ? void 0 : _props$displayValues$.value;
  246. return typeof val === 'string' || typeof val === 'number' ? String(val) : '';
  247. });
  248. // ============================== Open ==============================
  249. var initOpen = props.open !== undefined ? props.open : props.defaultOpen;
  250. var innerOpen = (0, _vue.ref)(initOpen);
  251. var mergedOpen = (0, _vue.ref)(initOpen);
  252. var setInnerOpen = function setInnerOpen(val) {
  253. innerOpen.value = props.open !== undefined ? props.open : val;
  254. mergedOpen.value = innerOpen.value;
  255. };
  256. (0, _vue.watch)(function () {
  257. return props.open;
  258. }, function () {
  259. setInnerOpen(props.open);
  260. });
  261. // Not trigger `open` in `combobox` when `notFoundContent` is empty
  262. var emptyListContent = (0, _vue.computed)(function () {
  263. return !props.notFoundContent && props.emptyOptions;
  264. });
  265. (0, _vue.watchEffect)(function () {
  266. mergedOpen.value = innerOpen.value;
  267. if (props.disabled || emptyListContent.value && mergedOpen.value && props.mode === 'combobox') {
  268. mergedOpen.value = false;
  269. }
  270. });
  271. var triggerOpen = (0, _vue.computed)(function () {
  272. return emptyListContent.value ? false : mergedOpen.value;
  273. });
  274. var onToggleOpen = function onToggleOpen(newOpen) {
  275. var nextOpen = newOpen !== undefined ? newOpen : !mergedOpen.value;
  276. if (innerOpen.value !== nextOpen && !props.disabled) {
  277. setInnerOpen(nextOpen);
  278. if (props.onDropdownVisibleChange) {
  279. props.onDropdownVisibleChange(nextOpen);
  280. }
  281. }
  282. };
  283. var tokenWithEnter = (0, _vue.computed)(function () {
  284. return (props.tokenSeparators || []).some(function (tokenSeparator) {
  285. return ['\n', '\r\n'].includes(tokenSeparator);
  286. });
  287. });
  288. var onInternalSearch = function onInternalSearch(searchText, fromTyping, isCompositing) {
  289. var _props$onActiveValueC;
  290. var ret = true;
  291. var newSearchText = searchText;
  292. (_props$onActiveValueC = props.onActiveValueChange) === null || _props$onActiveValueC === void 0 ? void 0 : _props$onActiveValueC.call(props, null);
  293. // Check if match the `tokenSeparators`
  294. var patchLabels = isCompositing ? null : (0, _valueUtil.getSeparatedContent)(searchText, props.tokenSeparators);
  295. // Ignore combobox since it's not split-able
  296. if (props.mode !== 'combobox' && patchLabels) {
  297. var _props$onSearchSplit;
  298. newSearchText = '';
  299. (_props$onSearchSplit = props.onSearchSplit) === null || _props$onSearchSplit === void 0 ? void 0 : _props$onSearchSplit.call(props, patchLabels);
  300. // Should close when paste finish
  301. onToggleOpen(false);
  302. // Tell Selector that break next actions
  303. ret = false;
  304. }
  305. if (props.onSearch && mergedSearchValue.value !== newSearchText) {
  306. props.onSearch(newSearchText, {
  307. source: fromTyping ? 'typing' : 'effect'
  308. });
  309. }
  310. return ret;
  311. };
  312. // Only triggered when menu is closed & mode is tags
  313. // If menu is open, OptionList will take charge
  314. // If mode isn't tags, press enter is not meaningful when you can't see any option
  315. var onInternalSearchSubmit = function onInternalSearchSubmit(searchText) {
  316. var _props$onSearch;
  317. // prevent empty tags from appearing when you click the Enter button
  318. if (!searchText || !searchText.trim()) {
  319. return;
  320. }
  321. (_props$onSearch = props.onSearch) === null || _props$onSearch === void 0 ? void 0 : _props$onSearch.call(props, searchText, {
  322. source: 'submit'
  323. });
  324. };
  325. // Close will clean up single mode search text
  326. (0, _vue.watch)(mergedOpen, function () {
  327. if (!mergedOpen.value && !multiple.value && props.mode !== 'combobox') {
  328. onInternalSearch('', false, false);
  329. }
  330. }, {
  331. immediate: true,
  332. flush: 'post'
  333. });
  334. // ============================ Disabled ============================
  335. // Close dropdown & remove focus state when disabled change
  336. (0, _vue.watch)(function () {
  337. return props.disabled;
  338. }, function () {
  339. if (innerOpen.value && !!props.disabled) {
  340. setInnerOpen(false);
  341. }
  342. }, {
  343. immediate: true
  344. });
  345. // ============================ Keyboard ============================
  346. /**
  347. * We record input value here to check if can press to clean up by backspace
  348. * - null: Key is not down, this is reset by key up
  349. * - true: Search text is empty when first time backspace down
  350. * - false: Search text is not empty when first time backspace down
  351. */
  352. var _useLock = (0, _useLock3.default)(),
  353. _useLock2 = (0, _slicedToArray2.default)(_useLock, 2),
  354. getClearLock = _useLock2[0],
  355. setClearLock = _useLock2[1];
  356. // KeyDown
  357. var onInternalKeyDown = function onInternalKeyDown(event) {
  358. var _props$onKeydown;
  359. var clearLock = getClearLock();
  360. var which = event.which;
  361. if (which === _KeyCode.default.ENTER) {
  362. // Do not submit form when type in the input
  363. if (props.mode !== 'combobox') {
  364. event.preventDefault();
  365. }
  366. // We only manage open state here, close logic should handle by list component
  367. if (!mergedOpen.value) {
  368. onToggleOpen(true);
  369. }
  370. }
  371. setClearLock(!!mergedSearchValue.value);
  372. // Remove value by `backspace`
  373. if (which === _KeyCode.default.BACKSPACE && !clearLock && multiple.value && !mergedSearchValue.value && props.displayValues.length) {
  374. var cloneDisplayValues = (0, _toConsumableArray2.default)(props.displayValues);
  375. var removedDisplayValue = null;
  376. for (var i = cloneDisplayValues.length - 1; i >= 0; i -= 1) {
  377. var current = cloneDisplayValues[i];
  378. if (!current.disabled) {
  379. cloneDisplayValues.splice(i, 1);
  380. removedDisplayValue = current;
  381. break;
  382. }
  383. }
  384. if (removedDisplayValue) {
  385. props.onDisplayValuesChange(cloneDisplayValues, {
  386. type: 'remove',
  387. values: [removedDisplayValue]
  388. });
  389. }
  390. }
  391. for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
  392. rest[_key - 1] = arguments[_key];
  393. }
  394. if (mergedOpen.value && listRef.value) {
  395. var _listRef$value2;
  396. (_listRef$value2 = listRef.value).onKeydown.apply(_listRef$value2, [event].concat(rest));
  397. }
  398. (_props$onKeydown = props.onKeydown) === null || _props$onKeydown === void 0 ? void 0 : _props$onKeydown.call.apply(_props$onKeydown, [props, event].concat(rest));
  399. };
  400. // KeyUp
  401. var onInternalKeyUp = function onInternalKeyUp(event) {
  402. for (var _len2 = arguments.length, rest = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
  403. rest[_key2 - 1] = arguments[_key2];
  404. }
  405. if (mergedOpen.value && listRef.value) {
  406. var _listRef$value3;
  407. (_listRef$value3 = listRef.value).onKeyup.apply(_listRef$value3, [event].concat(rest));
  408. }
  409. if (props.onKeyup) {
  410. props.onKeyup.apply(props, [event].concat(rest));
  411. }
  412. };
  413. // ============================ Selector ============================
  414. var onSelectorRemove = function onSelectorRemove(val) {
  415. var newValues = props.displayValues.filter(function (i) {
  416. return i !== val;
  417. });
  418. props.onDisplayValuesChange(newValues, {
  419. type: 'remove',
  420. values: [val]
  421. });
  422. };
  423. // ========================== Focus / Blur ==========================
  424. /** Record real focus status */
  425. var focusRef = (0, _vue.ref)(false);
  426. var onContainerFocus = function onContainerFocus() {
  427. setMockFocused(true);
  428. if (!props.disabled) {
  429. if (props.onFocus && !focusRef.value) {
  430. props.onFocus.apply(props, arguments);
  431. }
  432. // `showAction` should handle `focus` if set
  433. if (props.showAction && props.showAction.includes('focus')) {
  434. onToggleOpen(true);
  435. }
  436. }
  437. focusRef.value = true;
  438. };
  439. var onContainerBlur = function onContainerBlur() {
  440. setMockFocused(false, function () {
  441. focusRef.value = false;
  442. onToggleOpen(false);
  443. });
  444. if (props.disabled) {
  445. return;
  446. }
  447. var searchVal = mergedSearchValue.value;
  448. if (searchVal) {
  449. // `tags` mode should move `searchValue` into values
  450. if (props.mode === 'tags') {
  451. props.onSearch(searchVal, {
  452. source: 'submit'
  453. });
  454. } else if (props.mode === 'multiple') {
  455. // `multiple` mode only clean the search value but not trigger event
  456. props.onSearch('', {
  457. source: 'blur'
  458. });
  459. }
  460. }
  461. if (props.onBlur) {
  462. props.onBlur.apply(props, arguments);
  463. }
  464. };
  465. (0, _vue.provide)('VCSelectContainerEvent', {
  466. focus: onContainerFocus,
  467. blur: onContainerBlur
  468. });
  469. // Give focus back of Select
  470. var activeTimeoutIds = [];
  471. (0, _vue.onMounted)(function () {
  472. activeTimeoutIds.forEach(function (timeoutId) {
  473. return clearTimeout(timeoutId);
  474. });
  475. activeTimeoutIds.splice(0, activeTimeoutIds.length);
  476. });
  477. (0, _vue.onBeforeUnmount)(function () {
  478. activeTimeoutIds.forEach(function (timeoutId) {
  479. return clearTimeout(timeoutId);
  480. });
  481. activeTimeoutIds.splice(0, activeTimeoutIds.length);
  482. });
  483. var onInternalMouseDown = function onInternalMouseDown(event) {
  484. var _triggerRef$value, _props$onMousedown;
  485. var target = event.target;
  486. var popupElement = (_triggerRef$value = triggerRef.value) === null || _triggerRef$value === void 0 ? void 0 : _triggerRef$value.getPopupElement();
  487. // We should give focus back to selector if clicked item is not focusable
  488. if (popupElement && popupElement.contains(target)) {
  489. var timeoutId = setTimeout(function () {
  490. var index = activeTimeoutIds.indexOf(timeoutId);
  491. if (index !== -1) {
  492. activeTimeoutIds.splice(index, 1);
  493. }
  494. cancelSetMockFocused();
  495. if (!mobile.value && !popupElement.contains(document.activeElement)) {
  496. var _selectorRef$value3;
  497. (_selectorRef$value3 = selectorRef.value) === null || _selectorRef$value3 === void 0 ? void 0 : _selectorRef$value3.focus();
  498. }
  499. });
  500. activeTimeoutIds.push(timeoutId);
  501. }
  502. for (var _len3 = arguments.length, restArgs = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
  503. restArgs[_key3 - 1] = arguments[_key3];
  504. }
  505. (_props$onMousedown = props.onMousedown) === null || _props$onMousedown === void 0 ? void 0 : _props$onMousedown.call.apply(_props$onMousedown, [props, event].concat(restArgs));
  506. };
  507. // ============================= Dropdown ==============================
  508. var containerWidth = (0, _vue.ref)(null);
  509. var instance = (0, _vue.getCurrentInstance)();
  510. var onPopupMouseEnter = function onPopupMouseEnter() {
  511. // We need force update here since popup dom is render async
  512. instance.update();
  513. };
  514. (0, _vue.onMounted)(function () {
  515. (0, _vue.watch)(triggerOpen, function () {
  516. if (triggerOpen.value) {
  517. var _containerRef$value;
  518. var newWidth = Math.ceil((_containerRef$value = containerRef.value) === null || _containerRef$value === void 0 ? void 0 : _containerRef$value.offsetWidth);
  519. if (containerWidth.value !== newWidth && !Number.isNaN(newWidth)) {
  520. containerWidth.value = newWidth;
  521. }
  522. }
  523. }, {
  524. immediate: true,
  525. flush: 'post'
  526. });
  527. });
  528. // Close when click on non-select element
  529. (0, _useSelectTriggerControl.default)([containerRef, triggerRef], triggerOpen, onToggleOpen);
  530. (0, _useBaseProps.useProvideBaseSelectProps)((0, _toReactive.toReactive)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _vue.toRefs)(props)), {}, {
  531. open: mergedOpen,
  532. triggerOpen: triggerOpen,
  533. showSearch: mergedShowSearch,
  534. multiple: multiple,
  535. toggleOpen: onToggleOpen
  536. })));
  537. return function () {
  538. var _classNames2;
  539. var _props$attrs = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), attrs),
  540. prefixCls = _props$attrs.prefixCls,
  541. id = _props$attrs.id,
  542. open = _props$attrs.open,
  543. defaultOpen = _props$attrs.defaultOpen,
  544. mode = _props$attrs.mode,
  545. showSearch = _props$attrs.showSearch,
  546. searchValue = _props$attrs.searchValue,
  547. onSearch = _props$attrs.onSearch,
  548. allowClear = _props$attrs.allowClear,
  549. clearIcon = _props$attrs.clearIcon,
  550. showArrow = _props$attrs.showArrow,
  551. inputIcon = _props$attrs.inputIcon,
  552. disabled = _props$attrs.disabled,
  553. loading = _props$attrs.loading,
  554. getInputElement = _props$attrs.getInputElement,
  555. getPopupContainer = _props$attrs.getPopupContainer,
  556. placement = _props$attrs.placement,
  557. animation = _props$attrs.animation,
  558. transitionName = _props$attrs.transitionName,
  559. dropdownStyle = _props$attrs.dropdownStyle,
  560. dropdownClassName = _props$attrs.dropdownClassName,
  561. dropdownMatchSelectWidth = _props$attrs.dropdownMatchSelectWidth,
  562. dropdownRender = _props$attrs.dropdownRender,
  563. dropdownAlign = _props$attrs.dropdownAlign,
  564. showAction = _props$attrs.showAction,
  565. direction = _props$attrs.direction,
  566. tokenSeparators = _props$attrs.tokenSeparators,
  567. tagRender = _props$attrs.tagRender,
  568. optionLabelRender = _props$attrs.optionLabelRender,
  569. onPopupScroll = _props$attrs.onPopupScroll,
  570. onDropdownVisibleChange = _props$attrs.onDropdownVisibleChange,
  571. onFocus = _props$attrs.onFocus,
  572. onBlur = _props$attrs.onBlur,
  573. onKeyup = _props$attrs.onKeyup,
  574. onKeydown = _props$attrs.onKeydown,
  575. onMousedown = _props$attrs.onMousedown,
  576. onClear = _props$attrs.onClear,
  577. omitDomProps = _props$attrs.omitDomProps,
  578. getRawInputElement = _props$attrs.getRawInputElement,
  579. displayValues = _props$attrs.displayValues,
  580. onDisplayValuesChange = _props$attrs.onDisplayValuesChange,
  581. emptyOptions = _props$attrs.emptyOptions,
  582. activeDescendantId = _props$attrs.activeDescendantId,
  583. activeValue = _props$attrs.activeValue,
  584. OptionList = _props$attrs.OptionList,
  585. restProps = (0, _objectWithoutProperties2.default)(_props$attrs, _excluded);
  586. // ============================= Input ==============================
  587. // Only works in `combobox`
  588. var customizeInputElement = mode === 'combobox' && getInputElement && getInputElement() || null;
  589. // Used for customize replacement for `vc-cascader`
  590. var customizeRawInputElement = typeof getRawInputElement === 'function' && getRawInputElement();
  591. var domProps = (0, _objectSpread2.default)({}, restProps);
  592. // Used for raw custom input trigger
  593. var onTriggerVisibleChange;
  594. if (customizeRawInputElement) {
  595. onTriggerVisibleChange = function onTriggerVisibleChange(newOpen) {
  596. onToggleOpen(newOpen);
  597. };
  598. }
  599. DEFAULT_OMIT_PROPS.forEach(function (propName) {
  600. delete domProps[propName];
  601. });
  602. omitDomProps === null || omitDomProps === void 0 ? void 0 : omitDomProps.forEach(function (propName) {
  603. delete domProps[propName];
  604. });
  605. // ============================= Arrow ==============================
  606. var mergedShowArrow = showArrow !== undefined ? showArrow : loading || !multiple.value && mode !== 'combobox';
  607. var arrowNode;
  608. if (mergedShowArrow) {
  609. arrowNode = (0, _vue.createVNode)(_TransBtn.default, {
  610. "class": (0, _classNames3.default)("".concat(prefixCls, "-arrow"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-arrow-loading"), loading)),
  611. "customizeIcon": inputIcon,
  612. "customizeIconProps": {
  613. loading: loading,
  614. searchValue: mergedSearchValue.value,
  615. open: mergedOpen.value,
  616. focused: mockFocused.value,
  617. showSearch: mergedShowSearch.value
  618. }
  619. }, null);
  620. }
  621. // ============================= Clear ==============================
  622. var clearNode;
  623. var onClearMouseDown = function onClearMouseDown() {
  624. onClear === null || onClear === void 0 ? void 0 : onClear();
  625. onDisplayValuesChange([], {
  626. type: 'clear',
  627. values: displayValues
  628. });
  629. onInternalSearch('', false, false);
  630. };
  631. if (!disabled && allowClear && (displayValues.length || mergedSearchValue.value)) {
  632. clearNode = (0, _vue.createVNode)(_TransBtn.default, {
  633. "class": "".concat(prefixCls, "-clear"),
  634. "onMousedown": onClearMouseDown,
  635. "customizeIcon": clearIcon
  636. }, {
  637. default: function _default() {
  638. return [(0, _vue.createTextVNode)("\xD7")];
  639. }
  640. });
  641. }
  642. // =========================== OptionList ===========================
  643. var optionList = (0, _vue.createVNode)(OptionList, {
  644. "ref": listRef
  645. }, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, legacyTreeSelectContext.customSlots), {}, {
  646. option: slots.option
  647. }));
  648. // ============================= Select =============================
  649. var mergedClassName = (0, _classNames3.default)(prefixCls, attrs.class, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-focused"), mockFocused.value), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-multiple"), multiple.value), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-single"), !multiple.value), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-allow-clear"), allowClear), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-show-arrow"), mergedShowArrow), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-loading"), loading), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-open"), mergedOpen.value), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-customize-input"), customizeInputElement), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls, "-show-search"), mergedShowSearch.value), _classNames2));
  650. // >>> Selector
  651. var selectorNode = (0, _vue.createVNode)(_SelectTrigger.default, {
  652. "ref": triggerRef,
  653. "disabled": disabled,
  654. "prefixCls": prefixCls,
  655. "visible": triggerOpen.value,
  656. "popupElement": optionList,
  657. "containerWidth": containerWidth.value,
  658. "animation": animation,
  659. "transitionName": transitionName,
  660. "dropdownStyle": dropdownStyle,
  661. "dropdownClassName": dropdownClassName,
  662. "direction": direction,
  663. "dropdownMatchSelectWidth": dropdownMatchSelectWidth,
  664. "dropdownRender": dropdownRender,
  665. "dropdownAlign": dropdownAlign,
  666. "placement": placement,
  667. "getPopupContainer": getPopupContainer,
  668. "empty": emptyOptions,
  669. "getTriggerDOMNode": function getTriggerDOMNode() {
  670. return selectorDomRef.current;
  671. },
  672. "onPopupVisibleChange": onTriggerVisibleChange,
  673. "onPopupMouseEnter": onPopupMouseEnter
  674. }, {
  675. default: function _default() {
  676. return customizeRawInputElement ? (0, _propsUtil.isValidElement)(customizeRawInputElement) && (0, _vnode.cloneElement)(customizeRawInputElement, {
  677. ref: selectorDomRef
  678. }, false, true) : (0, _vue.createVNode)(_Selector.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
  679. "domRef": selectorDomRef,
  680. "prefixCls": prefixCls,
  681. "inputElement": customizeInputElement,
  682. "ref": selectorRef,
  683. "id": id,
  684. "showSearch": mergedShowSearch.value,
  685. "mode": mode,
  686. "activeDescendantId": activeDescendantId,
  687. "tagRender": tagRender,
  688. "optionLabelRender": optionLabelRender,
  689. "values": displayValues,
  690. "open": mergedOpen.value,
  691. "onToggleOpen": onToggleOpen,
  692. "activeValue": activeValue,
  693. "searchValue": mergedSearchValue.value,
  694. "onSearch": onInternalSearch,
  695. "onSearchSubmit": onInternalSearchSubmit,
  696. "onRemove": onSelectorRemove,
  697. "tokenWithEnter": tokenWithEnter.value
  698. }), null);
  699. }
  700. });
  701. // >>> Render
  702. var renderNode;
  703. // Render raw
  704. if (customizeRawInputElement) {
  705. renderNode = selectorNode;
  706. } else {
  707. renderNode = (0, _vue.createVNode)("div", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, domProps), {}, {
  708. "class": mergedClassName,
  709. "ref": containerRef,
  710. "onMousedown": onInternalMouseDown,
  711. "onKeydown": onInternalKeyDown,
  712. "onKeyup": onInternalKeyUp
  713. }), [mockFocused.value && !mergedOpen.value && (0, _vue.createVNode)("span", {
  714. "style": {
  715. width: 0,
  716. height: 0,
  717. display: 'flex',
  718. overflow: 'hidden',
  719. opacity: 0
  720. },
  721. "aria-live": "polite"
  722. }, ["".concat(displayValues.map(function (_ref2) {
  723. var label = _ref2.label,
  724. value = _ref2.value;
  725. return ['number', 'string'].includes((0, _typeof2.default)(label)) ? label : value;
  726. }).join(', '))]), selectorNode, arrowNode, clearNode]);
  727. }
  728. return renderNode;
  729. };
  730. }
  731. });
  732. exports.default = _default2;