Bläddra i källkod

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

TonyKang 8 år sedan
förälder
incheckning
1700af1939
1 ändrade filer med 138 tillägg och 20 borttagningar
  1. 138 20
      public/web/idTree.js

+ 138 - 20
public/web/idTree.js

@@ -121,6 +121,16 @@ var idTree = {
                 };
                 tree.items.splice(0, tree.items.length);
                 addItems(tree.roots);
+            },
+            addUpdateDataForParent: function (datas, nodes, pid) {
+                nodes.forEach(function (node) {
+                    datas.push({type: 'update', data: node.tree.getDataTemplate(node.getID(), pid, node.getNextSiblingID())});
+                });
+            },
+            addUpdateDataForNextSibling: function (datas, node, nid) {
+                if (node) {
+                    datas.push({type: 'update', data: node.tree.getDataTemplate(node.getID(), node.getParentID(), nid)});
+                }
             }
         };
 
@@ -138,9 +148,6 @@ var idTree = {
             this.visible = true;
 
             this.visible = true;
-
-            this.isUpdate = false;
-            this.isNew = false;
         };
 
         Node.prototype.getID = function () {
@@ -156,6 +163,10 @@ var idTree = {
         Node.prototype.firstChild = function () {
             return this.children.length === 0 ? null : this.children[0];
         };
+        Node.prototype.lastChild = function () {
+            return this.children.length === 0 ? null : this.children[this.children.length - 1];
+        };
+
         Node.prototype.depth = function () {
             return this.parent ? this.parent.depth() + 1 : 0;
         };
@@ -175,7 +186,7 @@ var idTree = {
         };
         Node.prototype.siblingIndex = function () {
             return this.parent ? this.parent.children.indexOf(this) : this.tree.roots.indexOf(this);
-        }
+        };
         Node.prototype.posterityCount = function () {
             var iCount = 0;
             if (this.children.length !== 0) {
@@ -230,19 +241,23 @@ var idTree = {
         Node.prototype.canUpLevel = function () {
             return this.parent ? true : false;
         };
-        Node.prototype.canDownLevel = function () {
-            return !this.isFirst();
-        };
-        Node.prototype.canUpMove = function () {
-            return !this.isFirst();
+        Node.prototype.getUpLevelData = function () {
+            var data = [];
+            if (this.canUpLevel()) {
+                if (!this.isLast()) {
+                    tools.addUpdateDataForParent(data, this.parent.children.slice(this.siblingIndex() + 1), this.getID());
+                }
+                if (this.preSibling) {
+                    tools.addUpdateDataForNextSibling(data, this.preSibling, this.tree.setting.rootId);
+                }
+                tools.addUpdateDataForNextSibling(data, this.parent, this.getID());
+                data.push({type: 'update', data: this.tree.getDataTemplate(this.getID(), this.parent.getParentID(), this.parent.getNextSiblingID())});
+            }
+            return data;
         };
-        Node.prototype.canDownMove = function () {
-            return !this.isLast();
-        }
-
         Node.prototype.upLevel = function () {
-            var success = false,
-                iIndex = this.parent.children.indexOf(this), orgParent = this.parent, newNextSibling = this.parent.nextSibling;
+            var result = {success: false, updateDatas: []};
+            var iIndex = this.parent.children.indexOf(this), orgParent = this.parent, newNextSibling = this.parent.nextSibling;
             if (this.canUpLevel) {
                 // NextSiblings become child
                 tools.addNodes(this.tree, this, this.parent.children.slice(iIndex + 1));
@@ -253,9 +268,24 @@ var idTree = {
                 if (!this.expanded) {
                     this.setExpanded(true);
                 }
-                success = true;
+                result.success = true;
             }
-            return success;
+            return result;
+        };
+
+        Node.prototype.canDownLevel = function () {
+            return !this.isFirst();
+        };
+        Node.prototype.getDownLevelData = function () {
+            var data = [];
+            if (this.canDownLevel()) {
+                if (this.preSibling.children.length !== 0) {
+                    tools.addUpdateDataForNextSibling(data, this.preSibling.lastChild(), this.getID());
+                }
+                tools.addUpdateDataForNextSibling(data, this.preSibling, this.getNextSiblingID());
+                data.push({type: 'update', data: this.tree.getDataTemplate(this.getID(), this.preSibling.getID(), this.tree.setting.rootId)});
+            }
+            return data;
         };
         Node.prototype.downLevel = function () {
             var success = false, iIndex = this.parent ? this.parent.children.indexOf(this) : this.tree.roots.indexOf(this);
@@ -270,10 +300,28 @@ var idTree = {
             }
             return success;
         };
+
+        Node.prototype.canUpMove = function () {
+            return !this.isFirst();
+        };
+        Node.prototype.getUpMoveData = function () {
+            var data = [];
+            if (this.canUpMove()) {
+                if (this.preSibling.preSibling) {
+                    tools.addUpdateDataForNextSibling(data, this.preSibling.preSibling, this.getID());
+                }
+                tools.addUpdateDataForNextSibling(data, this.preSibling, this.getNextSiblingID());
+                tools.addUpdateDataForNextSibling(data, this, this.preSibling.getID());
+            }
+            return data;
+        };
         Node.prototype.upMove = function () {
             var success = false;
             var iIndex = this.siblingIndex(), belongArray = this.parent ? this.parent.children : this.tree.roots, orgPre = this.preSibling;
             if (this.canUpMove()) {
+                if (orgPre.preSibling) {
+                    orgPre.preSibling.nextSibling = this;
+                }
                 orgPre.nextSibling = this.nextSibling;
                 this.preSibling = orgPre.preSibling;
                 orgPre.preSibling = this;
@@ -285,10 +333,28 @@ var idTree = {
             }
             return success;
         };
+
+        Node.prototype.canDownMove = function () {
+            return !this.isLast();
+        };
+        Node.prototype.getDownMoveData = function () {
+            var data = [];
+            if (this.canDownMove()) {
+                if (this.preSibling) {
+                    tools.addUpdateDataForNextSibling(data, this.preSibling, this.nextSibling.getID());
+                }
+                tools.addUpdateDataForNextSibling(data, this, this.nextSibling.getNextSiblingID());
+                tools.addUpdateDataForNextSibling(data, this.nextSibling, this.getID());
+            }
+            return data;
+        };
         Node.prototype.downMove = function () {
             var success = false;
             var iIndex = this.siblingIndex(), belongArray = this.parent ? this.parent.children : this.tree.roots, orgNext = this.nextSibling;
             if (this.canDownMove()) {
+                if (this.preSibling) {
+                    this.preSibling.nextSibling = orgNext;
+                }
                 orgNext.preSibling = this.preSibling;
                 this.nextSibling = orgNext.nextSibling;
                 orgNext.nextSibling = this;
@@ -299,7 +365,7 @@ var idTree = {
                 success = true;
             }
             return success;
-        }
+        };
 
         var Tree = function (setting) {
             this.nodes = {};
@@ -313,6 +379,14 @@ var idTree = {
             this.eventType = _eventType;
         };
 
+        Tree.prototype.getDataTemplate = function (id, pid, nid) {
+            var data = {};
+            data[this.setting.id] = id;
+            data[this.setting.pid] = pid;
+            data[this.setting.nid] = nid;
+            return data;
+        };
+
         Tree.prototype.maxNodeID = (function () {
             var maxID = 0;
             return function (ID) {
@@ -420,10 +494,36 @@ var idTree = {
             }
             return node;
         };
+        Tree.prototype.getInsertData = function (parentID, nextSiblingID) {
+            var data = [];
+            var newID = this.newNodeID();
+            var parent = parentID === -1 ? null : this.nodes[this.prefix + parentID];
+            var nextSibling = nextSiblingID === -1 ? null: this.nodes[this.prefix + nextSiblingID];
+            if (newID !== -1) {
+                data.push({type: 'new', data: this.getDataTemplate(newID, parentID, nextSiblingID)});
+
+                if (nextSibling && nextSibling.preSibling) {
+                    tools.addUpdateDataForNextSibling(data, nextSibling.preSibling, newID);
+                } else if (parent && parent.childrent.length !== 0) {
+                    tools.addUpdateDataForNextSibling(data, parent.lastChild(), newID);
+                } else if (!parent && this.roots.length !== 0) {
+                    tools.addUpdateDataForNextSibling(data, this.roots[this.roots.length - 1], newID);
+                }
+            }
+            return data;
+        };
+
         Tree.prototype.delete = function (node) {
-            var success = false;
+            var success = false, that = this;
+            var deleteIdIndex = function (nodes) {
+                nodes.forEach(function (node) {
+                    delete that.nodes[that.prefix + node.getID()];
+                    deleteIdIndex(node.children);
+                })
+            }
             if (node) {
-                delete this.nodes[this.prefix + node.getID()];
+                deleteIdIndex([node]);
+                //delete this.nodes[this.prefix + node.getID()];
                 if (node.preSibling) {
                     node.preSibling.nextSibling = node.nextSibling;
                 }
@@ -440,6 +540,24 @@ var idTree = {
             }
             return success;
         };
+        Tree.prototype.getDeleteData = function (node) {
+            var data = [];
+            var addUpdateDataForDelete = function (datas, nodes) {
+                nodes.forEach(function (node) {
+                    var delData = {};
+                    delData[node.tree.setting.id] = node.getID();
+                    datas.push({type: 'delete', data: delData});
+                    addUpdateDataForDelete(datas, node.children);
+                })
+            };
+            if (node) {
+                addUpdateDataForDelete(data, [node]);
+                if (node.preSibling) {
+                    tools.addUpdateDataForNextSibling(data, node.preSibling, node.getNextSiblingID());
+                }
+            }
+            return data;
+        }
 
         /*Tree.prototype.editedData = function (field, id, newText) {
             var node = this.findNode(id), result = {allow: false, nodes: []};