|  | @@ -667,12 +667,28 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |                      callback: function (key, opt) {
 | 
	
		
			
				|  |  |                          treeOperationObj.addNode(ledgerSpread.getActiveSheet());
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  | -                    visible: function(key, opt){
 | 
	
		
			
				|  |  | +                    disabled: function (key, opt) {
 | 
	
		
			
				|  |  |                          const sheet = ledgerSpread.getActiveSheet();
 | 
	
		
			
				|  |  |                          const selection = sheet.getSelections();
 | 
	
		
			
				|  |  | -                        const row = selection[0].row;
 | 
	
		
			
				|  |  | -                        const select = ledgerTree.nodes[row];
 | 
	
		
			
				|  |  | -                        return select;
 | 
	
		
			
				|  |  | +                        const sel = selection ? selection[0] : sheet.getSelections()[0];
 | 
	
		
			
				|  |  | +                        const row = sel ? sel.row : -1;
 | 
	
		
			
				|  |  | +                        const tree = sheet.zh_tree;
 | 
	
		
			
				|  |  | +                        if (!tree) return true;
 | 
	
		
			
				|  |  | +                        const first = sheet.zh_tree.nodes[row];
 | 
	
		
			
				|  |  | +                        let last = first, sameParent = true;
 | 
	
		
			
				|  |  | +                        if (sel.rowCount > 1) {
 | 
	
		
			
				|  |  | +                            for (let r = 1; r < sel.rowCount; r++) {
 | 
	
		
			
				|  |  | +                                const rNode = tree.nodes[sel.row + r];
 | 
	
		
			
				|  |  | +                                if (rNode.level > first.level) continue;
 | 
	
		
			
				|  |  | +                                if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
 | 
	
		
			
				|  |  | +                                    sameParent = false;
 | 
	
		
			
				|  |  | +                                    break;
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                                last = rNode;
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        const valid = !sheet.zh_setting.readOnly;
 | 
	
		
			
				|  |  | +                        return !(valid && first && first.level > 1);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  },
 | 
	
		
			
				|  |  |                  'delete': {
 | 
	
	
		
			
				|  | @@ -681,12 +697,28 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |                      callback: function (key, opt) {
 | 
	
		
			
				|  |  |                          treeOperationObj.deleteNode(ledgerSpread.getActiveSheet());
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  | -                    visible: function (key, opt) {
 | 
	
		
			
				|  |  | +                    disabled: function (key, opt) {
 | 
	
		
			
				|  |  |                          const sheet = ledgerSpread.getActiveSheet();
 | 
	
		
			
				|  |  |                          const selection = sheet.getSelections();
 | 
	
		
			
				|  |  | -                        const row = selection[0].row;
 | 
	
		
			
				|  |  | -                        const select = ledgerTree.nodes[row];
 | 
	
		
			
				|  |  | -                        return select;
 | 
	
		
			
				|  |  | +                        const sel = selection ? selection[0] : sheet.getSelections()[0];
 | 
	
		
			
				|  |  | +                        const row = sel ? sel.row : -1;
 | 
	
		
			
				|  |  | +                        const tree = sheet.zh_tree;
 | 
	
		
			
				|  |  | +                        if (!tree) return true;
 | 
	
		
			
				|  |  | +                        const first = sheet.zh_tree.nodes[row];
 | 
	
		
			
				|  |  | +                        let last = first, sameParent = true;
 | 
	
		
			
				|  |  | +                        if (sel.rowCount > 1) {
 | 
	
		
			
				|  |  | +                            for (let r = 1; r < sel.rowCount; r++) {
 | 
	
		
			
				|  |  | +                                const rNode = tree.nodes[sel.row + r];
 | 
	
		
			
				|  |  | +                                if (rNode.level > first.level) continue;
 | 
	
		
			
				|  |  | +                                if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
 | 
	
		
			
				|  |  | +                                    sameParent = false;
 | 
	
		
			
				|  |  | +                                    break;
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                                last = rNode;
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        const valid = !sheet.zh_setting.readOnly;
 | 
	
		
			
				|  |  | +                        return !(valid && first && sameParent && first.level > 1 && !first.node_type);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  },
 | 
	
		
			
				|  |  |                  'copyBlock': {
 |