DirectoryTree.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. var _typeof = require("@babel/runtime/helpers/typeof");
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.directoryTreeProps = exports.default = void 0;
  8. var _vue = require("vue");
  9. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  10. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  11. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  12. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  13. var _debounce = _interopRequireDefault(require("lodash/debounce"));
  14. var _FolderOpenOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/FolderOpenOutlined"));
  15. var _FolderOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/FolderOutlined"));
  16. var _FileOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/FileOutlined"));
  17. var _classNames2 = _interopRequireDefault(require("../_util/classNames"));
  18. var _Tree = _interopRequireWildcard(require("./Tree"));
  19. var _initDefaultProps = _interopRequireDefault(require("../_util/props-util/initDefaultProps"));
  20. var _treeUtil = require("../vc-tree/utils/treeUtil");
  21. var _util = require("../vc-tree/util");
  22. var _dictUtil = require("./utils/dictUtil");
  23. var _useConfigInject2 = _interopRequireDefault(require("../_util/hooks/useConfigInject"));
  24. var _propsUtil = require("../_util/props-util");
  25. var _excluded = ["icon", "blockNode"];
  26. function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
  27. function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
  28. var directoryTreeProps = function directoryTreeProps() {
  29. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _Tree.treeProps)()), {}, {
  30. expandAction: {
  31. type: [Boolean, String]
  32. }
  33. });
  34. };
  35. exports.directoryTreeProps = directoryTreeProps;
  36. function getIcon(props) {
  37. var isLeaf = props.isLeaf,
  38. expanded = props.expanded;
  39. if (isLeaf) {
  40. return (0, _vue.createVNode)(_FileOutlined.default, null, null);
  41. }
  42. return expanded ? (0, _vue.createVNode)(_FolderOpenOutlined.default, null, null) : (0, _vue.createVNode)(_FolderOutlined.default, null, null);
  43. }
  44. var _default = (0, _vue.defineComponent)({
  45. compatConfig: {
  46. MODE: 3
  47. },
  48. name: 'ADirectoryTree',
  49. inheritAttrs: false,
  50. props: (0, _initDefaultProps.default)(directoryTreeProps(), {
  51. showIcon: true,
  52. expandAction: 'click'
  53. }),
  54. slots: ['icon', 'title', 'switcherIcon', 'titleRender'],
  55. // emits: [
  56. // 'update:selectedKeys',
  57. // 'update:checkedKeys',
  58. // 'update:expandedKeys',
  59. // 'expand',
  60. // 'select',
  61. // 'check',
  62. // 'doubleclick',
  63. // 'dblclick',
  64. // 'click',
  65. // ],
  66. setup: function setup(props, _ref) {
  67. var _slots$default;
  68. var attrs = _ref.attrs,
  69. slots = _ref.slots,
  70. emit = _ref.emit,
  71. expose = _ref.expose;
  72. // convertTreeToData 兼容 a-tree-node 历史写法,未来a-tree-node移除后,删除相关代码,不要再render中调用 treeData,否则死循环
  73. var treeData = (0, _vue.ref)(props.treeData || (0, _treeUtil.convertTreeToData)((0, _propsUtil.filterEmpty)((_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots))));
  74. (0, _vue.watch)(function () {
  75. return props.treeData;
  76. }, function () {
  77. treeData.value = props.treeData;
  78. });
  79. (0, _vue.onUpdated)(function () {
  80. (0, _vue.nextTick)(function () {
  81. if (props.treeData === undefined && slots.default) {
  82. var _slots$default2;
  83. treeData.value = (0, _treeUtil.convertTreeToData)((0, _propsUtil.filterEmpty)((_slots$default2 = slots.default) === null || _slots$default2 === void 0 ? void 0 : _slots$default2.call(slots)));
  84. }
  85. });
  86. });
  87. // Shift click usage
  88. var lastSelectedKey = (0, _vue.ref)();
  89. var cachedSelectedKeys = (0, _vue.ref)();
  90. var fieldNames = (0, _vue.computed)(function () {
  91. return (0, _treeUtil.fillFieldNames)(props.fieldNames);
  92. });
  93. var treeRef = (0, _vue.ref)();
  94. var scrollTo = function scrollTo(scroll) {
  95. var _treeRef$value;
  96. (_treeRef$value = treeRef.value) === null || _treeRef$value === void 0 ? void 0 : _treeRef$value.scrollTo(scroll);
  97. };
  98. expose({
  99. scrollTo: scrollTo,
  100. selectedKeys: (0, _vue.computed)(function () {
  101. var _treeRef$value2;
  102. return (_treeRef$value2 = treeRef.value) === null || _treeRef$value2 === void 0 ? void 0 : _treeRef$value2.selectedKeys;
  103. }),
  104. checkedKeys: (0, _vue.computed)(function () {
  105. var _treeRef$value3;
  106. return (_treeRef$value3 = treeRef.value) === null || _treeRef$value3 === void 0 ? void 0 : _treeRef$value3.checkedKeys;
  107. }),
  108. halfCheckedKeys: (0, _vue.computed)(function () {
  109. var _treeRef$value4;
  110. return (_treeRef$value4 = treeRef.value) === null || _treeRef$value4 === void 0 ? void 0 : _treeRef$value4.halfCheckedKeys;
  111. }),
  112. loadedKeys: (0, _vue.computed)(function () {
  113. var _treeRef$value5;
  114. return (_treeRef$value5 = treeRef.value) === null || _treeRef$value5 === void 0 ? void 0 : _treeRef$value5.loadedKeys;
  115. }),
  116. loadingKeys: (0, _vue.computed)(function () {
  117. var _treeRef$value6;
  118. return (_treeRef$value6 = treeRef.value) === null || _treeRef$value6 === void 0 ? void 0 : _treeRef$value6.loadingKeys;
  119. }),
  120. expandedKeys: (0, _vue.computed)(function () {
  121. var _treeRef$value7;
  122. return (_treeRef$value7 = treeRef.value) === null || _treeRef$value7 === void 0 ? void 0 : _treeRef$value7.expandedKeys;
  123. })
  124. });
  125. var getInitExpandedKeys = function getInitExpandedKeys() {
  126. var _convertDataToEntitie = (0, _treeUtil.convertDataToEntities)(treeData.value, {
  127. fieldNames: fieldNames.value
  128. }),
  129. keyEntities = _convertDataToEntitie.keyEntities;
  130. var initExpandedKeys;
  131. // Expanded keys
  132. if (props.defaultExpandAll) {
  133. initExpandedKeys = Object.keys(keyEntities);
  134. } else if (props.defaultExpandParent) {
  135. initExpandedKeys = (0, _util.conductExpandParent)(props.expandedKeys || props.defaultExpandedKeys || [], keyEntities);
  136. } else {
  137. initExpandedKeys = props.expandedKeys || props.defaultExpandedKeys;
  138. }
  139. return initExpandedKeys;
  140. };
  141. var selectedKeys = (0, _vue.ref)(props.selectedKeys || props.defaultSelectedKeys || []);
  142. var expandedKeys = (0, _vue.ref)(getInitExpandedKeys());
  143. (0, _vue.watch)(function () {
  144. return props.selectedKeys;
  145. }, function () {
  146. if (props.selectedKeys !== undefined) {
  147. selectedKeys.value = props.selectedKeys;
  148. }
  149. }, {
  150. immediate: true
  151. });
  152. (0, _vue.watch)(function () {
  153. return props.expandedKeys;
  154. }, function () {
  155. if (props.expandedKeys !== undefined) {
  156. expandedKeys.value = props.expandedKeys;
  157. }
  158. }, {
  159. immediate: true
  160. });
  161. var expandFolderNode = function expandFolderNode(event, node) {
  162. var isLeaf = node.isLeaf;
  163. if (isLeaf || event.shiftKey || event.metaKey || event.ctrlKey) {
  164. return;
  165. }
  166. // Call internal rc-tree expand function
  167. // https://github.com/ant-design/ant-design/issues/12567
  168. treeRef.value.onNodeExpand(event, node);
  169. };
  170. var onDebounceExpand = (0, _debounce.default)(expandFolderNode, 200, {
  171. leading: true
  172. });
  173. var onExpand = function onExpand(keys, info) {
  174. if (props.expandedKeys === undefined) {
  175. expandedKeys.value = keys;
  176. }
  177. // Call origin function
  178. emit('update:expandedKeys', keys);
  179. emit('expand', keys, info);
  180. };
  181. var onClick = function onClick(event, node) {
  182. var expandAction = props.expandAction;
  183. // Expand the tree
  184. if (expandAction === 'click') {
  185. onDebounceExpand(event, node);
  186. }
  187. emit('click', event, node);
  188. };
  189. var onDoubleClick = function onDoubleClick(event, node) {
  190. var expandAction = props.expandAction;
  191. // Expand the tree
  192. if (expandAction === 'dblclick' || expandAction === 'doubleclick') {
  193. onDebounceExpand(event, node);
  194. }
  195. emit('doubleclick', event, node);
  196. emit('dblclick', event, node);
  197. };
  198. var onSelect = function onSelect(keys, event) {
  199. var multiple = props.multiple;
  200. var node = event.node,
  201. nativeEvent = event.nativeEvent;
  202. var key = node[fieldNames.value.key];
  203. // const newState: DirectoryTreeState = {};
  204. // We need wrap this event since some value is not same
  205. var newEvent = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, event), {}, {
  206. selected: true // Directory selected always true
  207. });
  208. // Windows / Mac single pick
  209. var ctrlPick = (nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.ctrlKey) || (nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.metaKey);
  210. var shiftPick = nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.shiftKey;
  211. // Generate new selected keys
  212. var newSelectedKeys;
  213. if (multiple && ctrlPick) {
  214. // Control click
  215. newSelectedKeys = keys;
  216. lastSelectedKey.value = key;
  217. cachedSelectedKeys.value = newSelectedKeys;
  218. newEvent.selectedNodes = (0, _dictUtil.convertDirectoryKeysToNodes)(treeData.value, newSelectedKeys, fieldNames.value);
  219. } else if (multiple && shiftPick) {
  220. // Shift click
  221. newSelectedKeys = Array.from(new Set([].concat((0, _toConsumableArray2.default)(cachedSelectedKeys.value || []), (0, _toConsumableArray2.default)((0, _dictUtil.calcRangeKeys)({
  222. treeData: treeData.value,
  223. expandedKeys: expandedKeys.value,
  224. startKey: key,
  225. endKey: lastSelectedKey.value,
  226. fieldNames: fieldNames.value
  227. })))));
  228. newEvent.selectedNodes = (0, _dictUtil.convertDirectoryKeysToNodes)(treeData.value, newSelectedKeys, fieldNames.value);
  229. } else {
  230. // Single click
  231. newSelectedKeys = [key];
  232. lastSelectedKey.value = key;
  233. cachedSelectedKeys.value = newSelectedKeys;
  234. newEvent.selectedNodes = (0, _dictUtil.convertDirectoryKeysToNodes)(treeData.value, newSelectedKeys, fieldNames.value);
  235. }
  236. emit('update:selectedKeys', newSelectedKeys);
  237. emit('select', newSelectedKeys, newEvent);
  238. if (props.selectedKeys === undefined) {
  239. selectedKeys.value = newSelectedKeys;
  240. }
  241. };
  242. var onCheck = function onCheck(checkedObjOrKeys, eventObj) {
  243. emit('update:checkedKeys', checkedObjOrKeys);
  244. emit('check', checkedObjOrKeys, eventObj);
  245. };
  246. var _useConfigInject = (0, _useConfigInject2.default)('tree', props),
  247. prefixCls = _useConfigInject.prefixCls,
  248. direction = _useConfigInject.direction;
  249. return function () {
  250. var connectClassName = (0, _classNames2.default)("".concat(prefixCls.value, "-directory"), (0, _defineProperty2.default)({}, "".concat(prefixCls.value, "-directory-rtl"), direction.value === 'rtl'), attrs.class);
  251. var _props$icon = props.icon,
  252. icon = _props$icon === void 0 ? slots.icon : _props$icon,
  253. _props$blockNode = props.blockNode,
  254. blockNode = _props$blockNode === void 0 ? true : _props$blockNode,
  255. otherProps = (0, _objectWithoutProperties2.default)(props, _excluded);
  256. return (0, _vue.createVNode)(_Tree.default, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, {
  257. "icon": icon || getIcon,
  258. "ref": treeRef,
  259. "blockNode": blockNode
  260. }, otherProps), {}, {
  261. "prefixCls": prefixCls.value,
  262. "class": connectClassName,
  263. "expandedKeys": expandedKeys.value,
  264. "selectedKeys": selectedKeys.value,
  265. "onSelect": onSelect,
  266. "onClick": onClick,
  267. "onDblclick": onDoubleClick,
  268. "onExpand": onExpand,
  269. "onCheck": onCheck
  270. }), slots);
  271. };
  272. }
  273. });
  274. exports.default = _default;