NodeList.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = exports.MotionEntity = exports.MOTION_KEY = void 0;
  7. exports.getMinimumRangeTransitionRange = getMinimumRangeTransitionRange;
  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 _vcVirtualList = _interopRequireDefault(require("../vc-virtual-list"));
  12. var _omit = _interopRequireDefault(require("../_util/omit"));
  13. var _contextTypes = require("./contextTypes");
  14. var _MotionTreeNode = _interopRequireDefault(require("./MotionTreeNode"));
  15. var _props = require("./props");
  16. var _diffUtil = require("./utils/diffUtil");
  17. var _treeUtil = require("./utils/treeUtil");
  18. /**
  19. * Handle virtual list of the TreeNodes.
  20. */
  21. var __rest = void 0 && (void 0).__rest || function (s, e) {
  22. var t = {};
  23. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  24. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  25. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  26. }
  27. return t;
  28. };
  29. const HIDDEN_STYLE = {
  30. width: 0,
  31. height: 0,
  32. display: 'flex',
  33. overflow: 'hidden',
  34. opacity: 0,
  35. border: 0,
  36. padding: 0,
  37. margin: 0
  38. };
  39. const noop = () => {};
  40. const MOTION_KEY = exports.MOTION_KEY = `RC_TREE_MOTION_${Math.random()}`;
  41. const MotionNode = {
  42. key: MOTION_KEY
  43. };
  44. const MotionEntity = exports.MotionEntity = {
  45. key: MOTION_KEY,
  46. level: 0,
  47. index: 0,
  48. pos: '0',
  49. node: MotionNode,
  50. nodes: [MotionNode]
  51. };
  52. const MotionFlattenData = {
  53. parent: null,
  54. children: [],
  55. pos: MotionEntity.pos,
  56. data: MotionNode,
  57. title: null,
  58. key: MOTION_KEY,
  59. /** Hold empty list here since we do not use it */
  60. isStart: [],
  61. isEnd: []
  62. };
  63. /**
  64. * We only need get visible content items to play the animation.
  65. */
  66. function getMinimumRangeTransitionRange(list, virtual, height, itemHeight) {
  67. if (virtual === false || !height) {
  68. return list;
  69. }
  70. return list.slice(0, Math.ceil(height / itemHeight) + 1);
  71. }
  72. function itemKey(item) {
  73. const {
  74. key,
  75. pos
  76. } = item;
  77. return (0, _treeUtil.getKey)(key, pos);
  78. }
  79. function getAccessibilityPath(item) {
  80. let path = String(item.key);
  81. let current = item;
  82. while (current.parent) {
  83. current = current.parent;
  84. path = `${current.key} > ${path}`;
  85. }
  86. return path;
  87. }
  88. var _default = exports.default = (0, _vue.defineComponent)({
  89. compatConfig: {
  90. MODE: 3
  91. },
  92. name: 'NodeList',
  93. inheritAttrs: false,
  94. props: _props.nodeListProps,
  95. setup(props, _ref) {
  96. let {
  97. expose,
  98. attrs
  99. } = _ref;
  100. // =============================== Ref ================================
  101. const listRef = (0, _vue.ref)();
  102. const indentMeasurerRef = (0, _vue.ref)();
  103. const {
  104. expandedKeys,
  105. flattenNodes
  106. } = (0, _contextTypes.useInjectKeysState)();
  107. expose({
  108. scrollTo: scroll => {
  109. listRef.value.scrollTo(scroll);
  110. },
  111. getIndentWidth: () => indentMeasurerRef.value.offsetWidth
  112. });
  113. // ============================== Motion ==============================
  114. const transitionData = (0, _vue.shallowRef)(flattenNodes.value);
  115. const transitionRange = (0, _vue.shallowRef)([]);
  116. const motionType = (0, _vue.ref)(null);
  117. function onMotionEnd() {
  118. transitionData.value = flattenNodes.value;
  119. transitionRange.value = [];
  120. motionType.value = null;
  121. props.onListChangeEnd();
  122. }
  123. const context = (0, _contextTypes.useInjectTreeContext)();
  124. (0, _vue.watch)([() => expandedKeys.value.slice(), flattenNodes], (_ref2, _ref3) => {
  125. let [expandedKeys, data] = _ref2;
  126. let [prevExpandedKeys, prevData] = _ref3;
  127. const diffExpanded = (0, _diffUtil.findExpandedKeys)(prevExpandedKeys, expandedKeys);
  128. if (diffExpanded.key !== null) {
  129. const {
  130. virtual,
  131. height,
  132. itemHeight
  133. } = props;
  134. if (diffExpanded.add) {
  135. const keyIndex = prevData.findIndex(_ref4 => {
  136. let {
  137. key
  138. } = _ref4;
  139. return key === diffExpanded.key;
  140. });
  141. const rangeNodes = getMinimumRangeTransitionRange((0, _diffUtil.getExpandRange)(prevData, data, diffExpanded.key), virtual, height, itemHeight);
  142. const newTransitionData = prevData.slice();
  143. newTransitionData.splice(keyIndex + 1, 0, MotionFlattenData);
  144. transitionData.value = newTransitionData;
  145. transitionRange.value = rangeNodes;
  146. motionType.value = 'show';
  147. } else {
  148. const keyIndex = data.findIndex(_ref5 => {
  149. let {
  150. key
  151. } = _ref5;
  152. return key === diffExpanded.key;
  153. });
  154. const rangeNodes = getMinimumRangeTransitionRange((0, _diffUtil.getExpandRange)(data, prevData, diffExpanded.key), virtual, height, itemHeight);
  155. const newTransitionData = data.slice();
  156. newTransitionData.splice(keyIndex + 1, 0, MotionFlattenData);
  157. transitionData.value = newTransitionData;
  158. transitionRange.value = rangeNodes;
  159. motionType.value = 'hide';
  160. }
  161. } else if (prevData !== data) {
  162. transitionData.value = data;
  163. }
  164. });
  165. // We should clean up motion if is changed by dragging
  166. (0, _vue.watch)(() => context.value.dragging, dragging => {
  167. if (!dragging) {
  168. onMotionEnd();
  169. }
  170. });
  171. const mergedData = (0, _vue.computed)(() => props.motion === undefined ? transitionData.value : flattenNodes.value);
  172. const onActiveChange = () => {
  173. props.onActiveChange(null);
  174. };
  175. return () => {
  176. const _a = (0, _extends2.default)((0, _extends2.default)({}, props), attrs),
  177. {
  178. prefixCls,
  179. selectable,
  180. checkable,
  181. disabled,
  182. motion,
  183. height,
  184. itemHeight,
  185. virtual,
  186. focusable,
  187. activeItem,
  188. focused,
  189. tabindex,
  190. onKeydown,
  191. onFocus,
  192. onBlur,
  193. onListChangeStart,
  194. onListChangeEnd
  195. } = _a,
  196. domProps = __rest(_a, ["prefixCls", "selectable", "checkable", "disabled", "motion", "height", "itemHeight", "virtual", "focusable", "activeItem", "focused", "tabindex", "onKeydown", "onFocus", "onBlur", "onListChangeStart", "onListChangeEnd"]);
  197. return (0, _vue.createVNode)(_vue.Fragment, null, [focused && activeItem && (0, _vue.createVNode)("span", {
  198. "style": HIDDEN_STYLE,
  199. "aria-live": "assertive"
  200. }, [getAccessibilityPath(activeItem)]), (0, _vue.createVNode)("div", null, [(0, _vue.createVNode)("input", {
  201. "style": HIDDEN_STYLE,
  202. "disabled": focusable === false || disabled,
  203. "tabindex": focusable !== false ? tabindex : null,
  204. "onKeydown": onKeydown,
  205. "onFocus": onFocus,
  206. "onBlur": onBlur,
  207. "value": "",
  208. "onChange": noop,
  209. "aria-label": "for screen reader"
  210. }, null)]), (0, _vue.createVNode)("div", {
  211. "class": `${prefixCls}-treenode`,
  212. "aria-hidden": true,
  213. "style": {
  214. position: 'absolute',
  215. pointerEvents: 'none',
  216. visibility: 'hidden',
  217. height: 0,
  218. overflow: 'hidden'
  219. }
  220. }, [(0, _vue.createVNode)("div", {
  221. "class": `${prefixCls}-indent`
  222. }, [(0, _vue.createVNode)("div", {
  223. "ref": indentMeasurerRef,
  224. "class": `${prefixCls}-indent-unit`
  225. }, null)])]), (0, _vue.createVNode)(_vcVirtualList.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _omit.default)(domProps, ['onActiveChange'])), {}, {
  226. "data": mergedData.value,
  227. "itemKey": itemKey,
  228. "height": height,
  229. "fullHeight": false,
  230. "virtual": virtual,
  231. "itemHeight": itemHeight,
  232. "prefixCls": `${prefixCls}-list`,
  233. "ref": listRef,
  234. "onVisibleChange": (originList, fullList) => {
  235. const originSet = new Set(originList);
  236. const restList = fullList.filter(item => !originSet.has(item));
  237. // Motion node is not render. Skip motion
  238. if (restList.some(item => itemKey(item) === MOTION_KEY)) {
  239. onMotionEnd();
  240. }
  241. }
  242. }), {
  243. default: treeNode => {
  244. const {
  245. pos
  246. } = treeNode,
  247. restProps = __rest(treeNode.data, []),
  248. {
  249. title,
  250. key,
  251. isStart,
  252. isEnd
  253. } = treeNode;
  254. const mergedKey = (0, _treeUtil.getKey)(key, pos);
  255. delete restProps.key;
  256. delete restProps.children;
  257. return (0, _vue.createVNode)(_MotionTreeNode.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, restProps), {}, {
  258. "eventKey": mergedKey,
  259. "title": title,
  260. "active": !!activeItem && key === activeItem.key,
  261. "data": treeNode.data,
  262. "isStart": isStart,
  263. "isEnd": isEnd,
  264. "motion": motion,
  265. "motionNodes": key === MOTION_KEY ? transitionRange.value : null,
  266. "motionType": motionType.value,
  267. "onMotionStart": onListChangeStart,
  268. "onMotionEnd": onMotionEnd,
  269. "onMousemove": onActiveChange
  270. }), null);
  271. }
  272. })]);
  273. };
  274. }
  275. });