/** * 台账相关js * * @author Mai * @date 2018/02/05 * @version */ $(document).ready(function() { autoFlashHeight(); const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]); SpreadJsObj.addDeleteBind(ledgerSpread); const ledgerTree = createNewPathTree({ id: 'ledger_id', pid: 'ledger_pid', order: 'order', level: 'level', rootId: -1, keys: ['id', 'tender_id', 'ledger_id'] }); ledgerTree.loadDatas(ledger); SpreadJsObj.initSheet(ledgerSpread.getActiveSheet(), { cols: [ {title: '项目节编号', field: 'code', width: 150, cellType: 'tree'}, {title: '清单编号', field: 'b_code', width: 80}, {title: '名称', field: 'name', width: 230}, {title: '单位', field: 'unit', width: 50}, {title: '单价', field: 'price', width: 60}, {title: '数量', field: 'quantity', width: 60}, {title: '金额', field: 'totalPrice', width: 60}, {title: '施工图原设计', field: 'design', width: 60}, {title: '图(册)号', field: 'drawingCode', width: 80}, {title: '备注', field: 'memo', width: 100} ], treeCol: 0, emptyRows: 3 }); SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree); const treeOperationObj = { /** * 刷新顶部按钮是否可用 * @param sheet * @param selections */ 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 = sheet.zh_tree.nodes[row]; if (!node) { return; } SpreadJsObj.massOperationSheet(sheet, function () { 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 = sheet.zh_tree.nodes[row]; if (!node) { return; } const count = ledgerTree.getPosterity(node).length; 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; const tree = sheet.zh_tree; if (!tree) { return; } const node = tree.nodes[row]; if (!node) { return; } 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; const tree = sheet.zh_tree; if (!tree) { return; } const node = tree.nodes[row]; if (!node) { return; } 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; const tree = sheet.zh_tree; if (!tree) { return; } const node = tree.nodes[row]; if (!node) { return; } 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; const tree = sheet.zh_tree; if (!tree) { return; } const node = tree.nodes[row]; if (!node) { return; } tree.baseOperation('base-operation', node, 'down-level', function (result) { sheet.repaint(); self.refreshOperationValid(sheet, sheet.getSelections()); }); }, /** * 编辑单元格响应事件 * @param {Object} e * @param {Object} info */ editEnded: function (e, info) { if (info.sheet.zh_setting) { const col = info.sheet.zh_setting.cols[info.col]; const sortData = info.sheet.zh_dataType === 'tree' ? info.sheet.zh_tree.nodes : info.sheet.zh_data; const node = sortData[info.row]; const data = { id: node.id, tender_id: node.tender_id, ledger_id: node.ledger_id }; data[col.field] = info.editingText; info.sheet.zh_tree.updateInfo('update-info', [data], function (result) { const rows = []; for (const data of result) { rows.push(sortData.indexOf(data)); } SpreadJsObj.reLoadRowsData(info.sheet, rows); }); } }, /** * 粘贴单元格响应事件 * @param e * @param info */ clipboardPasted: function (e, info) { if (info.sheet.zh_setting && info.sheet.zh_dataType === 'tree') { const sortData = info.sheet.zh_tree.nodes; const datas = [], nodes = []; for (let iRow = 0; iRow < info.cellRange.rowCount; iRow ++) { const curRow = info.cellRange.row + iRow; const node = sortData[curRow]; if (node) { const data = info.sheet.zh_tree.getNodeKeyData(node); for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) { const curCol = info.cellRange.col + iCol; const colSetting = info.sheet.zh_setting.cols[curCol]; data[colSetting.field] = info.sheet.getText(curRow, curCol); } datas.push(data); nodes.push(node); } } info.sheet.zh_tree.updateInfo('update-info', datas, function (result) { const rows = []; for (const data of result) { rows.push(sortData.indexOf(data)); } SpreadJsObj.reLoadRowsData(info.sheet, rows); }); } }, deletePress: function (sheet) { if (sheet.zh_setting && sheet.zh_dataType === 'tree') { const sortData = sheet.zh_tree.nodes; const datas = [], nodes = []; const sel = sheet.getSelections()[0]; for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) { const node = sortData[iRow]; if (node) { const data = sheet.zh_tree.getNodeKeyData(node); for (let iCol = sel.col; iCol < sel.col + sel.colCount; iCol++) { const colSetting = sheet.zh_setting.cols[iCol]; data[colSetting.field] = null; } datas.push(data); nodes.push(node); } } sheet.zh_tree.updateInfo('update-info', datas, function (result) { const rows = []; for (const data of result) { rows.push(sortData.indexOf(data)); } SpreadJsObj.reLoadRowsData(sheet, rows); }); } }, pasteBlock: function (spread, block) { const self = this; const sheet = spread.getActiveSheet(); const row = sheet.getSelections()[0].row; const tree = sheet.zh_tree; if (!tree) { return; } const node = tree.nodes[row]; if (!node) { return; } tree.pasteBlock('paste-block', node, block, function (result) { SpreadJsObj.massOperationSheet(sheet, function () { 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); SpreadJsObj.reLoadRowData(sheet, index, 1); } } self.refreshOperationValid(sheet, sheet.getSelections()); }); }); } }; ledgerSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e, info) { treeOperationObj.refreshOperationValid(info.sheet, info.newSelections); }); ledgerSpread.bind(GC.Spread.Sheets.Events.EditEnded, treeOperationObj.editEnded); ledgerSpread.bind(GC.Spread.Sheets.Events.ClipboardPasted, treeOperationObj.clipboardPasted); SpreadJsObj.addDeleteBind(ledgerSpread, treeOperationObj.deletePress); // 绑定 删除等 顶部按钮 $('#delete').click(function () { treeOperationObj.deleteNode(ledgerSpread); }); $('#up-move').click(function () { treeOperationObj.upMove(ledgerSpread); }); $('#down-move').click(function () { treeOperationObj.downMove(ledgerSpread); }); $('#up-level').click(function () { treeOperationObj.upLevel(ledgerSpread); }); $('#down-level').click(function () { treeOperationObj.downLevel(ledgerSpread); }); treeOperationObj.refreshOperationValid(ledgerSpread.getActiveSheet(), ledgerSpread.getActiveSheet().getSelections()); // 右键菜单 $.contextMenu({ selector: '#ledger-spread', build: function ($trigger, e) { const target = SpreadJsObj.safeRightClickSelection($trigger, e, ledgerSpread); return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader; }, items: { 'create': { name: '新增', icon: 'fa-sign-in', callback: function (key, opt) { treeOperationObj.addNode(ledgerSpread); }, visible: function(key, opt){ const sheet = ledgerSpread.getActiveSheet(); const selection = sheet.getSelections(); const row = selection[0].row; const select = ledgerTree.nodes[row]; return select; } }, 'delete': { name: '删除', icon: 'fa-remove', callback: function (key, opt) { treeOperationObj.deleteNode(ledgerSpread); }, visible: function (key, opt) { const sheet = ledgerSpread.getActiveSheet(); const selection = sheet.getSelections(); const row = selection[0].row; const select = ledgerTree.nodes[row]; return select; } }, 'copyBlock': { name: '复制整块', icon: 'fa-files-o', callback: function (key, opt) { /*ledgerSpread.commandManager().execute({ cmd:"copy", sheetName:ledgerSpread.getActiveSheet().name() });*/ treeOperationObj.block = []; const copyBlockList = []; const sheet = ledgerSpread.getActiveSheet(); const sel = sheet.getSelections()[0]; let iRow = sel.row; const pid = sheet.zh_tree.nodes[iRow].ledger_pid; while (iRow < sel.row + sel.rowCount) { const node = sheet.zh_tree.nodes[iRow]; if (node.ledger_pid !== pid) { toast('error: 仅可同时选中同层节点', 'error', 'exclamation-circle'); return; } copyBlockList.push(node.ledger_id); iRow += sheet.zh_tree.getPosterity(node).length + 1; } treeOperationObj.block = copyBlockList; }, visible: function (key, opt) { const sheet = ledgerSpread.getActiveSheet(); const selection = sheet.getSelections(); const row = selection[0].row; const select = ledgerTree.nodes[row]; return select; } }, 'pasteBlock': { name: '粘贴', icon: 'fa-clipboard', disabled: function (key, opt) { const block = treeOperationObj.block || []; return block.length <= 0; }, callback: function (key, opt) { const block = treeOperationObj.block || []; if (block.length > 0) { treeOperationObj.pasteBlock(ledgerSpread, block); }/* else { ledgerSpread.commandManager().execute({ cmd:"paste", sheetName:ledgerSpread.getActiveSheet().name() }); }*/ } } } }); });