Pārlūkot izejas kodu

code supplement/revamp for zTree

TonyKang 8 gadi atpakaļ
vecāks
revīzija
dcad29cc6c

+ 22 - 0
modules/rationRepository/controllers/repositoryGljController.js

@@ -13,6 +13,28 @@ module.exports ={
             callback(req,res,err, 'Get Tree', data)
         });
     },
+    createNewGljTypeNode: function(req, res) {
+        var repId = req.body.repositoryId;
+        var lastNodeId = req.body.lastNodeId;
+        var nodeData = JSON.parse(req.body.rawNodeData);
+        gljRepository.createNewNode(repId, lastNodeId, nodeData, function(err, msg, data){
+            callback(req,res,err,msg, data)
+        });
+    },
+    updateGljNodes: function(req, res) {
+        var nodes = JSON.parse(req.body.nodes);
+        gljRepository.updateNodes(nodes, function(err,results){
+            callback(req,res, err, results)
+        });
+    },
+    deleteGljNodes: function(req, res) {
+        var nodes = JSON.parse(req.body.nodes);
+        var preNodeId = req.body.preNodeId;
+        var preNodeNextId = req.body.preNodeNextId;
+        gljRepository.removeNodes(nodes, preNodeId, preNodeNextId, function(err,results){
+            callback(req,res, err, results)
+        });
+    },
     getGljItems: function(req, res) {
         var repId = req.body.repositoryId,
             gljType = req.body.type,

+ 59 - 1
modules/rationRepository/models/gljRepository.js

@@ -14,7 +14,8 @@ var gljTypeSchema = mongoose.Schema({
     ID: Number,
     ParentID: Number,
     NextSiblingID: Number,
-    Name: String
+    Name: String,
+    isDeleted: Boolean
 });
 
 var gljSchema = mongoose.Schema({
@@ -150,5 +151,62 @@ gljItemDAO.prototype.updateGljItems = function(repId, items, callback) {
     });
 };
 
+gljItemDAO.prototype.updateNodes = function(nodes, callback) {
+    var functions = [];
+    for (var i=0; i < nodes.length; i++) {
+        functions.push((function(doc) {
+            return function(cb) {
+                gljTypeModel.update({ID: doc.ID}, doc, cb);
+            };
+        })(nodes[i]));
+    }
+    async.parallel(functions, function(err, results) {
+        callback(err, results);
+    });
+};
+gljItemDAO.prototype.removeNodes =  function(nodeIds, preNodeId, preNodeNextId, callback){
+    var functions = [];
+    if (preNodeId != -1) {
+        functions.push((function(nodeId, nextId) {
+            return function(cb) {
+                gljTypeModel.update({ID: nodeId}, {"NextSiblingID": nextId}, cb);
+            };
+        })(preNodeId, preNodeNextId));
+    }
+    for (var i=0; i < nodeIds.length; i++) {
+        functions.push((function(nodeId) {
+            return function(cb) {
+                gljTypeModel.update({ID: nodeId}, {"isDeleted": true}, cb);
+            };
+        })(nodeIds[i]));
+    }
+    async.parallel(functions, function(err, results) {
+        callback(err, results);
+    });
+};
+
+gljItemDAO.prototype.createNewNode = function(repId, lastNodeId, nodeData, callback) {
+    return counter.counterDAO.getIDAfterCount(counter.moduleName.GLJ, 1, function(err, result){
+        nodeData.repositoryId = repId;
+        nodeData.ID = result.value.sequence_value;
+        var node = new gljTypeModel(nodeData);
+        node.save(function (err, result) {
+            if (err) {
+                callback(true, "章节树ID错误!", false);
+            } else {
+                if (lastNodeId > 0) {
+                    gljTypeModel.update({ID: lastNodeId}, {"NextSiblingID": nodeData.ID}, function(err, rst){
+                        if (err) {
+                            callback(true, "章节树ID错误!", false);
+                        } else {
+                            callback(false, '', result);
+                        }
+                    });
+                } else callback(false, '', result);
+            }
+        });
+    });
+};
+
 module.exports = new gljItemDAO();
 

+ 3 - 0
modules/rationRepository/routes/rationRepRoutes.js

@@ -24,6 +24,9 @@ apiRouter.post("/deleteNodes",rationChapterTreeController.deleteNodes);
 apiRouter.post("/getRationItems",rationController.getRationItemsBySection);
 apiRouter.post("/mixUpdateRationItems",rationController.mixUpdateRationItems);
 
+apiRouter.post("/createNewGljTypeNode",repositoryGljController.createNewGljTypeNode);
+apiRouter.post("/updateGljNodes",repositoryGljController.updateGljNodes);
+apiRouter.post("/deleteGljNodes",repositoryGljController.deleteGljNodes);
 apiRouter.post("/getGljTree",repositoryGljController.getGljTree);
 apiRouter.post("/getGljItems",repositoryGljController.getGljItems);
 apiRouter.post("/mixUpdateGljItems",repositoryGljController.mixUpdateGljItems);

+ 5 - 3
web/rationLibEditor/dinge.html

@@ -50,7 +50,7 @@
                           -->
                           <a onclick="zTreeOprObj.addRootNode()" class="btn btn-secondary btn-sm">增加根节点</a>
                       </div>
-                    <div id="rct_right_key" class="tab-content">
+                    <div class="tab-content">
                       <ul id="rationChapterTree" class="ztree"></ul>
                     </div>
                   </div>
@@ -866,6 +866,7 @@
   	<script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
     <script type="text/javascript" src="/lib/ztree/jquery.ztree.exedit.js"></script>
     <script type="text/javascript" src="/web/rationLibEditor/js/chapterTree.js"></script>
+    <script type="text/javascript" src="/web/rationLibEditor/js/zTreeCommon.js"></script>
     <script type="text/javascript" src="/web/rationLibEditor/js/sheetCommon.js"></script>
     <script type="text/javascript" src="/web/rationLibEditor/js/ration.js"></script>
     <script type="text/javascript" src="/web/rationLibEditor/js/rationGLJ.js"></script>
@@ -883,7 +884,9 @@
                 enable: true,
                 editNameSelectAll: true,
                 showRemoveBtn: true,
-                showRenameBtn: true
+                showRenameBtn: true,
+                removeTitle: "remove",
+                renameTitle: "rename"
             },
             data: {
                 keep: {
@@ -902,7 +905,6 @@
             },
             callback:{
                 onClick: zTreeOprObj.onClick,
-                beforeDrag: zTreeOprObj.beforeDrag,
                 beforeRename: zTreeOprObj.beforeRename,
                 beforeRemove: zTreeOprObj.onBeforeRemove,
                 onRemove: zTreeOprObj.onRemove,

+ 20 - 3
web/rationLibEditor/gongliao.html

@@ -178,14 +178,27 @@
     <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
   	<script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
   	<script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
+    <script type="text/javascript" src="/lib/ztree/jquery.ztree.exedit.js"></script>
     <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
     <script type="text/javascript" src="/public/QueryParam.js"></script>
     <script type="text/javascript" src="/web/rationLibEditor/js/repositoryGLJ.js"></script>
+    <script type="text/javascript" src="/web/rationLibEditor/js/zTreeCommon.js"></script>
     <script type="text/javascript" src="/web/rationLibEditor/js/sheetCommon.js"></script>
     <script type="text/javascript">
-        var setting = {
+        var gljSetting = {
             view: {
-                showIcon: true
+                addHoverDom: gljTypeTreeOprObj.addHoverDom,
+                removeHoverDom: gljTypeTreeOprObj.removeHoverDom,
+                expandSpeed: "",
+                selectedMulti: false
+            },
+            edit: {
+                enable: true,
+                editNameSelectAll: true,
+                showRemoveBtn: true,
+                showRenameBtn: true,
+                removeTitle: "删除节点",
+                renameTitle: "更改名称"
             },
             data: {
                 keep: {
@@ -204,7 +217,11 @@
                 }
             },
             callback:{
-                onClick: repositoryGljObj.onClick,
+                beforeRename: gljTypeTreeOprObj.beforeRename,
+                onRename: gljTypeTreeOprObj.onRename,
+                beforeRemove: gljTypeTreeOprObj.onBeforeRemove,
+                onRemove: gljTypeTreeOprObj.onRemove,
+                onClick: gljTypeTreeOprObj.onClick
             }
         };
   	</script>

+ 2 - 10
web/rationLibEditor/js/chapterTree.js

@@ -28,7 +28,7 @@ var zTreeOprObj = {
             timeout:20000,
             success:function(result,textStatus,status){
                 if(status.status == 200) {
-                    me.createRationTree(result.data);
+                    zTreeHelper.createTree(result.data, setting, "rationChapterTree", me);
                 }
             },
             error:function(err){
@@ -36,11 +36,6 @@ var zTreeOprObj = {
             }
         })
     },
-    createRationTree: function(sourceData){
-        var me = zTreeOprObj, treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
-        me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, treeArr);
-        me.treeObj.expandAll(true);
-    },
     addRootNode: function() {
         var me = zTreeOprObj, rawNode = {ParentID: -1, NextSiblingID: -1, name: "新增节点"}, lastNodeId = -1;
         if (me.treeObj) {
@@ -131,9 +126,6 @@ var zTreeOprObj = {
             //me.treeObj.updateNode(pNode, false); //这方法有后遗症,多次操作后会造成节点新增子节点时,父节点icon显示不正确
         }
     },
-    beforeDrag: function(treeId, treeNodes) {
-        return false;
-    },
     updateNodes: function(nodes){
         if (nodes && nodes.length > 0) {
             var reqData = []
@@ -167,7 +159,7 @@ var zTreeOprObj = {
         var me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
         //if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0||(treeNode.level==2)) return;
         if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
-        var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='add node' onfocus='this.blur();'></span>";
+        var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
         sObj.after(addStr);
         var btn = $("#addBtn_"+treeNode.tId);
         if (btn) btn.bind("click", function(){

+ 152 - 19
web/rationLibEditor/js/repositoryGLJ.js

@@ -25,10 +25,10 @@ var pageOprObj = {
 repositoryGljObj = {
     treeObj : null,
     workBook: null,
-    gljAllTypeId: -1,
     gljCurTypeId: -1,
     currentRepositoryId: -1,
     currentCache: null,
+    parentNodeIds: {},
     gljList: [],
     setting: {
         header:[
@@ -58,16 +58,9 @@ repositoryGljObj = {
             timeout:20000,
             success:function(result,textStatus,status){
                 if(status.status == 200) {
-                    me.createTree(result.data);
-                    //me.gljAllTypeId
+                    zTreeHelper.createTree(result.data, gljSetting, "repositoryTree", me);
                     if (result.data && result.data.length > 0) {
-                        for (var i = 0; i < result.data.length; i++) {
-                            if (result.data[i].Name === "全部") {
-                                me.gljAllTypeId = result.data[i].ID;
-                                me.gljCurTypeId = me.gljAllTypeId;
-                                break;
-                            }
-                        }
+                        me.gljCurTypeId = result.data[0].ID;
                         if (callback) {
                             var repId = -1;
                             repId = result.data[0].repositoryId;
@@ -81,11 +74,6 @@ repositoryGljObj = {
             }
         })
     },
-    createTree : function(sourceData){
-        var me = repositoryGljObj, treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
-        me.treeObj = $.fn.zTree.init($("#repositoryTree"), setting, treeArr);
-        me.treeObj.expandAll(true);
-    },
     getGljItems: function(repId) {
         var me = this;
         me.currentRepositoryId = repId;
@@ -112,8 +100,11 @@ repositoryGljObj = {
         var me = repositoryGljObj;
         if (me.workBook) {
             var cacheSection = [];
+            var pArr = me.parentNodeIds["_pNodeId_" + type];
             for (var i = 0; i < data.length; i++) {
-                if (type == me.gljAllTypeId || type == data[i].gljType) {
+                if (pArr && pArr.indexOf(data[i].gljType) >= 0) {
+                    cacheSection.push(data[i]);
+                } else if (type == data[i].gljType) {
                     cacheSection.push(data[i]);
                 }
             }
@@ -190,7 +181,7 @@ repositoryGljObj = {
     },
     onClipboardPasting: function(sender, args) {
         var me = repositoryGljObj;
-        if (args.cellRange.colCount != me.setting.header.length || me.gljCurTypeId < 0 || me.gljAllTypeId === me.gljCurTypeId) {
+        if (args.cellRange.colCount != me.setting.header.length || me.gljCurTypeId < 0 || me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
             args.cancel = true;
         }
     },
@@ -239,7 +230,7 @@ repositoryGljObj = {
                 }
             },
             error:function(err){
-                alert(err.responseJSON.error);
+                alert("保存失败");
             }
         })
     },
@@ -296,12 +287,154 @@ repositoryGljObj = {
             else if (a.code < b.code) rst = -1;
             return rst;
         });
-    },
+    }
+}
+
+var gljTypeTreeOprObj = {
     onClick: function(event,treeId,treeNode) {
         var me = repositoryGljObj,
             gljTypeId = treeNode.ID;
         me.gljCurTypeId = treeNode.ID;
         me.currentCache = me.getCache();
         me.showGljItems(me.gljList, gljTypeId);
+        if (me.parentNodeIds["_pNodeId_" + treeNode.ID]) {
+            sheetCommonObj.shieldAllCells(me.workBook.getSheet(0), me.setting);
+        } else {
+            sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
+        }
+    },
+    beforeRename: function(treeId, treeNode, newName, isCancel) {
+        if (newName.length == 0) {
+            return false;
+        }
+        return true;
+    },
+    onRename : function(e, treeId, treeNode, isCancel) {
+        var nodes = [];
+        nodes.push(treeNode);
+        gljTypeTreeOprObj.updateNodes(nodes);
+    },
+    onBeforeRemove: function(treeId, treeNode){
+        if (treeNode.ParentID == -1 && treeNode.isFirstNode) {
+            alert("不允许删除全部!");
+            return false;
+        }
+        if (!confirm("您确定要删除此节点及所有子节点的数据?删除后不可恢复!")) {
+            return false;
+        }
+        var nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
+        if (preNode) {
+            preNodeId = preNode.ID;
+        }
+        private_fetchAllSubItems = function(pItem){
+            nodeIds.push(pItem.ID);
+            if (pItem.items && pItem.items.length > 0) {
+                for (var i = 0; i < pItem.items.length; i++) {
+                    private_fetchAllSubItems(pItem.items[i]);
+                }
+            }
+        };
+        nodeIds.push(treeNode.ID);
+        for (var i = 0; i < treeNode.items.length; i++) {
+            private_fetchAllSubItems(treeNode.items[i]);
+        }
+        $.ajax({
+            type:"POST",
+            url:"api/deleteGljNodes",
+            data:{"nodes": JSON.stringify(nodeIds), "preNodeId": preNodeId, "preNodeNextId": treeNode.NextSiblingID},
+            dataType:"json",
+            cache:false,
+            timeout:5000,
+            success:function(result,textStatus,status){
+                var pNode = treeNode.getParentNode();
+                if (pNode && pNode.items && pNode.items.length == 1) {
+                    pNode.isParent = false;
+                }
+            },
+            error:function(){
+            }
+        });
+        return true;
+    },
+    onRemove: function(e, treeId, treeNode){
+        var me = repositoryGljObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
+        if (pNode && pNode.items && pNode.items.length == 0) {
+            pNode.isParent = false;
+            me.treeObj.refresh();
+        }
+    },
+    updateNodes: function(nodes){
+        if (nodes && nodes.length > 0) {
+            var reqData = []
+            for (var i = 0; i < nodes.length; i++) {
+                var node = {};
+                node.repositoryId = nodes[i].repositoryId;
+                node.ID = nodes[i].ID;
+                node.ParentID = nodes[i].ParentID;
+                node.NextSiblingID = nodes[i].NextSiblingID;
+                node.Name = nodes[i].Name;
+                if (nodes[i].__v != null) node.__v = nodes[i].__v + 1
+                else node.__v = 0;
+                reqData.push(node);
+            }
+            $.ajax({
+                type:"POST",
+                url:"api/updateGljNodes",
+                data:{"nodes": JSON.stringify(reqData)},
+                dataType:"json",
+                cache:false,
+                timeout:5000,
+                success:function(result,textStatus,status){
+                    console.log(status + ' : ' + result);
+                },
+                error:function(){
+                }
+            })
+        }
+    },
+    addNewNode : function(rawNode, lastNodeId, callback){
+        $.ajax({
+            type:"POST",
+            url:"api/createNewGljTypeNode",
+            data:{"repositoryId": repositoryGljObj.currentRepositoryId,"lastNodeId": lastNodeId, "rawNodeData": JSON.stringify(rawNode)},
+            dataType:"json",
+            cache:false,
+            timeout:1000,
+            success: function(result,textStatus,status){
+                callback(false, result);
+            },
+            error:function(err){
+                callback(err);
+            }
+        })
+    },
+    addHoverDom: function(treeId, treeNode) {
+        var me = repositoryGljObj, sObj = $("#" + treeNode.tId + "_span");
+        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
+        var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
+        sObj.after(addStr);
+        var btn = $("#addBtn_"+treeNode.tId);
+        if (btn) btn.bind("click", function(){
+            var rawNode = {ParentID: treeNode.ID, NextSiblingID: -1, Name: "新增子节点"}, lastNodeId = -1;
+            if (treeNode.items.length > 0) {
+                lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
+            }
+            gljTypeTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
+                if (!(err)) {
+                    var newNodes = [], isSilent = false;
+                    newNodes.push({ repositoryId: rst.data.repositoryId, ID: rst.data.ID, ParentID: rst.data.ParentID, NextSiblingID:-1, Name:"新增子节点",isParent:false, items:[]});
+                    treeNode.isParent = true;
+                    if (me.treeObj) {
+                        me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
+                    } else {
+                        me.treeObj = $.fn.zTree.init($("#rationChapterTree"), gljSetting, newNodes);
+                    }
+                }
+            });
+        });
+    },
+    removeHoverDom: function(treeId, treeNode) {
+        $("#addBtn_"+treeNode.tId).unbind().remove();
     }
+
 }

+ 27 - 0
web/rationLibEditor/js/zTreeCommon.js

@@ -0,0 +1,27 @@
+/**
+ * Created by Tony on 2017/5/12.
+ */
+zTreeHelper = {
+    createTree: function(sourceData, setting, containerId, caller){
+        var treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
+        var private_build_parentNodeIds = function(pNodeId, nodesArr){
+            var rst = [];
+            for (var i = 0; i < nodesArr.length; i++) {
+                if (nodesArr[i].items.length > 0) {
+                    rst = rst.concat(private_build_parentNodeIds(nodesArr[i].ID, nodesArr[i].items));
+                } else {
+                    rst.push(nodesArr[i].ID);
+                }
+            }
+            if (pNodeId && rst.length > 0) {
+                caller.parentNodeIds["_pNodeId_" + pNodeId] = rst;
+            }
+            return rst;
+        };
+        if (caller.parentNodeIds) {
+            private_build_parentNodeIds(null, treeArr);
+        }
+        caller.treeObj = $.fn.zTree.init($("#" + containerId), setting, treeArr);
+        caller.treeObj.expandAll(true);
+    }
+}