@sy-common/organize-select-help 1.0.0-beta.65 → 1.0.0-beta.66
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/package.json +1 -1
- package/src/index.vue +12 -19
- package/src/organize-tree.vue +5 -15
package/package.json
CHANGED
package/src/index.vue
CHANGED
|
@@ -296,7 +296,7 @@ export default {
|
|
|
296
296
|
parentOrgList: [],
|
|
297
297
|
orgTagList:[],
|
|
298
298
|
postTagList:[],
|
|
299
|
-
selectedPositionId: null, //
|
|
299
|
+
selectedPositionId: null, // 岗位单选的选中状态存储
|
|
300
300
|
selectedOrgTagKey: '', // 存储选中标签的唯一标识
|
|
301
301
|
selectedPostTagKey: '', // 存储选中标签的唯一标识
|
|
302
302
|
//人员选择
|
|
@@ -304,8 +304,8 @@ export default {
|
|
|
304
304
|
staffTagList:[],
|
|
305
305
|
staffOrgList:[],
|
|
306
306
|
staffSearchList:[],
|
|
307
|
-
selectedStaffOrgId: '', //
|
|
308
|
-
proStaffOrgList: [], //
|
|
307
|
+
selectedStaffOrgId: '', // 选中的组织节点ID
|
|
308
|
+
proStaffOrgList: [], // 暂存选中的组织节点
|
|
309
309
|
initialDefaultOrgUnitId: '', // 缓存初始defaultOrgUnitId
|
|
310
310
|
// staffTreeInited: false, // 组织树初始化完成标记
|
|
311
311
|
// 树加载完成标记
|
|
@@ -1517,7 +1517,7 @@ export default {
|
|
|
1517
1517
|
continue;
|
|
1518
1518
|
}
|
|
1519
1519
|
|
|
1520
|
-
//
|
|
1520
|
+
// 父节点追溯与节点链挂载(使用当前Tab的树数据originalTreeData,而非固定orgTree)
|
|
1521
1521
|
let targetParent = null;
|
|
1522
1522
|
let nodeChain = [currentNode];
|
|
1523
1523
|
const MAX_DEPTH = 8;
|
|
@@ -1542,7 +1542,7 @@ export default {
|
|
|
1542
1542
|
}
|
|
1543
1543
|
|
|
1544
1544
|
parentNode.orgNodeName = parentNode.orgNodeName || parentNode.orgUnitName || `未命名组织(${parentId})`;
|
|
1545
|
-
//
|
|
1545
|
+
// 查询父节点是否在当前Tab的树数据中(originalTreeData),而非固定orgTree
|
|
1546
1546
|
const parentInTree = this.findNodeInTree(originalTreeData, parentNode.orgUnitId);
|
|
1547
1547
|
|
|
1548
1548
|
if (parentInTree) {
|
|
@@ -1629,7 +1629,7 @@ export default {
|
|
|
1629
1629
|
treeRef.handleChange(matchedNodes);
|
|
1630
1630
|
}
|
|
1631
1631
|
|
|
1632
|
-
//
|
|
1632
|
+
// 提示信息
|
|
1633
1633
|
this.$Message.success(`成功选中${matchedNodes.length}个组织节点`);
|
|
1634
1634
|
});
|
|
1635
1635
|
} else {
|
|
@@ -1647,11 +1647,10 @@ export default {
|
|
|
1647
1647
|
});
|
|
1648
1648
|
},
|
|
1649
1649
|
|
|
1650
|
-
//
|
|
1650
|
+
// 移除树数据中的 parent 引用,避免子组件处理时形成循环
|
|
1651
1651
|
removeParentReferences(treeData) {
|
|
1652
1652
|
if (!Array.isArray(treeData)) return;
|
|
1653
1653
|
treeData.forEach(node => {
|
|
1654
|
-
// 删除可能存在的 parent 引用(如果节点有此属性)
|
|
1655
1654
|
if (node.parent) delete node.parent;
|
|
1656
1655
|
// 递归处理子节点
|
|
1657
1656
|
if (Array.isArray(node.orgChildrenList)) {
|
|
@@ -1686,7 +1685,6 @@ export default {
|
|
|
1686
1685
|
return null;
|
|
1687
1686
|
},
|
|
1688
1687
|
|
|
1689
|
-
// 增强安全深拷贝,主动移除循环引用字段
|
|
1690
1688
|
safeDeepCopy(obj, hash = new WeakMap()) {
|
|
1691
1689
|
if (obj === null || typeof obj !== 'object') {
|
|
1692
1690
|
return obj;
|
|
@@ -1715,15 +1713,12 @@ export default {
|
|
|
1715
1713
|
hash.set(obj, copy);
|
|
1716
1714
|
for (let key in obj) {
|
|
1717
1715
|
if (obj.hasOwnProperty(key)) {
|
|
1718
|
-
// 仅过滤vue内部字段,保留业务字段
|
|
1719
1716
|
if (['__vue__', '__ob__', '$parent', '$children'].includes(key)) {
|
|
1720
1717
|
continue;
|
|
1721
1718
|
}
|
|
1722
|
-
// 子节点数组特殊处理
|
|
1723
1719
|
if (['orgChildrenList', 'children'].includes(key) && Array.isArray(obj[key])) {
|
|
1724
1720
|
copy[key] = obj[key].map(child => this.safeDeepCopy(child, hash));
|
|
1725
1721
|
} else {
|
|
1726
|
-
// 保留所有业务字段,不额外过滤
|
|
1727
1722
|
copy[key] = this.safeDeepCopy(obj[key], hash);
|
|
1728
1723
|
}
|
|
1729
1724
|
}
|
|
@@ -1735,9 +1730,9 @@ export default {
|
|
|
1735
1730
|
},
|
|
1736
1731
|
|
|
1737
1732
|
/**
|
|
1738
|
-
*
|
|
1739
|
-
* @param {string} orgUnitId
|
|
1740
|
-
* @returns {Promise<Object|null>}
|
|
1733
|
+
* 查询单个节点的原生详情
|
|
1734
|
+
* @param {string} orgUnitId
|
|
1735
|
+
* @returns {Promise<Object|null>}
|
|
1741
1736
|
*/
|
|
1742
1737
|
getOrgNodeDetail(orgUnitId) {
|
|
1743
1738
|
return new Promise((resolve) => {
|
|
@@ -1745,13 +1740,12 @@ export default {
|
|
|
1745
1740
|
params: { orgUnitId: orgUnitId }
|
|
1746
1741
|
}).then((res) => {
|
|
1747
1742
|
if (res.data.code === 1 && res.data.data) {
|
|
1748
|
-
// 仅保留原生树结构必需字段(过滤业务冗余字段)
|
|
1749
1743
|
const { orgUnitId, parentOrgUnitId, orgNodeName, orgChildrenList } = res.data.data;
|
|
1750
1744
|
resolve({
|
|
1751
1745
|
orgUnitId,
|
|
1752
1746
|
parentOrgUnitId,
|
|
1753
1747
|
orgNodeName,
|
|
1754
|
-
orgChildrenList: orgChildrenList || []
|
|
1748
|
+
orgChildrenList: orgChildrenList || []
|
|
1755
1749
|
});
|
|
1756
1750
|
} else {
|
|
1757
1751
|
resolve(null);
|
|
@@ -1764,7 +1758,7 @@ export default {
|
|
|
1764
1758
|
},
|
|
1765
1759
|
|
|
1766
1760
|
/**
|
|
1767
|
-
*
|
|
1761
|
+
* 迭代查找节点
|
|
1768
1762
|
* @param {Array} treeData - 树形数据
|
|
1769
1763
|
* @param {string} targetOrgUnitId - 目标节点ID
|
|
1770
1764
|
* @returns {Object|null} 找到的节点
|
|
@@ -1777,7 +1771,6 @@ export default {
|
|
|
1777
1771
|
const queue = [...treeData];
|
|
1778
1772
|
while (queue.length > 0) {
|
|
1779
1773
|
const currentNode = queue.shift();
|
|
1780
|
-
// 兼容子组件可能的字段映射(orgUnitId可能存储在id字段)
|
|
1781
1774
|
const nodeId = currentNode.orgUnitId || currentNode.id || '';
|
|
1782
1775
|
if (nodeId === targetOrgUnitId) {
|
|
1783
1776
|
return currentNode;
|
package/src/organize-tree.vue
CHANGED
|
@@ -201,7 +201,7 @@ export default {
|
|
|
201
201
|
},
|
|
202
202
|
|
|
203
203
|
async loadData(item, callback) {
|
|
204
|
-
//
|
|
204
|
+
// 即使禁用懒加载,也允许加载已有子节点
|
|
205
205
|
if (this.disableLazyLoad) {
|
|
206
206
|
let children = item.orgChildrenList || item.children || [];
|
|
207
207
|
const formattedChildren = this.safeDeepCopy(children).map(child => ({
|
|
@@ -305,7 +305,7 @@ export default {
|
|
|
305
305
|
return;
|
|
306
306
|
}
|
|
307
307
|
|
|
308
|
-
//
|
|
308
|
+
// 单选,清空所有选中状态
|
|
309
309
|
this.clearAllChecked(this.data);
|
|
310
310
|
|
|
311
311
|
const targetList = this.isSingleSelect
|
|
@@ -412,34 +412,27 @@ export default {
|
|
|
412
412
|
}
|
|
413
413
|
return null;
|
|
414
414
|
},
|
|
415
|
-
|
|
415
|
+
|
|
416
416
|
initTree(treeList) {
|
|
417
417
|
// 递归处理节点的内部方法
|
|
418
418
|
const recursiveInitNode = (node) => {
|
|
419
|
-
// 1. 统一节点标题(优先级:orgUnitName > orgNodeName > name > 兜底)
|
|
420
419
|
node.title = node.orgUnitName || node.orgNodeName || node.name || `未命名组织(${node.orgUnitId || node.id || ''})`;
|
|
421
|
-
// 2. 初始化基础字段
|
|
422
420
|
node.loading = false;
|
|
423
421
|
node.expand = false;
|
|
424
422
|
node.checked = false;
|
|
425
|
-
// 3. 关键:无论是否有子节点,先初始化 children 空数组(让 Tree 组件识别可懒加载)
|
|
426
423
|
node.children = node.children || [];
|
|
427
|
-
// 4. 同步 orgChildrenList 和 children(双向绑定,避免字段不一致)
|
|
428
424
|
node.orgChildrenList = node.orgChildrenList || node.children || [];
|
|
429
|
-
// 5. 禁用状态处理
|
|
430
425
|
if (this.disabled) {
|
|
431
426
|
node.disabled = true;
|
|
432
427
|
}
|
|
433
|
-
// 6. 叶子节点判断:如果明确标记为 leafNode,删除 loading 和 children(禁止展开)
|
|
434
428
|
if (node.leafNode) {
|
|
435
429
|
delete node.loading;
|
|
436
430
|
delete node.children;
|
|
437
431
|
delete node.orgChildrenList;
|
|
438
432
|
} else {
|
|
439
|
-
// 7. 非叶子节点:递归处理已有子节点(确保下级节点也完成初始化)
|
|
440
433
|
if (Array.isArray(node.orgChildrenList) && node.orgChildrenList.length > 0) {
|
|
441
434
|
node.children = node.orgChildrenList.map(child => recursiveInitNode(child));
|
|
442
|
-
node.expand = true;
|
|
435
|
+
node.expand = true;
|
|
443
436
|
}
|
|
444
437
|
}
|
|
445
438
|
return node;
|
|
@@ -509,18 +502,16 @@ export default {
|
|
|
509
502
|
flex: 1,
|
|
510
503
|
pointerEvents: 'none',
|
|
511
504
|
userSelect: 'none',
|
|
512
|
-
// 新增:防止文字溢出导致的截断(可选,解决orgUnitId显示不全问题)
|
|
513
505
|
whiteSpace: 'normal',
|
|
514
506
|
wordWrap: 'break-word'
|
|
515
507
|
}
|
|
516
|
-
}, nodeText)
|
|
508
|
+
}, nodeText)
|
|
517
509
|
]);
|
|
518
510
|
},
|
|
519
511
|
collectCurrentCheckedNodes(nodeList) {
|
|
520
512
|
let checkedNodes = [];
|
|
521
513
|
nodeList.forEach(node => {
|
|
522
514
|
if (node.checked) {
|
|
523
|
-
// 强制补全orgUnitId,过滤无效节点
|
|
524
515
|
const nodeId = node.orgUnitId || node.id || '';
|
|
525
516
|
if (nodeId && typeof nodeId === 'string' && nodeId.trim()) {
|
|
526
517
|
const validNode = {
|
|
@@ -551,7 +542,6 @@ export default {
|
|
|
551
542
|
watch: {
|
|
552
543
|
'treeList': {
|
|
553
544
|
handler(val) {
|
|
554
|
-
// 自定义树场景:直接使用父组件传递的树数据,不初始化旧接口
|
|
555
545
|
if (this.isCustomTree || this.isDisableLazyLoad) {
|
|
556
546
|
let tree = this.safeDeepCopy(val);
|
|
557
547
|
this.initTree(tree);
|