| 
					
				 | 
			
			
				@@ -35,46 +35,86 @@ $(document).ready(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const treeOperationObj = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        refreshOperationValid: function (sheet, selections) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const setObjEnable = function (obj, enable) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (enable) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    obj.removeClass('disabled'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    obj.addClass('disabled'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const row = selections[0].row; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const tree = sheet.zh_tree; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!tree) { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const node = sheet.zh_tree.nodes[row]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setObjEnable($('#delete'), node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setObjEnable($('#up-move'), node && node.order > 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setObjEnable($('#down-move'), node && !tree.isLastSibling(node)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setObjEnable($('#up-level'), tree.getParent(node)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setObjEnable($('#down-level'), node && node.order > 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 新增节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param spread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         addNode: function (spread) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const sheet = spread.getActiveSheet(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const row = sheet.getSelections()[0].row; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const tree = sheet.zh_tree; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!tree) { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const node = spread.zh_tree.nodes[row]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const node = sheet.zh_tree.nodes[row]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!node) { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             SpreadJsObj.massOperationSheet(sheet, function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                tree.addNode('add-node', node, function (newNodes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    newNodes.sort(function (a, b) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        const aIndex = tree.nodes.indexOf(a); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        const bIndex = tree.nodes.indexOf(b); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return aIndex - bIndex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for (const node of newNodes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        const index = tree.nodes.indexOf(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        sheet.addRows(index, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tree.baseOperation('base-operation', node, 'add', function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const newNodes = result.create; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (newNodes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        newNodes.sort(function (a, b) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            const aIndex = tree.nodes.indexOf(a); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            const bIndex = tree.nodes.indexOf(b); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            return aIndex - bIndex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (const node of newNodes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            const index = tree.nodes.indexOf(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            sheet.addRows(index, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    self.refreshOperationValid(sheet, sheet.getSelections()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 删除选中节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param spread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         deleteNode: function (spread) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const sheet = spread.getActiveSheet(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const row = sheet.getSelections()[0].row; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const tree = sheet.zh_tree; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!tree) { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const node = spread.zh_tree.nodes[row]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const node = sheet.zh_tree.nodes[row]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!node) { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const count = ledgerTree.getPosterity(node).length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tree.deleteNode('delete-node', node, function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.baseOperation('base-operation', node, 'delete', function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 sheet.deleteRows(row, count + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.refreshOperationValid(sheet, sheet.getSelections()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 上移选中节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param spread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         upMove: function (spread) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const sheet = spread.getActiveSheet(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const sel = sheet.getSelections()[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const row = sel.row; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -85,15 +125,22 @@ $(document).ready(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const node = tree.nodes[row]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!node) { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tree.upMoveNode('up-move', node, function (datas) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const data of datas) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.baseOperation('base-operation', node, 'up-move', function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (const data of result.update) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     SpreadJsObj.reLoadRowData(sheet, tree.nodes.indexOf(data), tree.getPosterity(data).length + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 sheet.setSelection(tree.nodes.indexOf(node), sel.col, sel.rowCount, sel.colCount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.refreshOperationValid(sheet, sheet.getSelections()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //sheet.moveTo(row, -1, tree.nodes.indexOf(node), -1, tree.getPosterity(node).length + 1, -1, GC.Spread.Sheets.CopyToOptions.value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 下移选中节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param spread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         downMove: function (spread) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const sheet = spread.getActiveSheet(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const sel = sheet.getSelections()[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const row = sel.row; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -104,14 +151,21 @@ $(document).ready(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const node = tree.nodes[row]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!node) { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tree.downMoveNode('down-move', node, function (datas) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (const data of datas) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.baseOperation('base-operation', node, 'down-move', function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (const data of result.update) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     SpreadJsObj.reLoadRowData(sheet, tree.nodes.indexOf(data), tree.getPosterity(data).length + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 sheet.setSelection(tree.nodes.indexOf(node), sel.col, sel.rowCount, sel.colCount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.refreshOperationValid(sheet, sheet.getSelections()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 升级选中节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param spread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         upLevel: function (spread) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const sheet = spread.getActiveSheet(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const row = sheet.getSelections()[0].row; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -121,11 +175,18 @@ $(document).ready(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const node = tree.nodes[row]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!node) { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tree.upLevelNode('up-level', node, function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.baseOperation('base-operation', node, 'up-level', function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 sheet.repaint(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.refreshOperationValid(sheet, sheet.getSelections()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 降级选中节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param spread 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         downLevel: function (spread) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const sheet = spread.getActiveSheet(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const row = sheet.getSelections()[0].row; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -135,12 +196,17 @@ $(document).ready(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const node = tree.nodes[row]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!node) { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tree.downLevelNode('down-level', node, function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.baseOperation('base-operation', node, 'down-level', function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 sheet.repaint(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.refreshOperationValid(sheet, sheet.getSelections()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ledgerSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e, info) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        treeOperationObj.refreshOperationValid(info.sheet, info.newSelections); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 绑定 删除等 顶部按钮 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $('#delete').click(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         treeOperationObj.deleteNode(ledgerSpread); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -157,6 +223,7 @@ $(document).ready(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $('#down-level').click(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         treeOperationObj.downLevel(ledgerSpread); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    treeOperationObj.refreshOperationValid(ledgerSpread.getActiveSheet(), ledgerSpread.getActiveSheet().getSelections()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 右键菜单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $.contextMenu({ 
			 |