OptionList.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _useMemo = _interopRequireDefault(require("../_util/hooks/useMemo"));
  11. var _KeyCode = _interopRequireDefault(require("../_util/KeyCode"));
  12. var _Tree = _interopRequireDefault(require("../vc-tree/Tree"));
  13. var _valueUtil = require("./utils/valueUtil");
  14. var _vcSelect = require("../vc-select");
  15. var _LegacyContext = _interopRequireDefault(require("./LegacyContext"));
  16. var _TreeSelectContext = _interopRequireDefault(require("./TreeSelectContext"));
  17. const HIDDEN_STYLE = {
  18. width: 0,
  19. height: 0,
  20. display: 'flex',
  21. overflow: 'hidden',
  22. opacity: 0,
  23. border: 0,
  24. padding: 0,
  25. margin: 0
  26. };
  27. var _default = exports.default = (0, _vue.defineComponent)({
  28. compatConfig: {
  29. MODE: 3
  30. },
  31. name: 'OptionList',
  32. inheritAttrs: false,
  33. setup(_, _ref) {
  34. let {
  35. slots,
  36. expose
  37. } = _ref;
  38. const baseProps = (0, _vcSelect.useBaseProps)();
  39. const legacyContext = (0, _LegacyContext.default)();
  40. const context = (0, _TreeSelectContext.default)();
  41. const treeRef = (0, _vue.ref)();
  42. const memoTreeData = (0, _useMemo.default)(() => context.treeData, [() => baseProps.open, () => context.treeData], next => next[0]);
  43. const mergedCheckedKeys = (0, _vue.computed)(() => {
  44. const {
  45. checkable,
  46. halfCheckedKeys,
  47. checkedKeys
  48. } = legacyContext;
  49. if (!checkable) {
  50. return null;
  51. }
  52. return {
  53. checked: checkedKeys,
  54. halfChecked: halfCheckedKeys
  55. };
  56. });
  57. (0, _vue.watch)(() => baseProps.open, () => {
  58. (0, _vue.nextTick)(() => {
  59. var _a;
  60. if (baseProps.open && !baseProps.multiple && legacyContext.checkedKeys.length) {
  61. (_a = treeRef.value) === null || _a === void 0 ? void 0 : _a.scrollTo({
  62. key: legacyContext.checkedKeys[0]
  63. });
  64. }
  65. });
  66. }, {
  67. immediate: true,
  68. flush: 'post'
  69. });
  70. // ========================== Search ==========================
  71. const lowerSearchValue = (0, _vue.computed)(() => String(baseProps.searchValue).toLowerCase());
  72. const filterTreeNode = treeNode => {
  73. if (!lowerSearchValue.value) {
  74. return false;
  75. }
  76. return String(treeNode[legacyContext.treeNodeFilterProp]).toLowerCase().includes(lowerSearchValue.value);
  77. };
  78. // =========================== Keys ===========================
  79. const expandedKeys = (0, _vue.shallowRef)(legacyContext.treeDefaultExpandedKeys);
  80. const searchExpandedKeys = (0, _vue.shallowRef)(null);
  81. (0, _vue.watch)(() => baseProps.searchValue, () => {
  82. if (baseProps.searchValue) {
  83. searchExpandedKeys.value = (0, _valueUtil.getAllKeys)((0, _vue.toRaw)(context.treeData), (0, _vue.toRaw)(context.fieldNames));
  84. }
  85. }, {
  86. immediate: true
  87. });
  88. const mergedExpandedKeys = (0, _vue.computed)(() => {
  89. if (legacyContext.treeExpandedKeys) {
  90. return legacyContext.treeExpandedKeys.slice();
  91. }
  92. return baseProps.searchValue ? searchExpandedKeys.value : expandedKeys.value;
  93. });
  94. const onInternalExpand = keys => {
  95. var _a;
  96. expandedKeys.value = keys;
  97. searchExpandedKeys.value = keys;
  98. (_a = legacyContext.onTreeExpand) === null || _a === void 0 ? void 0 : _a.call(legacyContext, keys);
  99. };
  100. // ========================== Events ==========================
  101. const onListMouseDown = event => {
  102. event.preventDefault();
  103. };
  104. const onInternalSelect = (_, _ref2) => {
  105. let {
  106. node
  107. } = _ref2;
  108. var _a, _b;
  109. const {
  110. checkable,
  111. checkedKeys
  112. } = legacyContext;
  113. if (checkable && (0, _valueUtil.isCheckDisabled)(node)) {
  114. return;
  115. }
  116. (_a = context.onSelect) === null || _a === void 0 ? void 0 : _a.call(context, node.key, {
  117. selected: !checkedKeys.includes(node.key)
  118. });
  119. if (!baseProps.multiple) {
  120. (_b = baseProps.toggleOpen) === null || _b === void 0 ? void 0 : _b.call(baseProps, false);
  121. }
  122. };
  123. // ========================= Keyboard =========================
  124. const activeKey = (0, _vue.ref)(null);
  125. const activeEntity = (0, _vue.computed)(() => legacyContext.keyEntities[activeKey.value]);
  126. const setActiveKey = key => {
  127. activeKey.value = key;
  128. };
  129. expose({
  130. scrollTo: function () {
  131. var _a, _b;
  132. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  133. args[_key] = arguments[_key];
  134. }
  135. return (_b = (_a = treeRef.value) === null || _a === void 0 ? void 0 : _a.scrollTo) === null || _b === void 0 ? void 0 : _b.call(_a, ...args);
  136. },
  137. onKeydown: event => {
  138. var _a;
  139. const {
  140. which
  141. } = event;
  142. switch (which) {
  143. // >>> Arrow keys
  144. case _KeyCode.default.UP:
  145. case _KeyCode.default.DOWN:
  146. case _KeyCode.default.LEFT:
  147. case _KeyCode.default.RIGHT:
  148. (_a = treeRef.value) === null || _a === void 0 ? void 0 : _a.onKeydown(event);
  149. break;
  150. // >>> Select item
  151. case _KeyCode.default.ENTER:
  152. {
  153. if (activeEntity.value) {
  154. const {
  155. selectable,
  156. value
  157. } = activeEntity.value.node || {};
  158. if (selectable !== false) {
  159. onInternalSelect(null, {
  160. node: {
  161. key: activeKey.value
  162. },
  163. selected: !legacyContext.checkedKeys.includes(value)
  164. });
  165. }
  166. }
  167. break;
  168. }
  169. // >>> Close
  170. case _KeyCode.default.ESC:
  171. {
  172. baseProps.toggleOpen(false);
  173. }
  174. }
  175. },
  176. onKeyup: () => {}
  177. });
  178. return () => {
  179. var _a;
  180. const {
  181. prefixCls,
  182. multiple,
  183. searchValue,
  184. open,
  185. notFoundContent = (_a = slots.notFoundContent) === null || _a === void 0 ? void 0 : _a.call(slots)
  186. } = baseProps;
  187. const {
  188. listHeight,
  189. listItemHeight,
  190. virtual,
  191. dropdownMatchSelectWidth,
  192. treeExpandAction
  193. } = context;
  194. const {
  195. checkable,
  196. treeDefaultExpandAll,
  197. treeIcon,
  198. showTreeIcon,
  199. switcherIcon,
  200. treeLine,
  201. loadData,
  202. treeLoadedKeys,
  203. treeMotion,
  204. onTreeLoad,
  205. checkedKeys
  206. } = legacyContext;
  207. // ========================== Render ==========================
  208. if (memoTreeData.value.length === 0) {
  209. return (0, _vue.createVNode)("div", {
  210. "role": "listbox",
  211. "class": `${prefixCls}-empty`,
  212. "onMousedown": onListMouseDown
  213. }, [notFoundContent]);
  214. }
  215. const treeProps = {
  216. fieldNames: context.fieldNames
  217. };
  218. if (treeLoadedKeys) {
  219. treeProps.loadedKeys = treeLoadedKeys;
  220. }
  221. if (mergedExpandedKeys.value) {
  222. treeProps.expandedKeys = mergedExpandedKeys.value;
  223. }
  224. return (0, _vue.createVNode)("div", {
  225. "onMousedown": onListMouseDown
  226. }, [activeEntity.value && open && (0, _vue.createVNode)("span", {
  227. "style": HIDDEN_STYLE,
  228. "aria-live": "assertive"
  229. }, [activeEntity.value.node.value]), (0, _vue.createVNode)(_Tree.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({
  230. "ref": treeRef,
  231. "focusable": false,
  232. "prefixCls": `${prefixCls}-tree`,
  233. "treeData": memoTreeData.value,
  234. "height": listHeight,
  235. "itemHeight": listItemHeight,
  236. "virtual": virtual !== false && dropdownMatchSelectWidth !== false,
  237. "multiple": multiple,
  238. "icon": treeIcon,
  239. "showIcon": showTreeIcon,
  240. "switcherIcon": switcherIcon,
  241. "showLine": treeLine,
  242. "loadData": searchValue ? null : loadData,
  243. "motion": treeMotion,
  244. "activeKey": activeKey.value,
  245. "checkable": checkable,
  246. "checkStrictly": true,
  247. "checkedKeys": mergedCheckedKeys.value,
  248. "selectedKeys": !checkable ? checkedKeys : [],
  249. "defaultExpandAll": treeDefaultExpandAll
  250. }, treeProps), {}, {
  251. "onActiveChange": setActiveKey,
  252. "onSelect": onInternalSelect,
  253. "onCheck": onInternalSelect,
  254. "onExpand": onInternalExpand,
  255. "onLoad": onTreeLoad,
  256. "filterTreeNode": filterTreeNode,
  257. "expandAction": treeExpandAction
  258. }), (0, _extends2.default)((0, _extends2.default)({}, slots), {
  259. checkable: legacyContext.customSlots.treeCheckable
  260. }))]);
  261. };
  262. }
  263. });