bkui-vue 3.0.2 → 3.0.4

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
@@ -1,7 +1,7 @@
1
1
  import "../styles/reset.css";
2
2
  import "./tree.less";
3
3
  import { PropTypes as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__, debounce as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_debounce__, withInstall as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_withInstall__ } from "../shared";
4
- import { computed as __WEBPACK_EXTERNAL_MODULE_vue_computed__, createVNode as __WEBPACK_EXTERNAL_MODULE_vue_createVNode__, defineComponent as __WEBPACK_EXTERNAL_MODULE_vue_defineComponent__, h as __WEBPACK_EXTERNAL_MODULE_vue_h__, isVNode as __WEBPACK_EXTERNAL_MODULE_vue_isVNode__, nextTick as __WEBPACK_EXTERNAL_MODULE_vue_nextTick__, onMounted as __WEBPACK_EXTERNAL_MODULE_vue_onMounted__, onUnmounted as __WEBPACK_EXTERNAL_MODULE_vue_onUnmounted__, reactive as __WEBPACK_EXTERNAL_MODULE_vue_reactive__, ref as __WEBPACK_EXTERNAL_MODULE_vue_ref__, toRef as __WEBPACK_EXTERNAL_MODULE_vue_toRef__, watch as __WEBPACK_EXTERNAL_MODULE_vue_watch__ } from "vue";
4
+ import { computed as __WEBPACK_EXTERNAL_MODULE_vue_computed__, createVNode as __WEBPACK_EXTERNAL_MODULE_vue_createVNode__, defineComponent as __WEBPACK_EXTERNAL_MODULE_vue_defineComponent__, h as __WEBPACK_EXTERNAL_MODULE_vue_h__, isVNode as __WEBPACK_EXTERNAL_MODULE_vue_isVNode__, markRaw as __WEBPACK_EXTERNAL_MODULE_vue_markRaw__, nextTick as __WEBPACK_EXTERNAL_MODULE_vue_nextTick__, onMounted as __WEBPACK_EXTERNAL_MODULE_vue_onMounted__, onUnmounted as __WEBPACK_EXTERNAL_MODULE_vue_onUnmounted__, reactive as __WEBPACK_EXTERNAL_MODULE_vue_reactive__, ref as __WEBPACK_EXTERNAL_MODULE_vue_ref__, shallowReactive as __WEBPACK_EXTERNAL_MODULE_vue_shallowReactive__, shallowRef as __WEBPACK_EXTERNAL_MODULE_vue_shallowRef__, toRaw as __WEBPACK_EXTERNAL_MODULE_vue_toRaw__, toRef as __WEBPACK_EXTERNAL_MODULE_vue_toRef__, watch as __WEBPACK_EXTERNAL_MODULE_vue_watch__ } from "vue";
5
5
  import { usePrefix as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__ } from "../config-provider";
6
6
  import { default as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_virtual_render_927587a8_default__ } from "../virtual-render";
7
7
  import "../virtual-render/virtual-render.less";
@@ -17601,6 +17601,12 @@ var treeProps = {
17601
17601
  * 默认虚拟滚动是开启的,数据量大的情况下有利于性能优化,可以通过设置 virtualRender = false 关闭虚拟滚动
17602
17602
  */
17603
17603
  virtualRender: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.bool.def(false),
17604
+ /**
17605
+ * 是否深度监听 data 内部变更(原地 push/改 children 等)
17606
+ * 默认 false:仅监听 data 引用变化,大数据量下性能更好
17607
+ * 若业务依赖「不换引用、原地改树」自动刷新,可设为 true(小数据场景)
17608
+ */
17609
+ watchDataDeep: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.bool.def(false),
17604
17610
  /**
17605
17611
  * 当前节点标识图标
17606
17612
  * 默认 true
@@ -17971,6 +17977,208 @@ var treeProps = {
17971
17977
 
17972
17978
  ;// external "../icon"
17973
17979
 
17980
+ ;// ../../packages/tree/src/use-checked-state.ts
17981
+ /*
17982
+ * Tencent is pleased to support the open source community by making
17983
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
17984
+ *
17985
+ * Copyright (C) 2025 Tencent. All rights reserved.
17986
+ *
17987
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) is licensed under the MIT License.
17988
+ *
17989
+ * License for 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition):
17990
+ *
17991
+ * ---------------------------------------------------
17992
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
17993
+ * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
17994
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
17995
+ * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
17996
+ *
17997
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
17998
+ * the Software.
17999
+ *
18000
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
18001
+ * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18002
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
18003
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
18004
+ * IN THE SOFTWARE.
18005
+ */
18006
+
18007
+ /**
18008
+ * 勾选状态增量维护:
18009
+ * - checked/indeterminate 用 Set 跟踪,避免每次 emit 全表 filter O(N)
18010
+ * - 子树更新按 flatData 的 DFS 连续区间扫描,避免递归调用开销
18011
+ */
18012
+ /* harmony default export */ const use_checked_state = (function (flatData, helpers) {
18013
+ var getChildNodes = helpers.getChildNodes,
18014
+ getNodeAttr = helpers.getNodeAttr,
18015
+ getParentNode = helpers.getParentNode,
18016
+ getSchemaVal = helpers.getSchemaVal,
18017
+ isRootNode = helpers.isRootNode;
18018
+ var checkedSet = new Set();
18019
+ var indeterminateSet = new Set();
18020
+ var syncNodeToSets = function syncNodeToSets(node) {
18021
+ var schema = getSchemaVal(node);
18022
+ if (!schema) {
18023
+ return;
18024
+ }
18025
+ var checked = !!schema[NODE_ATTRIBUTES.IS_CHECKED];
18026
+ var indeterminate = checked && !!schema[NODE_ATTRIBUTES.IS_INDETERMINATE];
18027
+ if (checked) {
18028
+ checkedSet.add(node);
18029
+ } else {
18030
+ checkedSet["delete"](node);
18031
+ }
18032
+ if (indeterminate) {
18033
+ indeterminateSet.add(node);
18034
+ } else {
18035
+ indeterminateSet["delete"](node);
18036
+ }
18037
+ };
18038
+ var setNodeCheckedState = function setNodeCheckedState(node, checked) {
18039
+ var indeterminate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
18040
+ var schema = getSchemaVal(node);
18041
+ if (!schema) {
18042
+ return false;
18043
+ }
18044
+ var nextChecked = !!checked;
18045
+ var nextIndeterminate = nextChecked && !!indeterminate;
18046
+ var prevChecked = !!schema[NODE_ATTRIBUTES.IS_CHECKED];
18047
+ var prevIndeterminate = !!schema[NODE_ATTRIBUTES.IS_INDETERMINATE];
18048
+ if (prevChecked === nextChecked && prevIndeterminate === nextIndeterminate) {
18049
+ return false;
18050
+ }
18051
+ schema[NODE_ATTRIBUTES.IS_CHECKED] = nextChecked;
18052
+ schema[NODE_ATTRIBUTES.IS_INDETERMINATE] = nextIndeterminate;
18053
+ if (nextChecked) {
18054
+ checkedSet.add(node);
18055
+ } else {
18056
+ checkedSet["delete"](node);
18057
+ }
18058
+ if (nextIndeterminate) {
18059
+ indeterminateSet.add(node);
18060
+ } else {
18061
+ indeterminateSet["delete"](node);
18062
+ }
18063
+ return true;
18064
+ };
18065
+ /** 基于 flatten 收集的 checkedList 重建,避免无勾选时全表扫描 */
18066
+ var rebuildCheckedSetsFromList = function rebuildCheckedSetsFromList() {
18067
+ var nodes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
18068
+ checkedSet.clear();
18069
+ indeterminateSet.clear();
18070
+ for (var i = 0, len = nodes.length; i < len; i++) {
18071
+ var node = nodes[i];
18072
+ syncNodeToSets(node);
18073
+ var parent = getParentNode(node);
18074
+ while (parent) {
18075
+ syncNodeToSets(parent);
18076
+ parent = getParentNode(parent);
18077
+ }
18078
+ }
18079
+ };
18080
+ /**
18081
+ * flatData 为 DFS 序,INDEX 即数组下标;后代是一段连续区间。
18082
+ */
18083
+ var forEachDescendant = function forEachDescendant(node, fn) {
18084
+ var _getNodeAttr, _getNodeAttr2;
18085
+ var data = flatData.data;
18086
+ var start = ((_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.INDEX)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : -1) + 1;
18087
+ if (start <= 0) {
18088
+ return;
18089
+ }
18090
+ var nodeDepth = (_getNodeAttr2 = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr2 !== void 0 ? _getNodeAttr2 : 0;
18091
+ for (var i = start; i < data.length; i++) {
18092
+ var _getNodeAttr3;
18093
+ var child = data[i];
18094
+ var depth = (_getNodeAttr3 = getNodeAttr(child, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr3 !== void 0 ? _getNodeAttr3 : 0;
18095
+ if (depth <= nodeDepth) {
18096
+ break;
18097
+ }
18098
+ fn(child);
18099
+ }
18100
+ };
18101
+ var setDescendantChecked = function setDescendantChecked(node, checked) {
18102
+ forEachDescendant(node, function (child) {
18103
+ setNodeCheckedState(child, checked, false);
18104
+ });
18105
+ };
18106
+ var isNodeChecked = function isNodeChecked(node) {
18107
+ return !!getNodeAttr(node, NODE_ATTRIBUTES.IS_CHECKED);
18108
+ };
18109
+ var isNodeIndeterminate = function isNodeIndeterminate(node) {
18110
+ return isNodeChecked(node) && !!getNodeAttr(node, NODE_ATTRIBUTES.IS_INDETERMINATE);
18111
+ };
18112
+ /**
18113
+ * 自底向上更新祖先勾选 / 半选,复杂度 O(depth × 兄弟数)
18114
+ */
18115
+ var _updateParentChecked = function updateParentChecked(item) {
18116
+ var parent = getParentNode(item);
18117
+ if (!parent) {
18118
+ return;
18119
+ }
18120
+ var children = getChildNodes(parent) || [];
18121
+ var hasChecked = false;
18122
+ var hasUncheckedOrIndeterminate = false;
18123
+ for (var i = 0, len = children.length; i < len; i++) {
18124
+ var child = children[i];
18125
+ var childChecked = isNodeChecked(child);
18126
+ if (childChecked) {
18127
+ hasChecked = true;
18128
+ }
18129
+ if (!childChecked || isNodeIndeterminate(child)) {
18130
+ hasUncheckedOrIndeterminate = true;
18131
+ }
18132
+ // 半选态已确定,可提前结束
18133
+ if (hasChecked && hasUncheckedOrIndeterminate) {
18134
+ break;
18135
+ }
18136
+ }
18137
+ setNodeCheckedState(parent, hasChecked, hasChecked && hasUncheckedOrIndeterminate);
18138
+ if (!isRootNode(parent)) {
18139
+ _updateParentChecked(parent);
18140
+ }
18141
+ };
18142
+ var getCheckedEmitPayload = function getCheckedEmitPayload() {
18143
+ return [Array.from(checkedSet), Array.from(indeterminateSet)];
18144
+ };
18145
+ var rebuildCheckedSets = function rebuildCheckedSets() {
18146
+ checkedSet.clear();
18147
+ indeterminateSet.clear();
18148
+ var data = flatData.data;
18149
+ for (var i = 0, len = data.length; i < len; i++) {
18150
+ syncNodeToSets(data[i]);
18151
+ }
18152
+ };
18153
+ var clearAllCheckedState = function clearAllCheckedState() {
18154
+ checkedSet.forEach(function (node) {
18155
+ var schema = getSchemaVal(node);
18156
+ if (schema) {
18157
+ schema[NODE_ATTRIBUTES.IS_CHECKED] = false;
18158
+ schema[NODE_ATTRIBUTES.IS_INDETERMINATE] = false;
18159
+ }
18160
+ });
18161
+ indeterminateSet.clear();
18162
+ checkedSet.clear();
18163
+ };
18164
+ // 初始化:优先用 flatten 结果,避免空勾选时扫百万节点
18165
+ rebuildCheckedSetsFromList(flatData.checkedList || []);
18166
+ flatData.syncCheckedState = syncNodeToSets;
18167
+ return {
18168
+ checkedSet: checkedSet,
18169
+ indeterminateSet: indeterminateSet,
18170
+ syncNodeToSets: syncNodeToSets,
18171
+ setNodeCheckedState: setNodeCheckedState,
18172
+ setDescendantChecked: setDescendantChecked,
18173
+ forEachDescendant: forEachDescendant,
18174
+ updateParentChecked: _updateParentChecked,
18175
+ getCheckedEmitPayload: getCheckedEmitPayload,
18176
+ rebuildCheckedSets: rebuildCheckedSets,
18177
+ rebuildCheckedSetsFromList: rebuildCheckedSetsFromList,
18178
+ clearAllCheckedState: clearAllCheckedState,
18179
+ isNodeIndeterminate: isNodeIndeterminate
18180
+ };
18181
+ });
17974
18182
  ;// ../../packages/tree/src/use-node-attribute.tsx
17975
18183
 
17976
18184
 
@@ -18001,32 +18209,76 @@ var treeProps = {
18001
18209
  */
18002
18210
 
18003
18211
 
18212
+
18004
18213
  /* harmony default export */ const use_node_attribute = (function (flatData, props) {
18214
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
18215
+ /**
18216
+ * WeakMap 以对象引用为 key;Vue Proxy 与 raw 不是同一引用,需同时兼容
18217
+ */
18218
+ var resolveSchemaNode = function resolveSchemaNode(node) {
18219
+ if (!node) {
18220
+ return null;
18221
+ }
18222
+ if (flatData.schema.has(node)) {
18223
+ return node;
18224
+ }
18225
+ var raw = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
18226
+ if (raw && raw !== node && flatData.schema.has(raw)) {
18227
+ return raw;
18228
+ }
18229
+ return null;
18230
+ };
18005
18231
  /**
18006
18232
  * 获取Schema中指定的对象值
18007
18233
  * @param key
18008
18234
  * @returns
18009
18235
  */
18010
18236
  var getSchemaVal = function getSchemaVal(node) {
18011
- return flatData.schema.get(node);
18237
+ var schemaNode = resolveSchemaNode(node);
18238
+ return schemaNode ? flatData.schema.get(schemaNode) : undefined;
18012
18239
  };
18013
18240
  function getNodeAttr(node, attr) {
18014
18241
  var _getSchemaVal;
18015
18242
  return node ? (_getSchemaVal = getSchemaVal(node)) === null || _getSchemaVal === void 0 ? void 0 : _getSchemaVal[attr] : undefined;
18016
18243
  }
18017
18244
  /**
18018
- * 设置节点属性
18245
+ * 设置节点属性(原地更新 schema,避免每次 Object.assign 新对象)
18019
18246
  * @param node 指定节点
18020
18247
  * @param attr 节点属性
18021
18248
  * @param val 属性值
18022
18249
  * @returns
18023
18250
  */
18024
18251
  var setNodeAttr = function setNodeAttr(node, attr, val, id) {
18025
- if (!flatData.schema.has(node)) {
18252
+ var setOptions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
18253
+ var schemaNode = resolveSchemaNode(node);
18254
+ if (!schemaNode) {
18026
18255
  console.warn('node is not in schema, please check', id, node);
18027
18256
  return;
18028
18257
  }
18029
- flatData.schema.set(node, Object.assign({}, getSchemaVal(node), _defineProperty({}, attr, val)));
18258
+ var schemaVal = flatData.schema.get(schemaNode);
18259
+ if (!schemaVal) {
18260
+ return;
18261
+ }
18262
+ if (schemaVal[attr] === val) {
18263
+ return;
18264
+ }
18265
+ if (attr === NODE_ATTRIBUTES.IS_OPEN) {
18266
+ var prevOpen = !!schemaVal[attr];
18267
+ var nextOpen = !!val;
18268
+ if (prevOpen !== nextOpen) {
18269
+ flatData.openCount = (flatData.openCount || 0) + (nextOpen ? 1 : -1);
18270
+ }
18271
+ }
18272
+ schemaVal[attr] = val;
18273
+ if (attr === NODE_ATTRIBUTES.IS_CHECKED || attr === NODE_ATTRIBUTES.IS_INDETERMINATE) {
18274
+ var _flatData$syncChecked;
18275
+ (_flatData$syncChecked = flatData.syncCheckedState) === null || _flatData$syncChecked === void 0 || _flatData$syncChecked.call(flatData, node);
18276
+ }
18277
+ if (!setOptions.silent) {
18278
+ var _options$onSchemaChan, _flatData$notifySchem;
18279
+ (_options$onSchemaChan = options.onSchemaChange) === null || _options$onSchemaChan === void 0 || _options$onSchemaChan.call(options, node, attr, val);
18280
+ (_flatData$notifySchem = flatData.notifySchemaChange) === null || _flatData$notifySchem === void 0 || _flatData$notifySchem.call(flatData, node, attr, val);
18281
+ }
18030
18282
  };
18031
18283
  var getNodeById = function getNodeById(id) {
18032
18284
  var _flatData$nodeMap$get, _flatData$nodeMap;
@@ -18047,13 +18299,33 @@ var treeProps = {
18047
18299
  return getNodeAttr(node, NODE_ATTRIBUTES.PATH);
18048
18300
  };
18049
18301
  var getNodeId = function getNodeId(node) {
18050
- return getNodeAttr(node, NODE_ATTRIBUTES.UUID);
18302
+ var schemaId = getNodeAttr(node, NODE_ATTRIBUTES.UUID);
18303
+ if (schemaId !== undefined && schemaId !== null && schemaId !== '') {
18304
+ return schemaId;
18305
+ }
18306
+ if (!node) {
18307
+ return undefined;
18308
+ }
18309
+ if (props !== null && props !== void 0 && props.nodeKey && node[props.nodeKey] !== undefined && node[props.nodeKey] !== null) {
18310
+ return node[props.nodeKey];
18311
+ }
18312
+ return node[NODE_ATTRIBUTES.UUID];
18051
18313
  };
18052
18314
  var isNodeOpened = function isNodeOpened(node) {
18053
18315
  return !!getNodeAttr(node, NODE_ATTRIBUTES.IS_OPEN);
18054
18316
  };
18055
18317
  var hasChildNode = function hasChildNode(node) {
18056
- return !!getNodeAttr(node, NODE_ATTRIBUTES.HAS_CHILD);
18318
+ var _flatData$childMap$ge, _flatData$childMap, _rawNode$childKey, _node$childKey;
18319
+ if (!!getNodeAttr(node, NODE_ATTRIBUTES.HAS_CHILD)) {
18320
+ return true;
18321
+ }
18322
+ var schemaNode = resolveSchemaNode(node);
18323
+ if (schemaNode && ((_flatData$childMap$ge = (_flatData$childMap = flatData.childMap) === null || _flatData$childMap === void 0 || (_flatData$childMap = _flatData$childMap.get(schemaNode)) === null || _flatData$childMap === void 0 ? void 0 : _flatData$childMap.length) !== null && _flatData$childMap$ge !== void 0 ? _flatData$childMap$ge : 0) > 0) {
18324
+ return true;
18325
+ }
18326
+ var childKey = (props === null || props === void 0 ? void 0 : props.children) || 'children';
18327
+ var rawNode = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
18328
+ return !!(rawNode !== null && rawNode !== void 0 && (_rawNode$childKey = rawNode[childKey]) !== null && _rawNode$childKey !== void 0 && _rawNode$childKey.length || node !== null && node !== void 0 && (_node$childKey = node[childKey]) !== null && _node$childKey !== void 0 && _node$childKey.length);
18057
18329
  };
18058
18330
  var isNodeMatched = function isNodeMatched(node) {
18059
18331
  return !!getNodeAttr(node, NODE_ATTRIBUTES.IS_MATCH);
@@ -18094,10 +18366,18 @@ var treeProps = {
18094
18366
  return getNodeAttr(node, NODE_ATTRIBUTES.INDEX);
18095
18367
  };
18096
18368
  var isRootNode = function isRootNode(node) {
18369
+ var _flatData$rootNodes;
18097
18370
  if (typeof node === 'string') {
18098
18371
  return !!getNodeAttrById(node, NODE_ATTRIBUTES.IS_ROOT);
18099
18372
  }
18100
- return !!getNodeAttr(node, NODE_ATTRIBUTES.IS_ROOT);
18373
+ if (!!getNodeAttr(node, NODE_ATTRIBUTES.IS_ROOT)) {
18374
+ return true;
18375
+ }
18376
+ if (getNodeAttr(node, NODE_ATTRIBUTES.PARENT)) {
18377
+ return false;
18378
+ }
18379
+ var schemaNode = resolveSchemaNode(node);
18380
+ return !!schemaNode && !!((_flatData$rootNodes = flatData.rootNodes) !== null && _flatData$rootNodes !== void 0 && _flatData$rootNodes.includes(schemaNode));
18101
18381
  };
18102
18382
  var getNodeParentIdById = function getNodeParentIdById(id) {
18103
18383
  var target = getNodeById(id);
@@ -18117,11 +18397,11 @@ var treeProps = {
18117
18397
  * @returns
18118
18398
  */
18119
18399
  var isItemOpen = function isItemOpen(item) {
18120
- if (_typeof(item) === 'object') {
18400
+ if (_typeof(item) === 'object' && item !== null) {
18121
18401
  return isNodeOpened(item);
18122
18402
  }
18123
18403
  if (typeof item === 'string') {
18124
- return getNodeAttrById(item, NODE_ATTRIBUTES.IS_OPEN);
18404
+ return !!getNodeAttrById(item, NODE_ATTRIBUTES.IS_OPEN);
18125
18405
  }
18126
18406
  return false;
18127
18407
  };
@@ -18157,10 +18437,15 @@ var treeProps = {
18157
18437
  return target;
18158
18438
  };
18159
18439
  var getChildNodes = function getChildNodes(node) {
18160
- var _flatData$childMap$ge, _flatData$childMap;
18161
- return (_flatData$childMap$ge = (_flatData$childMap = flatData.childMap) === null || _flatData$childMap === void 0 ? void 0 : _flatData$childMap.get(node)) !== null && _flatData$childMap$ge !== void 0 ? _flatData$childMap$ge : flatData.data.filter(function (item) {
18162
- return getParentNode(item) === node;
18163
- });
18440
+ var _resolveSchemaNode, _flatData$childMap$ge2, _flatData$childMap2, _flatData$childMap3;
18441
+ var schemaNode = (_resolveSchemaNode = resolveSchemaNode(node)) !== null && _resolveSchemaNode !== void 0 ? _resolveSchemaNode : __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
18442
+ var mapped = (_flatData$childMap$ge2 = (_flatData$childMap2 = flatData.childMap) === null || _flatData$childMap2 === void 0 ? void 0 : _flatData$childMap2.get(schemaNode)) !== null && _flatData$childMap$ge2 !== void 0 ? _flatData$childMap$ge2 : (_flatData$childMap3 = flatData.childMap) === null || _flatData$childMap3 === void 0 ? void 0 : _flatData$childMap3.get(node);
18443
+ if (mapped) {
18444
+ return mapped;
18445
+ }
18446
+ // 禁止回退 flatData.data.filter(百万节点 O(N));直接读源数据 children
18447
+ var childKey = (props === null || props === void 0 ? void 0 : props.children) || 'children';
18448
+ return (schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode[childKey]) || (node === null || node === void 0 ? void 0 : node[childKey]) || [];
18164
18449
  };
18165
18450
  var getSourceNodeByUID = function getSourceNodeByUID(uid) {
18166
18451
  return getNodeById(uid);
@@ -18222,8 +18507,8 @@ var treeProps = {
18222
18507
  };
18223
18508
  };
18224
18509
  var getRootNodeList = function getRootNodeList() {
18225
- var _flatData$rootNodes;
18226
- return (_flatData$rootNodes = flatData.rootNodes) !== null && _flatData$rootNodes !== void 0 ? _flatData$rootNodes : flatData.data.filter(function (item) {
18510
+ var _flatData$rootNodes2;
18511
+ return (_flatData$rootNodes2 = flatData.rootNodes) !== null && _flatData$rootNodes2 !== void 0 ? _flatData$rootNodes2 : flatData.data.filter(function (item) {
18227
18512
  return isRootNode(item);
18228
18513
  });
18229
18514
  };
@@ -18291,6 +18576,7 @@ function _toConsumableArray(r) {
18291
18576
 
18292
18577
  ;// ../../packages/tree/src/util.ts
18293
18578
  /* unused harmony import specifier */ var util_defineProperty;
18579
+ /* unused harmony import specifier */ var util_typeof;
18294
18580
 
18295
18581
 
18296
18582
 
@@ -18328,6 +18614,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
18328
18614
  */
18329
18615
 
18330
18616
 
18617
+
18331
18618
  var DEFAULT_LEVLE_LINE = '1px dashed #c3cdd7';
18332
18619
  /**
18333
18620
  * 获取配置项可为Bool|String|Function类型,如果为Bool则配置默认值
@@ -18410,10 +18697,10 @@ var getTreeStyle = function getTreeStyle(item, props) {
18410
18697
  * @returns
18411
18698
  */
18412
18699
  var getNodeItemStyle = function getNodeItemStyle(item, props, flatData) {
18413
- var _schema$get;
18700
+ var _schema$get$NODE_ATTR, _schema$get, _schema$get2;
18414
18701
  var showTree = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
18415
18702
  var schema = flatData.schema;
18416
- var depth = (_schema$get = schema.get(item)) === null || _schema$get === void 0 ? void 0 : _schema$get[NODE_ATTRIBUTES.DEPTH];
18703
+ var depth = (_schema$get$NODE_ATTR = (_schema$get = schema.get(item)) === null || _schema$get === void 0 ? void 0 : _schema$get[NODE_ATTRIBUTES.DEPTH]) !== null && _schema$get$NODE_ATTR !== void 0 ? _schema$get$NODE_ATTR : (_schema$get2 = schema.get(__WEBPACK_EXTERNAL_MODULE_vue_toRaw__(item))) === null || _schema$get2 === void 0 ? void 0 : _schema$get2[NODE_ATTRIBUTES.DEPTH];
18417
18704
  if (showTree) {
18418
18705
  var args = ['node'];
18419
18706
  var levelLine = function levelLine() {
@@ -18432,16 +18719,23 @@ var getNodeItemStyle = function getNodeItemStyle(item, props, flatData) {
18432
18719
  * @param item
18433
18720
  * @returns
18434
18721
  */
18722
+ var getSchemaAttr = function getSchemaAttr(schema, item) {
18723
+ return schema.get(item) || schema.get(__WEBPACK_EXTERNAL_MODULE_vue_toRaw__(item)) || {};
18724
+ };
18435
18725
  var getNodeItemClass = function getNodeItemClass(item, schema, props) {
18436
18726
  var showTree = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
18727
+ var schemaAttr = getSchemaAttr(schema, item);
18437
18728
  // eslint-disable-next-line @typescript-eslint/naming-convention
18438
- var _ref = schema.get(item) || {},
18439
- __is_root = _ref.__is_root,
18440
- __is_open = _ref.__is_open;
18729
+ var __is_root = schemaAttr.__is_root,
18730
+ __is_open = schemaAttr.__is_open,
18731
+ __parent = schemaAttr.__parent,
18732
+ __depth = schemaAttr.__depth;
18733
+ // 根节点必须带 is-root,否则会命中子节点连线样式(左侧伪元素横线堆叠成“竖线”)
18734
+ var isRoot = __is_root !== null && __is_root !== void 0 ? __is_root : __parent == null && (__depth === 0 || __depth === undefined);
18441
18735
  var _usePrefix = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__(),
18442
18736
  resolveClassName = _usePrefix.resolveClassName;
18443
18737
  return _defineProperty(_defineProperty(_defineProperty(_defineProperty({
18444
- 'is-root': __is_root
18738
+ 'is-root': !!isRoot
18445
18739
  }, "".concat(resolveClassName('tree-node')), true), 'is-open', __is_open), 'is-virtual-render', props.virtualRender), 'level-line', props.levelLine && showTree);
18446
18740
  };
18447
18741
  /**
@@ -18451,10 +18745,10 @@ var getNodeItemClass = function getNodeItemClass(item, schema, props) {
18451
18745
  */
18452
18746
  var getNodeRowClass = function getNodeRowClass(item, schema) {
18453
18747
  // eslint-disable-next-line @typescript-eslint/naming-convention
18454
- var _ref3 = schema.get(item) || {},
18455
- __is_checked = _ref3.__is_checked,
18456
- __is_indeterminate = _ref3.__is_indeterminate,
18457
- __is_selected = _ref3.__is_selected;
18748
+ var _getSchemaAttr = getSchemaAttr(schema, item),
18749
+ __is_checked = _getSchemaAttr.__is_checked,
18750
+ __is_indeterminate = _getSchemaAttr.__is_indeterminate,
18751
+ __is_selected = _getSchemaAttr.__is_selected;
18458
18752
  var _usePrefix2 = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__(),
18459
18753
  resolveClassName = _usePrefix2.resolveClassName;
18460
18754
  return _defineProperty({
@@ -18482,7 +18776,7 @@ var _cloneTreeNode = function cloneTreeNode(node) {
18482
18776
  return _cloneTreeNode(item);
18483
18777
  });
18484
18778
  }
18485
- if (node && _typeof(node) === 'object') {
18779
+ if (node && util_typeof(node) === 'object') {
18486
18780
  return Object.keys(node).reduce(function (acc, key) {
18487
18781
  var value = node[key];
18488
18782
  acc[key] = Array.isArray(value) ? value.slice() : value;
@@ -18660,18 +18954,18 @@ var moveTreeNodeById = function moveTreeNodeById() {
18660
18954
  var nodeKey = arguments.length > 3 ? arguments[3] : undefined;
18661
18955
  var childKey = arguments.length > 4 ? arguments[4] : undefined;
18662
18956
  var options = arguments.length > 5 ? arguments[5] : undefined;
18663
- var nextTreeData = _cloneTreeData(treeData, childKey);
18664
- var removeResult = removeTreeNodeById(nextTreeData, nodeId, nodeKey, childKey);
18957
+ // 原地移动,避免百万节点全量 cloneTreeData
18958
+ var removeResult = removeTreeNodeById(treeData, nodeId, nodeKey, childKey);
18665
18959
  if (!removeResult.node) {
18666
18960
  return null;
18667
18961
  }
18668
- var insertResult = insertTreeNodeById(nextTreeData, removeResult.node, targetNodeId, nodeKey, childKey, options);
18962
+ var insertResult = insertTreeNodeById(treeData, removeResult.node, targetNodeId, nodeKey, childKey, options);
18669
18963
  if (!insertResult.targetNode) {
18670
18964
  return null;
18671
18965
  }
18672
18966
  return {
18673
18967
  trigger: 'drag',
18674
- data: nextTreeData,
18968
+ data: treeData,
18675
18969
  node: removeResult.node,
18676
18970
  targetNode: insertResult.targetNode,
18677
18971
  parentNode: insertResult.parentNode,
@@ -18782,7 +19076,8 @@ var isCascadeEnabled = function isCascadeEnabled(props) {
18782
19076
  }
18783
19077
  return Promise.resolve(resp);
18784
19078
  }
18785
- var nextTreeData = _cloneTreeData((_options$getTreeData = (_options$getTreeData2 = options.getTreeData) === null || _options$getTreeData2 === void 0 ? void 0 : _options$getTreeData2.call(options)) !== null && _options$getTreeData !== void 0 ? _options$getTreeData : props.data, props.children);
19079
+ // 原地写入子节点,避免百万节点全量 cloneTreeData
19080
+ var nextTreeData = (_options$getTreeData = (_options$getTreeData2 = options.getTreeData) === null || _options$getTreeData2 === void 0 ? void 0 : _options$getTreeData2.call(options)) !== null && _options$getTreeData !== void 0 ? _options$getTreeData : props.data;
18786
19081
  mutateTreeById(nextTreeData, nodeId, props.nodeKey || NODE_ATTRIBUTES.UUID, props.children, function (targetNode) {
18787
19082
  targetNode[NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_OPEN]] = true;
18788
19083
  targetNode[props.children] = nodeValue;
@@ -18866,6 +19161,7 @@ var isCascadeEnabled = function isCascadeEnabled(props) {
18866
19161
  ;// ../../packages/tree/src/use-node-action.tsx
18867
19162
 
18868
19163
 
19164
+
18869
19165
  var use_node_action_this = undefined;
18870
19166
  /*
18871
19167
  * Tencent is pleased to support the open source community by making
@@ -18901,13 +19197,13 @@ var use_node_action_this = undefined;
18901
19197
 
18902
19198
 
18903
19199
 
19200
+
18904
19201
  /* harmony default export */ const use_node_action = (function (props, ctx, flatData, _renderData, initOption) {
18905
19202
  // const checkedNodes = [];
18906
19203
  var selectedNodeId = props.selected;
18907
19204
  var _useNodeAttribute = use_node_attribute(flatData, props),
18908
19205
  setNodeAttr = _useNodeAttribute.setNodeAttr,
18909
19206
  setNodeAttrById = _useNodeAttribute.setNodeAttrById,
18910
- getNodePath = _useNodeAttribute.getNodePath,
18911
19207
  getSchemaVal = _useNodeAttribute.getSchemaVal,
18912
19208
  getNodeAttr = _useNodeAttribute.getNodeAttr,
18913
19209
  getNodeId = _useNodeAttribute.getNodeId,
@@ -18921,10 +19217,28 @@ var use_node_action_this = undefined;
18921
19217
  getParentNode = _useNodeAttribute.getParentNode,
18922
19218
  resolveScopedSlotParam = _useNodeAttribute.resolveScopedSlotParam,
18923
19219
  extendNodeAttr = _useNodeAttribute.extendNodeAttr,
18924
- extendNodeScopedData = _useNodeAttribute.extendNodeScopedData;
19220
+ extendNodeScopedData = _useNodeAttribute.extendNodeScopedData,
19221
+ getRootNodeList = _useNodeAttribute.getRootNodeList;
18925
19222
  var _usePrefix = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__(),
18926
19223
  resolveClassName = _usePrefix.resolveClassName;
18927
- var registerNextLoop = initOption.registerNextLoop;
19224
+ var registerNextLoop = initOption.registerNextLoop,
19225
+ syncNodeOpenState = initOption.syncNodeOpenState,
19226
+ scheduleUiRefresh = initOption.scheduleUiRefresh;
19227
+ var _useCheckedState = use_checked_state(flatData, {
19228
+ getChildNodes: getChildNodes,
19229
+ getNodeAttr: getNodeAttr,
19230
+ getParentNode: getParentNode,
19231
+ getSchemaVal: getSchemaVal,
19232
+ isRootNode: isRootNode
19233
+ }),
19234
+ setNodeCheckedState = _useCheckedState.setNodeCheckedState,
19235
+ setDescendantChecked = _useCheckedState.setDescendantChecked,
19236
+ forEachDescendant = _useCheckedState.forEachDescendant,
19237
+ updateParentChecked = _useCheckedState.updateParentChecked,
19238
+ getCheckedEmitPayload = _useCheckedState.getCheckedEmitPayload,
19239
+ rebuildCheckedSetsFromList = _useCheckedState.rebuildCheckedSetsFromList,
19240
+ clearAllCheckedState = _useCheckedState.clearAllCheckedState,
19241
+ isNodeIndeterminate = _useCheckedState.isNodeIndeterminate;
18928
19242
  var _useNodeAsync = use_node_async(props, flatData, ctx, initOption),
18929
19243
  asyncNodeClick = _useNodeAsync.asyncNodeClick,
18930
19244
  deepAutoOpen = _useNodeAsync.deepAutoOpen;
@@ -19025,32 +19339,20 @@ var use_node_action_this = undefined;
19025
19339
  }
19026
19340
  return null;
19027
19341
  };
19028
- var _updateParentChecked = function updateParentChecked(item, isChecked) {
19029
- var parent = getParentNode(item);
19030
- if (!parent) {
19031
- return;
19032
- }
19033
- var isNeedChecked = isChecked ? isChecked : (getChildNodes(parent) || []).some(function (node) {
19034
- return isNodeChecked(node);
19035
- });
19036
- setNodeAttr(parent, NODE_ATTRIBUTES.IS_CHECKED, isNeedChecked);
19037
- setNodeAttr(parent, NODE_ATTRIBUTES.IS_INDETERMINATE, (getChildNodes(parent) || []).some(function (node) {
19038
- return !isNodeChecked(node) || isIndeterminate(node);
19039
- }));
19040
- if (!isRootNode(parent)) {
19041
- _updateParentChecked(parent, isChecked);
19042
- }
19043
- };
19044
- var _deepUpdateChildNode = function deepUpdateChildNode(node, attr, value) {
19045
- getChildNodes(node).forEach(function (chid) {
19342
+ var deepUpdateChildNode = function deepUpdateChildNode(node, attr, value) {
19343
+ // 按 DFS 连续区间扫描后代,避免递归 forEach
19344
+ forEachDescendant(node, function (chid) {
19046
19345
  if (Array.isArray(attr)) {
19047
19346
  attr.forEach(function (val, index) {
19048
- setNodeAttr(chid, val, value[index]);
19347
+ setNodeAttr(chid, val, value[index], undefined, {
19348
+ silent: true
19349
+ });
19049
19350
  });
19050
19351
  } else {
19051
- setNodeAttr(chid, attr, value);
19352
+ setNodeAttr(chid, attr, value, undefined, {
19353
+ silent: true
19354
+ });
19052
19355
  }
19053
- _deepUpdateChildNode(chid, attr, value);
19054
19356
  });
19055
19357
  };
19056
19358
  var isRemoteFnExec = function isRemoteFnExec(event) {
@@ -19061,27 +19363,40 @@ var use_node_action_this = undefined;
19061
19363
  }
19062
19364
  return true;
19063
19365
  };
19366
+ var emitCheckedChange = function emitCheckedChange() {
19367
+ // 先让勾选 UI 刷新,再异步抛出列表,避免百万级 Array.from 阻塞交互
19368
+ __WEBPACK_EXTERNAL_MODULE_vue_nextTick__(function () {
19369
+ var _getCheckedEmitPayloa = getCheckedEmitPayload(),
19370
+ _getCheckedEmitPayloa2 = _slicedToArray(_getCheckedEmitPayloa, 2),
19371
+ checkedNodes = _getCheckedEmitPayloa2[0],
19372
+ indeterminateNodes = _getCheckedEmitPayloa2[1];
19373
+ ctx.emit(EVENTS.NODE_CHECKED, checkedNodes, indeterminateNodes);
19374
+ });
19375
+ };
19376
+ var applyCheckedChange = function applyCheckedChange(item, value) {
19377
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
19378
+ var checked = !!value;
19379
+ setNodeCheckedState(item, checked, false);
19380
+ if (isCascadeEnabled(props)) {
19381
+ setDescendantChecked(item, checked);
19382
+ updateParentChecked(item);
19383
+ }
19384
+ if (options.refresh !== false) {
19385
+ scheduleUiRefresh === null || scheduleUiRefresh === void 0 || scheduleUiRefresh();
19386
+ }
19387
+ if (options.emitEvent !== false) {
19388
+ emitCheckedChange();
19389
+ }
19390
+ };
19064
19391
  var handleNodeItemCheckboxChange = function handleNodeItemCheckboxChange(item, value, event) {
19065
19392
  event === null || event === void 0 || event.preventDefault();
19066
19393
  event === null || event === void 0 || event.stopImmediatePropagation();
19067
19394
  event === null || event === void 0 || event.stopPropagation();
19068
- setNodeAttr(item, NODE_ATTRIBUTES.IS_CHECKED, !!value);
19069
- if (value) {
19070
- setNodeAttr(item, NODE_ATTRIBUTES.IS_INDETERMINATE, false);
19071
- }
19072
- if (props.checkStrictly) {
19073
- _deepUpdateChildNode(item, [NODE_ATTRIBUTES.IS_CHECKED, NODE_ATTRIBUTES.IS_INDETERMINATE], [!!value, false]);
19074
- _updateParentChecked(item, value);
19075
- }
19076
- ctx.emit(EVENTS.NODE_CHECKED, flatData.data.filter(function (t) {
19077
- return isNodeChecked(t);
19078
- }), flatData.data.filter(function (t) {
19079
- return isIndeterminate(t);
19080
- }));
19395
+ applyCheckedChange(item, value);
19081
19396
  handleNodeContentClick(item, event, 'checked');
19082
19397
  };
19083
19398
  var isIndeterminate = function isIndeterminate(item) {
19084
- return isNodeChecked(item) && getNodeAttr(item, NODE_ATTRIBUTES.IS_INDETERMINATE);
19399
+ return isNodeIndeterminate(item);
19085
19400
  };
19086
19401
  var getCheckboxRender = function getCheckboxRender(item) {
19087
19402
  if (!showCheckbox(props, extendNodeScopedData(item))) {
@@ -19110,14 +19425,15 @@ var use_node_action_this = undefined;
19110
19425
  var e = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
19111
19426
  var fireEmit = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
19112
19427
  var newVal = isOpen === null ? !isItemOpen(item) : !!isOpen;
19428
+ setNodeAttr(item, NODE_ATTRIBUTES.IS_OPEN, newVal, undefined, {
19429
+ silent: true
19430
+ });
19113
19431
  /**
19114
- * 在收起节点时需要重置当前节点的所有叶子节点状态为 __isOpen = false
19115
- * 如果是需要点击当前节点展开所有叶子节点此处也可以打开
19432
+ * 增量维护可见列表:
19433
+ * - 展开:插入子节点
19434
+ * - 收起:移除可见后代,并仅重置可见区间内的 IS_OPEN(不再扫 flat 全量子树)
19116
19435
  */
19117
- if (!newVal) {
19118
- _deepUpdateChildNode(item, NODE_ATTRIBUTES.IS_OPEN, newVal);
19119
- }
19120
- setNodeAttr(item, NODE_ATTRIBUTES.IS_OPEN, newVal);
19436
+ syncNodeOpenState === null || syncNodeOpenState === void 0 || syncNodeOpenState(item, newVal);
19121
19437
  if (fireEmit) {
19122
19438
  var emitEvent = isItemOpen(item) ? EVENTS.NODE_EXPAND : EVENTS.NODE_COLLAPSE;
19123
19439
  ctx.emit(emitEvent, item, resolveScopedSlotParam(item), getSchemaVal(item), e);
@@ -19149,7 +19465,24 @@ var use_node_action_this = undefined;
19149
19465
  var setOpen = function setOpen(item) {
19150
19466
  var isOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19151
19467
  var autoOpenParents = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19152
- _setNodeAttribute(item, NODE_ATTRIBUTES.IS_OPEN, isOpen, autoOpenParents && isOpen);
19468
+ var resolvedItem = resolveNodeItem(item);
19469
+ if (resolvedItem[NODE_ATTRIBUTES.IS_NULL]) {
19470
+ return;
19471
+ }
19472
+ if (autoOpenParents && isOpen && !isRootNode(resolvedItem)) {
19473
+ var parents = [];
19474
+ var parent = getParentNode(resolvedItem);
19475
+ while (parent) {
19476
+ parents.unshift(parent);
19477
+ parent = getParentNode(parent);
19478
+ }
19479
+ parents.forEach(function (node) {
19480
+ if (!isItemOpen(node)) {
19481
+ setNodeOpened(node, true, null, false);
19482
+ }
19483
+ });
19484
+ }
19485
+ setNodeOpened(resolvedItem, isOpen, null, false);
19153
19486
  };
19154
19487
  /**
19155
19488
  * 递归处理当前节点以及父级节点属性值
@@ -19249,11 +19582,11 @@ var use_node_action_this = undefined;
19249
19582
  }
19250
19583
  var resolvedItem = resolveNodeItem(nodeList[0]);
19251
19584
  if (typeof resolvedItem === 'number' || typeof resolvedItem === 'string' || _typeof(resolvedItem) === 'symbol') {
19252
- var _flatData$data$find;
19253
- var nodeId = resolvedItem;
19254
- resolvedItem = (_flatData$data$find = flatData.data.find(function (item) {
19255
- return getNodeId(item) === nodeId;
19256
- })) !== null && _flatData$data$find !== void 0 ? _flatData$data$find : _defineProperty({}, NODE_ATTRIBUTES.IS_NULL, true);
19585
+ var _ref, _flatData$nodeMap$get, _flatData$nodeMap;
19586
+ var nodeId = String(resolvedItem);
19587
+ resolvedItem = (_ref = (_flatData$nodeMap$get = (_flatData$nodeMap = flatData.nodeMap) === null || _flatData$nodeMap === void 0 ? void 0 : _flatData$nodeMap.get(nodeId)) !== null && _flatData$nodeMap$get !== void 0 ? _flatData$nodeMap$get : flatData.data.find(function (item) {
19588
+ return "".concat(getNodeId(item)) === nodeId;
19589
+ })) !== null && _ref !== void 0 ? _ref : _defineProperty({}, NODE_ATTRIBUTES.IS_NULL, true);
19257
19590
  }
19258
19591
  if (resolvedItem[NODE_ATTRIBUTES.IS_NULL]) {
19259
19592
  return;
@@ -19358,23 +19691,30 @@ var use_node_action_this = undefined;
19358
19691
  * @returns
19359
19692
  */
19360
19693
  var filterNextNode = function filterNextNode(depth, node) {
19694
+ var _getNodeAttr;
19361
19695
  if (isRootNode(node)) {
19362
19696
  return false;
19363
19697
  }
19364
- var nodepath = getNodePath(node);
19365
- var paths = "".concat(nodepath).split('-').slice(0, depth + 1);
19366
- var currentPath = paths.join('-');
19367
- // 如果是判定当前节点,则必须要有一条线
19368
- if (currentPath === nodepath) {
19698
+ var nodeDepth = (_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : 0;
19699
+ // 当前节点所在 depth:必有连线
19700
+ if (depth === nodeDepth) {
19369
19701
  return true;
19370
19702
  }
19371
- var lastLevel = paths.pop();
19372
- var nextLevel = parseInt(lastLevel, 10);
19373
- paths.push("".concat(nextLevel + 1));
19374
- var nextNodePath = paths.join('-');
19375
- return flatData.data.some(function (val) {
19376
- return getNodePath(val) === nextNodePath;
19377
- });
19703
+ if (depth > nodeDepth) {
19704
+ return false;
19705
+ }
19706
+ // 取 depth 层祖先,判断其是否存在下一个兄弟节点 —— O(depth) 替代全表 some
19707
+ var ancestor = node;
19708
+ for (var i = nodeDepth; i > depth; i--) {
19709
+ ancestor = getParentNode(ancestor);
19710
+ if (!ancestor) {
19711
+ return false;
19712
+ }
19713
+ }
19714
+ var parent = getParentNode(ancestor);
19715
+ var siblings = parent ? getChildNodes(parent) : getRootNodeList();
19716
+ var idx = siblings.indexOf(ancestor);
19717
+ return idx >= 0 && idx < siblings.length - 1;
19378
19718
  };
19379
19719
  /**
19380
19720
  * 获取层级连线
@@ -19382,16 +19722,20 @@ var use_node_action_this = undefined;
19382
19722
  * @returns
19383
19723
  */
19384
19724
  var getVirtualLines = function getVirtualLines(node) {
19385
- var _getNodeAttr;
19725
+ var _getNodeAttr2;
19386
19726
  if (!props.levelLine) {
19387
19727
  return null;
19388
19728
  }
19729
+ // 根节点不渲染层级连线(与基础用法一致)
19730
+ if (isRootNode(node)) {
19731
+ return null;
19732
+ }
19389
19733
  var getNodeLineStyle = function getNodeLineStyle(dpth) {
19390
19734
  return {
19391
19735
  '--depth': dpth
19392
19736
  };
19393
19737
  };
19394
- var maxDeep = ((_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : 0) + 1;
19738
+ var maxDeep = ((_getNodeAttr2 = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr2 !== void 0 ? _getNodeAttr2 : 0) + 1;
19395
19739
  return new Array(maxDeep).fill('').map(function (_, index) {
19396
19740
  return index;
19397
19741
  }).filter(function (depth) {
@@ -19470,8 +19814,12 @@ var use_node_action_this = undefined;
19470
19814
  setOpen: setOpen,
19471
19815
  setNodeAttribute: _setNodeAttribute,
19472
19816
  isIndeterminate: isIndeterminate,
19473
- deepUpdateChildNode: _deepUpdateChildNode,
19474
- updateParentChecked: _updateParentChecked
19817
+ deepUpdateChildNode: deepUpdateChildNode,
19818
+ updateParentChecked: updateParentChecked,
19819
+ applyCheckedChange: applyCheckedChange,
19820
+ emitCheckedChange: emitCheckedChange,
19821
+ rebuildCheckedSetsFromList: rebuildCheckedSetsFromList,
19822
+ clearAllCheckedState: clearAllCheckedState
19475
19823
  };
19476
19824
  });
19477
19825
  ;// ../../packages/tree/src/use-node-drag.tsx
@@ -20043,6 +20391,16 @@ var use_tree_init_this = undefined;
20043
20391
 
20044
20392
 
20045
20393
 
20394
+ var toRawStore = function toRawStore(value) {
20395
+ return __WEBPACK_EXTERNAL_MODULE_vue_markRaw__(value);
20396
+ };
20397
+ var SOURCE_IS_OPEN = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_OPEN];
20398
+ var SOURCE_IS_CHECKED = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_CHECKED];
20399
+ var SOURCE_IS_SELECTED = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_SELECTED];
20400
+ var SOURCE_IS_ASYNC = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_ASYNC];
20401
+ var SOURCE_IS_MATCH = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_MATCH];
20402
+ var SOURCE_IS_CACHED = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_CACHED];
20403
+ var SOURCE_IS_LOADING = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_LOADING];
20046
20404
  /* harmony default export */ const use_tree_init = (function (props) {
20047
20405
  var _props$async3;
20048
20406
  /**
@@ -20059,6 +20417,7 @@ var use_tree_init_this = undefined;
20059
20417
  var checkedList = [];
20060
20418
  var outputData = [];
20061
20419
  var order = 0;
20420
+ var openCount = 0;
20062
20421
  var treeSchema = new WeakMap();
20063
20422
  var nodeMap = new Map();
20064
20423
  var childMap = new WeakMap();
@@ -20082,111 +20441,59 @@ var use_tree_init_this = undefined;
20082
20441
  if (target[attrName] === attrValue) {
20083
20442
  return;
20084
20443
  }
20085
- Object.assign(target, _defineProperty({}, attrName, attrValue));
20444
+ if (attrName === NODE_ATTRIBUTES.IS_OPEN) {
20445
+ var prevOpen = !!target[attrName];
20446
+ var nextOpen = !!attrValue;
20447
+ if (prevOpen !== nextOpen) {
20448
+ openCount += nextOpen ? 1 : -1;
20449
+ }
20450
+ }
20451
+ target[attrName] = attrValue;
20086
20452
  loopUpdateNodeAttr(target[NODE_ATTRIBUTES.PARENT], attrName, attrValue, callFn);
20087
20453
  }
20088
20454
  }
20089
20455
  }
20090
20456
  }
20457
+ var nodeKey = props.nodeKey;
20458
+ var expandAll = !!props.expandAll;
20459
+ var autoOpenParentNode = !!props.autoOpenParentNode;
20460
+ var selectable = !!props.selectable;
20461
+ var hasCheckedProp = Array.isArray(props.checked) && props.checked.length > 0;
20462
+ var hasSelectedProp = props.selected !== undefined && props.selected !== null;
20463
+ var checkboxEnabled = props.showCheckbox !== false && !!props.showCheckbox;
20464
+ var useCache = !!cachedSchema;
20091
20465
  function getUid(item) {
20092
- var uid = null;
20093
- if (typeof props.nodeKey === 'string') {
20094
- uid = item[props.nodeKey] || esm_browser_v4();
20466
+ if (typeof nodeKey === 'string') {
20467
+ var keyVal = item[nodeKey];
20468
+ if (keyVal !== undefined && keyVal !== null && keyVal !== '') {
20469
+ return keyVal;
20470
+ }
20095
20471
  }
20096
- return uid || item[NODE_ATTRIBUTES.UUID] || esm_browser_v4();
20472
+ return item[NODE_ATTRIBUTES.UUID] || esm_browser_v4();
20097
20473
  }
20098
- /**
20099
- * 默认设置
20100
- * 如果传入数据没有设置相关属性值
20101
- * 这里会自动生成
20102
- */
20103
- var cachedDefaultVal = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, NODE_ATTRIBUTES.IS_OPEN, function () {
20104
- return !!props.expandAll;
20105
- }), NODE_ATTRIBUTES.IS_CHECKED, function () {
20106
- return false;
20107
- }), NODE_ATTRIBUTES.IS_MATCH, function () {
20108
- return false;
20109
- }), NODE_ATTRIBUTES.IS_SELECTED, function (node, uuid) {
20110
- return _resolvePropIsMatched(node, props.selected, uuid);
20111
- }), NODE_ATTRIBUTES.IS_CACHED, function () {
20112
- return false;
20113
- }), NODE_ATTRIBUTES.IS_ASYNC, function () {
20114
- return null;
20115
- }), NODE_ATTRIBUTES.IS_LOADING, function () {
20116
- return false;
20117
- });
20118
- /**
20119
- * 根据Props设置和已缓存数据解析当前节点对应属性值
20120
- * @param uuid 当前节点id
20121
- * @param node 当前节点
20122
- * @param cachedAttr 当前节点属性名称
20123
- * @param defVal 默认值
20124
- */
20125
- function getCachedTreeNodeAttr(uuid, node, cachedAttr) {
20126
- var _cachedSchema$get;
20127
- var defVal = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined;
20128
- var defaultValue = defVal;
20129
- // 设置默认值
20130
- if (defVal === undefined && typeof cachedDefaultVal[cachedAttr] === 'function') {
20131
- defaultValue = cachedDefaultVal[cachedAttr](node, uuid);
20132
- }
20133
- // 通过映射配置,检查当前数据是否设置相关属性值
20134
- // 如果传入数据设置了相关属性值,则返回传入数据设置值
20135
- var sourceAttr = NODE_SOURCE_ATTRS[cachedAttr];
20136
- if (Object.prototype.hasOwnProperty.call(node, sourceAttr)) {
20474
+ function resolveAttr(node, sourceAttr, cachedAttr, defaultValue) {
20475
+ if (sourceAttr in node) {
20137
20476
  return node[sourceAttr];
20138
20477
  }
20139
- // 判断是缓存数据是否已经处理过此属性
20140
- // 在数据改变时,如果缓存数据没有处理过此属性,则返回默认值
20141
- var cached = (_cachedSchema$get = cachedSchema === null || cachedSchema === void 0 ? void 0 : cachedSchema.get(node)) !== null && _cachedSchema$get !== void 0 ? _cachedSchema$get : undefined;
20142
- var result = undefined;
20143
- if (cached) {
20144
- result = cached[cachedAttr];
20145
- }
20146
- // 处理默认值
20147
- if (result === undefined || result === null) {
20148
- result = defaultValue;
20149
- }
20150
- return result;
20151
- }
20152
- /**
20153
- * 当前节点是否是选中状态
20154
- * @param uuid 当前节点id
20155
- * @param node 当前节点
20156
- * @returns
20157
- */
20158
- function isCachedTreeNodeSelected(uuid, node) {
20159
- if (!props.selectable) {
20160
- return false;
20161
- }
20162
- var isMatch = _resolvePropIsMatched(node, props.selected, uuid);
20163
- return getCachedTreeNodeAttr(uuid, node, NODE_ATTRIBUTES.IS_SELECTED, isMatch);
20164
- }
20165
- function isNodeOpend(uuid, item, parent) {
20166
- var _treeSchema$get;
20167
- var isItemOpened = getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_OPEN);
20168
- var isParentOpened = treeSchema.has(parent) ? (_treeSchema$get = treeSchema.get(parent)) === null || _treeSchema$get === void 0 ? void 0 : _treeSchema$get[NODE_ATTRIBUTES.IS_OPEN] : true;
20169
- return isItemOpened && isParentOpened;
20170
- }
20171
- function isCheckedNode(node, uuid, attributes) {
20172
- var isChecked = showCheckbox(props, {
20173
- data: node,
20174
- attributes: attributes
20175
- });
20176
- if (!isChecked) {
20177
- return false;
20478
+ if (useCache) {
20479
+ var cached = cachedSchema.get(node);
20480
+ if (cached) {
20481
+ var cachedVal = cached[cachedAttr];
20482
+ if (cachedVal !== undefined && cachedVal !== null) {
20483
+ return cachedVal;
20484
+ }
20485
+ }
20178
20486
  }
20179
- var isMatch = _resolvePropIsMatched(node, props.checked, uuid);
20180
- return getCachedTreeNodeAttr(uuid, node, NODE_ATTRIBUTES.IS_CHECKED, isMatch);
20487
+ return defaultValue;
20181
20488
  }
20182
20489
  function validateIsOpenLoopFn(targetAttr) {
20183
20490
  var _targetAttr$NODE_ATTR;
20184
20491
  return !((_targetAttr$NODE_ATTR = targetAttr === null || targetAttr === void 0 ? void 0 : targetAttr[NODE_ATTRIBUTES.IS_OPEN]) !== null && _targetAttr$NODE_ATTR !== void 0 ? _targetAttr$NODE_ATTR : false);
20185
20492
  }
20186
20493
  function loopUpdateCheckedEvent(target, _attrName, _attrValue, node) {
20187
- target[NODE_ATTRIBUTES.IS_INDETERMINATE] = (node[props.children] || []).some(function (child) {
20188
- var _treeSchema$get$NODE_, _treeSchema$get2;
20189
- return !((_treeSchema$get$NODE_ = (_treeSchema$get2 = treeSchema.get(child)) === null || _treeSchema$get2 === void 0 ? void 0 : _treeSchema$get2[NODE_ATTRIBUTES.IS_CHECKED]) !== null && _treeSchema$get$NODE_ !== void 0 ? _treeSchema$get$NODE_ : false);
20494
+ target[NODE_ATTRIBUTES.IS_INDETERMINATE] = (node[children] || []).some(function (child) {
20495
+ var _treeSchema$get$NODE_, _treeSchema$get;
20496
+ return !((_treeSchema$get$NODE_ = (_treeSchema$get = treeSchema.get(child)) === null || _treeSchema$get === void 0 ? void 0 : _treeSchema$get[NODE_ATTRIBUTES.IS_CHECKED]) !== null && _treeSchema$get$NODE_ !== void 0 ? _treeSchema$get$NODE_ : false);
20190
20497
  });
20191
20498
  return true;
20192
20499
  }
@@ -20196,69 +20503,85 @@ var use_tree_init_this = undefined;
20196
20503
  var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
20197
20504
  var arrLength = array.length;
20198
20505
  for (var i = 0; i < arrLength; i++) {
20506
+ var _attributes;
20199
20507
  var item = array[i];
20508
+ if (item === null || item === undefined) {
20509
+ continue;
20510
+ }
20200
20511
  if (Array.isArray(item)) {
20201
20512
  flatten(item, depth, parent, path);
20513
+ continue;
20514
+ }
20515
+ if (_typeof(item) !== 'object') {
20516
+ continue;
20517
+ }
20518
+ // 统一用 raw 作为 WeakMap key,避免 Proxy/raw 不一致导致 schema 全量失效
20519
+ var rawItem = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(item);
20520
+ var currentPath = path !== null ? "".concat(path, "-").concat(i) : "".concat(i);
20521
+ var uuid = "".concat(getUid(rawItem));
20522
+ var childList = rawItem[children];
20523
+ var hasChildren = !!(childList && childList.length);
20524
+ if (!nodeKey) {
20525
+ rawItem[NODE_ATTRIBUTES.UUID] = uuid;
20526
+ }
20527
+ var isOpened = !!resolveAttr(rawItem, SOURCE_IS_OPEN, NODE_ATTRIBUTES.IS_OPEN, expandAll);
20528
+ if (autoOpenParentNode) {
20529
+ if (isOpened && parent) {
20530
+ loopUpdateNodeAttr(parent, NODE_ATTRIBUTES.IS_OPEN, true, validateIsOpenLoopFn);
20531
+ }
20532
+ } else if (parent) {
20533
+ var _treeSchema$get2;
20534
+ var parentOpened = !!((_treeSchema$get2 = treeSchema.get(parent)) !== null && _treeSchema$get2 !== void 0 && _treeSchema$get2[NODE_ATTRIBUTES.IS_OPEN]);
20535
+ isOpened = isOpened && parentOpened;
20536
+ }
20537
+ var isSelected = false;
20538
+ if (selectable) {
20539
+ var selectedDefault = hasSelectedProp ? _resolvePropIsMatched(rawItem, props.selected, uuid) : false;
20540
+ isSelected = !!resolveAttr(rawItem, SOURCE_IS_SELECTED, NODE_ATTRIBUTES.IS_SELECTED, selectedDefault);
20541
+ }
20542
+ var isChecked = false;
20543
+ if (checkboxEnabled) {
20544
+ var canCheck = showCheckbox(props, {
20545
+ data: rawItem
20546
+ });
20547
+ if (canCheck) {
20548
+ var checkedDefault = hasCheckedProp ? _resolvePropIsMatched(rawItem, props.checked, uuid) : false;
20549
+ isChecked = !!resolveAttr(rawItem, SOURCE_IS_CHECKED, NODE_ATTRIBUTES.IS_CHECKED, checkedDefault);
20550
+ }
20551
+ }
20552
+ 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, isSelected), NODE_ATTRIBUTES.IS_MATCH, !!resolveAttr(rawItem, SOURCE_IS_MATCH, NODE_ATTRIBUTES.IS_MATCH, false)), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_attributes, NODE_ATTRIBUTES.IS_OPEN, isOpened), NODE_ATTRIBUTES.IS_CHECKED, isChecked), NODE_ATTRIBUTES.IS_CACHED, !!resolveAttr(rawItem, SOURCE_IS_CACHED, NODE_ATTRIBUTES.IS_CACHED, false)), NODE_ATTRIBUTES.IS_ASYNC, resolveAttr(rawItem, SOURCE_IS_ASYNC, NODE_ATTRIBUTES.IS_ASYNC, null)), NODE_ATTRIBUTES.IS_LOADING, !!resolveAttr(rawItem, SOURCE_IS_LOADING, NODE_ATTRIBUTES.IS_LOADING, false)), NODE_ATTRIBUTES.IS_INDETERMINATE, false));
20553
+ if (isChecked) {
20554
+ checkedList.push(rawItem);
20555
+ }
20556
+ if (isOpened) {
20557
+ openCount += 1;
20558
+ }
20559
+ treeSchema.set(rawItem, attributes);
20560
+ nodeMap.set(uuid, rawItem);
20561
+ if (parent === null) {
20562
+ rootNodes.push(rawItem);
20202
20563
  } else {
20203
- if (_typeof(item) === 'object' && item !== null) {
20204
- var _attributes;
20205
- var currentPath = path !== null ? "".concat(path, "-").concat(i) : "".concat(i);
20206
- var uuid = "".concat(getUid(item));
20207
- var hasChildren = !!(item[children] || []).length;
20208
- if (!props.nodeKey) {
20209
- item[NODE_ATTRIBUTES.UUID] = uuid;
20210
- }
20211
- if (nodeMap.has(uuid)) {
20212
- console.warn("[bk-tree] duplicate node key \"".concat(uuid, "\" found, please check nodeKey."));
20213
- }
20214
- /**
20215
- * 当前节点设置是否为展开状态
20216
- */
20217
- var isOpened = getCachedTreeNodeAttr(uuid, item, NODE_ATTRIBUTES.IS_OPEN);
20218
- /**
20219
- * 如果初始化发现当前属性为展开或者选中 & 设置了 autoOpenParentNode = true
20220
- * 此时需要设置当前节点的所有父级节点都为展开状态
20221
- */
20222
- if (props.autoOpenParentNode) {
20223
- isOpened && loopUpdateNodeAttr(parent, NODE_ATTRIBUTES.IS_OPEN, true, validateIsOpenLoopFn);
20224
- } else {
20225
- /**
20226
- * 如果没有设置自动展开所有父级
20227
- * 此时需要判定当前节点是否可以展开状态需要同时判定父级是否展开
20228
- * 如果父级不是展开状态,此节点不能展示,应该也是关闭状态,只有当父级展开时,此节点才为展开状态
20229
- */
20230
- isOpened = isNodeOpend(uuid, item, parent);
20231
- }
20232
- 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));
20233
- attributes[NODE_ATTRIBUTES.IS_CHECKED] = isCheckedNode(item, uuid, attributes);
20234
- if (attributes[NODE_ATTRIBUTES.IS_CHECKED]) {
20235
- checkedList.push(item);
20236
- }
20237
- treeSchema.set(item, attributes);
20238
- nodeMap.set(uuid, item);
20239
- if (parent === null) {
20240
- rootNodes.push(item);
20241
- } else {
20242
- var siblings = childMap.get(parent) || [];
20243
- siblings.push(item);
20244
- childMap.set(parent, siblings);
20245
- }
20246
- outputData.push(item);
20247
- order += 1;
20248
- if (Object.prototype.hasOwnProperty.call(item, children)) {
20249
- flatten(item[children] || [], depth + 1, item, currentPath);
20250
- }
20564
+ var siblings = childMap.get(parent);
20565
+ if (!siblings) {
20566
+ siblings = [];
20567
+ childMap.set(parent, siblings);
20251
20568
  }
20569
+ siblings.push(rawItem);
20570
+ }
20571
+ outputData.push(rawItem);
20572
+ order += 1;
20573
+ if (hasChildren) {
20574
+ flatten(childList, depth + 1, rawItem, currentPath);
20252
20575
  }
20253
20576
  }
20254
20577
  }
20255
20578
  flatten(treeData !== null && treeData !== void 0 ? treeData : data);
20256
- if (props.showCheckbox !== false && props.checkStrictly) {
20257
- checkedList === null || checkedList === void 0 || checkedList.forEach(function (value) {
20579
+ if (checkboxEnabled && props.checkStrictly) {
20580
+ checkedList.forEach(function (value) {
20258
20581
  loopUpdateNodeAttr(value, NODE_ATTRIBUTES.IS_CHECKED, true, loopUpdateCheckedEvent);
20259
20582
  });
20260
20583
  }
20261
- return [outputData, treeSchema, nodeMap, childMap, rootNodes];
20584
+ return [outputData, treeSchema, nodeMap, childMap, rootNodes, openCount, checkedList];
20262
20585
  };
20263
20586
  var formatData = getFlatdata();
20264
20587
  var nextLoopEvents = new Map();
@@ -20266,14 +20589,17 @@ var use_tree_init_this = undefined;
20266
20589
  var afterSelectWatch = [];
20267
20590
  /**
20268
20591
  * 扁平化数据
20269
- * schema: 需要展示连线时,用于计算连线高度
20592
+ * shallowReactive:只跟踪 data/rootNodes 等字段替换,避免百万节点被深代理
20593
+ * schema/nodeMap/childMap 使用 markRaw,避免 WeakMap get/set 进入依赖收集
20270
20594
  */
20271
- var flatData = __WEBPACK_EXTERNAL_MODULE_vue_reactive__({
20595
+ var flatData = __WEBPACK_EXTERNAL_MODULE_vue_shallowReactive__({
20272
20596
  data: formatData[0],
20273
- schema: formatData[1],
20274
- nodeMap: formatData[2],
20275
- childMap: formatData[3],
20597
+ schema: toRawStore(formatData[1]),
20598
+ nodeMap: toRawStore(formatData[2]),
20599
+ childMap: toRawStore(formatData[3]),
20276
20600
  rootNodes: formatData[4],
20601
+ openCount: formatData[5] || 0,
20602
+ checkedList: formatData[6] || [],
20277
20603
  levelLineSchema: {}
20278
20604
  });
20279
20605
  var _useNodeAsync = use_node_async(props, flatData),
@@ -20344,30 +20670,39 @@ var use_tree_init_this = undefined;
20344
20670
  /**
20345
20671
  * 监听组件配置Data改变
20346
20672
  */
20673
+ var afterRebuildCallbacks = [];
20674
+ var onAfterRebuild = function onAfterRebuild(callback) {
20675
+ afterRebuildCallbacks.push(callback);
20676
+ };
20347
20677
  var rebuildData = function rebuildData(treeData) {
20348
20678
  var cachedSchema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : flatData.schema;
20349
- var formatData = getFlatdata(treeData, cachedSchema);
20350
- flatData.data = formatData[0];
20351
- flatData.schema = formatData[1];
20352
- flatData.nodeMap = formatData[2];
20353
- flatData.childMap = formatData[3];
20354
- flatData.rootNodes = formatData[4];
20679
+ var next = getFlatdata(treeData, cachedSchema);
20680
+ // 先替换 schema/maps,再替换 data,避免 data watcher 读到旧 schema
20681
+ flatData.schema = toRawStore(next[1]);
20682
+ flatData.nodeMap = toRawStore(next[2]);
20683
+ flatData.childMap = toRawStore(next[3]);
20684
+ flatData.rootNodes = next[4];
20685
+ flatData.openCount = next[5] || 0;
20686
+ flatData.checkedList = next[6] || [];
20687
+ flatData.data = next[0];
20688
+ afterRebuildCallbacks.forEach(function (callback) {
20689
+ return callback();
20690
+ });
20355
20691
  };
20692
+ // watchDataDeep=false(默认):仅监听 data 引用变化,大数据量友好
20693
+ // watchDataDeep=true:深度监听原地变更;百万节点下会明显变慢,仅建议小数据使用
20694
+ // 组件内部拖拽/异步仍走 onTreeDataChange → rebuildData
20356
20695
  __WEBPACK_EXTERNAL_MODULE_vue_watch__(function () {
20357
- return [props.data];
20696
+ return props.data;
20358
20697
  }, function (newData) {
20359
20698
  var _props$async, _props$async2;
20360
- rebuildData(newData[0], flatData.schema);
20699
+ rebuildData(newData, flatData.schema);
20361
20700
  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') {
20362
20701
  deepAutoOpen();
20363
20702
  }
20364
- /**
20365
- * 执行缓存下来的周期函数
20366
- * 保证data改变之后执行相关操作
20367
- */
20368
20703
  executeNextEvent();
20369
20704
  }, {
20370
- deep: true
20705
+ deep: !!props.watchDataDeep
20371
20706
  });
20372
20707
  if (props.selectable) {
20373
20708
  __WEBPACK_EXTERNAL_MODULE_vue_onMounted__(function () {
@@ -20406,9 +20741,226 @@ var use_tree_init_this = undefined;
20406
20741
  afterDataUpdate: afterDataUpdate,
20407
20742
  registerNextLoop: registerNextLoop,
20408
20743
  rebuildData: rebuildData,
20744
+ onAfterRebuild: onAfterRebuild,
20409
20745
  onSelected: onSelected
20410
20746
  };
20411
20747
  });
20748
+ ;// ../../packages/tree/src/use-visible-nodes.ts
20749
+ /*
20750
+ * Tencent is pleased to support the open source community by making
20751
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
20752
+ *
20753
+ * Copyright (C) 2025 Tencent. All rights reserved.
20754
+ *
20755
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) is licensed under the MIT License.
20756
+ *
20757
+ * License for 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition):
20758
+ *
20759
+ * ---------------------------------------------------
20760
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
20761
+ * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
20762
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
20763
+ * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
20764
+ *
20765
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
20766
+ * the Software.
20767
+ *
20768
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
20769
+ * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20770
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
20771
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20772
+ * IN THE SOFTWARE.
20773
+ */
20774
+
20775
+
20776
+ /**
20777
+ * 增量维护树的可见节点列表,避免每次展开都对全量 flatData 做 O(N) filter。
20778
+ * 展开/收起复杂度接近 O(受影响的可见子节点数),禁止回退到全表扫描。
20779
+ */
20780
+ /* harmony default export */ const use_visible_nodes = (function (flatData, helpers) {
20781
+ var checkNodeIsOpen = helpers.checkNodeIsOpen,
20782
+ getChildNodes = helpers.getChildNodes,
20783
+ getNodeAttr = helpers.getNodeAttr,
20784
+ getNodeOrder = helpers.getNodeOrder,
20785
+ getSchemaVal = helpers.getSchemaVal,
20786
+ isNodeOpened = helpers.isNodeOpened;
20787
+ var visibleNodes = __WEBPACK_EXTERNAL_MODULE_vue_shallowRef__([]);
20788
+ var uiVersion = __WEBPACK_EXTERNAL_MODULE_vue_shallowRef__(0);
20789
+ var uiFlushScheduled = false;
20790
+ var emitListChange = function emitListChange(next) {
20791
+ visibleNodes.value = next;
20792
+ };
20793
+ var scheduleUiRefresh = function scheduleUiRefresh() {
20794
+ if (uiFlushScheduled) {
20795
+ return;
20796
+ }
20797
+ uiFlushScheduled = true;
20798
+ __WEBPACK_EXTERNAL_MODULE_vue_nextTick__(function () {
20799
+ uiFlushScheduled = false;
20800
+ uiVersion.value += 1;
20801
+ });
20802
+ };
20803
+ var rebuildVisibleNodes = function rebuildVisibleNodes(filterFn) {
20804
+ var _flatData$rootNodes;
20805
+ if (!filterFn && (flatData.openCount || 0) <= 0 && (_flatData$rootNodes = flatData.rootNodes) !== null && _flatData$rootNodes !== void 0 && _flatData$rootNodes.length) {
20806
+ emitListChange(flatData.rootNodes.slice());
20807
+ return;
20808
+ }
20809
+ var predicate = filterFn !== null && filterFn !== void 0 ? filterFn : checkNodeIsOpen;
20810
+ var next = [];
20811
+ var data = flatData.data;
20812
+ for (var i = 0, len = data.length; i < len; i++) {
20813
+ var item = data[i];
20814
+ if (predicate(item)) {
20815
+ next.push(item);
20816
+ }
20817
+ }
20818
+ emitListChange(next);
20819
+ };
20820
+ var _collectOpenedBranch = function collectOpenedBranch(node, result) {
20821
+ var children = getChildNodes(node);
20822
+ for (var i = 0, len = children.length; i < len; i++) {
20823
+ var child = children[i];
20824
+ result.push(child);
20825
+ if (isNodeOpened(child)) {
20826
+ _collectOpenedBranch(child, result);
20827
+ }
20828
+ }
20829
+ };
20830
+ /** 仅在可见列表内线性查找,O(V),禁止回退扫 flat 全表 */
20831
+ var findVisibleIndexLinear = function findVisibleIndexLinear(node) {
20832
+ var list = visibleNodes.value;
20833
+ var rawNode = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
20834
+ for (var i = 0, len = list.length; i < len; i++) {
20835
+ var current = list[i];
20836
+ if (current === node || current === rawNode || __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(current) === rawNode) {
20837
+ return i;
20838
+ }
20839
+ }
20840
+ return -1;
20841
+ };
20842
+ /**
20843
+ * 按唯一 ORDER 二分定位,兼容 Proxy/raw 引用不一致。
20844
+ * 找不到时最多回退可见列表线性查找,不得 O(N) rebuild。
20845
+ */
20846
+ var findVisibleIndex = function findVisibleIndex(node) {
20847
+ var _getNodeOrder;
20848
+ var list = visibleNodes.value;
20849
+ if (!list.length) {
20850
+ return -1;
20851
+ }
20852
+ var rawNode = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
20853
+ var targetOrder = (_getNodeOrder = getNodeOrder(rawNode)) !== null && _getNodeOrder !== void 0 ? _getNodeOrder : getNodeOrder(node);
20854
+ if (targetOrder === undefined || targetOrder === null || Number.isNaN(Number(targetOrder))) {
20855
+ return findVisibleIndexLinear(node);
20856
+ }
20857
+ var low = 0;
20858
+ var high = list.length - 1;
20859
+ while (low <= high) {
20860
+ var mid = low + high >> 1;
20861
+ var midOrder = Number(getNodeOrder(list[mid]));
20862
+ if (midOrder === Number(targetOrder)) {
20863
+ return mid;
20864
+ }
20865
+ if (midOrder < Number(targetOrder)) {
20866
+ low = mid + 1;
20867
+ } else {
20868
+ high = mid - 1;
20869
+ }
20870
+ }
20871
+ return findVisibleIndexLinear(node);
20872
+ };
20873
+ var closeOpenedInRange = function closeOpenedInRange(list, start, end) {
20874
+ for (var i = start; i < end; i++) {
20875
+ var schema = getSchemaVal(list[i]);
20876
+ if (!(schema !== null && schema !== void 0 && schema[NODE_ATTRIBUTES.IS_OPEN])) {
20877
+ continue;
20878
+ }
20879
+ schema[NODE_ATTRIBUTES.IS_OPEN] = false;
20880
+ if ((flatData.openCount || 0) > 0) {
20881
+ flatData.openCount -= 1;
20882
+ }
20883
+ }
20884
+ };
20885
+ /**
20886
+ * 展开节点:在可见列表中插入直接子节点,以及已展开子树。
20887
+ */
20888
+ var expandVisibleNode = function expandVisibleNode(node) {
20889
+ var _getNodeAttr;
20890
+ var index = findVisibleIndex(node);
20891
+ if (index < 0) {
20892
+ // 不回退全表 rebuild(百万节点会卡 ~1s),只刷新当前行展开图标
20893
+ scheduleUiRefresh();
20894
+ return;
20895
+ }
20896
+ var list = visibleNodes.value;
20897
+ // 已有后代可见则认为已展开,只刷新图标
20898
+ var nodeDepth = Number((_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : 0);
20899
+ var next = list[index + 1];
20900
+ if (next) {
20901
+ var _getNodeAttr2;
20902
+ var nextDepth = Number((_getNodeAttr2 = getNodeAttr(next, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr2 !== void 0 ? _getNodeAttr2 : -1);
20903
+ if (nextDepth > nodeDepth) {
20904
+ scheduleUiRefresh();
20905
+ return;
20906
+ }
20907
+ }
20908
+ var insertNodes = [];
20909
+ _collectOpenedBranch(node, insertNodes);
20910
+ if (!insertNodes.length) {
20911
+ scheduleUiRefresh();
20912
+ return;
20913
+ }
20914
+ emitListChange(list.slice(0, index + 1).concat(insertNodes, list.slice(index + 1)));
20915
+ };
20916
+ /**
20917
+ * 收起节点:
20918
+ * 1) 只关闭「可见后代」中的 IS_OPEN(不必扫 flat 全量子树)
20919
+ * 2) 从可见列表移除该区间
20920
+ */
20921
+ var collapseVisibleNode = function collapseVisibleNode(node) {
20922
+ var _getNodeAttr3;
20923
+ var index = findVisibleIndex(node);
20924
+ if (index < 0) {
20925
+ scheduleUiRefresh();
20926
+ return;
20927
+ }
20928
+ var list = visibleNodes.value;
20929
+ var nodeDepth = Number((_getNodeAttr3 = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr3 !== void 0 ? _getNodeAttr3 : 0);
20930
+ var end = index + 1;
20931
+ while (end < list.length) {
20932
+ var _getNodeAttr4;
20933
+ var depth = Number((_getNodeAttr4 = getNodeAttr(list[end], NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr4 !== void 0 ? _getNodeAttr4 : -1);
20934
+ if (depth <= nodeDepth) {
20935
+ break;
20936
+ }
20937
+ end += 1;
20938
+ }
20939
+ if (end === index + 1) {
20940
+ scheduleUiRefresh();
20941
+ return;
20942
+ }
20943
+ closeOpenedInRange(list, index + 1, end);
20944
+ emitListChange(list.slice(0, index + 1).concat(list.slice(end)));
20945
+ };
20946
+ var syncNodeOpenState = function syncNodeOpenState(node, isOpen) {
20947
+ if (isOpen) {
20948
+ expandVisibleNode(node);
20949
+ return;
20950
+ }
20951
+ collapseVisibleNode(node);
20952
+ };
20953
+ rebuildVisibleNodes();
20954
+ return {
20955
+ visibleNodes: visibleNodes,
20956
+ uiVersion: uiVersion,
20957
+ rebuildVisibleNodes: rebuildVisibleNodes,
20958
+ expandVisibleNode: expandVisibleNode,
20959
+ collapseVisibleNode: collapseVisibleNode,
20960
+ syncNodeOpenState: syncNodeOpenState,
20961
+ scheduleUiRefresh: scheduleUiRefresh
20962
+ };
20963
+ });
20412
20964
  ;// ../../packages/tree/src/tree.tsx
20413
20965
 
20414
20966
 
@@ -20453,6 +21005,7 @@ var use_tree_init_this = undefined;
20453
21005
 
20454
21006
 
20455
21007
 
21008
+
20456
21009
  /* harmony default export */ const tree = (__WEBPACK_EXTERNAL_MODULE_vue_defineComponent__({
20457
21010
  name: 'Tree',
20458
21011
  props: treeProps,
@@ -20464,7 +21017,8 @@ var use_tree_init_this = undefined;
20464
21017
  flatData = _useTreeInit.flatData,
20465
21018
  onSelected = _useTreeInit.onSelected,
20466
21019
  rebuildData = _useTreeInit.rebuildData,
20467
- registerNextLoop = _useTreeInit.registerNextLoop;
21020
+ registerNextLoop = _useTreeInit.registerNextLoop,
21021
+ onAfterRebuild = _useTreeInit.onAfterRebuild;
20468
21022
  var _useNodeAttribute = use_node_attribute(flatData, props),
20469
21023
  checkNodeIsOpen = _useNodeAttribute.checkNodeIsOpen,
20470
21024
  isRootNode = _useNodeAttribute.isRootNode,
@@ -20477,7 +21031,10 @@ var use_tree_init_this = undefined;
20477
21031
  getNodeById = _useNodeAttribute.getNodeById,
20478
21032
  getParentNode = _useNodeAttribute.getParentNode,
20479
21033
  getRootNodeList = _useNodeAttribute.getRootNodeList,
20480
- getIntersectionResponse = _useNodeAttribute.getIntersectionResponse;
21034
+ getIntersectionResponse = _useNodeAttribute.getIntersectionResponse,
21035
+ getChildNodes = _useNodeAttribute.getChildNodes,
21036
+ getNodePath = _useNodeAttribute.getNodePath,
21037
+ getSchemaVal = _useNodeAttribute.getSchemaVal;
20481
21038
  var _useSearch = use_search(props),
20482
21039
  searchFn = _useSearch.searchFn,
20483
21040
  isSearchActive = _useSearch.isSearchActive,
@@ -20489,6 +21046,47 @@ var use_tree_init_this = undefined;
20489
21046
  var matchedNodeIds = __WEBPACK_EXTERNAL_MODULE_vue_reactive__(new Set());
20490
21047
  var visibleNodeIds = __WEBPACK_EXTERNAL_MODULE_vue_reactive__(new Set());
20491
21048
  var searchOriginalOpenState = new Map();
21049
+ var _useVisibleNodes = use_visible_nodes(flatData, {
21050
+ checkNodeIsOpen: checkNodeIsOpen,
21051
+ getChildNodes: getChildNodes,
21052
+ getNodeAttr: getNodeAttr,
21053
+ getNodePath: getNodePath,
21054
+ getNodeOrder: function getNodeOrder(node) {
21055
+ var _getNodeAttr;
21056
+ return (_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.ORDER)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : 0;
21057
+ },
21058
+ getSchemaVal: getSchemaVal,
21059
+ isNodeOpened: isNodeOpened
21060
+ }),
21061
+ renderData = _useVisibleNodes.visibleNodes,
21062
+ uiVersion = _useVisibleNodes.uiVersion,
21063
+ rebuildVisibleNodes = _useVisibleNodes.rebuildVisibleNodes,
21064
+ syncNodeOpenStateRaw = _useVisibleNodes.syncNodeOpenState,
21065
+ scheduleUiRefresh = _useVisibleNodes.scheduleUiRefresh;
21066
+ var filterFn = function filterFn(item) {
21067
+ if (isSearchActive.value) {
21068
+ return visibleNodeIds.has("".concat(getNodeId(item)));
21069
+ }
21070
+ return checkNodeIsOpen(item);
21071
+ };
21072
+ /**
21073
+ * 搜索态下可见集由 matched/visibleNodeIds 决定,不能按父子关系增量插入;
21074
+ * 非搜索态走 O(子树) 增量更新。
21075
+ */
21076
+ var syncNodeOpenState = function syncNodeOpenState(node, isOpen) {
21077
+ if (isSearchActive.value) {
21078
+ rebuildVisibleNodes(filterFn);
21079
+ return;
21080
+ }
21081
+ syncNodeOpenStateRaw(node, isOpen);
21082
+ };
21083
+ flatData.notifySchemaChange = function (_node, attr) {
21084
+ // IS_OPEN 由 syncNodeOpenState 增量维护可见列表
21085
+ if (attr === NODE_ATTRIBUTES.IS_OPEN) {
21086
+ return;
21087
+ }
21088
+ scheduleUiRefresh();
21089
+ };
20492
21090
  var getRenderNodeId = function getRenderNodeId(node) {
20493
21091
  return "".concat(getNodeId(node));
20494
21092
  };
@@ -20525,18 +21123,6 @@ var use_tree_init_this = undefined;
20525
21123
  _addDescendantNodes(child);
20526
21124
  });
20527
21125
  };
20528
- var filterFn = function filterFn(item) {
20529
- if (isSearchActive.value) {
20530
- return visibleNodeIds.has(getRenderNodeId(item));
20531
- }
20532
- return checkNodeIsOpen(item);
20533
- };
20534
- // 计算当前需要渲染的节点信息
20535
- var renderData = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
20536
- return flatData.data.filter(function (item) {
20537
- return filterFn(item);
20538
- });
20539
- });
20540
21126
  var _useIntersectionObser = use_intersection_observer(props),
20541
21127
  getLastVisibleElement = _useIntersectionObser.getLastVisibleElement,
20542
21128
  intersectionObserver = _useIntersectionObser.intersectionObserver;
@@ -20608,7 +21194,9 @@ var use_tree_init_this = undefined;
20608
21194
  return treeDataRef.value;
20609
21195
  },
20610
21196
  onTreeDataChange: onTreeDataChange,
20611
- registerNextLoop: registerNextLoop
21197
+ registerNextLoop: registerNextLoop,
21198
+ syncNodeOpenState: syncNodeOpenState,
21199
+ scheduleUiRefresh: scheduleUiRefresh
20612
21200
  }),
20613
21201
  renderTreeNode = _useNodeAction.renderTreeNode,
20614
21202
  handleTreeNodeClick = _useNodeAction.handleTreeNodeClick,
@@ -20617,10 +21205,38 @@ var use_tree_init_this = undefined;
20617
21205
  setSelect = _useNodeAction.setSelect,
20618
21206
  asyncNodeClick = _useNodeAction.asyncNodeClick,
20619
21207
  setNodeAttribute = _useNodeAction.setNodeAttribute,
20620
- isIndeterminate = _useNodeAction.isIndeterminate,
20621
- deepUpdateChildNode = _useNodeAction.deepUpdateChildNode,
20622
- updateParentChecked = _useNodeAction.updateParentChecked;
21208
+ applyCheckedChange = _useNodeAction.applyCheckedChange,
21209
+ emitCheckedChange = _useNodeAction.emitCheckedChange,
21210
+ rebuildCheckedSetsFromList = _useNodeAction.rebuildCheckedSetsFromList,
21211
+ clearAllCheckedState = _useNodeAction.clearAllCheckedState;
21212
+ // 数据重建完成后同步勾选索引与可见列表(保证读到最新 schema)
21213
+ var syncAfterRebuild = function syncAfterRebuild() {
21214
+ rebuildCheckedSetsFromList(flatData.checkedList || []);
21215
+ rebuildVisibleNodes(isSearchActive.value ? filterFn : undefined);
21216
+ };
21217
+ onAfterRebuild(syncAfterRebuild);
21218
+ __WEBPACK_EXTERNAL_MODULE_vue_watch__(function () {
21219
+ return flatData.data;
21220
+ }, syncAfterRebuild);
20623
21221
  var handleSearch = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_debounce__(120, function () {
21222
+ // 非搜索态:禁止扫全表写 IS_MATCH(百万节点首屏会卡死)
21223
+ if (!isSearchActive.value) {
21224
+ if (searchOriginalOpenState.size) {
21225
+ restoreSearchOpenState();
21226
+ }
21227
+ if (matchedNodeIds.size) {
21228
+ matchedNodeIds.forEach(function (nodeId) {
21229
+ var node = getNodeById(nodeId);
21230
+ if (node) {
21231
+ setNodeAttribute(node, NODE_ATTRIBUTES.IS_MATCH, false, false);
21232
+ }
21233
+ });
21234
+ matchedNodeIds.clear();
21235
+ }
21236
+ visibleNodeIds.clear();
21237
+ rebuildVisibleNodes();
21238
+ return;
21239
+ }
20624
21240
  restoreSearchOpenState();
20625
21241
  matchedNodeIds.clear();
20626
21242
  visibleNodeIds.clear();
@@ -20633,9 +21249,6 @@ var use_tree_init_this = undefined;
20633
21249
  }
20634
21250
  setNodeAttribute(item, [NODE_ATTRIBUTES.IS_MATCH, NODE_ATTRIBUTES.IS_OPEN], [isMatch, isNodeOpened(item)], false);
20635
21251
  });
20636
- if (!isSearchActive.value) {
20637
- return;
20638
- }
20639
21252
  flatData.data.forEach(function (item) {
20640
21253
  if (!matchedNodeIds.has(getRenderNodeId(item))) {
20641
21254
  return;
@@ -20648,13 +21261,11 @@ var use_tree_init_this = undefined;
20648
21261
  _addDescendantNodes(item);
20649
21262
  }
20650
21263
  });
21264
+ rebuildVisibleNodes(filterFn);
20651
21265
  });
20652
- __WEBPACK_EXTERNAL_MODULE_vue_watch__([refSearch, function () {
20653
- return flatData.data;
20654
- }, resultType, showChildNodes], function () {
21266
+ __WEBPACK_EXTERNAL_MODULE_vue_watch__([refSearch, resultType, showChildNodes, isSearchActive], function () {
20655
21267
  handleSearch();
20656
21268
  }, {
20657
- deep: true,
20658
21269
  immediate: true
20659
21270
  });
20660
21271
  __WEBPACK_EXTERNAL_MODULE_vue_onMounted__(function () {
@@ -20692,22 +21303,17 @@ var use_tree_init_this = undefined;
20692
21303
  var nodes = resolveToNodes(item);
20693
21304
  nodes.forEach(function (node) {
20694
21305
  var resolvedNode = resolveNodeItem(node);
20695
- setNodeAction(resolvedNode, NODE_ATTRIBUTES.IS_CHECKED, checked);
20696
- if (checked) {
20697
- setNodeAction(resolvedNode, NODE_ATTRIBUTES.IS_INDETERMINATE, false);
20698
- }
20699
- // 如果设置了 checkStrictly,需要同步更新子节点和父节点的状态
20700
- if (props.checkStrictly) {
20701
- deepUpdateChildNode(resolvedNode, [NODE_ATTRIBUTES.IS_CHECKED, NODE_ATTRIBUTES.IS_INDETERMINATE], [checked, false]);
20702
- updateParentChecked(resolvedNode, checked);
21306
+ if (resolvedNode[NODE_ATTRIBUTES.IS_NULL]) {
21307
+ return;
20703
21308
  }
21309
+ applyCheckedChange(resolvedNode, checked, {
21310
+ emitEvent: false,
21311
+ refresh: false
21312
+ });
20704
21313
  });
21314
+ scheduleUiRefresh();
20705
21315
  if (triggerEvent) {
20706
- ctx.emit(EVENTS.NODE_CHECKED, flatData.data.filter(function (t) {
20707
- return isNodeChecked(t);
20708
- }), flatData.data.filter(function (t) {
20709
- return isIndeterminate(t);
20710
- }));
21316
+ emitCheckedChange();
20711
21317
  }
20712
21318
  };
20713
21319
  onSelected(function (newData) {
@@ -20756,14 +21362,7 @@ var use_tree_init_this = undefined;
20756
21362
  __WEBPACK_EXTERNAL_MODULE_vue_watch__(function () {
20757
21363
  return [props.checked];
20758
21364
  }, function () {
20759
- // 先清除所有节点的选中和半选状态
20760
- flatData.data.forEach(function (node) {
20761
- if (isNodeChecked(node) || isIndeterminate(node)) {
20762
- setNodeAction(node, NODE_ATTRIBUTES.IS_CHECKED, false);
20763
- setNodeAction(node, NODE_ATTRIBUTES.IS_INDETERMINATE, false);
20764
- }
20765
- });
20766
- // 再设置新的选中节点
21365
+ clearAllCheckedState();
20767
21366
  setChecked(props.checked, true);
20768
21367
  }, {
20769
21368
  immediate: true
@@ -20888,6 +21487,8 @@ var use_tree_init_this = undefined;
20888
21487
  var _usePrefix = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__(),
20889
21488
  resolveClassName = _usePrefix.resolveClassName;
20890
21489
  return function () {
21490
+ // 依赖 uiVersion,确保 checkbox/selected 等 schema 变更能触发重渲染
21491
+ void uiVersion.value;
20891
21492
  return __WEBPACK_EXTERNAL_MODULE_vue_createVNode__(__WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_virtual_render_927587a8_default__, {
20892
21493
  "ref": root,
20893
21494
  "style": getTreeStyle(null, props),
@@ -20898,7 +21499,7 @@ var use_tree_init_this = undefined;
20898
21499
  "keepAlive": true,
20899
21500
  "lineHeight": props.lineHeight,
20900
21501
  "list": renderData.value,
20901
- "rowKey": NODE_ATTRIBUTES.UUID,
21502
+ "rowKey": props.nodeKey || NODE_ATTRIBUTES.UUID,
20902
21503
  "throttleDelay": 0,
20903
21504
  "onContentScroll": handleContentScroll
20904
21505
  }, {