|
@@ -1,470 +0,0 @@
|
|
|
-/**
|
|
|
- * Created by Mai on 2017/3/17.
|
|
|
- */
|
|
|
-var idTree = {
|
|
|
- createNew: function (setting) {
|
|
|
- var _setting = {
|
|
|
- id: 'id',
|
|
|
- pid: 'pid',
|
|
|
- nid: 'nid',
|
|
|
- rootId: -1
|
|
|
- };
|
|
|
-
|
|
|
- var _eventType = {
|
|
|
- editedData: 'editedData'
|
|
|
- };
|
|
|
-
|
|
|
- var tools = {
|
|
|
- findNode: function (nodes, check) {
|
|
|
- for (var i = 0; i < nodes.length; i++) {
|
|
|
- if (check(nodes[i])) {
|
|
|
- return nodes[i];
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
- },
|
|
|
- reSortNodes: function (nodes, recursive) {
|
|
|
- var temp = [], first;
|
|
|
- var findFirstNode = function (nodes) {
|
|
|
- return tools.findNode(nodes, function (node) {
|
|
|
- return node.preSibling === null;
|
|
|
- });
|
|
|
- };
|
|
|
- var moveNode = function (node, orgArray, newArray, newIndex) {
|
|
|
- var next;
|
|
|
- orgArray.splice(orgArray.indexOf(node), 1);
|
|
|
- newArray.splice(newIndex, 0, node);
|
|
|
- if (node.getNextSiblingID() !== -1) {
|
|
|
- next = node.nextSibling;
|
|
|
- if (next && (orgArray.indexOf(next) >= 0)) {
|
|
|
- moveNode(next, orgArray, newArray, newIndex + 1);
|
|
|
- }
|
|
|
- }
|
|
|
- };
|
|
|
- if (nodes.length === 0) {
|
|
|
- return nodes;
|
|
|
- }
|
|
|
- if (recursive) {
|
|
|
- nodes.forEach(function (node) {
|
|
|
- node.children = tools.reSortNodes(node.children, recursive);
|
|
|
- });
|
|
|
- }
|
|
|
- while (nodes.length > 0) {
|
|
|
- first = findFirstNode(nodes);
|
|
|
- first = first ? first : nodes[0];
|
|
|
- moveNode(first, nodes, temp, temp.length);
|
|
|
- }
|
|
|
- nodes = null;
|
|
|
- tools.reSiblingNodes(temp);
|
|
|
- return temp;
|
|
|
- },
|
|
|
- reSiblingNodes: function (nodes) {
|
|
|
- var i;
|
|
|
- for (i = 0; i < nodes.length; i++) {
|
|
|
- nodes[i].preSibling = (i === 0) ? null : nodes[i - 1];
|
|
|
- nodes[i].nextSibling = (i === nodes.length - 1) ? null : nodes[i + 1];
|
|
|
- }
|
|
|
- },
|
|
|
- // ��nodes�У���iIndex����������ʼȫ���Ƴ�
|
|
|
- removeNodes: function (tree, parent, iIndex, count) {
|
|
|
- var children = parent ? parent.children : tree.roots;
|
|
|
- var pre = (iIndex < 0 || iIndex >= children.length) ? null : children[iIndex].preSibling;
|
|
|
- var next = (pre && iIndex + count - 1 < children.length) ? children[iIndex + count] : null;
|
|
|
- if (pre) {
|
|
|
- pre.nextSibling = next;
|
|
|
- }
|
|
|
- if (next) {
|
|
|
- next.preSibling = pre;
|
|
|
- }
|
|
|
- if (arguments.length === 4) {
|
|
|
- children.splice(iIndex, count);
|
|
|
- } else {
|
|
|
- children.splice(iIndex, children.length - iIndex);
|
|
|
- }
|
|
|
- },
|
|
|
- // ��nodes������addNodes, λ�ô�index��ʼ
|
|
|
- addNodes: function (tree, parent, nodes, iIndex) {
|
|
|
- var children = parent ? parent.children : tree.roots;
|
|
|
- var pre, next, i;
|
|
|
- if (nodes.length === 0) { return; }
|
|
|
- if (arguments.length === 4) {
|
|
|
- pre = (iIndex <= 0 || iIndex > children.length) ? null : children[iIndex - 1];
|
|
|
- next = pre ? pre.nextSibling : null;
|
|
|
- } else if (arguments.length === 3) {
|
|
|
- pre = children.length === 0 ? null : children[children.length - 1];
|
|
|
- next = null;
|
|
|
- }
|
|
|
- if (pre) {
|
|
|
- pre.nextSibling = nodes[0];
|
|
|
- }
|
|
|
- nodes[0].preSibling = pre;
|
|
|
- if (next) {
|
|
|
- next.preSibling = nodes[nodes.length - 1];
|
|
|
- }
|
|
|
- nodes[nodes.length - 1].nextSibling = next;
|
|
|
- for (i = 0; i < nodes.length; i++) {
|
|
|
- if (arguments.length === 4) {
|
|
|
- children.splice(iIndex + i, 0, nodes[i]);
|
|
|
- } else if (arguments.length === 3) {
|
|
|
- children.push(nodes[i]);
|
|
|
- }
|
|
|
- nodes[i].parent = parent;
|
|
|
- }
|
|
|
- },
|
|
|
- sortTreeItems: function (tree) {
|
|
|
- var addItems = function (items) {
|
|
|
- var i;
|
|
|
- for (i = 0; i < items.length; i++) {
|
|
|
- tree.items.push(items[i]);
|
|
|
- addItems(items[i].children);
|
|
|
- }
|
|
|
- };
|
|
|
- tree.items.splice(0, tree.items.length);
|
|
|
- addItems(tree.roots);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- var Node = function (tree, data) {
|
|
|
- // ���µ����ԣ�����Ԫ�������ֱ����
|
|
|
- this.tree = tree;
|
|
|
- this.data = data;
|
|
|
- this.children = [];
|
|
|
-
|
|
|
- this.parent = null;
|
|
|
- this.nextSibling = null;
|
|
|
- this.preSibling = null;
|
|
|
-
|
|
|
- this.expanded = true;
|
|
|
- this.visible = true;
|
|
|
-
|
|
|
- this.visible = true;
|
|
|
-
|
|
|
- this.isUpdate = false;
|
|
|
- this.isNew = false;
|
|
|
- };
|
|
|
-
|
|
|
- Node.prototype.getID = function () {
|
|
|
- return this.data[this.tree.setting.id];
|
|
|
- };
|
|
|
- Node.prototype.getParentID = function () {
|
|
|
- return this.parent ? this.parent.getID() : -1;
|
|
|
- };
|
|
|
- Node.prototype.getNextSiblingID = function () {
|
|
|
- return this.nextSibling ? this.nextSibling.getID() : -1;
|
|
|
- };
|
|
|
-
|
|
|
- Node.prototype.firstChild = function () {
|
|
|
- return this.children.length === 0 ? null : this.children[0];
|
|
|
- };
|
|
|
- Node.prototype.depth = function () {
|
|
|
- return this.parent ? this.parent.depth() + 1 : 0;
|
|
|
- };
|
|
|
- Node.prototype.isFirst = function () {
|
|
|
- if (this.parent) {
|
|
|
- return this.parent.children.indexOf(this) === 0 ? true : false;
|
|
|
- } else {
|
|
|
- return this.tree.roots.indexOf(this) === 0 ? true : false;
|
|
|
- }
|
|
|
- };
|
|
|
- Node.prototype.isLast = function () {
|
|
|
- if (this.parent) {
|
|
|
- return this.parent.children.indexOf(this) === this.parent.children.length - 1 ? true : false;
|
|
|
- } else {
|
|
|
- return this.tree.roots.indexOf(this) === this.tree.roots.length - 1 ? true : false;
|
|
|
- }
|
|
|
- };
|
|
|
- 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) {
|
|
|
- iCount += this.children.length;
|
|
|
- this.children.forEach(function (child) {
|
|
|
- iCount += child.posterityCount();
|
|
|
- });
|
|
|
- }
|
|
|
- return iCount;
|
|
|
- /*return (node.children.length === 0) ? 0 : node.children.reduce(function (x, y) {
|
|
|
- return x.posterityCount() + y.posterityCount();
|
|
|
- }) + node.children.count;*/
|
|
|
- };
|
|
|
-
|
|
|
- Node.prototype.setExpanded = function (expanded) {
|
|
|
- var setNodesVisible = function (nodes, visible) {
|
|
|
- nodes.forEach(function (node) {
|
|
|
- node.visible = visible;
|
|
|
- setNodesVisible(node.children, visible && node.expanded);
|
|
|
- })
|
|
|
- };
|
|
|
- this.expanded = expanded;
|
|
|
- setNodesVisible(this.children, expanded);
|
|
|
- };
|
|
|
- /*Node.prototype.vis = function () {
|
|
|
- return this.parent ? this.parent.vis() && this.parent.expanded() : true;
|
|
|
- };*/
|
|
|
- Node.prototype.serialNo = function () {
|
|
|
- return this.tree.items.indexOf(this);
|
|
|
- }
|
|
|
- /*Node.prototype.serialNo = function () {
|
|
|
- if (this.preSibling) {
|
|
|
- return this.preSibling.serialNo() + this.preSibling.posterityCount() + 1;
|
|
|
- } else if (this.parent) {
|
|
|
- return this.parent.serialNo() + 1;
|
|
|
- } else {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- };*/
|
|
|
-
|
|
|
- Node.prototype.addChild = function (node) {
|
|
|
- var preSibling = this.children.length === 0 ? null : this.children[this.children.length - 1];
|
|
|
- node.parent = this;
|
|
|
- if (preSibling) {
|
|
|
- preSibling.nextSibling = node;
|
|
|
- }
|
|
|
- node.preSibling = preSibling;
|
|
|
- this.children.push(node);
|
|
|
- };
|
|
|
- Node.prototype.removeChild = function (node) {
|
|
|
- var preSibling = node.preSibling, nextSibling = node.nextSibling;
|
|
|
- if (preSibling) {
|
|
|
- preSibling.nextSibling = nextSibling;
|
|
|
- }
|
|
|
- if (nextSibling) {
|
|
|
- nextSibling.preSibling = preSibling;
|
|
|
- }
|
|
|
- this.children.splice(this.children.re)
|
|
|
- };
|
|
|
-
|
|
|
- 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.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;
|
|
|
- if (this.canUpLevel) {
|
|
|
- // NextSiblings become child
|
|
|
- tools.addNodes(this.tree, this, this.parent.children.slice(iIndex + 1));
|
|
|
- // Orginal Parent remove node and nextSiblings
|
|
|
- tools.removeNodes(this.tree, this.parent, iIndex);
|
|
|
- // New Parent add node
|
|
|
- tools.addNodes(this.tree, this.parent.parent, [this], this.parent.siblingIndex() + 1);
|
|
|
- if (!this.expanded) {
|
|
|
- this.setExpanded(true);
|
|
|
- }
|
|
|
- success = true;
|
|
|
- }
|
|
|
- return success;
|
|
|
- };
|
|
|
- Node.prototype.downLevel = function () {
|
|
|
- var success = false, iIndex = this.parent ? this.parent.children.indexOf(this) : this.tree.roots.indexOf(this);
|
|
|
- var newParent = this.preSibling;
|
|
|
- if (this.canDownLevel()) {
|
|
|
- tools.removeNodes(this.tree, this.parent, this.siblingIndex(), 1);
|
|
|
- tools.addNodes(this.tree, this.preSibling, [this]);
|
|
|
- if (!newParent.expanded) {
|
|
|
- newParent.setExpanded(true);
|
|
|
- }
|
|
|
- success = true;
|
|
|
- }
|
|
|
- return success;
|
|
|
- };
|
|
|
- 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()) {
|
|
|
- orgPre.nextSibling = this.nextSibling;
|
|
|
- this.preSibling = orgPre.preSibling;
|
|
|
- orgPre.preSibling = this;
|
|
|
- this.nextSibling = orgPre;
|
|
|
- belongArray.splice(iIndex, 1);
|
|
|
- belongArray.splice(iIndex - 1, 0, this);
|
|
|
- tools.sortTreeItems(this.tree);
|
|
|
- success = true;
|
|
|
- }
|
|
|
- return success;
|
|
|
- };
|
|
|
- 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()) {
|
|
|
- orgNext.preSibling = this.preSibling;
|
|
|
- this.nextSibling = orgNext.nextSibling;
|
|
|
- orgNext.nextSibling = this;
|
|
|
- this.preSibling = orgNext;
|
|
|
- belongArray.splice(iIndex, 1);
|
|
|
- belongArray.splice(iIndex + 1, 0, this);
|
|
|
- tools.sortTreeItems(this.tree);
|
|
|
- success = true;
|
|
|
- }
|
|
|
- return success;
|
|
|
- }
|
|
|
-
|
|
|
- var Tree = function (setting) {
|
|
|
- this.nodes = {};
|
|
|
- this.roots = [];
|
|
|
- this.items = [];
|
|
|
- this.setting = setting;
|
|
|
- this.prefix = 'id_';
|
|
|
- this.selected = null;
|
|
|
-
|
|
|
- this.event = {};
|
|
|
- this.eventType = _eventType;
|
|
|
- };
|
|
|
-
|
|
|
- Tree.prototype.maxNodeID = (function () {
|
|
|
- var maxID = 0;
|
|
|
- return function (ID) {
|
|
|
- if (arguments.length === 0) {
|
|
|
- return maxID;
|
|
|
- } else {
|
|
|
- maxID = Math.max(maxID, ID);
|
|
|
- }
|
|
|
- };
|
|
|
- })();
|
|
|
- Tree.prototype.rangeNodeID = (function () {
|
|
|
- var rangeID = -1;
|
|
|
- return function (ID) {
|
|
|
- if (arguments.length === 0) {
|
|
|
- return rangeID;
|
|
|
- } else {
|
|
|
- rangeID = Math.max(rangeID, ID);
|
|
|
- }
|
|
|
- }
|
|
|
- })();
|
|
|
- Tree.prototype.newNodeID = function () {
|
|
|
- if (this.rangeNodeID() === -1) {
|
|
|
- return this.maxNodeID() + 1;
|
|
|
- } else {
|
|
|
- if (this.maxNodeID() >= this.rangeNodeID()) {
|
|
|
- return this.maxNodeID() + 1;
|
|
|
- } else {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- }
|
|
|
- /*if (this.maxID >= this.rangeNodeID() || this.rangeNodeID === -1) {
|
|
|
- return -1;
|
|
|
- } else {
|
|
|
- return this.maxNodeID() + 1;
|
|
|
- }*/
|
|
|
- };
|
|
|
-
|
|
|
- Tree.prototype.loadDatas = function (datas) {
|
|
|
- var prefix = this.prefix, i, node, parent, next, that = this;
|
|
|
- // prepare index
|
|
|
- datas.forEach(function (data) {
|
|
|
- var node = new Node(that, data);
|
|
|
- that.nodes[prefix + data[that.setting.id]] = node;
|
|
|
- that.maxNodeID(data[that.setting.id]);
|
|
|
- });
|
|
|
- // set parent by pid, set nextSibling by nid
|
|
|
- datas.forEach(function (data) {
|
|
|
- node = that.nodes[prefix + data[that.setting.id]];
|
|
|
- if (data[that.setting.pid] === that.setting.rootId) {
|
|
|
- that.roots.push(node);
|
|
|
- } else {
|
|
|
- parent = that.nodes[prefix + data[that.setting.pid]];
|
|
|
- if (parent) {
|
|
|
- node.parent = parent;
|
|
|
- parent.children.push(node);
|
|
|
- }
|
|
|
- }
|
|
|
- if (data[that.setting.nid] !== that.setting.rootId) {
|
|
|
- next = that.nodes[prefix + data[that.setting.nid]];
|
|
|
- if (next) {
|
|
|
- node.nextSibling = next;
|
|
|
- next.preSibling = node;
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- // sort by nid
|
|
|
- this.roots = tools.reSortNodes(this.roots, true);
|
|
|
- tools.sortTreeItems(this);
|
|
|
- };
|
|
|
- Tree.prototype.firstNode = function () {
|
|
|
- return this.roots.length === 0 ? null : this.roots[0];
|
|
|
- };
|
|
|
- Tree.prototype.findNode = function (id) {
|
|
|
- return this.nodes[this.prefix + id];
|
|
|
- };
|
|
|
- Tree.prototype.count = function () {
|
|
|
- var iCount = 0;
|
|
|
- if (this.roots.length !== 0) {
|
|
|
- iCount += this.roots.length;
|
|
|
- this.roots.forEach(function (node) {
|
|
|
- iCount += node.posterityCount();
|
|
|
- });
|
|
|
- }
|
|
|
- return iCount;
|
|
|
- };
|
|
|
-
|
|
|
- Tree.prototype.insert = function (parentID, nextSiblingID) {
|
|
|
- var newID = this.newNodeID(), node = null, data = {};
|
|
|
- var parent = parentID === -1 ? null : this.nodes[this.prefix + parentID];
|
|
|
- var nextSibling = nextSiblingID === -1 ? null: this.nodes[this.prefix + nextSiblingID];
|
|
|
- if (newID !== -1) {
|
|
|
- data = {};
|
|
|
- data[this.setting.id] = newID;
|
|
|
- data[this.setting.pid] = parentID;
|
|
|
- data[this.setting.nid] = nextSiblingID;
|
|
|
- node = new Node(this, data);
|
|
|
- if (nextSibling) {
|
|
|
- tools.addNodes(this, parent, [node], nextSibling.siblingIndex());
|
|
|
- } else {
|
|
|
- tools.addNodes(this, parent, [node]);
|
|
|
- }
|
|
|
- this.nodes[this.prefix + newID] = node;
|
|
|
- tools.sortTreeItems(this);
|
|
|
- this.maxNodeID(newID);
|
|
|
- }
|
|
|
- return node;
|
|
|
- };
|
|
|
- Tree.prototype.delete = function (node) {
|
|
|
- var success = false;
|
|
|
- if (node) {
|
|
|
- delete this.nodes[this.prefix + node.getID()];
|
|
|
- if (node.preSibling) {
|
|
|
- node.preSibling.nextSibling = node.nextSibling;
|
|
|
- }
|
|
|
- if (node.nextSibling) {
|
|
|
- node.nextSibling.preSibling = node.preSibling;
|
|
|
- }
|
|
|
- if (node.parent) {
|
|
|
- node.parent.children.splice(node.siblingIndex(), 1);
|
|
|
- } else {
|
|
|
- this.roots.splice(node.siblingIndex(), 1);
|
|
|
- }
|
|
|
- tools.sortTreeItems(this);
|
|
|
- success = true;
|
|
|
- }
|
|
|
- return success;
|
|
|
- };
|
|
|
- //willdel
|
|
|
- /* Tree.prototype.editedData = function (field, id, newText) {
|
|
|
- var node = this.findNode(id), result = {allow: false, nodes: []};
|
|
|
- if (this.event[this.eventType.editedData]) {
|
|
|
- return this.event[this.eventType.editedData](field, node.data);
|
|
|
- } else {
|
|
|
- node.data[field] = newText;
|
|
|
- result.allow = true;
|
|
|
- return result;
|
|
|
- }
|
|
|
- };*/
|
|
|
-
|
|
|
- Tree.prototype.bind = function (eventName, eventFun) {
|
|
|
- this.event[eventName] = eventFun;
|
|
|
- };
|
|
|
-
|
|
|
- return new Tree(setting);
|
|
|
- }
|
|
|
-};
|