bkui-vue 2.1.0-dev-beta.8 → 2.1.0-dev-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/tree/index.js CHANGED
@@ -17461,7 +17461,7 @@ function toPropertyKey(t) {
17461
17461
 
17462
17462
  ;// CONCATENATED MODULE: ../../node_modules/@babel/runtime/helpers/esm/defineProperty.js
17463
17463
 
17464
- function _defineProperty(e, r, t) {
17464
+ function defineProperty_defineProperty(e, r, t) {
17465
17465
  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
17466
17466
  value: t,
17467
17467
  enumerable: !0,
@@ -17500,6 +17500,8 @@ var _TreeEmitEventsType;
17500
17500
  */
17501
17501
  var EVENTS;
17502
17502
  (function (EVENTS) {
17503
+ EVENTS["NODE_ASYNC_LOAD"] = "nodeAsyncLoad";
17504
+ EVENTS["NODE_ASYNC_LOAD_ERROR"] = "nodeAsyncLoadError";
17503
17505
  EVENTS["NODE_CHECKED"] = "nodeChecked";
17504
17506
  EVENTS["NODE_CLICK"] = "nodeClick";
17505
17507
  EVENTS["NODE_COLLAPSE"] = "nodeCollapse";
@@ -17515,7 +17517,7 @@ var EVENTS;
17515
17517
  var EMPTY = function EMPTY() {
17516
17518
  return true;
17517
17519
  };
17518
- var TreeEmitEventsType = (_TreeEmitEventsType = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_TreeEmitEventsType, EVENTS.NODE_CLICK, EMPTY), EVENTS.NODE_COLLAPSE, EMPTY), EVENTS.NODE_EXPAND, EMPTY), EVENTS.NODE_CHECKED, EMPTY), EVENTS.NODE_DRAG_START, EMPTY), EVENTS.NODE_DRAG_OVER, EMPTY), EVENTS.NODE_DRAG_LEAVE, EMPTY), EVENTS.NODE_DRAG_SORT, EMPTY), EVENTS.NODE_DROP, EMPTY), EVENTS.NODE_ENTER_VIEW, EMPTY), _defineProperty(_TreeEmitEventsType, EVENTS.NODE_SELECTED, EMPTY));
17520
+ var TreeEmitEventsType = (_TreeEmitEventsType = {}, defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(_TreeEmitEventsType, EVENTS.NODE_ASYNC_LOAD, EMPTY), EVENTS.NODE_ASYNC_LOAD_ERROR, EMPTY), EVENTS.NODE_CLICK, EMPTY), EVENTS.NODE_COLLAPSE, EMPTY), EVENTS.NODE_EXPAND, EMPTY), EVENTS.NODE_CHECKED, EMPTY), EVENTS.NODE_DRAG_START, EMPTY), EVENTS.NODE_DRAG_OVER, EMPTY), EVENTS.NODE_DRAG_LEAVE, EMPTY), EVENTS.NODE_DRAG_SORT, EMPTY), defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(_TreeEmitEventsType, EVENTS.NODE_DROP, EMPTY), EVENTS.NODE_ENTER_VIEW, EMPTY), EVENTS.NODE_SELECTED, EMPTY));
17519
17521
  /**
17520
17522
  * 节点扩展属性
17521
17523
  */
@@ -17542,7 +17544,7 @@ var NODE_ATTRIBUTES;
17542
17544
  NODE_ATTRIBUTES["TREE_NODE_ATTR"] = "__attr__";
17543
17545
  NODE_ATTRIBUTES["UUID"] = "__uuid";
17544
17546
  })(NODE_ATTRIBUTES || (NODE_ATTRIBUTES = {}));
17545
- var NODE_SOURCE_ATTRS = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, NODE_ATTRIBUTES.IS_OPEN, 'isOpen'), NODE_ATTRIBUTES.IS_SELECTED, 'selected'), NODE_ATTRIBUTES.IS_MATCH, 'isMatch'), NODE_ATTRIBUTES.HAS_CHILD, 'hasChild'), NODE_ATTRIBUTES.IS_CHECKED, 'checked'), NODE_ATTRIBUTES.IS_ASYNC, 'async'), NODE_ATTRIBUTES.IS_LOADING, 'loading'), NODE_ATTRIBUTES.IS_ROOT, 'isRoot');
17547
+ var NODE_SOURCE_ATTRS = defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty({}, NODE_ATTRIBUTES.IS_OPEN, 'isOpen'), NODE_ATTRIBUTES.IS_SELECTED, 'selected'), NODE_ATTRIBUTES.IS_MATCH, 'isMatch'), NODE_ATTRIBUTES.HAS_CHILD, 'hasChild'), NODE_ATTRIBUTES.IS_CHECKED, 'checked'), NODE_ATTRIBUTES.IS_ASYNC, 'async'), NODE_ATTRIBUTES.IS_LOADING, 'loading'), NODE_ATTRIBUTES.IS_ROOT, 'isRoot');
17546
17548
  /**
17547
17549
  * 节点点击可执行行为配置
17548
17550
  */
@@ -17588,7 +17590,7 @@ var treeProps = {
17588
17590
  label: shared_namespaceObject.PropTypes.oneOfType([shared_namespaceObject.PropTypes.func.def(undefined), shared_namespaceObject.PropTypes.string.def('label')]),
17589
17591
  /**
17590
17592
  * 每个树节点用来作为唯一标识的属性,此标识应该是唯一的
17591
- * 如果设置系统会默认自动生成唯一id
17593
+ * 启用拖拽、异步、受控选中/勾选等复杂能力时强烈建议显式设置
17592
17594
  */
17593
17595
  nodeKey: shared_namespaceObject.PropTypes.string.def(undefined),
17594
17596
  /**
@@ -17623,6 +17625,10 @@ var treeProps = {
17623
17625
  * 默认 true
17624
17626
  */
17625
17627
  prefixIcon: shared_namespaceObject.PropTypes.oneOfType([shared_namespaceObject.PropTypes.func.def(function () {}), shared_namespaceObject.PropTypes.bool.def(false)]).def(true),
17628
+ /**
17629
+ * 当树数据需要由外部接管更新时的统一回调
17630
+ */
17631
+ onDataChange: Function,
17626
17632
  /**
17627
17633
  * 异步加载节点数据配置
17628
17634
  * @param callback 请求数据回调函数,函数返回 Promise
@@ -17774,9 +17780,18 @@ var treeProps = {
17774
17780
  */
17775
17781
  keepSlotData: shared_namespaceObject.PropTypes.bool.def(false),
17776
17782
  /**
17777
- * 在显示复选框的情况下,是否严格的遵循父子互相关联的做法
17783
+ * 是否启用父子节点勾选联动
17784
+ * true: 父子联动
17785
+ * false: 父子不联动(语义与行业常见 checkStrictly 相反,为兼容历史行为暂保留)
17778
17786
  */
17779
17787
  checkStrictly: shared_namespaceObject.PropTypes.bool.def(true),
17788
+ /**
17789
+ * 是否深度监听 props.data 变化
17790
+ * - false (默认): 仅监听 props.data 引用变化,性能更优
17791
+ * - true: 深度监听 props.data 内部节点变化(已废弃,将在下个主版本移除)
17792
+ * @deprecated 请使用 onDataChange 回调更新数据,避免直接修改 props.data 内部节点
17793
+ */
17794
+ deepWatch: shared_namespaceObject.PropTypes.bool.def(false),
17780
17795
  /**
17781
17796
  * 是否开启监听Tree节点进入Tree容器可视区域
17782
17797
  */
@@ -18048,7 +18063,7 @@ const icon_namespaceObject = icon_x({ ["DownShape"]: () => __WEBPACK_EXTERNAL_MO
18048
18063
  console.warn('node is not in schema, please check', id, node);
18049
18064
  return;
18050
18065
  }
18051
- flatData.schema.set(node, Object.assign({}, getSchemaVal(node), _defineProperty({}, attr, val)));
18066
+ flatData.schema.set(node, Object.assign({}, getSchemaVal(node), defineProperty_defineProperty({}, attr, val)));
18052
18067
  };
18053
18068
  var getNodeById = function getNodeById(id) {
18054
18069
  return flatData.data.find(function (item) {
@@ -18179,14 +18194,18 @@ const icon_namespaceObject = icon_x({ ["DownShape"]: () => __WEBPACK_EXTERNAL_MO
18179
18194
  return Array.isArray(pre) ? pre[index] : pre[props.children][index];
18180
18195
  }, props.data);
18181
18196
  if (uid) {
18182
- Object.assign(target, _defineProperty({}, NODE_ATTRIBUTES.UUID, uid));
18197
+ Object.assign(target, defineProperty_defineProperty({}, NODE_ATTRIBUTES.UUID, uid));
18183
18198
  }
18184
18199
  return target;
18185
18200
  };
18186
18201
  var getChildNodes = function getChildNodes(node) {
18187
- return flatData.data.filter(function (item) {
18188
- return getParentNode(item) === node;
18202
+ var children = [];
18203
+ flatData.data.forEach(function (item) {
18204
+ if (getParentNode(item) === node) {
18205
+ children.push(item);
18206
+ }
18189
18207
  });
18208
+ return children;
18190
18209
  };
18191
18210
  var getSourceNodeByUID = function getSourceNodeByUID(uid) {
18192
18211
  return flatData.data.find(function (item) {
@@ -18199,7 +18218,7 @@ const icon_namespaceObject = icon_x({ ["DownShape"]: () => __WEBPACK_EXTERNAL_MO
18199
18218
  target = getSourceNodeByUID(target);
18200
18219
  }
18201
18220
  if (isRootNode(target)) {
18202
- return _defineProperty({}, props.children, props.data);
18221
+ return defineProperty_defineProperty({}, props.children, props.data);
18203
18222
  }
18204
18223
  return getParentNode(target);
18205
18224
  };
@@ -18209,10 +18228,10 @@ const icon_namespaceObject = icon_x({ ["DownShape"]: () => __WEBPACK_EXTERNAL_MO
18209
18228
  * @returns
18210
18229
  */
18211
18230
  var resolveScopedSlotParam = function resolveScopedSlotParam(item) {
18212
- return _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_LOADING], getNodeAttr(item, NODE_ATTRIBUTES.IS_LOADING)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.HAS_CHILD], hasChildNode(item)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_MATCH], isNodeMatched(item)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_CHECKED], isNodeChecked(item)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_OPEN], isNodeOpened(item)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_ROOT], isRootNode(item)), "fullPath", getNodeAttr(item, NODE_ATTRIBUTES.PATH)), "uuid", getNodeId(item)), "parent", getNodeAttr(item, NODE_ATTRIBUTES.PARENT)), "parentId", getNodeId(getNodeAttr(item, NODE_ATTRIBUTES.PARENT)));
18231
+ return defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty({}, NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_LOADING], getNodeAttr(item, NODE_ATTRIBUTES.IS_LOADING)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.HAS_CHILD], hasChildNode(item)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_MATCH], isNodeMatched(item)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_CHECKED], isNodeChecked(item)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_OPEN], isNodeOpened(item)), NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_ROOT], isRootNode(item)), "fullPath", getNodeAttr(item, NODE_ATTRIBUTES.PATH)), "uuid", getNodeId(item)), "parent", getNodeAttr(item, NODE_ATTRIBUTES.PARENT)), "parentId", getNodeId(getNodeAttr(item, NODE_ATTRIBUTES.PARENT)));
18213
18232
  };
18214
18233
  var extendNodeAttr = function extendNodeAttr(item) {
18215
- return Object.assign({}, item, _defineProperty({}, NODE_ATTRIBUTES.TREE_NODE_ATTR, resolveScopedSlotParam(item)));
18234
+ return Object.assign({}, item, defineProperty_defineProperty({}, NODE_ATTRIBUTES.TREE_NODE_ATTR, resolveScopedSlotParam(item)));
18216
18235
  };
18217
18236
  var extendNodeScopedData = function extendNodeScopedData(item) {
18218
18237
  return {
@@ -18320,9 +18339,13 @@ function _toConsumableArray(r) {
18320
18339
 
18321
18340
 
18322
18341
 
18342
+
18323
18343
  var _this = undefined;
18344
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = util_unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
18345
+ function util_unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return util_arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? util_arrayLikeToArray(r, a) : void 0; } }
18346
+ function util_arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
18324
18347
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18325
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
18348
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { defineProperty_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
18326
18349
  /*
18327
18350
  * Tencent is pleased to support the open source community by making
18328
18351
  * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
@@ -18351,6 +18374,23 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
18351
18374
 
18352
18375
 
18353
18376
  var DEFAULT_LEVLE_LINE = '1px dashed #c3cdd7';
18377
+ var _cloneTreeNode = function cloneTreeNode(node) {
18378
+ if (Array.isArray(node)) {
18379
+ return node.map(function (item) {
18380
+ return _cloneTreeNode(item);
18381
+ });
18382
+ }
18383
+ if (node && _typeof(node) === 'object') {
18384
+ return Object.keys(node).reduce(function (acc, key) {
18385
+ var value = node[key];
18386
+ acc[key] = Array.isArray(value) ? value.map(function (item) {
18387
+ return _cloneTreeNode(item);
18388
+ }) : value;
18389
+ return acc;
18390
+ }, {});
18391
+ }
18392
+ return node;
18393
+ };
18354
18394
  /**
18355
18395
  * 获取配置项可为Bool|String|Function类型,如果为Bool则配置默认值
18356
18396
  * @param props
@@ -18462,7 +18502,7 @@ var getNodeItemClass = function getNodeItemClass(item, schema, props) {
18462
18502
  __is_open = _ref.__is_open;
18463
18503
  var _usePrefix = (0,config_provider_namespaceObject.usePrefix)(),
18464
18504
  resolveClassName = _usePrefix.resolveClassName;
18465
- return _defineProperty(_defineProperty(_defineProperty(_defineProperty({
18505
+ return defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty({
18466
18506
  'is-root': __is_root
18467
18507
  }, "".concat(resolveClassName('tree-node')), true), 'is-open', __is_open), 'is-virtual-render', props.virtualRender), 'level-line', props.levelLine && showTree);
18468
18508
  };
@@ -18478,7 +18518,7 @@ var getNodeRowClass = function getNodeRowClass(item, schema) {
18478
18518
  __is_selected = _ref3.__is_selected;
18479
18519
  var _usePrefix2 = (0,config_provider_namespaceObject.usePrefix)(),
18480
18520
  resolveClassName = _usePrefix2.resolveClassName;
18481
- return _defineProperty({
18521
+ return defineProperty_defineProperty({
18482
18522
  'is-checked': __is_checked,
18483
18523
  'is-selected': __is_selected,
18484
18524
  'node-folder': item.is_folder,
@@ -18496,6 +18536,187 @@ var getNodeRowClass = function getNodeRowClass(item, schema) {
18496
18536
  var updateTreeNode = function updateTreeNode(path, treeData, childKey, nodekey, nodeValue) {
18497
18537
  assignTreeNode(path, treeData, childKey, _defineProperty({}, nodekey, nodeValue));
18498
18538
  };
18539
+ var _cloneTreeData = function cloneTreeData() {
18540
+ var treeData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
18541
+ var childKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'children';
18542
+ return (treeData || []).map(function (node) {
18543
+ var clonedNode = _cloneTreeNode(node);
18544
+ if (Array.isArray(node === null || node === void 0 ? void 0 : node[childKey])) {
18545
+ clonedNode[childKey] = _cloneTreeData(node[childKey], childKey);
18546
+ }
18547
+ return clonedNode;
18548
+ });
18549
+ };
18550
+
18551
+ var _findNodeById = function findNodeById() {
18552
+ var treeData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
18553
+ var nodeId = arguments.length > 1 ? arguments[1] : undefined;
18554
+ var nodeKey = arguments.length > 2 ? arguments[2] : undefined;
18555
+ var childKey = arguments.length > 3 ? arguments[3] : undefined;
18556
+ var _iterator = _createForOfIteratorHelper(treeData),
18557
+ _step;
18558
+ try {
18559
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
18560
+ var node = _step.value;
18561
+ if ((node === null || node === void 0 ? void 0 : node[nodeKey]) === nodeId) {
18562
+ return node;
18563
+ }
18564
+ var children = node === null || node === void 0 ? void 0 : node[childKey];
18565
+ if (Array.isArray(children) && children.length) {
18566
+ var target = _findNodeById(children, nodeId, nodeKey, childKey);
18567
+ if (target) {
18568
+ return target;
18569
+ }
18570
+ }
18571
+ }
18572
+ } catch (err) {
18573
+ _iterator.e(err);
18574
+ } finally {
18575
+ _iterator.f();
18576
+ }
18577
+ return null;
18578
+ };
18579
+
18580
+ var mutateTreeById = function mutateTreeById() {
18581
+ var treeData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
18582
+ var nodeId = arguments.length > 1 ? arguments[1] : undefined;
18583
+ var nodeKey = arguments.length > 2 ? arguments[2] : undefined;
18584
+ var childKey = arguments.length > 3 ? arguments[3] : undefined;
18585
+ var updater = arguments.length > 4 ? arguments[4] : undefined;
18586
+ var target = _findNodeById(treeData, nodeId, nodeKey, childKey);
18587
+ if (target) {
18588
+ updater(target);
18589
+ }
18590
+ return treeData;
18591
+ };
18592
+ var removeTreeNodeById = function removeTreeNodeById() {
18593
+ var treeData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
18594
+ var nodeId = arguments.length > 1 ? arguments[1] : undefined;
18595
+ var nodeKey = arguments.length > 2 ? arguments[2] : undefined;
18596
+ var childKey = arguments.length > 3 ? arguments[3] : undefined;
18597
+ var _loop = function loop(list, parentNode) {
18598
+ for (var index = 0; index < list.length; index++) {
18599
+ var current = list[index];
18600
+ if ((current === null || current === void 0 ? void 0 : current[nodeKey]) === nodeId) {
18601
+ var _list$splice = list.splice(index, 1),
18602
+ _list$splice2 = _slicedToArray(_list$splice, 1),
18603
+ node = _list$splice2[0];
18604
+ return {
18605
+ node: node,
18606
+ parentNode: parentNode,
18607
+ index: index
18608
+ };
18609
+ }
18610
+ var children = current === null || current === void 0 ? void 0 : current[childKey];
18611
+ if (Array.isArray(children) && children.length) {
18612
+ var _result = _loop(children, current);
18613
+ if (_result.node) {
18614
+ return _result;
18615
+ }
18616
+ }
18617
+ }
18618
+ return {
18619
+ node: null,
18620
+ parentNode: null,
18621
+ index: -1
18622
+ };
18623
+ };
18624
+ var result = _loop(treeData, null);
18625
+ return _objectSpread(_objectSpread({}, result), {}, {
18626
+ data: treeData
18627
+ });
18628
+ };
18629
+ var insertTreeNodeById = function insertTreeNodeById() {
18630
+ var treeData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
18631
+ var node = arguments.length > 1 ? arguments[1] : undefined;
18632
+ var targetNodeId = arguments.length > 2 ? arguments[2] : undefined;
18633
+ var nodeKey = arguments.length > 3 ? arguments[3] : undefined;
18634
+ var childKey = arguments.length > 4 ? arguments[4] : undefined;
18635
+ var options = arguments.length > 5 ? arguments[5] : undefined;
18636
+ var dropType = options.dropType,
18637
+ _options$willInsertAf = options.willInsertAfter,
18638
+ willInsertAfter = _options$willInsertAf === void 0 ? true : _options$willInsertAf;
18639
+ if (dropType === 'child') {
18640
+ var targetNode = _findNodeById(treeData, targetNodeId, nodeKey, childKey);
18641
+ if (!targetNode) {
18642
+ return {
18643
+ data: treeData,
18644
+ parentNode: null,
18645
+ targetNode: null,
18646
+ index: -1
18647
+ };
18648
+ }
18649
+ if (!Array.isArray(targetNode[childKey])) {
18650
+ targetNode[childKey] = [];
18651
+ }
18652
+ var targetChildren = targetNode[childKey];
18653
+ targetChildren.push(node);
18654
+ return {
18655
+ data: treeData,
18656
+ parentNode: targetNode,
18657
+ targetNode: targetNode,
18658
+ index: targetChildren.length - 1
18659
+ };
18660
+ }
18661
+ var _loop2 = function loop(list, parentNode) {
18662
+ for (var index = 0; index < list.length; index++) {
18663
+ var current = list[index];
18664
+ if ((current === null || current === void 0 ? void 0 : current[nodeKey]) === targetNodeId) {
18665
+ var insertIndex = willInsertAfter ? index + 1 : index;
18666
+ list.splice(insertIndex, 0, node);
18667
+ return {
18668
+ parentNode: parentNode,
18669
+ targetNode: current,
18670
+ index: insertIndex
18671
+ };
18672
+ }
18673
+ var children = current === null || current === void 0 ? void 0 : current[childKey];
18674
+ if (Array.isArray(children) && children.length) {
18675
+ var _result2 = _loop2(children, current);
18676
+ if (_result2.targetNode) {
18677
+ return _result2;
18678
+ }
18679
+ }
18680
+ }
18681
+ return {
18682
+ parentNode: null,
18683
+ targetNode: null,
18684
+ index: -1
18685
+ };
18686
+ };
18687
+ var result = _loop2(treeData, null);
18688
+ return _objectSpread({
18689
+ data: treeData
18690
+ }, result);
18691
+ };
18692
+ var moveTreeNodeById = function moveTreeNodeById() {
18693
+ var treeData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
18694
+ var nodeId = arguments.length > 1 ? arguments[1] : undefined;
18695
+ var targetNodeId = arguments.length > 2 ? arguments[2] : undefined;
18696
+ var nodeKey = arguments.length > 3 ? arguments[3] : undefined;
18697
+ var childKey = arguments.length > 4 ? arguments[4] : undefined;
18698
+ var options = arguments.length > 5 ? arguments[5] : undefined;
18699
+ var nextTreeData = _cloneTreeData(treeData, childKey);
18700
+ var removeResult = removeTreeNodeById(nextTreeData, nodeId, nodeKey, childKey);
18701
+ if (!removeResult.node) {
18702
+ return null;
18703
+ }
18704
+ var insertResult = insertTreeNodeById(nextTreeData, removeResult.node, targetNodeId, nodeKey, childKey, options);
18705
+ if (!insertResult.targetNode && options.dropType !== 'child') {
18706
+ return null;
18707
+ }
18708
+ return {
18709
+ trigger: 'drag',
18710
+ data: nextTreeData,
18711
+ node: removeResult.node,
18712
+ targetNode: insertResult.targetNode,
18713
+ parentNode: insertResult.parentNode,
18714
+ oldParentNode: removeResult.parentNode,
18715
+ dropType: options.dropType,
18716
+ sourceIndex: removeResult.index,
18717
+ targetIndex: insertResult.index
18718
+ };
18719
+ };
18499
18720
  /**
18500
18721
  * 根据路径更新指定节点Child-Data
18501
18722
  * @param path 节点路径
@@ -18514,9 +18735,7 @@ var assignTreeNode = function assignTreeNode(path, treeData, childKey, assignVal
18514
18735
  var resolveNodeItem = function resolveNodeItem(node) {
18515
18736
  if (node === undefined || node === null) {
18516
18737
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
18517
- return {
18518
- __IS_NULL: true
18519
- };
18738
+ return defineProperty_defineProperty({}, NODE_ATTRIBUTES.IS_NULL, true);
18520
18739
  }
18521
18740
  return node;
18522
18741
  };
@@ -18568,23 +18787,42 @@ var showCheckbox = function showCheckbox(props, node) {
18568
18787
 
18569
18788
 
18570
18789
 
18571
- /* harmony default export */ const use_node_async = (function (props, flatData) {
18790
+ /* harmony default export */ const use_node_async = (function (props, flatData, ctx) {
18572
18791
  var _useNodeAttribute = use_node_attribute(flatData, props),
18573
18792
  setNodeAttr = _useNodeAttribute.setNodeAttr,
18574
- getNodePath = _useNodeAttribute.getNodePath,
18793
+ getNodeId = _useNodeAttribute.getNodeId,
18575
18794
  getNodeAttr = _useNodeAttribute.getNodeAttr,
18576
18795
  resolveScopedSlotParam = _useNodeAttribute.resolveScopedSlotParam,
18577
18796
  setTreeNodeLoading = _useNodeAttribute.setTreeNodeLoading;
18797
+ var requestVersionMap = new Map();
18798
+ var emitTreeDataChange = function emitTreeDataChange(payload) {
18799
+ var _props$onDataChange;
18800
+ (_props$onDataChange = props.onDataChange) === null || _props$onDataChange === void 0 || _props$onDataChange.call(props, payload);
18801
+ ctx === null || ctx === void 0 || ctx.emit(EVENTS.NODE_ASYNC_LOAD, payload);
18802
+ };
18578
18803
  /**
18579
18804
  * 处理异步加载节点数据返回结果
18580
18805
  * @param resp 异步请求返回结果
18581
18806
  * @param item 当前节点
18582
18807
  */
18583
- var setNodeRemoteLoad = function setNodeRemoteLoad(resp, item) {
18808
+ var setNodeRemoteLoad = function setNodeRemoteLoad(resp, item, requestVersion) {
18584
18809
  if (_typeof(resp) === 'object' && resp !== null) {
18810
+ var nodeId = getNodeId(item);
18811
+ if (requestVersion !== undefined && requestVersionMap.get(nodeId) !== requestVersion) {
18812
+ return Promise.resolve(resp);
18813
+ }
18585
18814
  setNodeAttr(item, NODE_ATTRIBUTES.IS_OPEN, true);
18586
18815
  var nodeValue = Array.isArray(resp) ? resp : [resp];
18587
- updateTreeNode(getNodePath(item), props.data, props.children, props.children, nodeValue);
18816
+ var nextTreeData = _cloneTreeData(props.data, props.children);
18817
+ mutateTreeById(nextTreeData, nodeId, props.nodeKey || NODE_ATTRIBUTES.UUID, props.children, function (targetNode) {
18818
+ targetNode[props.children] = nodeValue;
18819
+ });
18820
+ emitTreeDataChange({
18821
+ trigger: 'async',
18822
+ data: nextTreeData,
18823
+ node: item,
18824
+ parentNode: item
18825
+ });
18588
18826
  return Promise.resolve(resp);
18589
18827
  }
18590
18828
  return Promise.resolve(resp);
@@ -18595,29 +18833,39 @@ var showCheckbox = function showCheckbox(props, node) {
18595
18833
  callback = _ref$callback === void 0 ? null : _ref$callback,
18596
18834
  _ref$cache = _ref.cache,
18597
18835
  cache = _ref$cache === void 0 ? true : _ref$cache;
18598
- /** 如果是异步请求加载 */
18599
18836
  if (typeof callback === 'function' && getNodeAttr(item, NODE_ATTRIBUTES.IS_ASYNC)) {
18600
- /** 用于注释当前节点是否已经初始化过 */
18837
+ var nodeId = getNodeId(item);
18838
+ var requestVersion = (requestVersionMap.get(nodeId) || 0) + 1;
18839
+ requestVersionMap.set(nodeId, requestVersion);
18601
18840
  setNodeAttr(item, NODE_ATTRIBUTES.IS_ASYNC_INIT, true);
18602
18841
  if (!getNodeAttr(item, NODE_ATTRIBUTES.IS_CACHED)) {
18603
18842
  setNodeAttr(item, NODE_ATTRIBUTES.IS_CACHED, cache);
18604
18843
  var dataAttr = resolveScopedSlotParam(item);
18605
18844
  var callbackResult = callback(item, function (resp) {
18606
- return setNodeRemoteLoad(resp, item);
18845
+ return setNodeRemoteLoad(resp, item, requestVersion);
18607
18846
  }, dataAttr);
18608
18847
  if (_typeof(callbackResult) === 'object' && callbackResult !== null) {
18609
18848
  setTreeNodeLoading(item, true);
18610
18849
  if (callbackResult instanceof Promise) {
18611
18850
  return Promise.resolve(callbackResult.then(function (resp) {
18612
- return setNodeRemoteLoad(resp, item);
18851
+ return setNodeRemoteLoad(resp, item, requestVersion);
18613
18852
  })["catch"](function (err) {
18614
- return console.error('load remote data error:', err);
18853
+ if (requestVersionMap.get(nodeId) === requestVersion) {
18854
+ ctx === null || ctx === void 0 || ctx.emit(EVENTS.NODE_ASYNC_LOAD_ERROR, {
18855
+ node: item,
18856
+ error: err,
18857
+ requestVersion: requestVersion
18858
+ });
18859
+ }
18860
+ return false;
18615
18861
  })["finally"](function () {
18616
- setTreeNodeLoading(item, false);
18617
- setNodeAttr(item, NODE_ATTRIBUTES.IS_CACHED, true);
18862
+ if (requestVersionMap.get(nodeId) === requestVersion) {
18863
+ setTreeNodeLoading(item, false);
18864
+ setNodeAttr(item, NODE_ATTRIBUTES.IS_CACHED, true);
18865
+ }
18618
18866
  }));
18619
18867
  }
18620
- setNodeRemoteLoad(callbackResult, item);
18868
+ setNodeRemoteLoad(callbackResult, item, requestVersion);
18621
18869
  setTreeNodeLoading(item, false);
18622
18870
  return Promise.resolve(true);
18623
18871
  }
@@ -18686,6 +18934,10 @@ var use_node_action_this = undefined;
18686
18934
 
18687
18935
  /* harmony default export */ const use_node_action = (function (props, ctx, flatData, _renderData, initOption) {
18688
18936
  // const checkedNodes = [];
18937
+ var getSelectedNodeId = function getSelectedNodeId() {
18938
+ var _props$selected;
18939
+ return (_props$selected = props.selected) !== null && _props$selected !== void 0 ? _props$selected : selectedNodeId;
18940
+ };
18689
18941
  var selectedNodeId = props.selected;
18690
18942
  var _useNodeAttribute = use_node_attribute(flatData, props),
18691
18943
  setNodeAttr = _useNodeAttribute.setNodeAttr,
@@ -18708,7 +18960,7 @@ var use_node_action_this = undefined;
18708
18960
  var _usePrefix = (0,config_provider_namespaceObject.usePrefix)(),
18709
18961
  resolveClassName = _usePrefix.resolveClassName;
18710
18962
  var registerNextLoop = initOption.registerNextLoop;
18711
- var _useNodeAsync = use_node_async(props, flatData),
18963
+ var _useNodeAsync = use_node_async(props, flatData, ctx),
18712
18964
  asyncNodeClick = _useNodeAsync.asyncNodeClick,
18713
18965
  deepAutoOpen = _useNodeAsync.deepAutoOpen;
18714
18966
  /**
@@ -18851,6 +19103,7 @@ var use_node_action_this = undefined;
18851
19103
  if (value) {
18852
19104
  setNodeAttr(item, NODE_ATTRIBUTES.IS_INDETERMINATE, false);
18853
19105
  }
19106
+ // 历史语义:checkStrictly=true 表示启用父子联动
18854
19107
  if (props.checkStrictly) {
18855
19108
  _deepUpdateChildNode(item, [NODE_ATTRIBUTES.IS_CHECKED, NODE_ATTRIBUTES.IS_INDETERMINATE], [!!value, false]);
18856
19109
  _updateParentChecked(item, value);
@@ -19031,7 +19284,7 @@ var use_node_action_this = undefined;
19031
19284
  var _flatData$data$find;
19032
19285
  resolvedItem = (_flatData$data$find = flatData.data.find(function (item) {
19033
19286
  return getNodeId(item) === resolvedItem;
19034
- })) !== null && _flatData$data$find !== void 0 ? _flatData$data$find : _defineProperty({}, NODE_ATTRIBUTES.IS_NULL, true);
19287
+ })) !== null && _flatData$data$find !== void 0 ? _flatData$data$find : defineProperty_defineProperty({}, NODE_ATTRIBUTES.IS_NULL, true);
19035
19288
  }
19036
19289
  if (resolvedItem[NODE_ATTRIBUTES.IS_NULL]) {
19037
19290
  return;
@@ -19040,19 +19293,23 @@ var use_node_action_this = undefined;
19040
19293
  console.warn('props.selectable is false or undefined, please set selectable with true');
19041
19294
  return;
19042
19295
  }
19043
- if (selectedNodeId !== null && selectedNodeId !== undefined) {
19044
- setNodeAttrById(selectedNodeId, NODE_ATTRIBUTES.IS_SELECTED, !selected);
19296
+ var currentSelectedNodeId = getSelectedNodeId();
19297
+ if (currentSelectedNodeId !== null && currentSelectedNodeId !== undefined) {
19298
+ setNodeAttrById(currentSelectedNodeId, NODE_ATTRIBUTES.IS_SELECTED, !selected);
19045
19299
  }
19046
- if (props.selected && props.selected !== selectedNodeId) {
19300
+ if (props.selected && props.selected !== currentSelectedNodeId) {
19047
19301
  setNodeAttrById(props.selected, NODE_ATTRIBUTES.IS_SELECTED, !selected);
19048
19302
  }
19049
19303
  setNodeAttr(resolvedItem, NODE_ATTRIBUTES.IS_SELECTED, selected);
19050
- selectedNodeId = getNodeId(resolvedItem);
19304
+ if (props.selected === undefined) {
19305
+ selectedNodeId = getNodeId(resolvedItem);
19306
+ }
19051
19307
  if (triggerEvent) {
19052
- ctx.emit(EVENTS.NODE_SELECTED, {
19308
+ var payload = {
19053
19309
  selected: selected,
19054
19310
  node: resolvedItem
19055
- });
19311
+ };
19312
+ ctx.emit(EVENTS.NODE_SELECTED, payload);
19056
19313
  }
19057
19314
  /**
19058
19315
  * 如果设置了自动展开
@@ -22647,14 +22904,17 @@ Sortable.mount(Remove, Revert);
22647
22904
 
22648
22905
 
22649
22906
 
22650
- /* harmony default export */ const use_node_drag = (function (props, ctx, root, flatData) {
22907
+ /* harmony default export */ const use_node_drag = (function (props, ctx, root, flatData, options) {
22651
22908
  var _useNodeAttribute = use_node_attribute(flatData, props),
22652
22909
  getSourceNodeByUID = _useNodeAttribute.getSourceNodeByUID,
22653
22910
  getParentNode = _useNodeAttribute.getParentNode,
22654
22911
  extendNodeAttr = _useNodeAttribute.extendNodeAttr,
22655
- setNodeAttr = _useNodeAttribute.setNodeAttr,
22656
22912
  getNodeAttr = _useNodeAttribute.getNodeAttr,
22657
- getRootNodeList = _useNodeAttribute.getRootNodeList;
22913
+ getNodeId = _useNodeAttribute.getNodeId,
22914
+ setNodeAttr = _useNodeAttribute.setNodeAttr;
22915
+ var _ref = options || {},
22916
+ moveTreeNodeById = _ref.moveTreeNodeById,
22917
+ onTreeDataChange = _ref.onTreeDataChange;
22658
22918
  var _usePrefix = (0,config_provider_namespaceObject.usePrefix)(),
22659
22919
  resolveClassName = _usePrefix.resolveClassName;
22660
22920
  var isNeedCheckDraggable = (0,external_vue_namespaceObject.computed)(function () {
@@ -22762,24 +23022,12 @@ Sortable.mount(Remove, Revert);
22762
23022
  }
22763
23023
  });
22764
23024
  };
22765
- /**
22766
- * 从父节点的 children 数组中移除指定节点
22767
- */
22768
- var removeFromParentChildren = function removeFromParentChildren(node, parent) {
22769
- if (!parent) {
22770
- var index = props.data.indexOf(node);
22771
- if (index > -1) {
22772
- props.data.splice(index, 1);
22773
- }
22774
- } else {
22775
- var children = parent[props.children];
22776
- if (children) {
22777
- var _index = children.indexOf(node);
22778
- if (_index > -1) {
22779
- children.splice(_index, 1);
22780
- }
22781
- }
23025
+ var emitTreeDataChange = function emitTreeDataChange(payload) {
23026
+ if (!payload) {
23027
+ return null;
22782
23028
  }
23029
+ onTreeDataChange === null || onTreeDataChange === void 0 || onTreeDataChange(payload);
23030
+ return payload;
22783
23031
  };
22784
23032
  /**
22785
23033
  * 更新节点的 HAS_CHILD 属性
@@ -22819,52 +23067,36 @@ Sortable.mount(Remove, Revert);
22819
23067
  return 'child';
22820
23068
  };
22821
23069
  /**
22822
- * 将源数据树结构重新展开为 flatData(BFS 顺序)
22823
- * 这是唯一需要的 flatData 更新方式:修改 children 后重新展平
23070
+ * 将源数据树结构重新展开为 flatData(DFS 顺序)
23071
+ * 同时重新计算所有节点属性(深度、路径、索引等)
23072
+ * 与 v1 版本保持一致:从 props.data 出发进行遍历,不依赖旧 schema 状态
22824
23073
  */
22825
- var rebuildFlatData = function rebuildFlatData() {
23074
+ var rebuildFlatDataWithAttributes = function rebuildFlatDataWithAttributes() {
22826
23075
  var newFlatData = [];
22827
- var _traverse = function traverse(nodes) {
22828
- nodes.forEach(function (node) {
22829
- newFlatData.push(node);
22830
- var children = node[props.children];
22831
- if (children && children.length > 0) {
22832
- _traverse(children);
22833
- }
22834
- });
22835
- };
22836
- _traverse(props.data);
22837
- flatData.data = newFlatData;
22838
- };
22839
- /**
22840
- * 重新计算所有节点属性(深度、路径、索引等)
22841
- */
22842
- var recalculateNodeAttributes = function recalculateNodeAttributes() {
22843
23076
  var orderIndex = 0;
22844
- var _setNodeAttribute = function setNodeAttribute(nodeList, level, parentPath, parent) {
22845
- for (var i = 0; i < nodeList.length; i++) {
22846
- var node = nodeList[i];
23077
+ var _traverse = function traverse(nodes, level, parentPath, parent) {
23078
+ for (var i = 0; i < nodes.length; i++) {
23079
+ var node = nodes[i];
22847
23080
  var path = parentPath !== '' ? "".concat(parentPath, "-").concat(i) : "".concat(i);
23081
+ // 重新构建 flatData
23082
+ newFlatData.push(node);
23083
+ // 重新计算所有节点属性
22848
23084
  setNodeAttr(node, NODE_ATTRIBUTES.INDEX, orderIndex);
22849
23085
  setNodeAttr(node, NODE_ATTRIBUTES.ORDER, orderIndex);
22850
23086
  setNodeAttr(node, NODE_ATTRIBUTES.DEPTH, level);
22851
23087
  setNodeAttr(node, NODE_ATTRIBUTES.PATH, path);
22852
23088
  setNodeAttr(node, NODE_ATTRIBUTES.IS_ROOT, level === 0);
22853
23089
  setNodeAttr(node, NODE_ATTRIBUTES.PARENT, parent);
22854
- if (!parent) {
22855
- // 根节点:检查是否有子节点
22856
- var _children = node[props.children];
22857
- setNodeAttr(node, NODE_ATTRIBUTES.HAS_CHILD, !!(_children && _children.length > 0));
22858
- }
23090
+ setNodeAttr(node, NODE_ATTRIBUTES.HAS_CHILD, !!(node[props.children] || []).length);
22859
23091
  orderIndex += 1;
22860
- var children = node[props.children];
22861
- if (children && children.length > 0) {
22862
- _setNodeAttribute(children, level + 1, path, node);
23092
+ var children = node[props.children] || [];
23093
+ if (children.length > 0) {
23094
+ _traverse(children, level + 1, path, node);
22863
23095
  }
22864
23096
  }
22865
23097
  };
22866
- var rootNodeList = getRootNodeList();
22867
- _setNodeAttribute(rootNodeList, 0, '', null);
23098
+ _traverse(props.data, 0, '', null);
23099
+ flatData.data = newFlatData;
22868
23100
  };
22869
23101
  /**
22870
23102
  * 拖拽排序:同级节点间排序(dragSort 模式)
@@ -22873,36 +23105,29 @@ Sortable.mount(Remove, Revert);
22873
23105
  var dragSortData = function dragSortData(sourceNodeData, targetNodeData, willInsertAfter, savedOpenStates) {
22874
23106
  var sourceParent = getParentNode(sourceNodeData);
22875
23107
  var targetParent = getParentNode(targetNodeData);
22876
- // 只允许同父节点下排序
22877
- if (props.dragSortMode === 'next' && sourceParent !== targetParent) return;
22878
- // 1. 从原位置移除
22879
- removeFromParentChildren(sourceNodeData, sourceParent);
22880
- // 2. 获取目标所在的 children 数组
22881
- var targetChildren;
22882
- if (!targetParent) {
22883
- targetChildren = props.data;
22884
- } else {
22885
- targetChildren = targetParent[props.children];
22886
- if (!targetChildren) {
22887
- targetParent[props.children] = [];
22888
- targetChildren = targetParent[props.children];
22889
- }
22890
- }
22891
- // 3. 在目标节点前/后插入源节点
22892
- var targetIndexInParent = targetChildren.indexOf(targetNodeData);
22893
- var insertIndex = willInsertAfter ? targetIndexInParent + 1 : targetIndexInParent;
22894
- targetChildren.splice(insertIndex, 0, sourceNodeData);
22895
- // 4. 重新构建 flatData 并计算属性
22896
- rebuildFlatData();
22897
- recalculateNodeAttributes();
22898
- // 5. 更新源父节点的 HAS_CHILD
23108
+ if (props.dragSortMode === 'next' && sourceParent !== targetParent) return null;
23109
+ var payload = emitTreeDataChange(moveTreeNodeById === null || moveTreeNodeById === void 0 ? void 0 : moveTreeNodeById(props.data, getNodeId(sourceNodeData), getNodeId(targetNodeData), props.nodeKey || NODE_ATTRIBUTES.UUID, props.children, {
23110
+ dropType: 'sort',
23111
+ willInsertAfter: willInsertAfter
23112
+ }));
23113
+ if (!payload) {
23114
+ return null;
23115
+ }
23116
+ rebuildFlatDataWithAttributes();
22899
23117
  updateHasChildAttr(sourceParent);
22900
- // 6. 恢复展开状态
22901
23118
  restoreAllOpenStates(savedOpenStates);
22902
- ctx.emit(EVENTS.NODE_DRAG_SORT, {
23119
+ var dragSortPayload = {
22903
23120
  sourceNode: sourceNodeData,
22904
- targetNode: targetNodeData
22905
- });
23121
+ targetNode: targetNodeData,
23122
+ sourceIndex: payload.sourceIndex,
23123
+ targetIndex: payload.targetIndex,
23124
+ data: payload.data,
23125
+ parentNode: payload.parentNode,
23126
+ oldParentNode: payload.oldParentNode,
23127
+ dropType: payload.dropType
23128
+ };
23129
+ ctx.emit(EVENTS.NODE_DRAG_SORT, dragSortPayload);
23130
+ return payload;
22906
23131
  };
22907
23132
  /**
22908
23133
  * 将源节点作为目标节点的子节点
@@ -22910,22 +23135,17 @@ Sortable.mount(Remove, Revert);
22910
23135
  */
22911
23136
  var dragAsChildNode = function dragAsChildNode(sourceNodeData, targetNodeData, savedOpenStates) {
22912
23137
  var sourceParent = getParentNode(sourceNodeData);
22913
- // 1. 从原位置移除
22914
- removeFromParentChildren(sourceNodeData, sourceParent);
22915
- // 2. 初始化目标节点的 children 并 push
22916
- if (!targetNodeData[props.children]) {
22917
- targetNodeData[props.children] = [];
22918
- }
22919
- targetNodeData[props.children].push(sourceNodeData);
22920
- // 3. 重新构建 flatData 并计算属性
22921
- rebuildFlatData();
22922
- recalculateNodeAttributes();
22923
- // 4. 更新属性
23138
+ var payload = emitTreeDataChange(moveTreeNodeById === null || moveTreeNodeById === void 0 ? void 0 : moveTreeNodeById(props.data, getNodeId(sourceNodeData), getNodeId(targetNodeData), props.nodeKey || NODE_ATTRIBUTES.UUID, props.children, {
23139
+ dropType: 'child'
23140
+ }));
23141
+ if (!payload) {
23142
+ return null;
23143
+ }
23144
+ rebuildFlatDataWithAttributes();
22924
23145
  updateHasChildAttr(sourceParent);
22925
23146
  setNodeAttr(targetNodeData, NODE_ATTRIBUTES.HAS_CHILD, true);
22926
- // 5. 恢复展开状态
22927
23147
  restoreAllOpenStates(savedOpenStates);
22928
- ctx.emit(EVENTS.NODE_DROP, sourceNodeData, targetNodeData, 'child');
23148
+ return payload;
22929
23149
  };
22930
23150
  /**
22931
23151
  * 将源节点作为目标节点的同级节点插入(可跨级)
@@ -22934,32 +23154,18 @@ Sortable.mount(Remove, Revert);
22934
23154
  var dragAsSiblingNode = function dragAsSiblingNode(sourceNodeData, targetNodeData, willInsertAfter, savedOpenStates) {
22935
23155
  var sourceParent = getParentNode(sourceNodeData);
22936
23156
  var targetParent = getParentNode(targetNodeData);
22937
- // 1. 从原位置移除
22938
- removeFromParentChildren(sourceNodeData, sourceParent);
22939
- // 2. 获取目标所在的 children 数组
22940
- var targetChildren;
22941
- if (!targetParent) {
22942
- targetChildren = props.data;
22943
- } else {
22944
- targetChildren = targetParent[props.children];
22945
- if (!targetChildren) {
22946
- targetParent[props.children] = [];
22947
- targetChildren = targetParent[props.children];
22948
- }
22949
- }
22950
- // 3. 在目标节点前/后插入源节点
22951
- var targetIndexInParent = targetChildren.indexOf(targetNodeData);
22952
- var insertIndex = willInsertAfter ? targetIndexInParent + 1 : targetIndexInParent;
22953
- targetChildren.splice(insertIndex, 0, sourceNodeData);
22954
- // 4. 重新构建 flatData 并计算属性
22955
- rebuildFlatData();
22956
- recalculateNodeAttributes();
22957
- // 5. 更新属性
23157
+ var payload = emitTreeDataChange(moveTreeNodeById === null || moveTreeNodeById === void 0 ? void 0 : moveTreeNodeById(props.data, getNodeId(sourceNodeData), getNodeId(targetNodeData), props.nodeKey || NODE_ATTRIBUTES.UUID, props.children, {
23158
+ dropType: 'move',
23159
+ willInsertAfter: willInsertAfter
23160
+ }));
23161
+ if (!payload) {
23162
+ return null;
23163
+ }
23164
+ rebuildFlatDataWithAttributes();
22958
23165
  updateHasChildAttr(sourceParent);
22959
23166
  updateHasChildAttr(targetParent);
22960
- // 6. 恢复展开状态
22961
23167
  restoreAllOpenStates(savedOpenStates);
22962
- ctx.emit(EVENTS.NODE_DROP, sourceNodeData, targetNodeData, 'move');
23168
+ return payload;
22963
23169
  };
22964
23170
  /**
22965
23171
  * 检查是否禁止拖拽
@@ -23036,7 +23242,8 @@ Sortable.mount(Remove, Revert);
23036
23242
  }
23037
23243
  var sourceNodeData = getSourceNodeByUID(dragNodeId);
23038
23244
  var targetNodeData = getSourceNodeByUID(targetNodeId);
23039
- if (!sourceNodeData || !targetNodeData) {
23245
+ var targetEl = evt.related;
23246
+ if (!sourceNodeData || !targetNodeData || !targetEl) {
23040
23247
  cleanup();
23041
23248
  return;
23042
23249
  }
@@ -23046,17 +23253,32 @@ Sortable.mount(Remove, Revert);
23046
23253
  }
23047
23254
  // 保存展开状态
23048
23255
  var savedOpenStates = saveAllOpenStates();
23049
- // 根据放置类型执行对应操作
23256
+ var payload = null;
23050
23257
  if (currentDropType === 'child') {
23051
- dragAsChildNode(sourceNodeData, targetNodeData, savedOpenStates);
23258
+ payload = dragAsChildNode(sourceNodeData, targetNodeData, savedOpenStates);
23052
23259
  } else if (currentDropType === 'sort') {
23053
- dragSortData(sourceNodeData, targetNodeData, currentWillInsertAfter, savedOpenStates);
23260
+ payload = dragSortData(sourceNodeData, targetNodeData, currentWillInsertAfter, savedOpenStates);
23054
23261
  } else {
23055
- // move: 跨级移动为同级节点
23056
- dragAsSiblingNode(sourceNodeData, targetNodeData, currentWillInsertAfter, savedOpenStates);
23262
+ payload = dragAsSiblingNode(sourceNodeData, targetNodeData, currentWillInsertAfter, savedOpenStates);
23263
+ }
23264
+ if (!payload) {
23265
+ cleanup();
23266
+ return;
23057
23267
  }
23058
23268
  var targetData = extendNodeAttr(targetNodeData);
23059
- ctx.emit(EVENTS.NODE_DROP, evt, evt.item, targetData);
23269
+ var dropPayload = {
23270
+ event: evt,
23271
+ element: targetEl,
23272
+ targetNode: targetData,
23273
+ sourceNode: sourceNodeData,
23274
+ data: payload.data,
23275
+ parentNode: payload.parentNode,
23276
+ oldParentNode: payload.oldParentNode,
23277
+ dropType: payload.dropType,
23278
+ sourceIndex: payload.sourceIndex,
23279
+ targetIndex: payload.targetIndex
23280
+ };
23281
+ ctx.emit(EVENTS.NODE_DROP, dropPayload);
23060
23282
  cleanup();
23061
23283
  },
23062
23284
  onMove: function onMove(evt, originalEvent) {
@@ -23114,12 +23336,6 @@ Sortable.mount(Remove, Revert);
23114
23336
  * 拖拽结束后移除节点的选中状态,避免拖拽完毕节点保持选中
23115
23337
  */
23116
23338
  var cleanup = function cleanup() {
23117
- if (dragNodeId) {
23118
- var dragNode = getSourceNodeByUID(dragNodeId);
23119
- if (dragNode) {
23120
- setNodeAttr(dragNode, NODE_ATTRIBUTES.IS_SELECTED, false);
23121
- }
23122
- }
23123
23339
  dragNodeId = '';
23124
23340
  currentDropType = 'move';
23125
23341
  currentRelatedId = '';
@@ -23363,8 +23579,16 @@ var use_tree_init_this = undefined;
23363
23579
 
23364
23580
 
23365
23581
 
23582
+ var warnRequiredNodeKey = function warnRequiredNodeKey(props) {
23583
+ var _props$async, _props$checked;
23584
+ var needsStableNodeKey = !!props.draggable || !!props.dragSort || !!((_props$async = props.async) !== null && _props$async !== void 0 && _props$async.callback) || props.selected !== undefined || !!((_props$checked = props.checked) !== null && _props$checked !== void 0 && _props$checked.length);
23585
+ if (needsStableNodeKey && !props.nodeKey) {
23586
+ console.warn('[Tree] `nodeKey` is recommended when using drag, async, selected, or checked state.');
23587
+ }
23588
+ };
23366
23589
  /* harmony default export */ const use_tree_init = (function (props) {
23367
- var _props$async3;
23590
+ var _props$async4;
23591
+ warnRequiredNodeKey(props);
23368
23592
  /**
23369
23593
  * 扁平化当前数据
23370
23594
  * @param treeData 树形结构数据
@@ -23379,6 +23603,10 @@ var use_tree_init_this = undefined;
23379
23603
  var checkedList = [];
23380
23604
  var outputData = [];
23381
23605
  var order = 0;
23606
+ // TODO P2: 考虑将 WeakMap<TreeNode, meta> 切换为 Map<nodeKey, meta>
23607
+ // 优势:序列化友好、跨实例共享、避免对象引用泄漏
23608
+ // 劣势:需要手动管理内存、依赖 nodeKey 唯一性
23609
+ // 当前保留 WeakMap 以保证兼容性和自动 GC
23382
23610
  var treeSchema = new WeakMap();
23383
23611
  /**
23384
23612
  * 递归更新节点属性
@@ -23399,7 +23627,7 @@ var use_tree_init_this = undefined;
23399
23627
  if (target[attrName] === attrValue) {
23400
23628
  return;
23401
23629
  }
23402
- Object.assign(target, _defineProperty({}, attrName, attrValue));
23630
+ Object.assign(target, defineProperty_defineProperty({}, attrName, attrValue));
23403
23631
  loopUpdateNodeAttr(target[NODE_ATTRIBUTES.PARENT], attrName, attrValue, callFn);
23404
23632
  }
23405
23633
  }
@@ -23417,7 +23645,7 @@ var use_tree_init_this = undefined;
23417
23645
  * 如果传入数据没有设置相关属性值
23418
23646
  * 这里会自动生成
23419
23647
  */
23420
- var cachedDefaultVal = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, NODE_ATTRIBUTES.IS_OPEN, function () {
23648
+ var cachedDefaultVal = defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty({}, NODE_ATTRIBUTES.IS_OPEN, function () {
23421
23649
  return !!props.expandAll;
23422
23650
  }), NODE_ATTRIBUTES.IS_CHECKED, function () {
23423
23651
  return false;
@@ -23540,7 +23768,7 @@ var use_tree_init_this = undefined;
23540
23768
  */
23541
23769
  isOpened = isNodeOpend(uuid, item, parent);
23542
23770
  }
23543
- var attributes = (_attributes = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_attributes, NODE_ATTRIBUTES.DEPTH, depth), NODE_ATTRIBUTES.INDEX, order), NODE_ATTRIBUTES.UUID, uuid), NODE_ATTRIBUTES.PARENT, parent), NODE_ATTRIBUTES.HAS_CHILD, hasChildren), NODE_ATTRIBUTES.PATH, currentPath), NODE_ATTRIBUTES.IS_ROOT, parent === null), NODE_ATTRIBUTES.ORDER, order), NODE_ATTRIBUTES.IS_SELECTED, isCachedTreeNodeSelected(uuid, item)), NODE_ATTRIBUTES.IS_MATCH, getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_MATCH)), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_attributes, NODE_ATTRIBUTES.IS_OPEN, isOpened), NODE_ATTRIBUTES.IS_CHECKED, undefined), NODE_ATTRIBUTES.IS_CACHED, getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_CACHED)), NODE_ATTRIBUTES.IS_ASYNC, getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_ASYNC)), NODE_ATTRIBUTES.IS_LOADING, getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_LOADING)), NODE_ATTRIBUTES.IS_INDETERMINATE, false));
23771
+ var attributes = (_attributes = {}, defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(_attributes, NODE_ATTRIBUTES.DEPTH, depth), NODE_ATTRIBUTES.INDEX, order), NODE_ATTRIBUTES.UUID, uuid), NODE_ATTRIBUTES.PARENT, parent), NODE_ATTRIBUTES.HAS_CHILD, hasChildren), NODE_ATTRIBUTES.PATH, currentPath), NODE_ATTRIBUTES.IS_ROOT, parent === null), NODE_ATTRIBUTES.ORDER, order), NODE_ATTRIBUTES.IS_SELECTED, isCachedTreeNodeSelected(uuid, item)), NODE_ATTRIBUTES.IS_MATCH, getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_MATCH)), defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(defineProperty_defineProperty(_attributes, NODE_ATTRIBUTES.IS_OPEN, isOpened), NODE_ATTRIBUTES.IS_CHECKED, undefined), NODE_ATTRIBUTES.IS_CACHED, getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_CACHED)), NODE_ATTRIBUTES.IS_ASYNC, getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_ASYNC)), NODE_ATTRIBUTES.IS_LOADING, getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_LOADING)), NODE_ATTRIBUTES.IS_INDETERMINATE, false));
23544
23772
  attributes[NODE_ATTRIBUTES.IS_CHECKED] = isCheckedNode(item, uuid, attributes);
23545
23773
  if (attributes[NODE_ATTRIBUTES.IS_CHECKED]) {
23546
23774
  checkedList.push(item);
@@ -23556,6 +23784,7 @@ var use_tree_init_this = undefined;
23556
23784
  }
23557
23785
  }
23558
23786
  flatten(treeData !== null && treeData !== void 0 ? treeData : data);
23787
+ // 历史语义:checkStrictly=true 表示启用父子联动
23559
23788
  if (props.showCheckbox !== false && props.checkStrictly) {
23560
23789
  checkedList === null || checkedList === void 0 || checkedList.forEach(function (value) {
23561
23790
  loopUpdateNodeAttr(value, NODE_ATTRIBUTES.IS_CHECKED, true, loopUpdateCheckedEvent);
@@ -23643,15 +23872,17 @@ var use_tree_init_this = undefined;
23643
23872
  };
23644
23873
  /**
23645
23874
  * 监听组件配置Data改变
23875
+ * 注意:外部应通过 onDataChange 回调更新数据,而非直接修改 props.data 内部节点
23876
+ * 默认不使用 deep: true 以避免不必要的深度遍历开销
23646
23877
  */
23647
23878
  (0,external_vue_namespaceObject.watch)(function () {
23648
- return [props.data];
23879
+ return props.data;
23649
23880
  }, function (newData) {
23650
- var _props$async, _props$async2;
23651
- var formatData = getFlatdata(newData[0], flatData.schema);
23881
+ var _props$async2, _props$async3;
23882
+ var formatData = getFlatdata(newData, flatData.schema);
23652
23883
  flatData.data = formatData[0];
23653
23884
  flatData.schema = formatData[1];
23654
- if ((_props$async = props.async) !== null && _props$async !== void 0 && _props$async.callback && ((_props$async2 = props.async) === null || _props$async2 === void 0 ? void 0 : _props$async2.deepAutoOpen) === 'every') {
23885
+ if ((_props$async2 = props.async) !== null && _props$async2 !== void 0 && _props$async2.callback && ((_props$async3 = props.async) === null || _props$async3 === void 0 ? void 0 : _props$async3.deepAutoOpen) === 'every') {
23655
23886
  deepAutoOpen();
23656
23887
  }
23657
23888
  /**
@@ -23660,8 +23891,12 @@ var use_tree_init_this = undefined;
23660
23891
  */
23661
23892
  executeNextEvent();
23662
23893
  }, {
23663
- deep: true
23894
+ deep: props.deepWatch
23664
23895
  });
23896
+ // deepWatch 已废弃警告
23897
+ if (props.deepWatch) {
23898
+ console.warn('[BkTree] deepWatch is deprecated and will be removed in the next major version. ' + 'Please use onDataChange callback to update data instead of directly modifying props.data internal nodes.');
23899
+ }
23665
23900
  if (props.selectable) {
23666
23901
  (0,external_vue_namespaceObject.onMounted)(function () {
23667
23902
  (0,external_vue_namespaceObject.watch)(function () {
@@ -23689,7 +23924,7 @@ var use_tree_init_this = undefined;
23689
23924
  registerNextLoop('afterDataUpdate', callFn);
23690
23925
  };
23691
23926
  /** 如果设置了异步请求 */
23692
- if ((_props$async3 = props.async) !== null && _props$async3 !== void 0 && _props$async3.callback) {
23927
+ if ((_props$async4 = props.async) !== null && _props$async4 !== void 0 && _props$async4.callback) {
23693
23928
  deepAutoOpen();
23694
23929
  }
23695
23930
  return {
@@ -23755,6 +23990,10 @@ var use_tree_init_this = undefined;
23755
23990
  flatData = _useTreeInit.flatData,
23756
23991
  onSelected = _useTreeInit.onSelected,
23757
23992
  registerNextLoop = _useTreeInit.registerNextLoop;
23993
+ var handleTreeDataChange = function handleTreeDataChange(payload) {
23994
+ var _props$onDataChange;
23995
+ (_props$onDataChange = props.onDataChange) === null || _props$onDataChange === void 0 || _props$onDataChange.call(props, payload);
23996
+ };
23758
23997
  var _useNodeAttribute = use_node_attribute(flatData, props),
23759
23998
  checkNodeIsOpen = _useNodeAttribute.checkNodeIsOpen,
23760
23999
  isRootNode = _useNodeAttribute.isRootNode,
@@ -23879,7 +24118,7 @@ var use_tree_init_this = undefined;
23879
24118
  if (checked) {
23880
24119
  setNodeAction(resolvedNode, NODE_ATTRIBUTES.IS_INDETERMINATE, false);
23881
24120
  }
23882
- // 如果设置了 checkStrictly,需要同步更新子节点和父节点的状态
24121
+ // 历史语义:checkStrictly=true 表示启用父子联动
23883
24122
  if (props.checkStrictly) {
23884
24123
  deepUpdateChildNode(resolvedNode, [NODE_ATTRIBUTES.IS_CHECKED, NODE_ATTRIBUTES.IS_INDETERMINATE], [checked, false]);
23885
24124
  updateParentChecked(resolvedNode, checked);
@@ -23896,32 +24135,46 @@ var use_tree_init_this = undefined;
23896
24135
  onSelected(function (newData) {
23897
24136
  setSelect(newData, true, props.autoOpenParentNode, true);
23898
24137
  });
24138
+ var buildChildrenIndex = function buildChildrenIndex() {
24139
+ var childrenMap = new Map();
24140
+ flatData.data.forEach(function (node) {
24141
+ var _getParentNode;
24142
+ var parentNode = (_getParentNode = getParentNode(node)) !== null && _getParentNode !== void 0 ? _getParentNode : null;
24143
+ if (!childrenMap.has(parentNode)) {
24144
+ childrenMap.set(parentNode, []);
24145
+ }
24146
+ childrenMap.get(parentNode).push(node);
24147
+ });
24148
+ return childrenMap;
24149
+ };
23899
24150
  /**
23900
24151
  * 根据最新的schema生成最新的Tree结构数据
23901
24152
  * @returns
23902
24153
  */
23903
24154
  var getLastTreeDataBySchema = function getLastTreeDataBySchema() {
24155
+ var _childrenMap$get2;
24156
+ var childrenMap = buildChildrenIndex();
23904
24157
  var _loopData = function loopData(rootNodeList) {
23905
24158
  return (rootNodeList !== null && rootNodeList !== void 0 ? rootNodeList : []).map(function (node) {
24159
+ var _childrenMap$get;
23906
24160
  var copyData = (0,lodash.cloneDeep)(node);
23907
24161
  if (!copyData) {
23908
24162
  return copyData;
23909
24163
  }
23910
- var children = flatData.data.filter(function (item) {
23911
- return getParentNode(item) === node;
23912
- });
24164
+ var children = (_childrenMap$get = childrenMap.get(node)) !== null && _childrenMap$get !== void 0 ? _childrenMap$get : [];
23913
24165
  copyData[props.children] = _loopData(children);
23914
24166
  return copyData;
23915
24167
  });
23916
24168
  };
23917
- return _loopData(getRootNodeList());
24169
+ return _loopData((_childrenMap$get2 = childrenMap.get(null)) !== null && _childrenMap$get2 !== void 0 ? _childrenMap$get2 : getRootNodeList());
23918
24170
  };
23919
24171
  /**
23920
24172
  * 获取当前树形结构相关数据
23921
24173
  * @param newTree 如果启用了排序,拖拽功能,这里数据结构会改变,需要设置为true,获取最新的数据
23922
24174
  * @returns
23923
24175
  */
23924
- var getData = function getData(newTree) {
24176
+ var getData = function getData() {
24177
+ var newTree = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
23925
24178
  if (!newTree) {
23926
24179
  return flatData;
23927
24180
  }
@@ -24020,7 +24273,10 @@ var use_tree_init_this = undefined;
24020
24273
  });
24021
24274
  var _useEmpty = use_empty(props),
24022
24275
  renderEmpty = _useEmpty.renderEmpty;
24023
- use_node_drag(props, ctx, root, flatData);
24276
+ use_node_drag(props, ctx, root, flatData, {
24277
+ moveTreeNodeById: moveTreeNodeById,
24278
+ onTreeDataChange: handleTreeDataChange
24279
+ });
24024
24280
  var renderTreeContent = function renderTreeContent(scopedData) {
24025
24281
  var _ctx$slots$empty, _ctx$slots$empty2, _ctx$slots;
24026
24282
  if (scopedData.length) {