bkui-vue 3.0.3 → 3.0.4-beta.2

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";
@@ -17334,8 +17334,6 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/**
17334
17334
 
17335
17335
  ;// external "../shared"
17336
17336
 
17337
- ;// external "vue"
17338
-
17339
17337
  ;// ../../node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
17340
17338
  function _arrayWithHoles(r) {
17341
17339
  if (Array.isArray(r)) return r;
@@ -17401,6 +17399,8 @@ function _slicedToArray(r, e) {
17401
17399
  return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
17402
17400
  }
17403
17401
 
17402
+ ;// external "vue"
17403
+
17404
17404
  ;// external "../config-provider"
17405
17405
 
17406
17406
  ;// external "../virtual-render"
@@ -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
@@ -17781,6 +17787,69 @@ var treeProps = {
17781
17787
  callback: __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_PropTypes__.func.def(undefined)
17782
17788
  })]).def(false)
17783
17789
  };
17790
+ ;// ../../packages/tree/src/tree-node-row.tsx
17791
+ /*
17792
+ * Tencent is pleased to support the open source community by making
17793
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
17794
+ *
17795
+ * Copyright (C) 2025 Tencent. All rights reserved.
17796
+ *
17797
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) is licensed under the MIT License.
17798
+ *
17799
+ * License for 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition):
17800
+ *
17801
+ * ---------------------------------------------------
17802
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
17803
+ * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
17804
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
17805
+ * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
17806
+ *
17807
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
17808
+ * the Software.
17809
+ *
17810
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
17811
+ * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17812
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
17813
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
17814
+ * IN THE SOFTWARE.
17815
+ */
17816
+
17817
+ /**
17818
+ * 独立树行组件:仅在 version / globalVersion 变化时重渲染。
17819
+ * 展开/选中时避免所有可见行的自定义插槽被连带重跑。
17820
+ */
17821
+ /* harmony default export */ const tree_node_row = (__WEBPACK_EXTERNAL_MODULE_vue_defineComponent__({
17822
+ name: 'BkTreeNodeRow',
17823
+ props: {
17824
+ item: {
17825
+ type: Object,
17826
+ required: true
17827
+ },
17828
+ showTree: {
17829
+ type: Boolean,
17830
+ "default": true
17831
+ },
17832
+ version: {
17833
+ type: Number,
17834
+ "default": 0
17835
+ },
17836
+ globalVersion: {
17837
+ type: Number,
17838
+ "default": 0
17839
+ },
17840
+ renderFn: {
17841
+ type: Function,
17842
+ required: true
17843
+ }
17844
+ },
17845
+ setup: function setup(props) {
17846
+ return function () {
17847
+ void props.version;
17848
+ void props.globalVersion;
17849
+ return props.renderFn(props.item, props.showTree);
17850
+ };
17851
+ }
17852
+ }));
17784
17853
  ;// external "../exception"
17785
17854
 
17786
17855
  ;// external "../exception/exception.less"
@@ -17971,6 +18040,208 @@ var treeProps = {
17971
18040
 
17972
18041
  ;// external "../icon"
17973
18042
 
18043
+ ;// ../../packages/tree/src/use-checked-state.ts
18044
+ /*
18045
+ * Tencent is pleased to support the open source community by making
18046
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
18047
+ *
18048
+ * Copyright (C) 2025 Tencent. All rights reserved.
18049
+ *
18050
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) is licensed under the MIT License.
18051
+ *
18052
+ * License for 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition):
18053
+ *
18054
+ * ---------------------------------------------------
18055
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
18056
+ * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
18057
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
18058
+ * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
18059
+ *
18060
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
18061
+ * the Software.
18062
+ *
18063
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
18064
+ * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18065
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
18066
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
18067
+ * IN THE SOFTWARE.
18068
+ */
18069
+
18070
+ /**
18071
+ * 勾选状态增量维护:
18072
+ * - checked/indeterminate 用 Set 跟踪,避免每次 emit 全表 filter O(N)
18073
+ * - 子树更新按 flatData 的 DFS 连续区间扫描,避免递归调用开销
18074
+ */
18075
+ /* harmony default export */ const use_checked_state = (function (flatData, helpers) {
18076
+ var getChildNodes = helpers.getChildNodes,
18077
+ getNodeAttr = helpers.getNodeAttr,
18078
+ getParentNode = helpers.getParentNode,
18079
+ getSchemaVal = helpers.getSchemaVal,
18080
+ isRootNode = helpers.isRootNode;
18081
+ var checkedSet = new Set();
18082
+ var indeterminateSet = new Set();
18083
+ var syncNodeToSets = function syncNodeToSets(node) {
18084
+ var schema = getSchemaVal(node);
18085
+ if (!schema) {
18086
+ return;
18087
+ }
18088
+ var checked = !!schema[NODE_ATTRIBUTES.IS_CHECKED];
18089
+ var indeterminate = checked && !!schema[NODE_ATTRIBUTES.IS_INDETERMINATE];
18090
+ if (checked) {
18091
+ checkedSet.add(node);
18092
+ } else {
18093
+ checkedSet["delete"](node);
18094
+ }
18095
+ if (indeterminate) {
18096
+ indeterminateSet.add(node);
18097
+ } else {
18098
+ indeterminateSet["delete"](node);
18099
+ }
18100
+ };
18101
+ var setNodeCheckedState = function setNodeCheckedState(node, checked) {
18102
+ var indeterminate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
18103
+ var schema = getSchemaVal(node);
18104
+ if (!schema) {
18105
+ return false;
18106
+ }
18107
+ var nextChecked = !!checked;
18108
+ var nextIndeterminate = nextChecked && !!indeterminate;
18109
+ var prevChecked = !!schema[NODE_ATTRIBUTES.IS_CHECKED];
18110
+ var prevIndeterminate = !!schema[NODE_ATTRIBUTES.IS_INDETERMINATE];
18111
+ if (prevChecked === nextChecked && prevIndeterminate === nextIndeterminate) {
18112
+ return false;
18113
+ }
18114
+ schema[NODE_ATTRIBUTES.IS_CHECKED] = nextChecked;
18115
+ schema[NODE_ATTRIBUTES.IS_INDETERMINATE] = nextIndeterminate;
18116
+ if (nextChecked) {
18117
+ checkedSet.add(node);
18118
+ } else {
18119
+ checkedSet["delete"](node);
18120
+ }
18121
+ if (nextIndeterminate) {
18122
+ indeterminateSet.add(node);
18123
+ } else {
18124
+ indeterminateSet["delete"](node);
18125
+ }
18126
+ return true;
18127
+ };
18128
+ /** 基于 flatten 收集的 checkedList 重建,避免无勾选时全表扫描 */
18129
+ var rebuildCheckedSetsFromList = function rebuildCheckedSetsFromList() {
18130
+ var nodes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
18131
+ checkedSet.clear();
18132
+ indeterminateSet.clear();
18133
+ for (var i = 0, len = nodes.length; i < len; i++) {
18134
+ var node = nodes[i];
18135
+ syncNodeToSets(node);
18136
+ var parent = getParentNode(node);
18137
+ while (parent) {
18138
+ syncNodeToSets(parent);
18139
+ parent = getParentNode(parent);
18140
+ }
18141
+ }
18142
+ };
18143
+ /**
18144
+ * flatData 为 DFS 序,INDEX 即数组下标;后代是一段连续区间。
18145
+ */
18146
+ var forEachDescendant = function forEachDescendant(node, fn) {
18147
+ var _getNodeAttr, _getNodeAttr2;
18148
+ var data = flatData.data;
18149
+ var start = ((_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.INDEX)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : -1) + 1;
18150
+ if (start <= 0) {
18151
+ return;
18152
+ }
18153
+ var nodeDepth = (_getNodeAttr2 = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr2 !== void 0 ? _getNodeAttr2 : 0;
18154
+ for (var i = start; i < data.length; i++) {
18155
+ var _getNodeAttr3;
18156
+ var child = data[i];
18157
+ var depth = (_getNodeAttr3 = getNodeAttr(child, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr3 !== void 0 ? _getNodeAttr3 : 0;
18158
+ if (depth <= nodeDepth) {
18159
+ break;
18160
+ }
18161
+ fn(child);
18162
+ }
18163
+ };
18164
+ var setDescendantChecked = function setDescendantChecked(node, checked) {
18165
+ forEachDescendant(node, function (child) {
18166
+ setNodeCheckedState(child, checked, false);
18167
+ });
18168
+ };
18169
+ var isNodeChecked = function isNodeChecked(node) {
18170
+ return !!getNodeAttr(node, NODE_ATTRIBUTES.IS_CHECKED);
18171
+ };
18172
+ var isNodeIndeterminate = function isNodeIndeterminate(node) {
18173
+ return isNodeChecked(node) && !!getNodeAttr(node, NODE_ATTRIBUTES.IS_INDETERMINATE);
18174
+ };
18175
+ /**
18176
+ * 自底向上更新祖先勾选 / 半选,复杂度 O(depth × 兄弟数)
18177
+ */
18178
+ var _updateParentChecked = function updateParentChecked(item) {
18179
+ var parent = getParentNode(item);
18180
+ if (!parent) {
18181
+ return;
18182
+ }
18183
+ var children = getChildNodes(parent) || [];
18184
+ var hasChecked = false;
18185
+ var hasUncheckedOrIndeterminate = false;
18186
+ for (var i = 0, len = children.length; i < len; i++) {
18187
+ var child = children[i];
18188
+ var childChecked = isNodeChecked(child);
18189
+ if (childChecked) {
18190
+ hasChecked = true;
18191
+ }
18192
+ if (!childChecked || isNodeIndeterminate(child)) {
18193
+ hasUncheckedOrIndeterminate = true;
18194
+ }
18195
+ // 半选态已确定,可提前结束
18196
+ if (hasChecked && hasUncheckedOrIndeterminate) {
18197
+ break;
18198
+ }
18199
+ }
18200
+ setNodeCheckedState(parent, hasChecked, hasChecked && hasUncheckedOrIndeterminate);
18201
+ if (!isRootNode(parent)) {
18202
+ _updateParentChecked(parent);
18203
+ }
18204
+ };
18205
+ var getCheckedEmitPayload = function getCheckedEmitPayload() {
18206
+ return [Array.from(checkedSet), Array.from(indeterminateSet)];
18207
+ };
18208
+ var rebuildCheckedSets = function rebuildCheckedSets() {
18209
+ checkedSet.clear();
18210
+ indeterminateSet.clear();
18211
+ var data = flatData.data;
18212
+ for (var i = 0, len = data.length; i < len; i++) {
18213
+ syncNodeToSets(data[i]);
18214
+ }
18215
+ };
18216
+ var clearAllCheckedState = function clearAllCheckedState() {
18217
+ checkedSet.forEach(function (node) {
18218
+ var schema = getSchemaVal(node);
18219
+ if (schema) {
18220
+ schema[NODE_ATTRIBUTES.IS_CHECKED] = false;
18221
+ schema[NODE_ATTRIBUTES.IS_INDETERMINATE] = false;
18222
+ }
18223
+ });
18224
+ indeterminateSet.clear();
18225
+ checkedSet.clear();
18226
+ };
18227
+ // 初始化:优先用 flatten 结果,避免空勾选时扫百万节点
18228
+ rebuildCheckedSetsFromList(flatData.checkedList || []);
18229
+ flatData.syncCheckedState = syncNodeToSets;
18230
+ return {
18231
+ checkedSet: checkedSet,
18232
+ indeterminateSet: indeterminateSet,
18233
+ syncNodeToSets: syncNodeToSets,
18234
+ setNodeCheckedState: setNodeCheckedState,
18235
+ setDescendantChecked: setDescendantChecked,
18236
+ forEachDescendant: forEachDescendant,
18237
+ updateParentChecked: _updateParentChecked,
18238
+ getCheckedEmitPayload: getCheckedEmitPayload,
18239
+ rebuildCheckedSets: rebuildCheckedSets,
18240
+ rebuildCheckedSetsFromList: rebuildCheckedSetsFromList,
18241
+ clearAllCheckedState: clearAllCheckedState,
18242
+ isNodeIndeterminate: isNodeIndeterminate
18243
+ };
18244
+ });
17974
18245
  ;// ../../packages/tree/src/use-node-attribute.tsx
17975
18246
 
17976
18247
 
@@ -18001,59 +18272,129 @@ var treeProps = {
18001
18272
  */
18002
18273
 
18003
18274
 
18275
+
18004
18276
  /* harmony default export */ const use_node_attribute = (function (flatData, props) {
18277
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
18278
+ /**
18279
+ * WeakMap 以对象引用为 key;Vue Proxy 与 raw 不是同一引用,需同时兼容
18280
+ */
18281
+ var resolveSchemaNode = function resolveSchemaNode(node) {
18282
+ if (!node) {
18283
+ return null;
18284
+ }
18285
+ if (flatData.schema.has(node)) {
18286
+ return node;
18287
+ }
18288
+ var raw = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
18289
+ if (raw && raw !== node && flatData.schema.has(raw)) {
18290
+ return raw;
18291
+ }
18292
+ return null;
18293
+ };
18005
18294
  /**
18006
18295
  * 获取Schema中指定的对象值
18007
18296
  * @param key
18008
18297
  * @returns
18009
18298
  */
18010
18299
  var getSchemaVal = function getSchemaVal(node) {
18011
- return flatData.schema.get(node);
18300
+ var schemaNode = resolveSchemaNode(node);
18301
+ return schemaNode ? flatData.schema.get(schemaNode) : undefined;
18012
18302
  };
18013
18303
  function getNodeAttr(node, attr) {
18014
18304
  var _getSchemaVal;
18015
18305
  return node ? (_getSchemaVal = getSchemaVal(node)) === null || _getSchemaVal === void 0 ? void 0 : _getSchemaVal[attr] : undefined;
18016
18306
  }
18017
18307
  /**
18018
- * 设置节点属性
18308
+ * 设置节点属性(原地更新 schema,避免每次 Object.assign 新对象)
18019
18309
  * @param node 指定节点
18020
18310
  * @param attr 节点属性
18021
18311
  * @param val 属性值
18022
18312
  * @returns
18023
18313
  */
18024
18314
  var setNodeAttr = function setNodeAttr(node, attr, val, id) {
18025
- if (!flatData.schema.has(node)) {
18315
+ var setOptions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
18316
+ var schemaNode = resolveSchemaNode(node);
18317
+ if (!schemaNode) {
18026
18318
  console.warn('node is not in schema, please check', id, node);
18027
18319
  return;
18028
18320
  }
18029
- flatData.schema.set(node, Object.assign({}, getSchemaVal(node), _defineProperty({}, attr, val)));
18321
+ var schemaVal = flatData.schema.get(schemaNode);
18322
+ if (!schemaVal) {
18323
+ return;
18324
+ }
18325
+ if (schemaVal[attr] === val) {
18326
+ return;
18327
+ }
18328
+ if (attr === NODE_ATTRIBUTES.IS_OPEN) {
18329
+ var prevOpen = !!schemaVal[attr];
18330
+ var nextOpen = !!val;
18331
+ if (prevOpen !== nextOpen) {
18332
+ flatData.openCount = (flatData.openCount || 0) + (nextOpen ? 1 : -1);
18333
+ }
18334
+ }
18335
+ schemaVal[attr] = val;
18336
+ if (attr === NODE_ATTRIBUTES.IS_CHECKED || attr === NODE_ATTRIBUTES.IS_INDETERMINATE) {
18337
+ var _flatData$syncChecked;
18338
+ (_flatData$syncChecked = flatData.syncCheckedState) === null || _flatData$syncChecked === void 0 || _flatData$syncChecked.call(flatData, node);
18339
+ }
18340
+ if (!setOptions.silent) {
18341
+ var _options$onSchemaChan, _flatData$notifySchem;
18342
+ (_options$onSchemaChan = options.onSchemaChange) === null || _options$onSchemaChan === void 0 || _options$onSchemaChan.call(options, node, attr, val);
18343
+ (_flatData$notifySchem = flatData.notifySchemaChange) === null || _flatData$notifySchem === void 0 || _flatData$notifySchem.call(flatData, node, attr, val);
18344
+ }
18030
18345
  };
18031
18346
  var getNodeById = function getNodeById(id) {
18032
- var _flatData$nodeMap$get, _flatData$nodeMap;
18033
- return (_flatData$nodeMap$get = (_flatData$nodeMap = flatData.nodeMap) === null || _flatData$nodeMap === void 0 ? void 0 : _flatData$nodeMap.get("".concat(id))) !== null && _flatData$nodeMap$get !== void 0 ? _flatData$nodeMap$get : flatData.data.find(function (item) {
18034
- return "".concat(getNodeId(item)) === "".concat(id);
18035
- });
18347
+ var _flatData$nodeMap;
18348
+ if (id === undefined || id === null || id === '') {
18349
+ return undefined;
18350
+ }
18351
+ // 禁止回退 flatData.data.find(百万节点 O(N))
18352
+ return (_flatData$nodeMap = flatData.nodeMap) === null || _flatData$nodeMap === void 0 ? void 0 : _flatData$nodeMap.get("".concat(id));
18036
18353
  };
18037
- var setNodeAttrById = function setNodeAttrById(id, attr, val) {
18354
+ var setNodeAttrById = function setNodeAttrById(id, attr, val, setOptions) {
18038
18355
  if (Array.isArray(id)) {
18039
18356
  Array.prototype.forEach.call(id, function (item) {
18040
- return setNodeAttr(getNodeById(item), attr, val, id);
18357
+ return setNodeAttr(getNodeById(item), attr, val, id, setOptions);
18041
18358
  });
18042
18359
  return;
18043
18360
  }
18044
- setNodeAttr(getNodeById(id), attr, val, id);
18361
+ var node = getNodeById(id);
18362
+ if (!node) {
18363
+ return;
18364
+ }
18365
+ setNodeAttr(node, attr, val, id, setOptions);
18045
18366
  };
18046
18367
  var getNodePath = function getNodePath(node) {
18047
18368
  return getNodeAttr(node, NODE_ATTRIBUTES.PATH);
18048
18369
  };
18049
18370
  var getNodeId = function getNodeId(node) {
18050
- return getNodeAttr(node, NODE_ATTRIBUTES.UUID);
18371
+ var schemaId = getNodeAttr(node, NODE_ATTRIBUTES.UUID);
18372
+ if (schemaId !== undefined && schemaId !== null && schemaId !== '') {
18373
+ return schemaId;
18374
+ }
18375
+ if (!node) {
18376
+ return undefined;
18377
+ }
18378
+ if (props !== null && props !== void 0 && props.nodeKey && node[props.nodeKey] !== undefined && node[props.nodeKey] !== null) {
18379
+ return node[props.nodeKey];
18380
+ }
18381
+ return node[NODE_ATTRIBUTES.UUID];
18051
18382
  };
18052
18383
  var isNodeOpened = function isNodeOpened(node) {
18053
18384
  return !!getNodeAttr(node, NODE_ATTRIBUTES.IS_OPEN);
18054
18385
  };
18055
18386
  var hasChildNode = function hasChildNode(node) {
18056
- return !!getNodeAttr(node, NODE_ATTRIBUTES.HAS_CHILD);
18387
+ var _flatData$childMap$ge, _flatData$childMap, _rawNode$childKey, _node$childKey;
18388
+ if (!!getNodeAttr(node, NODE_ATTRIBUTES.HAS_CHILD)) {
18389
+ return true;
18390
+ }
18391
+ var schemaNode = resolveSchemaNode(node);
18392
+ 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) {
18393
+ return true;
18394
+ }
18395
+ var childKey = (props === null || props === void 0 ? void 0 : props.children) || 'children';
18396
+ var rawNode = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
18397
+ 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
18398
  };
18058
18399
  var isNodeMatched = function isNodeMatched(node) {
18059
18400
  return !!getNodeAttr(node, NODE_ATTRIBUTES.IS_MATCH);
@@ -18094,10 +18435,18 @@ var treeProps = {
18094
18435
  return getNodeAttr(node, NODE_ATTRIBUTES.INDEX);
18095
18436
  };
18096
18437
  var isRootNode = function isRootNode(node) {
18438
+ var _flatData$rootNodes;
18097
18439
  if (typeof node === 'string') {
18098
18440
  return !!getNodeAttrById(node, NODE_ATTRIBUTES.IS_ROOT);
18099
18441
  }
18100
- return !!getNodeAttr(node, NODE_ATTRIBUTES.IS_ROOT);
18442
+ if (!!getNodeAttr(node, NODE_ATTRIBUTES.IS_ROOT)) {
18443
+ return true;
18444
+ }
18445
+ if (getNodeAttr(node, NODE_ATTRIBUTES.PARENT)) {
18446
+ return false;
18447
+ }
18448
+ var schemaNode = resolveSchemaNode(node);
18449
+ return !!schemaNode && !!((_flatData$rootNodes = flatData.rootNodes) !== null && _flatData$rootNodes !== void 0 && _flatData$rootNodes.includes(schemaNode));
18101
18450
  };
18102
18451
  var getNodeParentIdById = function getNodeParentIdById(id) {
18103
18452
  var target = getNodeById(id);
@@ -18117,11 +18466,11 @@ var treeProps = {
18117
18466
  * @returns
18118
18467
  */
18119
18468
  var isItemOpen = function isItemOpen(item) {
18120
- if (_typeof(item) === 'object') {
18469
+ if (_typeof(item) === 'object' && item !== null) {
18121
18470
  return isNodeOpened(item);
18122
18471
  }
18123
18472
  if (typeof item === 'string') {
18124
- return getNodeAttrById(item, NODE_ATTRIBUTES.IS_OPEN);
18473
+ return !!getNodeAttrById(item, NODE_ATTRIBUTES.IS_OPEN);
18125
18474
  }
18126
18475
  return false;
18127
18476
  };
@@ -18157,10 +18506,15 @@ var treeProps = {
18157
18506
  return target;
18158
18507
  };
18159
18508
  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
- });
18509
+ var _resolveSchemaNode, _flatData$childMap$ge2, _flatData$childMap2, _flatData$childMap3;
18510
+ var schemaNode = (_resolveSchemaNode = resolveSchemaNode(node)) !== null && _resolveSchemaNode !== void 0 ? _resolveSchemaNode : __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
18511
+ 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);
18512
+ if (mapped) {
18513
+ return mapped;
18514
+ }
18515
+ // 禁止回退 flatData.data.filter(百万节点 O(N));直接读源数据 children
18516
+ var childKey = (props === null || props === void 0 ? void 0 : props.children) || 'children';
18517
+ return (schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode[childKey]) || (node === null || node === void 0 ? void 0 : node[childKey]) || [];
18164
18518
  };
18165
18519
  var getSourceNodeByUID = function getSourceNodeByUID(uid) {
18166
18520
  return getNodeById(uid);
@@ -18184,13 +18538,17 @@ var treeProps = {
18184
18538
  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)));
18185
18539
  };
18186
18540
  var extendNodeAttr = function extendNodeAttr(item) {
18187
- return Object.assign({}, item, _defineProperty({}, NODE_ATTRIBUTES.TREE_NODE_ATTR, resolveScopedSlotParam(item)));
18541
+ return __WEBPACK_EXTERNAL_MODULE_vue_markRaw__(Object.assign({}, __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(item), _defineProperty({}, NODE_ATTRIBUTES.TREE_NODE_ATTR, resolveScopedSlotParam(item))));
18188
18542
  };
18543
+ /**
18544
+ * 插槽参数:data 使用 toRaw,避免深层 Proxy;整体 markRaw,降低自定义渲染时的响应式开销。
18545
+ * 注意:data 仍持有原 children 引用,业务侧勿对整棵 data 做 JSON.stringify。
18546
+ */
18189
18547
  var extendNodeScopedData = function extendNodeScopedData(item) {
18190
- return {
18191
- data: item,
18548
+ return __WEBPACK_EXTERNAL_MODULE_vue_markRaw__({
18549
+ data: __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(item),
18192
18550
  attributes: resolveScopedSlotParam(item)
18193
- };
18551
+ });
18194
18552
  };
18195
18553
  /**
18196
18554
  * 组装进入可视区域元素返回数据
@@ -18222,8 +18580,8 @@ var treeProps = {
18222
18580
  };
18223
18581
  };
18224
18582
  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) {
18583
+ var _flatData$rootNodes2;
18584
+ return (_flatData$rootNodes2 = flatData.rootNodes) !== null && _flatData$rootNodes2 !== void 0 ? _flatData$rootNodes2 : flatData.data.filter(function (item) {
18227
18585
  return isRootNode(item);
18228
18586
  });
18229
18587
  };
@@ -18291,6 +18649,7 @@ function _toConsumableArray(r) {
18291
18649
 
18292
18650
  ;// ../../packages/tree/src/util.ts
18293
18651
  /* unused harmony import specifier */ var util_defineProperty;
18652
+ /* unused harmony import specifier */ var util_typeof;
18294
18653
 
18295
18654
 
18296
18655
 
@@ -18328,6 +18687,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
18328
18687
  */
18329
18688
 
18330
18689
 
18690
+
18331
18691
  var DEFAULT_LEVLE_LINE = '1px dashed #c3cdd7';
18332
18692
  /**
18333
18693
  * 获取配置项可为Bool|String|Function类型,如果为Bool则配置默认值
@@ -18410,10 +18770,10 @@ var getTreeStyle = function getTreeStyle(item, props) {
18410
18770
  * @returns
18411
18771
  */
18412
18772
  var getNodeItemStyle = function getNodeItemStyle(item, props, flatData) {
18413
- var _schema$get;
18773
+ var _schema$get$NODE_ATTR, _schema$get, _schema$get2;
18414
18774
  var showTree = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
18415
18775
  var schema = flatData.schema;
18416
- var depth = (_schema$get = schema.get(item)) === null || _schema$get === void 0 ? void 0 : _schema$get[NODE_ATTRIBUTES.DEPTH];
18776
+ 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
18777
  if (showTree) {
18418
18778
  var args = ['node'];
18419
18779
  var levelLine = function levelLine() {
@@ -18432,16 +18792,23 @@ var getNodeItemStyle = function getNodeItemStyle(item, props, flatData) {
18432
18792
  * @param item
18433
18793
  * @returns
18434
18794
  */
18795
+ var getSchemaAttr = function getSchemaAttr(schema, item) {
18796
+ return schema.get(item) || schema.get(__WEBPACK_EXTERNAL_MODULE_vue_toRaw__(item)) || {};
18797
+ };
18435
18798
  var getNodeItemClass = function getNodeItemClass(item, schema, props) {
18436
18799
  var showTree = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
18800
+ var schemaAttr = getSchemaAttr(schema, item);
18437
18801
  // 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;
18802
+ var __is_root = schemaAttr.__is_root,
18803
+ __is_open = schemaAttr.__is_open,
18804
+ __parent = schemaAttr.__parent,
18805
+ __depth = schemaAttr.__depth;
18806
+ // 根节点必须带 is-root,否则会命中子节点连线样式(左侧伪元素横线堆叠成“竖线”)
18807
+ var isRoot = __is_root !== null && __is_root !== void 0 ? __is_root : __parent == null && (__depth === 0 || __depth === undefined);
18441
18808
  var _usePrefix = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__(),
18442
18809
  resolveClassName = _usePrefix.resolveClassName;
18443
18810
  return _defineProperty(_defineProperty(_defineProperty(_defineProperty({
18444
- 'is-root': __is_root
18811
+ 'is-root': !!isRoot
18445
18812
  }, "".concat(resolveClassName('tree-node')), true), 'is-open', __is_open), 'is-virtual-render', props.virtualRender), 'level-line', props.levelLine && showTree);
18446
18813
  };
18447
18814
  /**
@@ -18451,10 +18818,10 @@ var getNodeItemClass = function getNodeItemClass(item, schema, props) {
18451
18818
  */
18452
18819
  var getNodeRowClass = function getNodeRowClass(item, schema) {
18453
18820
  // 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;
18821
+ var _getSchemaAttr = getSchemaAttr(schema, item),
18822
+ __is_checked = _getSchemaAttr.__is_checked,
18823
+ __is_indeterminate = _getSchemaAttr.__is_indeterminate,
18824
+ __is_selected = _getSchemaAttr.__is_selected;
18458
18825
  var _usePrefix2 = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__(),
18459
18826
  resolveClassName = _usePrefix2.resolveClassName;
18460
18827
  return _defineProperty({
@@ -18482,7 +18849,7 @@ var _cloneTreeNode = function cloneTreeNode(node) {
18482
18849
  return _cloneTreeNode(item);
18483
18850
  });
18484
18851
  }
18485
- if (node && _typeof(node) === 'object') {
18852
+ if (node && util_typeof(node) === 'object') {
18486
18853
  return Object.keys(node).reduce(function (acc, key) {
18487
18854
  var value = node[key];
18488
18855
  acc[key] = Array.isArray(value) ? value.slice() : value;
@@ -18660,18 +19027,18 @@ var moveTreeNodeById = function moveTreeNodeById() {
18660
19027
  var nodeKey = arguments.length > 3 ? arguments[3] : undefined;
18661
19028
  var childKey = arguments.length > 4 ? arguments[4] : undefined;
18662
19029
  var options = arguments.length > 5 ? arguments[5] : undefined;
18663
- var nextTreeData = _cloneTreeData(treeData, childKey);
18664
- var removeResult = removeTreeNodeById(nextTreeData, nodeId, nodeKey, childKey);
19030
+ // 原地移动,避免百万节点全量 cloneTreeData
19031
+ var removeResult = removeTreeNodeById(treeData, nodeId, nodeKey, childKey);
18665
19032
  if (!removeResult.node) {
18666
19033
  return null;
18667
19034
  }
18668
- var insertResult = insertTreeNodeById(nextTreeData, removeResult.node, targetNodeId, nodeKey, childKey, options);
19035
+ var insertResult = insertTreeNodeById(treeData, removeResult.node, targetNodeId, nodeKey, childKey, options);
18669
19036
  if (!insertResult.targetNode) {
18670
19037
  return null;
18671
19038
  }
18672
19039
  return {
18673
19040
  trigger: 'drag',
18674
- data: nextTreeData,
19041
+ data: treeData,
18675
19042
  node: removeResult.node,
18676
19043
  targetNode: insertResult.targetNode,
18677
19044
  parentNode: insertResult.parentNode,
@@ -18782,7 +19149,8 @@ var isCascadeEnabled = function isCascadeEnabled(props) {
18782
19149
  }
18783
19150
  return Promise.resolve(resp);
18784
19151
  }
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);
19152
+ // 原地写入子节点,避免百万节点全量 cloneTreeData
19153
+ 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
19154
  mutateTreeById(nextTreeData, nodeId, props.nodeKey || NODE_ATTRIBUTES.UUID, props.children, function (targetNode) {
18787
19155
  targetNode[NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_OPEN]] = true;
18788
19156
  targetNode[props.children] = nodeValue;
@@ -18866,6 +19234,7 @@ var isCascadeEnabled = function isCascadeEnabled(props) {
18866
19234
  ;// ../../packages/tree/src/use-node-action.tsx
18867
19235
 
18868
19236
 
19237
+
18869
19238
  var use_node_action_this = undefined;
18870
19239
  /*
18871
19240
  * Tencent is pleased to support the open source community by making
@@ -18901,13 +19270,14 @@ var use_node_action_this = undefined;
18901
19270
 
18902
19271
 
18903
19272
 
19273
+
18904
19274
  /* harmony default export */ const use_node_action = (function (props, ctx, flatData, _renderData, initOption) {
18905
19275
  // const checkedNodes = [];
18906
19276
  var selectedNodeId = props.selected;
19277
+ var selectedNode = null;
18907
19278
  var _useNodeAttribute = use_node_attribute(flatData, props),
18908
19279
  setNodeAttr = _useNodeAttribute.setNodeAttr,
18909
19280
  setNodeAttrById = _useNodeAttribute.setNodeAttrById,
18910
- getNodePath = _useNodeAttribute.getNodePath,
18911
19281
  getSchemaVal = _useNodeAttribute.getSchemaVal,
18912
19282
  getNodeAttr = _useNodeAttribute.getNodeAttr,
18913
19283
  getNodeId = _useNodeAttribute.getNodeId,
@@ -18921,10 +19291,28 @@ var use_node_action_this = undefined;
18921
19291
  getParentNode = _useNodeAttribute.getParentNode,
18922
19292
  resolveScopedSlotParam = _useNodeAttribute.resolveScopedSlotParam,
18923
19293
  extendNodeAttr = _useNodeAttribute.extendNodeAttr,
18924
- extendNodeScopedData = _useNodeAttribute.extendNodeScopedData;
19294
+ extendNodeScopedData = _useNodeAttribute.extendNodeScopedData,
19295
+ getRootNodeList = _useNodeAttribute.getRootNodeList;
18925
19296
  var _usePrefix = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__(),
18926
19297
  resolveClassName = _usePrefix.resolveClassName;
18927
- var registerNextLoop = initOption.registerNextLoop;
19298
+ var registerNextLoop = initOption.registerNextLoop,
19299
+ syncNodeOpenState = initOption.syncNodeOpenState,
19300
+ scheduleUiRefresh = initOption.scheduleUiRefresh;
19301
+ var _useCheckedState = use_checked_state(flatData, {
19302
+ getChildNodes: getChildNodes,
19303
+ getNodeAttr: getNodeAttr,
19304
+ getParentNode: getParentNode,
19305
+ getSchemaVal: getSchemaVal,
19306
+ isRootNode: isRootNode
19307
+ }),
19308
+ setNodeCheckedState = _useCheckedState.setNodeCheckedState,
19309
+ setDescendantChecked = _useCheckedState.setDescendantChecked,
19310
+ forEachDescendant = _useCheckedState.forEachDescendant,
19311
+ updateParentChecked = _useCheckedState.updateParentChecked,
19312
+ getCheckedEmitPayload = _useCheckedState.getCheckedEmitPayload,
19313
+ rebuildCheckedSetsFromList = _useCheckedState.rebuildCheckedSetsFromList,
19314
+ clearAllCheckedState = _useCheckedState.clearAllCheckedState,
19315
+ isNodeIndeterminate = _useCheckedState.isNodeIndeterminate;
18928
19316
  var _useNodeAsync = use_node_async(props, flatData, ctx, initOption),
18929
19317
  asyncNodeClick = _useNodeAsync.asyncNodeClick,
18930
19318
  deepAutoOpen = _useNodeAsync.deepAutoOpen;
@@ -19025,32 +19413,20 @@ var use_node_action_this = undefined;
19025
19413
  }
19026
19414
  return null;
19027
19415
  };
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) {
19416
+ var deepUpdateChildNode = function deepUpdateChildNode(node, attr, value) {
19417
+ // 按 DFS 连续区间扫描后代,避免递归 forEach
19418
+ forEachDescendant(node, function (chid) {
19046
19419
  if (Array.isArray(attr)) {
19047
19420
  attr.forEach(function (val, index) {
19048
- setNodeAttr(chid, val, value[index]);
19421
+ setNodeAttr(chid, val, value[index], undefined, {
19422
+ silent: true
19423
+ });
19049
19424
  });
19050
19425
  } else {
19051
- setNodeAttr(chid, attr, value);
19426
+ setNodeAttr(chid, attr, value, undefined, {
19427
+ silent: true
19428
+ });
19052
19429
  }
19053
- _deepUpdateChildNode(chid, attr, value);
19054
19430
  });
19055
19431
  };
19056
19432
  var isRemoteFnExec = function isRemoteFnExec(event) {
@@ -19061,27 +19437,45 @@ var use_node_action_this = undefined;
19061
19437
  }
19062
19438
  return true;
19063
19439
  };
19440
+ var emitCheckedChange = function emitCheckedChange() {
19441
+ // 先让勾选 UI 刷新,再异步抛出列表,避免百万级 Array.from 阻塞交互
19442
+ __WEBPACK_EXTERNAL_MODULE_vue_nextTick__(function () {
19443
+ var _getCheckedEmitPayloa = getCheckedEmitPayload(),
19444
+ _getCheckedEmitPayloa2 = _slicedToArray(_getCheckedEmitPayloa, 2),
19445
+ checkedNodes = _getCheckedEmitPayloa2[0],
19446
+ indeterminateNodes = _getCheckedEmitPayloa2[1];
19447
+ ctx.emit(EVENTS.NODE_CHECKED, checkedNodes, indeterminateNodes);
19448
+ });
19449
+ };
19450
+ var applyCheckedChange = function applyCheckedChange(item, value) {
19451
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
19452
+ var checked = !!value;
19453
+ setNodeCheckedState(item, checked, false);
19454
+ if (isCascadeEnabled(props)) {
19455
+ setDescendantChecked(item, checked);
19456
+ updateParentChecked(item);
19457
+ }
19458
+ if (options.refresh !== false) {
19459
+ // 级联勾选可能影响大量节点,走全局刷新;单节点勾选只刷新当前行
19460
+ if (isCascadeEnabled(props)) {
19461
+ scheduleUiRefresh === null || scheduleUiRefresh === void 0 || scheduleUiRefresh();
19462
+ } else {
19463
+ scheduleUiRefresh === null || scheduleUiRefresh === void 0 || scheduleUiRefresh(item);
19464
+ }
19465
+ }
19466
+ if (options.emitEvent !== false) {
19467
+ emitCheckedChange();
19468
+ }
19469
+ };
19064
19470
  var handleNodeItemCheckboxChange = function handleNodeItemCheckboxChange(item, value, event) {
19065
19471
  event === null || event === void 0 || event.preventDefault();
19066
19472
  event === null || event === void 0 || event.stopImmediatePropagation();
19067
19473
  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
- }));
19474
+ applyCheckedChange(item, value);
19081
19475
  handleNodeContentClick(item, event, 'checked');
19082
19476
  };
19083
19477
  var isIndeterminate = function isIndeterminate(item) {
19084
- return isNodeChecked(item) && getNodeAttr(item, NODE_ATTRIBUTES.IS_INDETERMINATE);
19478
+ return isNodeIndeterminate(item);
19085
19479
  };
19086
19480
  var getCheckboxRender = function getCheckboxRender(item) {
19087
19481
  if (!showCheckbox(props, extendNodeScopedData(item))) {
@@ -19110,14 +19504,15 @@ var use_node_action_this = undefined;
19110
19504
  var e = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
19111
19505
  var fireEmit = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
19112
19506
  var newVal = isOpen === null ? !isItemOpen(item) : !!isOpen;
19507
+ setNodeAttr(item, NODE_ATTRIBUTES.IS_OPEN, newVal, undefined, {
19508
+ silent: true
19509
+ });
19113
19510
  /**
19114
- * 在收起节点时需要重置当前节点的所有叶子节点状态为 __isOpen = false
19115
- * 如果是需要点击当前节点展开所有叶子节点此处也可以打开
19511
+ * 增量维护可见列表:
19512
+ * - 展开:插入子节点
19513
+ * - 收起:移除可见后代,并仅重置可见区间内的 IS_OPEN(不再扫 flat 全量子树)
19116
19514
  */
19117
- if (!newVal) {
19118
- _deepUpdateChildNode(item, NODE_ATTRIBUTES.IS_OPEN, newVal);
19119
- }
19120
- setNodeAttr(item, NODE_ATTRIBUTES.IS_OPEN, newVal);
19515
+ syncNodeOpenState === null || syncNodeOpenState === void 0 || syncNodeOpenState(item, newVal);
19121
19516
  if (fireEmit) {
19122
19517
  var emitEvent = isItemOpen(item) ? EVENTS.NODE_EXPAND : EVENTS.NODE_COLLAPSE;
19123
19518
  ctx.emit(emitEvent, item, resolveScopedSlotParam(item), getSchemaVal(item), e);
@@ -19149,7 +19544,24 @@ var use_node_action_this = undefined;
19149
19544
  var setOpen = function setOpen(item) {
19150
19545
  var isOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19151
19546
  var autoOpenParents = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19152
- _setNodeAttribute(item, NODE_ATTRIBUTES.IS_OPEN, isOpen, autoOpenParents && isOpen);
19547
+ var resolvedItem = resolveNodeItem(item);
19548
+ if (resolvedItem[NODE_ATTRIBUTES.IS_NULL]) {
19549
+ return;
19550
+ }
19551
+ if (autoOpenParents && isOpen && !isRootNode(resolvedItem)) {
19552
+ var parents = [];
19553
+ var parent = getParentNode(resolvedItem);
19554
+ while (parent) {
19555
+ parents.unshift(parent);
19556
+ parent = getParentNode(parent);
19557
+ }
19558
+ parents.forEach(function (node) {
19559
+ if (!isItemOpen(node)) {
19560
+ setNodeOpened(node, true, null, false);
19561
+ }
19562
+ });
19563
+ }
19564
+ setNodeOpened(resolvedItem, isOpen, null, false);
19153
19565
  };
19154
19566
  /**
19155
19567
  * 递归处理当前节点以及父级节点属性值
@@ -19249,11 +19661,10 @@ var use_node_action_this = undefined;
19249
19661
  }
19250
19662
  var resolvedItem = resolveNodeItem(nodeList[0]);
19251
19663
  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);
19664
+ var _flatData$nodeMap$get, _flatData$nodeMap;
19665
+ var nodeId = String(resolvedItem);
19666
+ // 只走 nodeMap,禁止 data.find O(N)
19667
+ resolvedItem = (_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 : _defineProperty({}, NODE_ATTRIBUTES.IS_NULL, true);
19257
19668
  }
19258
19669
  if (resolvedItem[NODE_ATTRIBUTES.IS_NULL]) {
19259
19670
  return;
@@ -19262,14 +19673,28 @@ var use_node_action_this = undefined;
19262
19673
  console.warn('props.selectable is false or undefined, please set selectable with true');
19263
19674
  return;
19264
19675
  }
19265
- if (selectedNodeId !== null && selectedNodeId !== undefined) {
19266
- setNodeAttrById(selectedNodeId, NODE_ATTRIBUTES.IS_SELECTED, !selected);
19676
+ // 取消旧选中:优先用缓存节点引用,避免 setNodeAttrById → 全表查找
19677
+ if (selectedNode && selectedNode !== resolvedItem) {
19678
+ setNodeAttr(selectedNode, NODE_ATTRIBUTES.IS_SELECTED, false, undefined, {
19679
+ silent: true
19680
+ });
19681
+ scheduleUiRefresh === null || scheduleUiRefresh === void 0 || scheduleUiRefresh(selectedNode);
19682
+ } else if (selectedNodeId !== null && selectedNodeId !== undefined && "".concat(selectedNodeId) !== "".concat(getNodeId(resolvedItem))) {
19683
+ setNodeAttrById(selectedNodeId, NODE_ATTRIBUTES.IS_SELECTED, false, {
19684
+ silent: true
19685
+ });
19267
19686
  }
19268
- if (props.selected && props.selected !== selectedNodeId) {
19269
- setNodeAttrById(props.selected, NODE_ATTRIBUTES.IS_SELECTED, !selected);
19687
+ if (props.selected && props.selected !== selectedNodeId && "".concat(props.selected) !== "".concat(getNodeId(resolvedItem))) {
19688
+ setNodeAttrById(props.selected, NODE_ATTRIBUTES.IS_SELECTED, false, {
19689
+ silent: true
19690
+ });
19270
19691
  }
19271
- setNodeAttr(resolvedItem, NODE_ATTRIBUTES.IS_SELECTED, selected);
19692
+ setNodeAttr(resolvedItem, NODE_ATTRIBUTES.IS_SELECTED, selected, undefined, {
19693
+ silent: true
19694
+ });
19695
+ selectedNode = resolvedItem;
19272
19696
  selectedNodeId = getNodeId(resolvedItem);
19697
+ scheduleUiRefresh === null || scheduleUiRefresh === void 0 || scheduleUiRefresh(resolvedItem);
19273
19698
  if (triggerEvent) {
19274
19699
  ctx.emit(EVENTS.NODE_SELECTED, {
19275
19700
  selected: selected,
@@ -19358,23 +19783,30 @@ var use_node_action_this = undefined;
19358
19783
  * @returns
19359
19784
  */
19360
19785
  var filterNextNode = function filterNextNode(depth, node) {
19786
+ var _getNodeAttr;
19361
19787
  if (isRootNode(node)) {
19362
19788
  return false;
19363
19789
  }
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) {
19790
+ var nodeDepth = (_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : 0;
19791
+ // 当前节点所在 depth:必有连线
19792
+ if (depth === nodeDepth) {
19369
19793
  return true;
19370
19794
  }
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
- });
19795
+ if (depth > nodeDepth) {
19796
+ return false;
19797
+ }
19798
+ // 取 depth 层祖先,判断其是否存在下一个兄弟节点 —— O(depth) 替代全表 some
19799
+ var ancestor = node;
19800
+ for (var i = nodeDepth; i > depth; i--) {
19801
+ ancestor = getParentNode(ancestor);
19802
+ if (!ancestor) {
19803
+ return false;
19804
+ }
19805
+ }
19806
+ var parent = getParentNode(ancestor);
19807
+ var siblings = parent ? getChildNodes(parent) : getRootNodeList();
19808
+ var idx = siblings.indexOf(ancestor);
19809
+ return idx >= 0 && idx < siblings.length - 1;
19378
19810
  };
19379
19811
  /**
19380
19812
  * 获取层级连线
@@ -19382,16 +19814,20 @@ var use_node_action_this = undefined;
19382
19814
  * @returns
19383
19815
  */
19384
19816
  var getVirtualLines = function getVirtualLines(node) {
19385
- var _getNodeAttr;
19817
+ var _getNodeAttr2;
19386
19818
  if (!props.levelLine) {
19387
19819
  return null;
19388
19820
  }
19821
+ // 根节点不渲染层级连线(与基础用法一致)
19822
+ if (isRootNode(node)) {
19823
+ return null;
19824
+ }
19389
19825
  var getNodeLineStyle = function getNodeLineStyle(dpth) {
19390
19826
  return {
19391
19827
  '--depth': dpth
19392
19828
  };
19393
19829
  };
19394
- var maxDeep = ((_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : 0) + 1;
19830
+ var maxDeep = ((_getNodeAttr2 = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr2 !== void 0 ? _getNodeAttr2 : 0) + 1;
19395
19831
  return new Array(maxDeep).fill('').map(function (_, index) {
19396
19832
  return index;
19397
19833
  }).filter(function (depth) {
@@ -19470,8 +19906,12 @@ var use_node_action_this = undefined;
19470
19906
  setOpen: setOpen,
19471
19907
  setNodeAttribute: _setNodeAttribute,
19472
19908
  isIndeterminate: isIndeterminate,
19473
- deepUpdateChildNode: _deepUpdateChildNode,
19474
- updateParentChecked: _updateParentChecked
19909
+ deepUpdateChildNode: deepUpdateChildNode,
19910
+ updateParentChecked: updateParentChecked,
19911
+ applyCheckedChange: applyCheckedChange,
19912
+ emitCheckedChange: emitCheckedChange,
19913
+ rebuildCheckedSetsFromList: rebuildCheckedSetsFromList,
19914
+ clearAllCheckedState: clearAllCheckedState
19475
19915
  };
19476
19916
  });
19477
19917
  ;// ../../packages/tree/src/use-node-drag.tsx
@@ -19812,7 +20252,6 @@ var use_node_action_this = undefined;
19812
20252
  });
19813
20253
  ;// ../../packages/tree/src/use-search.tsx
19814
20254
 
19815
- var use_search_this = undefined;
19816
20255
  /*
19817
20256
  * Tencent is pleased to support the open source community by making
19818
20257
  * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
@@ -19847,15 +20286,11 @@ var use_search_this = undefined;
19847
20286
  var exactMatch = function exactMatch(matchValue, itemValue) {
19848
20287
  return matchValue === itemValue;
19849
20288
  };
19850
- var fuzzyMatch = function fuzzyMatch(matchValue, itemValue) {
19851
- try {
19852
- return new RegExp("".concat(matchValue), 'i').test("".concat(itemValue));
19853
- } catch (_unused) {
19854
- return "".concat(itemValue).toLowerCase().includes("".concat(matchValue).toLowerCase());
19855
- }
20289
+ var fuzzyMatchWithRegex = function fuzzyMatchWithRegex(regex, itemValue) {
20290
+ return regex.test("".concat(itemValue));
19856
20291
  };
19857
- var matchFn = function matchFn(match, args) {
19858
- return Reflect.apply(match, use_search_this, args);
20292
+ var fuzzyMatchIncludes = function fuzzyMatchIncludes(matchValue, itemValue) {
20293
+ return "".concat(itemValue).toLowerCase().includes(matchValue);
19859
20294
  };
19860
20295
  var isSearchDisabled = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
19861
20296
  return refSearch.value === undefined || refSearch.value === false;
@@ -19864,10 +20299,9 @@ var use_search_this = undefined;
19864
20299
  if (refSearch.value && _typeof(refSearch.value) === 'object') {
19865
20300
  return refSearch.value;
19866
20301
  }
19867
- var emptyOption = {
20302
+ return {
19868
20303
  value: ''
19869
20304
  };
19870
- return emptyOption;
19871
20305
  });
19872
20306
  var resultType = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
19873
20307
  var _searchOption$value$r;
@@ -19877,41 +20311,84 @@ var use_search_this = undefined;
19877
20311
  var _searchOption$value$s;
19878
20312
  return (_searchOption$value$s = searchOption.value.showChildNodes) !== null && _searchOption$value$s !== void 0 ? _searchOption$value$s : false;
19879
20313
  });
19880
- var getSearchValue = function getSearchValue() {
20314
+ /** 只暴露原始检索值,供外部浅层 watch,避免 deep watch 整个 search 对象 */
20315
+ var searchValue = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
19881
20316
  var _searchOption$value$v;
20317
+ if (isSearchDisabled.value) {
20318
+ return '';
20319
+ }
19882
20320
  if (isCommonType(refSearch.value)) {
19883
20321
  return refSearch.value;
19884
20322
  }
19885
20323
  return (_searchOption$value$v = searchOption.value.value) !== null && _searchOption$value$v !== void 0 ? _searchOption$value$v : '';
19886
- };
19887
- var searchFn = function searchFn(itemValue, item) {
20324
+ });
20325
+ var isSearchActive = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
20326
+ return !isSearchDisabled.value && "".concat(searchValue.value).length > 0;
20327
+ });
20328
+ var isTreeUI = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
20329
+ return resultType.value === 'tree';
20330
+ });
20331
+ /**
20332
+ * 为一次检索创建匹配器(模糊匹配只编译一次正则),避免百万节点循环内重复 new RegExp。
20333
+ */
20334
+ var createMatcher = function createMatcher() {
19888
20335
  if (isSearchDisabled.value) {
19889
- return true;
20336
+ return function () {
20337
+ return true;
20338
+ };
19890
20339
  }
19891
- var value = getSearchValue();
20340
+ var value = searchValue.value;
19892
20341
  if ("".concat(value).length === 0) {
19893
- return false;
20342
+ return function () {
20343
+ return false;
20344
+ };
19894
20345
  }
19895
20346
  if (isCommonType(refSearch.value)) {
19896
- return matchFn(fuzzyMatch, [value, itemValue, item]);
20347
+ var _text = "".concat(value);
20348
+ try {
20349
+ var regex = new RegExp(_text, 'i');
20350
+ return function (itemValue) {
20351
+ return fuzzyMatchWithRegex(regex, itemValue);
20352
+ };
20353
+ } catch (_unused) {
20354
+ var lower = _text.toLowerCase();
20355
+ return function (itemValue) {
20356
+ return fuzzyMatchIncludes(lower, itemValue);
20357
+ };
20358
+ }
19897
20359
  }
19898
20360
  var _searchOption$value$m = searchOption.value.match,
19899
20361
  match = _searchOption$value$m === void 0 ? 'fuzzy' : _searchOption$value$m;
19900
- var defaultMatch = match === 'fuzzy' ? fuzzyMatch : exactMatch;
19901
- var matchCallback = typeof match === 'function' ? match : defaultMatch;
19902
- return matchFn(matchCallback, [value, itemValue, item]);
19903
- };
19904
- var isSearchActive = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
19905
- if (isSearchDisabled.value) {
19906
- return false;
20362
+ if (typeof match === 'function') {
20363
+ return function (itemValue, item) {
20364
+ return !!match(value, itemValue, item);
20365
+ };
19907
20366
  }
19908
- return "".concat(getSearchValue()).length > 0;
19909
- });
19910
- var isTreeUI = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
19911
- return resultType.value === 'tree';
19912
- });
19913
- return {
19914
- searchFn: searchFn,
20367
+ if (match === 'full') {
20368
+ return function (itemValue) {
20369
+ return exactMatch(value, itemValue);
20370
+ };
20371
+ }
20372
+ var text = "".concat(value);
20373
+ try {
20374
+ var _regex = new RegExp(text, 'i');
20375
+ return function (itemValue) {
20376
+ return fuzzyMatchWithRegex(_regex, itemValue);
20377
+ };
20378
+ } catch (_unused2) {
20379
+ var _lower = text.toLowerCase();
20380
+ return function (itemValue) {
20381
+ return fuzzyMatchIncludes(_lower, itemValue);
20382
+ };
20383
+ }
20384
+ };
20385
+ var searchFn = function searchFn(itemValue, item) {
20386
+ return createMatcher()(itemValue, item);
20387
+ };
20388
+ return {
20389
+ searchFn: searchFn,
20390
+ createMatcher: createMatcher,
20391
+ searchValue: searchValue,
19915
20392
  refSearch: refSearch,
19916
20393
  isSearchActive: isSearchActive,
19917
20394
  isSearchDisabled: isSearchDisabled,
@@ -20043,6 +20520,16 @@ var use_tree_init_this = undefined;
20043
20520
 
20044
20521
 
20045
20522
 
20523
+ var toRawStore = function toRawStore(value) {
20524
+ return __WEBPACK_EXTERNAL_MODULE_vue_markRaw__(value);
20525
+ };
20526
+ var SOURCE_IS_OPEN = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_OPEN];
20527
+ var SOURCE_IS_CHECKED = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_CHECKED];
20528
+ var SOURCE_IS_SELECTED = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_SELECTED];
20529
+ var SOURCE_IS_ASYNC = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_ASYNC];
20530
+ var SOURCE_IS_MATCH = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_MATCH];
20531
+ var SOURCE_IS_CACHED = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_CACHED];
20532
+ var SOURCE_IS_LOADING = NODE_SOURCE_ATTRS[NODE_ATTRIBUTES.IS_LOADING];
20046
20533
  /* harmony default export */ const use_tree_init = (function (props) {
20047
20534
  var _props$async3;
20048
20535
  /**
@@ -20059,6 +20546,7 @@ var use_tree_init_this = undefined;
20059
20546
  var checkedList = [];
20060
20547
  var outputData = [];
20061
20548
  var order = 0;
20549
+ var openCount = 0;
20062
20550
  var treeSchema = new WeakMap();
20063
20551
  var nodeMap = new Map();
20064
20552
  var childMap = new WeakMap();
@@ -20082,111 +20570,59 @@ var use_tree_init_this = undefined;
20082
20570
  if (target[attrName] === attrValue) {
20083
20571
  return;
20084
20572
  }
20085
- Object.assign(target, _defineProperty({}, attrName, attrValue));
20573
+ if (attrName === NODE_ATTRIBUTES.IS_OPEN) {
20574
+ var prevOpen = !!target[attrName];
20575
+ var nextOpen = !!attrValue;
20576
+ if (prevOpen !== nextOpen) {
20577
+ openCount += nextOpen ? 1 : -1;
20578
+ }
20579
+ }
20580
+ target[attrName] = attrValue;
20086
20581
  loopUpdateNodeAttr(target[NODE_ATTRIBUTES.PARENT], attrName, attrValue, callFn);
20087
20582
  }
20088
20583
  }
20089
20584
  }
20090
20585
  }
20586
+ var nodeKey = props.nodeKey;
20587
+ var expandAll = !!props.expandAll;
20588
+ var autoOpenParentNode = !!props.autoOpenParentNode;
20589
+ var selectable = !!props.selectable;
20590
+ var hasCheckedProp = Array.isArray(props.checked) && props.checked.length > 0;
20591
+ var hasSelectedProp = props.selected !== undefined && props.selected !== null;
20592
+ var checkboxEnabled = props.showCheckbox !== false && !!props.showCheckbox;
20593
+ var useCache = !!cachedSchema;
20091
20594
  function getUid(item) {
20092
- var uid = null;
20093
- if (typeof props.nodeKey === 'string') {
20094
- uid = item[props.nodeKey] || esm_browser_v4();
20595
+ if (typeof nodeKey === 'string') {
20596
+ var keyVal = item[nodeKey];
20597
+ if (keyVal !== undefined && keyVal !== null && keyVal !== '') {
20598
+ return keyVal;
20599
+ }
20095
20600
  }
20096
- return uid || item[NODE_ATTRIBUTES.UUID] || esm_browser_v4();
20601
+ return item[NODE_ATTRIBUTES.UUID] || esm_browser_v4();
20097
20602
  }
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)) {
20603
+ function resolveAttr(node, sourceAttr, cachedAttr, defaultValue) {
20604
+ if (sourceAttr in node) {
20137
20605
  return node[sourceAttr];
20138
20606
  }
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;
20607
+ if (useCache) {
20608
+ var cached = cachedSchema.get(node);
20609
+ if (cached) {
20610
+ var cachedVal = cached[cachedAttr];
20611
+ if (cachedVal !== undefined && cachedVal !== null) {
20612
+ return cachedVal;
20613
+ }
20614
+ }
20178
20615
  }
20179
- var isMatch = _resolvePropIsMatched(node, props.checked, uuid);
20180
- return getCachedTreeNodeAttr(uuid, node, NODE_ATTRIBUTES.IS_CHECKED, isMatch);
20616
+ return defaultValue;
20181
20617
  }
20182
20618
  function validateIsOpenLoopFn(targetAttr) {
20183
20619
  var _targetAttr$NODE_ATTR;
20184
20620
  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
20621
  }
20186
20622
  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);
20623
+ target[NODE_ATTRIBUTES.IS_INDETERMINATE] = (node[children] || []).some(function (child) {
20624
+ var _treeSchema$get$NODE_, _treeSchema$get;
20625
+ 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
20626
  });
20191
20627
  return true;
20192
20628
  }
@@ -20196,69 +20632,85 @@ var use_tree_init_this = undefined;
20196
20632
  var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
20197
20633
  var arrLength = array.length;
20198
20634
  for (var i = 0; i < arrLength; i++) {
20635
+ var _attributes;
20199
20636
  var item = array[i];
20637
+ if (item === null || item === undefined) {
20638
+ continue;
20639
+ }
20200
20640
  if (Array.isArray(item)) {
20201
20641
  flatten(item, depth, parent, path);
20642
+ continue;
20643
+ }
20644
+ if (_typeof(item) !== 'object') {
20645
+ continue;
20646
+ }
20647
+ // 统一用 raw 作为 WeakMap key,避免 Proxy/raw 不一致导致 schema 全量失效
20648
+ var rawItem = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(item);
20649
+ var currentPath = path !== null ? "".concat(path, "-").concat(i) : "".concat(i);
20650
+ var uuid = "".concat(getUid(rawItem));
20651
+ var childList = rawItem[children];
20652
+ var hasChildren = !!(childList && childList.length);
20653
+ if (!nodeKey) {
20654
+ rawItem[NODE_ATTRIBUTES.UUID] = uuid;
20655
+ }
20656
+ var isOpened = !!resolveAttr(rawItem, SOURCE_IS_OPEN, NODE_ATTRIBUTES.IS_OPEN, expandAll);
20657
+ if (autoOpenParentNode) {
20658
+ if (isOpened && parent) {
20659
+ loopUpdateNodeAttr(parent, NODE_ATTRIBUTES.IS_OPEN, true, validateIsOpenLoopFn);
20660
+ }
20661
+ } else if (parent) {
20662
+ var _treeSchema$get2;
20663
+ var parentOpened = !!((_treeSchema$get2 = treeSchema.get(parent)) !== null && _treeSchema$get2 !== void 0 && _treeSchema$get2[NODE_ATTRIBUTES.IS_OPEN]);
20664
+ isOpened = isOpened && parentOpened;
20665
+ }
20666
+ var isSelected = false;
20667
+ if (selectable) {
20668
+ var selectedDefault = hasSelectedProp ? _resolvePropIsMatched(rawItem, props.selected, uuid) : false;
20669
+ isSelected = !!resolveAttr(rawItem, SOURCE_IS_SELECTED, NODE_ATTRIBUTES.IS_SELECTED, selectedDefault);
20670
+ }
20671
+ var isChecked = false;
20672
+ if (checkboxEnabled) {
20673
+ var canCheck = showCheckbox(props, {
20674
+ data: rawItem
20675
+ });
20676
+ if (canCheck) {
20677
+ var checkedDefault = hasCheckedProp ? _resolvePropIsMatched(rawItem, props.checked, uuid) : false;
20678
+ isChecked = !!resolveAttr(rawItem, SOURCE_IS_CHECKED, NODE_ATTRIBUTES.IS_CHECKED, checkedDefault);
20679
+ }
20680
+ }
20681
+ 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));
20682
+ if (isChecked) {
20683
+ checkedList.push(rawItem);
20684
+ }
20685
+ if (isOpened) {
20686
+ openCount += 1;
20687
+ }
20688
+ treeSchema.set(rawItem, attributes);
20689
+ nodeMap.set(uuid, rawItem);
20690
+ if (parent === null) {
20691
+ rootNodes.push(rawItem);
20202
20692
  } 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
- }
20693
+ var siblings = childMap.get(parent);
20694
+ if (!siblings) {
20695
+ siblings = [];
20696
+ childMap.set(parent, siblings);
20251
20697
  }
20698
+ siblings.push(rawItem);
20699
+ }
20700
+ outputData.push(rawItem);
20701
+ order += 1;
20702
+ if (hasChildren) {
20703
+ flatten(childList, depth + 1, rawItem, currentPath);
20252
20704
  }
20253
20705
  }
20254
20706
  }
20255
20707
  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) {
20708
+ if (checkboxEnabled && props.checkStrictly) {
20709
+ checkedList.forEach(function (value) {
20258
20710
  loopUpdateNodeAttr(value, NODE_ATTRIBUTES.IS_CHECKED, true, loopUpdateCheckedEvent);
20259
20711
  });
20260
20712
  }
20261
- return [outputData, treeSchema, nodeMap, childMap, rootNodes];
20713
+ return [outputData, treeSchema, nodeMap, childMap, rootNodes, openCount, checkedList];
20262
20714
  };
20263
20715
  var formatData = getFlatdata();
20264
20716
  var nextLoopEvents = new Map();
@@ -20266,14 +20718,17 @@ var use_tree_init_this = undefined;
20266
20718
  var afterSelectWatch = [];
20267
20719
  /**
20268
20720
  * 扁平化数据
20269
- * schema: 需要展示连线时,用于计算连线高度
20721
+ * shallowReactive:只跟踪 data/rootNodes 等字段替换,避免百万节点被深代理
20722
+ * schema/nodeMap/childMap 使用 markRaw,避免 WeakMap get/set 进入依赖收集
20270
20723
  */
20271
- var flatData = __WEBPACK_EXTERNAL_MODULE_vue_reactive__({
20724
+ var flatData = __WEBPACK_EXTERNAL_MODULE_vue_shallowReactive__({
20272
20725
  data: formatData[0],
20273
- schema: formatData[1],
20274
- nodeMap: formatData[2],
20275
- childMap: formatData[3],
20726
+ schema: toRawStore(formatData[1]),
20727
+ nodeMap: toRawStore(formatData[2]),
20728
+ childMap: toRawStore(formatData[3]),
20276
20729
  rootNodes: formatData[4],
20730
+ openCount: formatData[5] || 0,
20731
+ checkedList: formatData[6] || [],
20277
20732
  levelLineSchema: {}
20278
20733
  });
20279
20734
  var _useNodeAsync = use_node_async(props, flatData),
@@ -20344,30 +20799,39 @@ var use_tree_init_this = undefined;
20344
20799
  /**
20345
20800
  * 监听组件配置Data改变
20346
20801
  */
20802
+ var afterRebuildCallbacks = [];
20803
+ var onAfterRebuild = function onAfterRebuild(callback) {
20804
+ afterRebuildCallbacks.push(callback);
20805
+ };
20347
20806
  var rebuildData = function rebuildData(treeData) {
20348
20807
  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];
20808
+ var next = getFlatdata(treeData, cachedSchema);
20809
+ // 先替换 schema/maps,再替换 data,避免 data watcher 读到旧 schema
20810
+ flatData.schema = toRawStore(next[1]);
20811
+ flatData.nodeMap = toRawStore(next[2]);
20812
+ flatData.childMap = toRawStore(next[3]);
20813
+ flatData.rootNodes = next[4];
20814
+ flatData.openCount = next[5] || 0;
20815
+ flatData.checkedList = next[6] || [];
20816
+ flatData.data = next[0];
20817
+ afterRebuildCallbacks.forEach(function (callback) {
20818
+ return callback();
20819
+ });
20355
20820
  };
20821
+ // watchDataDeep=false(默认):仅监听 data 引用变化,大数据量友好
20822
+ // watchDataDeep=true:深度监听原地变更;百万节点下会明显变慢,仅建议小数据使用
20823
+ // 组件内部拖拽/异步仍走 onTreeDataChange → rebuildData
20356
20824
  __WEBPACK_EXTERNAL_MODULE_vue_watch__(function () {
20357
- return [props.data];
20825
+ return props.data;
20358
20826
  }, function (newData) {
20359
20827
  var _props$async, _props$async2;
20360
- rebuildData(newData[0], flatData.schema);
20828
+ rebuildData(newData, flatData.schema);
20361
20829
  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
20830
  deepAutoOpen();
20363
20831
  }
20364
- /**
20365
- * 执行缓存下来的周期函数
20366
- * 保证data改变之后执行相关操作
20367
- */
20368
20832
  executeNextEvent();
20369
20833
  }, {
20370
- deep: true
20834
+ deep: !!props.watchDataDeep
20371
20835
  });
20372
20836
  if (props.selectable) {
20373
20837
  __WEBPACK_EXTERNAL_MODULE_vue_onMounted__(function () {
@@ -20406,12 +20870,351 @@ var use_tree_init_this = undefined;
20406
20870
  afterDataUpdate: afterDataUpdate,
20407
20871
  registerNextLoop: registerNextLoop,
20408
20872
  rebuildData: rebuildData,
20873
+ onAfterRebuild: onAfterRebuild,
20409
20874
  onSelected: onSelected
20410
20875
  };
20411
20876
  });
20412
- ;// ../../packages/tree/src/tree.tsx
20877
+ ;// ../../packages/tree/src/use-visible-nodes.ts
20878
+ /*
20879
+ * Tencent is pleased to support the open source community by making
20880
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
20881
+ *
20882
+ * Copyright (C) 2025 Tencent. All rights reserved.
20883
+ *
20884
+ * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) is licensed under the MIT License.
20885
+ *
20886
+ * License for 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition):
20887
+ *
20888
+ * ---------------------------------------------------
20889
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
20890
+ * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
20891
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
20892
+ * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
20893
+ *
20894
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
20895
+ * the Software.
20896
+ *
20897
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
20898
+ * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20899
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
20900
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20901
+ * IN THE SOFTWARE.
20902
+ */
20413
20903
 
20414
20904
 
20905
+ /** 单次批量节点刷新超过该阈值时回退全局刷新,避免响应式写爆 */
20906
+ var NODE_UI_REFRESH_GLOBAL_THRESHOLD = 50;
20907
+ /**
20908
+ * 增量维护树的可见节点列表,避免每次展开都对全量 flatData 做 O(N) filter。
20909
+ * 展开/收起复杂度接近 O(受影响的可见子节点数),禁止回退到全表扫描。
20910
+ *
20911
+ * UI 刷新支持按节点粒度 bump,避免自定义插槽时全量可见行重跑。
20912
+ */
20913
+ /* harmony default export */ const use_visible_nodes = (function (flatData, helpers) {
20914
+ var checkNodeIsOpen = helpers.checkNodeIsOpen,
20915
+ getChildNodes = helpers.getChildNodes,
20916
+ getNodeAttr = helpers.getNodeAttr,
20917
+ getNodeId = helpers.getNodeId,
20918
+ getNodeOrder = helpers.getNodeOrder,
20919
+ getSchemaVal = helpers.getSchemaVal,
20920
+ isNodeOpened = helpers.isNodeOpened;
20921
+ var visibleNodes = __WEBPACK_EXTERNAL_MODULE_vue_shallowRef__([]);
20922
+ /** 全量 UI 版本:级联勾选等大批量变更时使用 */
20923
+ var uiVersion = __WEBPACK_EXTERNAL_MODULE_vue_shallowRef__(0);
20924
+ /** 任意 UI 刷新的唤醒信号:驱动 Tree 重渲染,具体行是否更新由 nodeUiVersions 决定 */
20925
+ var uiTick = __WEBPACK_EXTERNAL_MODULE_vue_shallowRef__(0);
20926
+ /** 按节点 UI 版本:选中/展开图标等局部变更时只更新对应行 */
20927
+ var nodeUiVersions = __WEBPACK_EXTERNAL_MODULE_vue_reactive__({});
20928
+ var uiFlushScheduled = false;
20929
+ var pendingGlobal = false;
20930
+ var pendingNodeIds = new Set();
20931
+ var emitListChange = function emitListChange(next) {
20932
+ visibleNodes.value = next;
20933
+ };
20934
+ var resolveNodeId = function resolveNodeId(node) {
20935
+ var id = getNodeId(node);
20936
+ return id === undefined || id === null ? '' : "".concat(id);
20937
+ };
20938
+ var flushUiRefresh = function flushUiRefresh() {
20939
+ uiFlushScheduled = false;
20940
+ var useGlobal = pendingGlobal || pendingNodeIds.size > NODE_UI_REFRESH_GLOBAL_THRESHOLD;
20941
+ if (useGlobal) {
20942
+ uiVersion.value += 1;
20943
+ } else {
20944
+ pendingNodeIds.forEach(function (id) {
20945
+ if (!id) {
20946
+ return;
20947
+ }
20948
+ nodeUiVersions[id] = (nodeUiVersions[id] || 0) + 1;
20949
+ });
20950
+ }
20951
+ pendingGlobal = false;
20952
+ pendingNodeIds.clear();
20953
+ // 唤醒 Tree → VirtualRender 插槽重跑;未 bump 的 TreeNodeRow 会因 props 不变而跳过
20954
+ uiTick.value += 1;
20955
+ };
20956
+ /**
20957
+ * 调度 UI 刷新:
20958
+ * - 传入 node:仅刷新该行(自定义插槽场景下避免全表 slot 重跑)
20959
+ * - 不传 node:全局刷新
20960
+ */
20961
+ var scheduleUiRefresh = function scheduleUiRefresh(node) {
20962
+ if (node) {
20963
+ var id = resolveNodeId(node);
20964
+ if (id) {
20965
+ pendingNodeIds.add(id);
20966
+ } else {
20967
+ pendingGlobal = true;
20968
+ }
20969
+ } else {
20970
+ pendingGlobal = true;
20971
+ }
20972
+ if (uiFlushScheduled) {
20973
+ return;
20974
+ }
20975
+ uiFlushScheduled = true;
20976
+ __WEBPACK_EXTERNAL_MODULE_vue_nextTick__(flushUiRefresh);
20977
+ };
20978
+ var getNodeUiVersion = function getNodeUiVersion(node) {
20979
+ var id = resolveNodeId(node);
20980
+ return id ? nodeUiVersions[id] || 0 : 0;
20981
+ };
20982
+ var rebuildVisibleNodes = function rebuildVisibleNodes(filterFn) {
20983
+ var _flatData$rootNodes;
20984
+ if (!filterFn && (flatData.openCount || 0) <= 0 && (_flatData$rootNodes = flatData.rootNodes) !== null && _flatData$rootNodes !== void 0 && _flatData$rootNodes.length) {
20985
+ emitListChange(flatData.rootNodes.slice());
20986
+ return;
20987
+ }
20988
+ var predicate = filterFn !== null && filterFn !== void 0 ? filterFn : checkNodeIsOpen;
20989
+ var next = [];
20990
+ var data = flatData.data;
20991
+ for (var i = 0, len = data.length; i < len; i++) {
20992
+ var item = data[i];
20993
+ if (predicate(item)) {
20994
+ next.push(item);
20995
+ }
20996
+ }
20997
+ emitListChange(next);
20998
+ };
20999
+ /** 直接设置可见列表(搜索态按候选集过滤后使用,避免再扫全表) */
21000
+ var setVisibleNodes = function setVisibleNodes(nodes) {
21001
+ emitListChange(nodes.slice());
21002
+ };
21003
+ var _collectOpenedBranch = function collectOpenedBranch(node, result) {
21004
+ var children = getChildNodes(node);
21005
+ for (var i = 0, len = children.length; i < len; i++) {
21006
+ var child = children[i];
21007
+ result.push(child);
21008
+ if (isNodeOpened(child)) {
21009
+ _collectOpenedBranch(child, result);
21010
+ }
21011
+ }
21012
+ };
21013
+ /** 在 flatData(DFS 序)中按 ORDER 二分定位 */
21014
+ var findFlatIndexByOrder = function findFlatIndexByOrder(targetOrder) {
21015
+ var data = flatData.data;
21016
+ var low = 0;
21017
+ var high = data.length - 1;
21018
+ while (low <= high) {
21019
+ var mid = low + high >> 1;
21020
+ var midOrder = Number(getNodeOrder(data[mid]));
21021
+ if (midOrder === targetOrder) {
21022
+ return mid;
21023
+ }
21024
+ if (midOrder < targetOrder) {
21025
+ low = mid + 1;
21026
+ } else {
21027
+ high = mid - 1;
21028
+ }
21029
+ }
21030
+ return -1;
21031
+ };
21032
+ /**
21033
+ * 收起时清除 flat 连续子孙区间内的 IS_OPEN(O(子树))。
21034
+ * 避免「可见区外仍保持 IS_OPEN」导致再次展开时 collectOpenedBranch 一次插入巨量子树。
21035
+ */
21036
+ var resetFlatDescendantOpenState = function resetFlatDescendantOpenState(node) {
21037
+ var _getNodeAttr;
21038
+ var nodeOrder = Number(getNodeOrder(node));
21039
+ var nodeDepth = Number((_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : 0);
21040
+ if (Number.isNaN(nodeOrder)) {
21041
+ return;
21042
+ }
21043
+ var start = findFlatIndexByOrder(nodeOrder) + 1;
21044
+ if (start <= 0) {
21045
+ return;
21046
+ }
21047
+ var data = flatData.data;
21048
+ for (var i = start, len = data.length; i < len; i++) {
21049
+ var _getNodeAttr2;
21050
+ var depth = Number((_getNodeAttr2 = getNodeAttr(data[i], NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr2 !== void 0 ? _getNodeAttr2 : -1);
21051
+ if (depth <= nodeDepth) {
21052
+ break;
21053
+ }
21054
+ var schema = getSchemaVal(data[i]);
21055
+ if (!(schema !== null && schema !== void 0 && schema[NODE_ATTRIBUTES.IS_OPEN])) {
21056
+ continue;
21057
+ }
21058
+ schema[NODE_ATTRIBUTES.IS_OPEN] = false;
21059
+ if ((flatData.openCount || 0) > 0) {
21060
+ flatData.openCount -= 1;
21061
+ }
21062
+ }
21063
+ };
21064
+ /** 仅在可见列表内线性查找,O(V),禁止回退扫 flat 全表 */
21065
+ var findVisibleIndexLinear = function findVisibleIndexLinear(node) {
21066
+ var list = visibleNodes.value;
21067
+ var rawNode = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
21068
+ for (var i = 0, len = list.length; i < len; i++) {
21069
+ var current = list[i];
21070
+ if (current === node || current === rawNode || __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(current) === rawNode) {
21071
+ return i;
21072
+ }
21073
+ }
21074
+ return -1;
21075
+ };
21076
+ /**
21077
+ * 按唯一 ORDER 二分定位,兼容 Proxy/raw 引用不一致。
21078
+ * 找不到时最多回退可见列表线性查找,不得 O(N) rebuild。
21079
+ */
21080
+ var findVisibleIndex = function findVisibleIndex(node) {
21081
+ var _getNodeOrder;
21082
+ var list = visibleNodes.value;
21083
+ if (!list.length) {
21084
+ return -1;
21085
+ }
21086
+ var rawNode = __WEBPACK_EXTERNAL_MODULE_vue_toRaw__(node);
21087
+ var targetOrder = (_getNodeOrder = getNodeOrder(rawNode)) !== null && _getNodeOrder !== void 0 ? _getNodeOrder : getNodeOrder(node);
21088
+ if (targetOrder === undefined || targetOrder === null || Number.isNaN(Number(targetOrder))) {
21089
+ return findVisibleIndexLinear(node);
21090
+ }
21091
+ var low = 0;
21092
+ var high = list.length - 1;
21093
+ while (low <= high) {
21094
+ var mid = low + high >> 1;
21095
+ var midOrder = Number(getNodeOrder(list[mid]));
21096
+ if (midOrder === Number(targetOrder)) {
21097
+ return mid;
21098
+ }
21099
+ if (midOrder < Number(targetOrder)) {
21100
+ low = mid + 1;
21101
+ } else {
21102
+ high = mid - 1;
21103
+ }
21104
+ }
21105
+ return findVisibleIndexLinear(node);
21106
+ };
21107
+ var closeOpenedInRange = function closeOpenedInRange(list, start, end) {
21108
+ for (var i = start; i < end; i++) {
21109
+ var schema = getSchemaVal(list[i]);
21110
+ if (!(schema !== null && schema !== void 0 && schema[NODE_ATTRIBUTES.IS_OPEN])) {
21111
+ continue;
21112
+ }
21113
+ schema[NODE_ATTRIBUTES.IS_OPEN] = false;
21114
+ if ((flatData.openCount || 0) > 0) {
21115
+ flatData.openCount -= 1;
21116
+ }
21117
+ }
21118
+ };
21119
+ /**
21120
+ * 展开节点:默认只插入直接子节点。
21121
+ * 若直接子节点自身已展开,再按需带上其已展开子树;
21122
+ * 配合 collapse 时清除 flat 子孙 IS_OPEN,避免一次插入数十万节点。
21123
+ */
21124
+ var expandVisibleNode = function expandVisibleNode(node) {
21125
+ var _getNodeAttr3;
21126
+ var index = findVisibleIndex(node);
21127
+ if (index < 0) {
21128
+ scheduleUiRefresh(node);
21129
+ return;
21130
+ }
21131
+ var list = visibleNodes.value;
21132
+ var nodeDepth = Number((_getNodeAttr3 = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr3 !== void 0 ? _getNodeAttr3 : 0);
21133
+ var next = list[index + 1];
21134
+ if (next) {
21135
+ var _getNodeAttr4;
21136
+ var nextDepth = Number((_getNodeAttr4 = getNodeAttr(next, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr4 !== void 0 ? _getNodeAttr4 : -1);
21137
+ if (nextDepth > nodeDepth) {
21138
+ scheduleUiRefresh(node);
21139
+ return;
21140
+ }
21141
+ }
21142
+ var children = getChildNodes(node);
21143
+ if (!children.length) {
21144
+ scheduleUiRefresh(node);
21145
+ return;
21146
+ }
21147
+ // 只展开一层:已打开的子节点再带上其子树(收起时已清子孙 IS_OPEN,通常不会很大)
21148
+ var insertNodes = [];
21149
+ for (var i = 0, len = children.length; i < len; i++) {
21150
+ var child = children[i];
21151
+ insertNodes.push(child);
21152
+ if (isNodeOpened(child)) {
21153
+ _collectOpenedBranch(child, insertNodes);
21154
+ }
21155
+ }
21156
+ emitListChange(list.slice(0, index + 1).concat(insertNodes, list.slice(index + 1)));
21157
+ scheduleUiRefresh(node);
21158
+ };
21159
+ /**
21160
+ * 收起节点:
21161
+ * 1) 清除 flat 子孙 IS_OPEN(防止再次展开时拖入巨量子树)
21162
+ * 2) 从可见列表移除该区间
21163
+ */
21164
+ var collapseVisibleNode = function collapseVisibleNode(node) {
21165
+ var _getNodeAttr5;
21166
+ var index = findVisibleIndex(node);
21167
+ if (index < 0) {
21168
+ // 即使不在可见列表,也清掉 flat 子孙 open,保持状态一致
21169
+ resetFlatDescendantOpenState(node);
21170
+ scheduleUiRefresh(node);
21171
+ return;
21172
+ }
21173
+ var list = visibleNodes.value;
21174
+ var nodeDepth = Number((_getNodeAttr5 = getNodeAttr(node, NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr5 !== void 0 ? _getNodeAttr5 : 0);
21175
+ var end = index + 1;
21176
+ while (end < list.length) {
21177
+ var _getNodeAttr6;
21178
+ var depth = Number((_getNodeAttr6 = getNodeAttr(list[end], NODE_ATTRIBUTES.DEPTH)) !== null && _getNodeAttr6 !== void 0 ? _getNodeAttr6 : -1);
21179
+ if (depth <= nodeDepth) {
21180
+ break;
21181
+ }
21182
+ end += 1;
21183
+ }
21184
+ // 先清 flat 子孙,再改可见列表(closeOpenedInRange 对已关闭节点是 no-op)
21185
+ resetFlatDescendantOpenState(node);
21186
+ if (end === index + 1) {
21187
+ scheduleUiRefresh(node);
21188
+ return;
21189
+ }
21190
+ closeOpenedInRange(list, index + 1, end);
21191
+ emitListChange(list.slice(0, index + 1).concat(list.slice(end)));
21192
+ scheduleUiRefresh(node);
21193
+ };
21194
+ var syncNodeOpenState = function syncNodeOpenState(node, isOpen) {
21195
+ if (isOpen) {
21196
+ expandVisibleNode(node);
21197
+ return;
21198
+ }
21199
+ collapseVisibleNode(node);
21200
+ };
21201
+ rebuildVisibleNodes();
21202
+ return {
21203
+ visibleNodes: visibleNodes,
21204
+ uiVersion: uiVersion,
21205
+ uiTick: uiTick,
21206
+ nodeUiVersions: nodeUiVersions,
21207
+ getNodeUiVersion: getNodeUiVersion,
21208
+ rebuildVisibleNodes: rebuildVisibleNodes,
21209
+ setVisibleNodes: setVisibleNodes,
21210
+ expandVisibleNode: expandVisibleNode,
21211
+ collapseVisibleNode: collapseVisibleNode,
21212
+ syncNodeOpenState: syncNodeOpenState,
21213
+ scheduleUiRefresh: scheduleUiRefresh
21214
+ };
21215
+ });
21216
+ ;// ../../packages/tree/src/tree.tsx
21217
+
20415
21218
  /*
20416
21219
  * Tencent is pleased to support the open source community by making
20417
21220
  * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
@@ -20453,6 +21256,8 @@ var use_tree_init_this = undefined;
20453
21256
 
20454
21257
 
20455
21258
 
21259
+
21260
+
20456
21261
  /* harmony default export */ const tree = (__WEBPACK_EXTERNAL_MODULE_vue_defineComponent__({
20457
21262
  name: 'Tree',
20458
21263
  props: treeProps,
@@ -20464,7 +21269,8 @@ var use_tree_init_this = undefined;
20464
21269
  flatData = _useTreeInit.flatData,
20465
21270
  onSelected = _useTreeInit.onSelected,
20466
21271
  rebuildData = _useTreeInit.rebuildData,
20467
- registerNextLoop = _useTreeInit.registerNextLoop;
21272
+ registerNextLoop = _useTreeInit.registerNextLoop,
21273
+ onAfterRebuild = _useTreeInit.onAfterRebuild;
20468
21274
  var _useNodeAttribute = use_node_attribute(flatData, props),
20469
21275
  checkNodeIsOpen = _useNodeAttribute.checkNodeIsOpen,
20470
21276
  isRootNode = _useNodeAttribute.isRootNode,
@@ -20477,18 +21283,101 @@ var use_tree_init_this = undefined;
20477
21283
  getNodeById = _useNodeAttribute.getNodeById,
20478
21284
  getParentNode = _useNodeAttribute.getParentNode,
20479
21285
  getRootNodeList = _useNodeAttribute.getRootNodeList,
20480
- getIntersectionResponse = _useNodeAttribute.getIntersectionResponse;
21286
+ getIntersectionResponse = _useNodeAttribute.getIntersectionResponse,
21287
+ getChildNodes = _useNodeAttribute.getChildNodes,
21288
+ getNodePath = _useNodeAttribute.getNodePath,
21289
+ getSchemaVal = _useNodeAttribute.getSchemaVal,
21290
+ setNodeAttr = _useNodeAttribute.setNodeAttr;
20481
21291
  var _useSearch = use_search(props),
20482
- searchFn = _useSearch.searchFn,
21292
+ createMatcher = _useSearch.createMatcher,
21293
+ searchValue = _useSearch.searchValue,
20483
21294
  isSearchActive = _useSearch.isSearchActive,
20484
- refSearch = _useSearch.refSearch,
20485
- isSearchDisabled = _useSearch.isSearchDisabled,
20486
21295
  isTreeUI = _useSearch.isTreeUI,
20487
21296
  resultType = _useSearch.resultType,
20488
21297
  showChildNodes = _useSearch.showChildNodes;
20489
- var matchedNodeIds = __WEBPACK_EXTERNAL_MODULE_vue_reactive__(new Set());
20490
- var visibleNodeIds = __WEBPACK_EXTERNAL_MODULE_vue_reactive__(new Set());
21298
+ // 不可用 reactive(Set):百万次 add/clear 会反复触发依赖,导致检索「连续刷新」
21299
+ var matchedNodeIds = new Set();
21300
+ var visibleNodeIds = new Set();
21301
+ /** 搜索候选节点(DFS 序),展开/收起时只在此集合上过滤,O(命中集) */
21302
+ var searchCandidateNodes = [];
20491
21303
  var searchOriginalOpenState = new Map();
21304
+ var getChildNodesForVisible = function getChildNodesForVisible(node) {
21305
+ var children = getChildNodes(node);
21306
+ if (!isSearchActive.value) {
21307
+ return children;
21308
+ }
21309
+ // 搜索态只插入检索可见集内的子节点,保证展开/收起增量正确
21310
+ return children.filter(function (child) {
21311
+ return visibleNodeIds.has("".concat(getNodeId(child)));
21312
+ });
21313
+ };
21314
+ var _useVisibleNodes = use_visible_nodes(flatData, {
21315
+ checkNodeIsOpen: checkNodeIsOpen,
21316
+ getChildNodes: getChildNodesForVisible,
21317
+ getNodeAttr: getNodeAttr,
21318
+ getNodeId: getNodeId,
21319
+ getNodePath: getNodePath,
21320
+ getNodeOrder: function getNodeOrder(node) {
21321
+ var _getNodeAttr;
21322
+ return (_getNodeAttr = getNodeAttr(node, NODE_ATTRIBUTES.ORDER)) !== null && _getNodeAttr !== void 0 ? _getNodeAttr : 0;
21323
+ },
21324
+ getSchemaVal: getSchemaVal,
21325
+ isNodeOpened: isNodeOpened
21326
+ }),
21327
+ renderData = _useVisibleNodes.visibleNodes,
21328
+ uiVersion = _useVisibleNodes.uiVersion,
21329
+ uiTick = _useVisibleNodes.uiTick,
21330
+ nodeUiVersions = _useVisibleNodes.nodeUiVersions,
21331
+ rebuildVisibleNodes = _useVisibleNodes.rebuildVisibleNodes,
21332
+ setVisibleNodes = _useVisibleNodes.setVisibleNodes,
21333
+ syncNodeOpenStateRaw = _useVisibleNodes.syncNodeOpenState,
21334
+ scheduleUiRefresh = _useVisibleNodes.scheduleUiRefresh;
21335
+ var isSearchTreeNodeVisible = function isSearchTreeNodeVisible(item) {
21336
+ if (!visibleNodeIds.has("".concat(getNodeId(item)))) {
21337
+ return false;
21338
+ }
21339
+ var parent = getParentNode(item);
21340
+ while (parent) {
21341
+ if (!isNodeOpened(parent)) {
21342
+ return false;
21343
+ }
21344
+ parent = getParentNode(parent);
21345
+ }
21346
+ return true;
21347
+ };
21348
+ var rebuildSearchVisibleList = function rebuildSearchVisibleList() {
21349
+ if (!isTreeUI.value) {
21350
+ setVisibleNodes(searchCandidateNodes);
21351
+ return;
21352
+ }
21353
+ var next = [];
21354
+ for (var i = 0, len = searchCandidateNodes.length; i < len; i++) {
21355
+ var item = searchCandidateNodes[i];
21356
+ if (isSearchTreeNodeVisible(item)) {
21357
+ next.push(item);
21358
+ }
21359
+ }
21360
+ setVisibleNodes(next);
21361
+ };
21362
+ /**
21363
+ * 搜索 list 模式:展开不影响可见集。
21364
+ * 其它情况走增量 expand/collapse(搜索 tree 下 getChildNodes 已按候选集过滤)。
21365
+ */
21366
+ var syncNodeOpenState = function syncNodeOpenState(node, isOpen) {
21367
+ if (isSearchActive.value && !isTreeUI.value) {
21368
+ scheduleUiRefresh(node);
21369
+ return;
21370
+ }
21371
+ syncNodeOpenStateRaw(node, isOpen);
21372
+ };
21373
+ flatData.notifySchemaChange = function (node, attr) {
21374
+ // IS_OPEN 由 syncNodeOpenState 增量维护可见列表,并按节点刷新图标
21375
+ if (attr === NODE_ATTRIBUTES.IS_OPEN) {
21376
+ return;
21377
+ }
21378
+ // 选中/勾选等:只刷新变更节点,避免自定义插槽全量重跑
21379
+ scheduleUiRefresh(node);
21380
+ };
20492
21381
  var getRenderNodeId = function getRenderNodeId(node) {
20493
21382
  return "".concat(getNodeId(node));
20494
21383
  };
@@ -20497,17 +21386,32 @@ var use_tree_init_this = undefined;
20497
21386
  if (!searchOriginalOpenState.has(nodeId)) {
20498
21387
  searchOriginalOpenState.set(nodeId, isNodeOpened(node));
20499
21388
  }
20500
- setNodeAttribute(node, NODE_ATTRIBUTES.IS_OPEN, true, false);
21389
+ setNodeAttr(node, NODE_ATTRIBUTES.IS_OPEN, true, undefined, {
21390
+ silent: true
21391
+ });
20501
21392
  };
20502
21393
  var restoreSearchOpenState = function restoreSearchOpenState() {
20503
21394
  searchOriginalOpenState.forEach(function (isOpen, nodeId) {
20504
21395
  var node = getNodeById(nodeId);
20505
21396
  if (node) {
20506
- setNodeAttribute(node, NODE_ATTRIBUTES.IS_OPEN, isOpen, false);
21397
+ setNodeAttr(node, NODE_ATTRIBUTES.IS_OPEN, isOpen, undefined, {
21398
+ silent: true
21399
+ });
20507
21400
  }
20508
21401
  });
20509
21402
  searchOriginalOpenState.clear();
20510
21403
  };
21404
+ var clearMatchedFlags = function clearMatchedFlags() {
21405
+ matchedNodeIds.forEach(function (nodeId) {
21406
+ var node = getNodeById(nodeId);
21407
+ if (node) {
21408
+ setNodeAttr(node, NODE_ATTRIBUTES.IS_MATCH, false, undefined, {
21409
+ silent: true
21410
+ });
21411
+ }
21412
+ });
21413
+ matchedNodeIds.clear();
21414
+ };
20511
21415
  var addAncestorNodes = function addAncestorNodes(node) {
20512
21416
  var parent = getParentNode(node);
20513
21417
  while (parent) {
@@ -20518,25 +21422,17 @@ var use_tree_init_this = undefined;
20518
21422
  }
20519
21423
  };
20520
21424
  var _addDescendantNodes = function addDescendantNodes(node) {
20521
- var _flatData$childMap$ge, _flatData$childMap;
20522
- var children = (_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 : [];
20523
- children.forEach(function (child) {
21425
+ var children = getChildNodes(node);
21426
+ for (var i = 0, len = children.length; i < len; i++) {
21427
+ var child = children[i];
20524
21428
  visibleNodeIds.add(getRenderNodeId(child));
21429
+ // showChildNodes:默认展开有子节点的路径,深层结果可直接可见;用户仍可手动收起
21430
+ if (hasChildNode(child)) {
21431
+ setSearchNodeOpen(child);
21432
+ }
20525
21433
  _addDescendantNodes(child);
20526
- });
20527
- };
20528
- var filterFn = function filterFn(item) {
20529
- if (isSearchActive.value) {
20530
- return visibleNodeIds.has(getRenderNodeId(item));
20531
21434
  }
20532
- return checkNodeIsOpen(item);
20533
21435
  };
20534
- // 计算当前需要渲染的节点信息
20535
- var renderData = __WEBPACK_EXTERNAL_MODULE_vue_computed__(function () {
20536
- return flatData.data.filter(function (item) {
20537
- return filterFn(item);
20538
- });
20539
- });
20540
21436
  var _useIntersectionObser = use_intersection_observer(props),
20541
21437
  getLastVisibleElement = _useIntersectionObser.getLastVisibleElement,
20542
21438
  intersectionObserver = _useIntersectionObser.intersectionObserver;
@@ -20608,7 +21504,9 @@ var use_tree_init_this = undefined;
20608
21504
  return treeDataRef.value;
20609
21505
  },
20610
21506
  onTreeDataChange: onTreeDataChange,
20611
- registerNextLoop: registerNextLoop
21507
+ registerNextLoop: registerNextLoop,
21508
+ syncNodeOpenState: syncNodeOpenState,
21509
+ scheduleUiRefresh: scheduleUiRefresh
20612
21510
  }),
20613
21511
  renderTreeNode = _useNodeAction.renderTreeNode,
20614
21512
  handleTreeNodeClick = _useNodeAction.handleTreeNodeClick,
@@ -20616,45 +21514,78 @@ var use_tree_init_this = undefined;
20616
21514
  setNodeAction = _useNodeAction.setNodeAction,
20617
21515
  setSelect = _useNodeAction.setSelect,
20618
21516
  asyncNodeClick = _useNodeAction.asyncNodeClick,
20619
- setNodeAttribute = _useNodeAction.setNodeAttribute,
20620
- isIndeterminate = _useNodeAction.isIndeterminate,
20621
- deepUpdateChildNode = _useNodeAction.deepUpdateChildNode,
20622
- updateParentChecked = _useNodeAction.updateParentChecked;
20623
- var handleSearch = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_debounce__(120, function () {
21517
+ applyCheckedChange = _useNodeAction.applyCheckedChange,
21518
+ emitCheckedChange = _useNodeAction.emitCheckedChange,
21519
+ rebuildCheckedSetsFromList = _useNodeAction.rebuildCheckedSetsFromList,
21520
+ clearAllCheckedState = _useNodeAction.clearAllCheckedState;
21521
+ // 数据重建完成后同步勾选索引与可见列表(保证读到最新 schema)
21522
+ var runSearch = function runSearch() {
20624
21523
  restoreSearchOpenState();
20625
- matchedNodeIds.clear();
21524
+ clearMatchedFlags();
20626
21525
  visibleNodeIds.clear();
20627
- flatData.data.forEach(function (item) {
20628
- var isMatch = !isSearchDisabled.value && searchFn(getLabel(item, props), item);
20629
- var nodeId = getRenderNodeId(item);
20630
- if (isMatch) {
20631
- matchedNodeIds.add(nodeId);
20632
- visibleNodeIds.add(nodeId);
20633
- }
20634
- setNodeAttribute(item, [NODE_ATTRIBUTES.IS_MATCH, NODE_ATTRIBUTES.IS_OPEN], [isMatch, isNodeOpened(item)], false);
20635
- });
21526
+ searchCandidateNodes = [];
21527
+ // 非搜索态:只恢复展开并重建可见列表,禁止扫全表写 IS_MATCH
20636
21528
  if (!isSearchActive.value) {
21529
+ rebuildVisibleNodes();
21530
+ scheduleUiRefresh();
20637
21531
  return;
20638
21532
  }
20639
- flatData.data.forEach(function (item) {
20640
- if (!matchedNodeIds.has(getRenderNodeId(item))) {
20641
- return;
21533
+ var matcher = createMatcher();
21534
+ var data = flatData.data;
21535
+ var matchedNodes = [];
21536
+ for (var i = 0, len = data.length; i < len; i++) {
21537
+ var item = data[i];
21538
+ if (!matcher(getLabel(item, props), item)) {
21539
+ continue;
20642
21540
  }
21541
+ var nodeId = getRenderNodeId(item);
21542
+ matchedNodeIds.add(nodeId);
21543
+ visibleNodeIds.add(nodeId);
21544
+ matchedNodes.push(item);
21545
+ // 仅给命中节点打标,禁止全表 setAttribute
21546
+ setNodeAttr(item, NODE_ATTRIBUTES.IS_MATCH, true, undefined, {
21547
+ silent: true
21548
+ });
21549
+ }
21550
+ for (var _i = 0, _len = matchedNodes.length; _i < _len; _i++) {
21551
+ var _item = matchedNodes[_i];
20643
21552
  if (resultType.value === 'tree') {
20644
- addAncestorNodes(item);
21553
+ addAncestorNodes(_item);
20645
21554
  }
20646
21555
  if (showChildNodes.value) {
20647
- setSearchNodeOpen(item);
20648
- _addDescendantNodes(item);
21556
+ setSearchNodeOpen(_item);
21557
+ _addDescendantNodes(_item);
20649
21558
  }
20650
- });
20651
- });
20652
- __WEBPACK_EXTERNAL_MODULE_vue_watch__([refSearch, function () {
21559
+ }
21560
+ // 按 DFS 序收集候选集,后续展开/收起只扫候选集
21561
+ for (var _i2 = 0, _len2 = data.length; _i2 < _len2; _i2++) {
21562
+ var _item2 = data[_i2];
21563
+ if (visibleNodeIds.has(getRenderNodeId(_item2))) {
21564
+ searchCandidateNodes.push(_item2);
21565
+ }
21566
+ }
21567
+ rebuildSearchVisibleList();
21568
+ scheduleUiRefresh();
21569
+ };
21570
+ var syncAfterRebuild = function syncAfterRebuild() {
21571
+ rebuildCheckedSetsFromList(flatData.checkedList || []);
21572
+ if (isSearchActive.value) {
21573
+ runSearch();
21574
+ return;
21575
+ }
21576
+ rebuildVisibleNodes();
21577
+ };
21578
+ onAfterRebuild(syncAfterRebuild);
21579
+ __WEBPACK_EXTERNAL_MODULE_vue_watch__(function () {
20653
21580
  return flatData.data;
20654
- }, resultType, showChildNodes], function () {
21581
+ }, syncAfterRebuild);
21582
+ var handleSearch = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_shared_edbdfb03_debounce__(120, runSearch);
21583
+ // 只浅监听检索值 / 展示模式,避免 deep watch search 对象在赋值时连环触发
21584
+ __WEBPACK_EXTERNAL_MODULE_vue_watch__(function () {
21585
+ return [searchValue.value, resultType.value, showChildNodes.value];
21586
+ }, function () {
20655
21587
  handleSearch();
20656
21588
  }, {
20657
- deep: true,
20658
21589
  immediate: true
20659
21590
  });
20660
21591
  __WEBPACK_EXTERNAL_MODULE_vue_onMounted__(function () {
@@ -20692,22 +21623,17 @@ var use_tree_init_this = undefined;
20692
21623
  var nodes = resolveToNodes(item);
20693
21624
  nodes.forEach(function (node) {
20694
21625
  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);
21626
+ if (resolvedNode[NODE_ATTRIBUTES.IS_NULL]) {
21627
+ return;
20703
21628
  }
21629
+ applyCheckedChange(resolvedNode, checked, {
21630
+ emitEvent: false,
21631
+ refresh: false
21632
+ });
20704
21633
  });
21634
+ scheduleUiRefresh();
20705
21635
  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
- }));
21636
+ emitCheckedChange();
20711
21637
  }
20712
21638
  };
20713
21639
  onSelected(function (newData) {
@@ -20756,14 +21682,7 @@ var use_tree_init_this = undefined;
20756
21682
  __WEBPACK_EXTERNAL_MODULE_vue_watch__(function () {
20757
21683
  return [props.checked];
20758
21684
  }, 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
- // 再设置新的选中节点
21685
+ clearAllCheckedState();
20767
21686
  setChecked(props.checked, true);
20768
21687
  }, {
20769
21688
  immediate: true
@@ -20820,6 +21739,55 @@ var use_tree_init_this = undefined;
20820
21739
  var triggerEvent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
20821
21740
  setChecked(getNodeById(id), checked, triggerEvent);
20822
21741
  };
21742
+ /**
21743
+ * 收起全部节点。
21744
+ * 直接批量清 schema.IS_OPEN,避免逐节点 setOpen 触发百万次增量更新。
21745
+ */
21746
+ var collapseAll = function collapseAll() {
21747
+ var data = flatData.data;
21748
+ for (var i = 0, len = data.length; i < len; i++) {
21749
+ var schema = getSchemaVal(data[i]);
21750
+ if (schema !== null && schema !== void 0 && schema[NODE_ATTRIBUTES.IS_OPEN]) {
21751
+ schema[NODE_ATTRIBUTES.IS_OPEN] = false;
21752
+ }
21753
+ }
21754
+ flatData.openCount = 0;
21755
+ if (isSearchActive.value) {
21756
+ rebuildSearchVisibleList();
21757
+ } else {
21758
+ rebuildVisibleNodes();
21759
+ }
21760
+ scheduleUiRefresh();
21761
+ };
21762
+ /**
21763
+ * 展开全部节点(openAllNodes)。
21764
+ * 批量写 IS_OPEN 后一次性重建可见列表。
21765
+ */
21766
+ var expandAllNodes = function expandAllNodes() {
21767
+ var data = flatData.data;
21768
+ var openCount = 0;
21769
+ for (var i = 0, len = data.length; i < len; i++) {
21770
+ var node = data[i];
21771
+ if (!hasChildNode(node)) {
21772
+ continue;
21773
+ }
21774
+ var schema = getSchemaVal(node);
21775
+ if (!schema) {
21776
+ continue;
21777
+ }
21778
+ if (!schema[NODE_ATTRIBUTES.IS_OPEN]) {
21779
+ schema[NODE_ATTRIBUTES.IS_OPEN] = true;
21780
+ }
21781
+ openCount += 1;
21782
+ }
21783
+ flatData.openCount = openCount;
21784
+ if (isSearchActive.value) {
21785
+ rebuildSearchVisibleList();
21786
+ } else {
21787
+ rebuildVisibleNodes();
21788
+ }
21789
+ scheduleUiRefresh();
21790
+ };
20823
21791
  ctx.expose({
20824
21792
  handleTreeNodeClick: handleTreeNodeClick,
20825
21793
  isNodeChecked: isNodeChecked,
@@ -20838,7 +21806,10 @@ var use_tree_init_this = undefined;
20838
21806
  getData: getData,
20839
21807
  reset: reset,
20840
21808
  getNodeAttr: getNodeAttr,
20841
- getParentNode: getParentNode
21809
+ getParentNode: getParentNode,
21810
+ collapseAll: collapseAll,
21811
+ expandAll: expandAllNodes,
21812
+ openAllNodes: expandAllNodes
20842
21813
  });
20843
21814
  var _useEmpty = use_empty(props),
20844
21815
  renderEmpty = _useEmpty.renderEmpty;
@@ -20851,8 +21822,18 @@ var use_tree_init_this = undefined;
20851
21822
  var renderTreeContent = function renderTreeContent(scopedData) {
20852
21823
  var _ctx$slots$empty, _ctx$slots$empty2, _ctx$slots;
20853
21824
  if (scopedData.length) {
21825
+ var showTree = !isSearchActive.value || isTreeUI.value;
21826
+ var globalVersion = uiVersion.value;
20854
21827
  return scopedData.map(function (d) {
20855
- return renderTreeNode(d, !isSearchActive.value || isTreeUI.value);
21828
+ var id = "".concat(getNodeId(d));
21829
+ return __WEBPACK_EXTERNAL_MODULE_vue_createVNode__(tree_node_row, {
21830
+ "key": id,
21831
+ "item": d,
21832
+ "showTree": showTree,
21833
+ "version": nodeUiVersions[id] || 0,
21834
+ "globalVersion": globalVersion,
21835
+ "renderFn": renderTreeNode
21836
+ }, null);
20856
21837
  });
20857
21838
  }
20858
21839
  var emptyType = isSearchActive.value ? 'search-empty' : 'empty';
@@ -20888,6 +21869,8 @@ var use_tree_init_this = undefined;
20888
21869
  var _usePrefix = __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_config_provider_fe8577a3_usePrefix__(),
20889
21870
  resolveClassName = _usePrefix.resolveClassName;
20890
21871
  return function () {
21872
+ // uiTick:节点级刷新时唤醒 Tree;具体哪些行更新由 TreeNodeRow 的 version 决定
21873
+ void uiTick.value;
20891
21874
  return __WEBPACK_EXTERNAL_MODULE_vue_createVNode__(__WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_virtual_render_927587a8_default__, {
20892
21875
  "ref": root,
20893
21876
  "style": getTreeStyle(null, props),
@@ -20898,7 +21881,7 @@ var use_tree_init_this = undefined;
20898
21881
  "keepAlive": true,
20899
21882
  "lineHeight": props.lineHeight,
20900
21883
  "list": renderData.value,
20901
- "rowKey": NODE_ATTRIBUTES.UUID,
21884
+ "rowKey": props.nodeKey || NODE_ATTRIBUTES.UUID,
20902
21885
  "throttleDelay": 0,
20903
21886
  "onContentScroll": handleContentScroll
20904
21887
  }, {