Explorar o código

项目管理收起节点操作的显示问题

1.使用“复制到”功能,A建设项目下将某分段文件复制到B建设项目下,显示有问题 ok
2. 降级到收起节点位置时,展开收起的节点 ok
vian %!s(int64=6) %!d(string=hai) anos
pai
achega
7f928ba457
Modificáronse 2 ficheiros con 47 adicións e 11 borrados
  1. 21 11
      web/building_saas/pm/js/pm_newMain.js
  2. 26 0
      web/building_saas/pm/js/pm_tree.js

+ 21 - 11
web/building_saas/pm/js/pm_newMain.js

@@ -559,7 +559,8 @@ const projTreeObj = {
         selected.nextSibling ? downMove.removeClass('disabled') : downMove.addClass('disabled');
 
     },
-    doAfterTreeOpr: function ({selected, parent, next, projectMap}) {
+    doAfterTreeOpr: function ({selected, parent, next, projectMap}, action) {
+        const me = this;
         $.bootstrapLoading.start();
         moveProjects({"user_id": userID, rootProjectID: null, projectMap: projectMap, feeRateMap: {}, unitPriceMap: {}},function (result) {
             for (let key in result) {//更新前端节点数据
@@ -571,7 +572,7 @@ const projTreeObj = {
                     }
                 }
             }
-            projTreeObj.moveTo(selected, null, parent, next, null);
+            projTreeObj.moveTo(selected, null, parent, next, null, action);
             $.bootstrapLoading.end();
         });
     },
@@ -597,8 +598,8 @@ const projTreeObj = {
             parent = null,
             next = null,
             projectMap = {};
-        const folderLevel = getFolderLevel(selected);
-        if (folderLevel === 3) {
+        const maxFolderLevel = getMaxFolderLevel(selected);
+        if (maxFolderLevel === 3) {
             return alert('文件夹不能超过3层');
         }
         //更新前兄弟节点
@@ -612,7 +613,7 @@ const projTreeObj = {
         }
         //更新选中节点
         projectMap[selected.id()] = {query: {ID: selected.id()}, update: {ParentID: orgPre.id(), NextSiblingID: -1}};
-        this.doAfterTreeOpr({selected, parent, next, projectMap});
+        this.doAfterTreeOpr({selected, parent, next, projectMap}, 'downLevel');
     },
     upMove: function () {
         let selected = projTreeObj.tree.selected,
@@ -1471,9 +1472,6 @@ const projTreeObj = {
         data.oldFileIDs = _.uniq(oldFileIDs);
         socket.emit('multiFileChangeNotify', data);
     },
-    checkFileName:async function (fileID,name,type) {
-        let node = this.tree.selected;
-    },
 
     insert: function (data, parent, next) {
         let preNode = this.tree.items[this.preSelection.row];
@@ -1495,9 +1493,11 @@ const projTreeObj = {
             sheet.setSelection(rIdx, cIdx, 1, 1);
             me.tree.selected = node;
             //父节点收起时添加子节点,子节点添加完后隐藏
-            if(node.parent && !node.parent.expanded){
+            /*if(node.parent && !node.parent.getRootExpandState()){
                 sheet.setRowVisible(rIdx, false);
-            }
+            }*/
+            // 添加节点自动展开相关的隐藏节点
+            me.tree.setNodesExpanded(node.getCollapseParents(), sheet);
             sheet.getCell(rIdx, 0).cellType(me.getTreeNodeCell(me.tree));
             me.refreshNodeData(node);
         });
@@ -1514,7 +1514,7 @@ const projTreeObj = {
         this.workBook.getActiveSheet().deleteRows(orgRow, 1);
         this.addRow(this.tree.items[newRow]);
     },
-    moveTo : function(select,target,parent,next,oldProject){
+    moveTo : function(select,target,parent,next,oldProject,action){
         let me = this;
         let fromRow = select.serialNo();
         let rCout = select.posterityCount() + 1;//删除的行数
@@ -1544,6 +1544,9 @@ const projTreeObj = {
             refreshNodes = refreshNodes.concat(newNodes);
             me.refreshNodeData(refreshNodes);
         });
+        if (action === 'downLevel') {
+            me.tree.setNodesExpanded([parent], sheet);
+        }
 
         function addNewNodes(node,parent,next) {
             const nodeState = {};
@@ -3843,6 +3846,13 @@ function getFolderLevel(selected) {
     return level;
 }
 
+// 选中节点及其子项最大文件夹层数
+function getMaxFolderLevel(selected) {
+    const nodes = [selected, ...selected.getAllChildren()];
+    const levels = nodes.map(node => getFolderLevel(node));
+    return Math.max(...levels);
+}
+
 //判断是否是三层文件夹以内
 function withinTreble(selectedItem){
     let rst;

+ 26 - 0
web/building_saas/pm/js/pm_tree.js

@@ -121,6 +121,17 @@ const pmTree = {
                     _view._hideNodes(this.children);
                 }
             };
+            Node.prototype.getCollapseParents = function () {
+                const rst = [];
+                let parent = this.parent;
+                while (parent && parent.data) {
+                    if (!parent.expanded) {
+                        rst.push(parent);
+                    }
+                    parent = parent.parent;
+                }
+                return rst;
+            };
             Node.prototype.serialNo = function () {
                 return this.tree.items.indexOf(this);
             };
@@ -437,6 +448,21 @@ const pmTree = {
                 }
             };
 
+            Tree.prototype.setNodesExpanded = function (nodes, sheet) {
+                TREE_SHEET_HELPER.massOperationSheet(sheet, () => {
+                    nodes.forEach(node => {
+                        node.setExpanded(true);
+                        const index = node.serialNo();
+                        const count = node.posterityCount();
+                        for (let i = 0; i < count; i++) {
+                            const row = index + i;
+                            const child = this.items[row + 1];
+                            sheet.setRowVisible(row + 1, child.visible);
+                        }
+                    });
+                });
+            };
+
             return Tree;
         })()