選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

440 行
20 KiB

/**
* Created by Jacky.Gao on 2017-01-31.
*/
import {undoManager,resetTableData,setDirty} from '../Utils.js';
import {doInsertRow} from './operation/InsertRowOperation.js';
import {doInsertCol} from './operation/InsertColOperation.js';
import {doDeleteRow} from './operation/DeleteRowOperation.js';
import {doDeleteCol} from './operation/DeleteColOperation.js';
import {renderRowHeader} from './HeaderUtils.js';
import RowColWidthHeightDialog from '../dialog/RowColWidthHeightDialog.js';
import Handsontable from 'handsontable';
export default function buildMenuConfigure(){
return {
callback: function (key, options) {
const _this=this;
if (key === 'insert_row_above') {
doInsertRow.call(this,true);
}else if(key === 'insert_row_below'){
doInsertRow.call(this);
}else if(key==='insert_col_left'){
doInsertCol.call(this,true);
}else if(key==='insert_col_right'){
doInsertCol.call(this);
}else if(key==='del_row'){
doDeleteRow.call(this);
}else if(key==='del_col'){
doDeleteCol.call(this);
}else if(key==='clean_content'){
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2],startCol=selected[1],endCol=selected[3];
let removeCellsMap=cleanCells(_this.context,startRow,endRow,startCol,endCol,'content');
undoManager.add({
redo:function(){
removeCellsMap=cleanCells(_this.context,startRow,endRow,startCol,endCol,'content');
},
undo:function(){
undoCleanCells(_this.context,startRow,endRow,startCol,endCol,removeCellsMap,'content');
}
})
}else if(key==='clean_style'){
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2],startCol=selected[1],endCol=selected[3];
let removeCellsMap=cleanCells(_this.context,startRow,endRow,startCol,endCol,'style');
undoManager.add({
redo:function(){
removeCellsMap=cleanCells(_this.context,startRow,endRow,startCol,endCol,'style');
},
undo:function(){
undoCleanCells(_this.context,startRow,endRow,startCol,endCol,removeCellsMap,'style');
}
})
}else if(key==='clean'){
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2],startCol=selected[1],endCol=selected[3];
let removeCellsMap=cleanCells(_this.context,startRow,endRow,startCol,endCol,'all');
undoManager.add({
redo:function(){
removeCellsMap=cleanCells(_this.context,startRow,endRow,startCol,endCol,'all');
},
undo:function(){
undoCleanCells(_this.context,startRow,endRow,startCol,endCol,removeCellsMap,'all');
}
});
}else if(key==='repeat_row_header'){
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2];
const context=this.context;
for(let rowNumber=startRow;rowNumber<=endRow;rowNumber++){
context.addRowHeader(rowNumber,'headerrepeat');
}
renderRowHeader(this,context);
setDirty();
}else if(key==='title_row'){
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2];
const context=this.context;
for(let rowNumber=startRow;rowNumber<=endRow;rowNumber++){
context.addRowHeader(rowNumber,'title');
}
renderRowHeader(this,context);
setDirty();
}else if(key==='repeat_row_footer'){
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2];
const context=this.context;
for(let rowNumber=startRow;rowNumber<=endRow;rowNumber++){
context.addRowHeader(rowNumber,'footerrepeat');
}
renderRowHeader(this,context);
setDirty();
}else if(key==='summary_row'){
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2];
const context=this.context;
for(let rowNumber=startRow;rowNumber<=endRow;rowNumber++){
context.addRowHeader(rowNumber,'summary');
}
renderRowHeader(this,context);
setDirty();
}else if(key==='repeat_cancel'){
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2];
const context=this.context;
for(let rowNumber=startRow;rowNumber<=endRow;rowNumber++){
context.adjustDelRowHeaders(rowNumber);
}
renderRowHeader(this,context);
setDirty();
}else if(key==='row_height'){
const selected=this.getSelected();
const startRow=selected[0];
const rowHeight=this.getRowHeight(startRow);
const dialog=new RowColWidthHeightDialog();
dialog.show(function(newHeight){
const rowHeights=_this.getSettings().rowHeights;
rowHeights.splice(startRow,1,newHeight);
_this.updateSettings({
rowHeights:rowHeights,
manualRowResize:rowHeights
});
},rowHeight,false);
setDirty();
}else if(key==='col_width'){
const selected=this.getSelected();
const startCol=selected[1];
const colWidth=this.getColWidth(startCol);
const dialog=new RowColWidthHeightDialog();
dialog.show(function(newColWidth){
const colWidths=_this.getSettings().colWidths;
colWidths.splice(startCol,1,newColWidth);
_this.updateSettings({
colWidths:colWidths,
manualColumnResize:colWidths
});
},colWidth,true);
setDirty();
}else if(key==='copy_style'){
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2],startCol=selected[1],endCol=selected[3];
let cell=_this.context.getCell(startRow,startCol);
if(!cell){
alert("请先选中目标单元格!");
return;
}
window.__copy_cell_style__=cell.cellStyle;
}else if(key==='paste_style'){
if(!window.__copy_cell_style__){
alert('请先复制目标单元格样式');
return;
}
const selected=this.getSelected();
const startRow=selected[0],endRow=selected[2],startCol=selected[1],endCol=selected[3];
let oldCellsStyleMap=pasteStyle(_this.context,startRow,endRow,startCol,endCol);
undoManager.add({
redo:function(){
oldCellsStyleMap=pasteStyle(_this.context,startRow,endRow,startCol,endCol);
},
undo:function(){
undoPasteStyle(_this.context,startRow,endRow,startCol,endCol,oldCellsStyleMap);
}
});
}
},
items: {
"insert_row_above": {
name: `<i class="ureport ureport-insertrow" style="color: #3344d3;font-size: 13px"></i> ${window.i18n.table.contextMenu.insertRowUp}`
},
"insert_row_below": {
name: `<i class="ureport ureport-insertrow" style="color: #3344d3;font-size: 13px"></i> ${window.i18n.table.contextMenu.insertRowDown}`
},
"insert_col_left": {
name: `<i class="ureport ureport-insert-column" style="color: #008ed3;font-size: 13px"></i> ${window.i18n.table.contextMenu.insertColBefore}`
},
"insert_col_right": {
name: `<i class="ureport ureport-insert-column" style="color: #008ed3;font-size: 13px"></i> ${window.i18n.table.contextMenu.insertColAfter}`
},
"del_row": {
name: `<i class="ureport ureport-deleterow" style="color: #d30a16;font-size: 13px"></i> ${window.i18n.table.contextMenu.delRow}`,
disabled:checkRowDeleteOperationDisabled
},
"del_col": {
name: `<i class="ureport ureport-deletecolumn" style="color: #d30a16;font-size: 13px"></i> ${window.i18n.table.contextMenu.delCol}`,
disabled:checkColDeleteOperationDisabled
},
"row_height": {
name: `<i class="ureport ureport-height" style="color: #d30a16;font-size: 13px;font-weight:bold"></i> ${window.i18n.table.contextMenu.rowHeight}`,
disabled:checkRowDeleteOperationDisabled
},
"col_width": {
name: `<i class="ureport ureport-width" style="color: #d30a16;font-size: 13px;font-weight:bold"></i> ${window.i18n.table.contextMenu.colWidth}`,
disabled:checkColDeleteOperationDisabled
},
"title_row": {
name: `<i class="ureport ureport-title" style="color: #9C27B0;font-size: 13px"></i> ${window.i18n.table.contextMenu.title}`,
disabled:checkRowDeleteOperationDisabled
},
"repeat_row_header": {
name: `<i class="ureport ureport-header-repeat" style="color: #9C27B0;font-size: 13px"></i> ${window.i18n.table.contextMenu.repeatHeader}`,
disabled:checkRowDeleteOperationDisabled
},
"repeat_row_footer": {
name: `<i class="ureport ureport-footer-repeat" style="color: #9C27B0;font-size: 13px"></i> ${window.i18n.table.contextMenu.repeatFooter}`,
disabled:checkRowDeleteOperationDisabled
},
"summary_row": {
name: `<i class="ureport ureport-summary" style="color: #9C27B0;font-size: 13px"></i> ${window.i18n.table.contextMenu.summary}`,
disabled:checkRowDeleteOperationDisabled
},
"repeat_cancel": {
name: `<i class="glyphicon glyphicon-remove-circle" style="color: #d30e00;font-size: 13px"></i> ${window.i18n.table.contextMenu.cancel}`,
disabled:checkRowDeleteOperationDisabled
},
"copy_style": {
name: `<i class="ureport ureport-copy" style="color: #d30e00;font-size: 13px"></i> ${window.i18n.table.contextMenu.copy}`,
disabled:checkCopyOperationDisabled
},
"paste_style": {
name: `<i class="ureport ureport-paste" style="color: #d30e00;font-size: 13px"></i> ${window.i18n.table.contextMenu.paste}`,
disabled:checkPasteOperationDisabled
},
"clean_content": {
name: `<i class="ureport ureport-clean-content" style="color: #007471;font-size: 13px"></i> ${window.i18n.table.contextMenu.clearContent}`,
disabled:checkCleanOperationDisabled
},
"clean_style": {
name: `<i class="ureport ureport-clean-style" style="color: #00746f;font-size: 13px"></i> ${window.i18n.table.contextMenu.clearStyle}`,
disabled:checkCleanOperationDisabled
},
"clean": {
name: `<i class="ureport ureport-clean" style="color: #d30e00;font-size: 13px"></i> ${window.i18n.table.contextMenu.clearAll}`,
disabled:checkCleanOperationDisabled
}
}
};
function undoCleanCells(context,startRow,endRow,startCol,endCol,removeCellsMap,type){
let cellsMap=context.cellsMap,hot=context.hot;
for(let i=startRow;i<=endRow;i++) {
for (let j = startCol; j <= endCol; j++) {
let cell = context.getCell(i, j);
if (!cell) {
continue;
}
let key=cell.rowNumber+","+cell.columnNumber;
if(type==='content'){
let orgValue=removeCellsMap.get(key);
if(!orgValue){
alert(`${window.i18n.table.contextMenu.cancelConetntFail}`);
return;
}
cell.value=orgValue;
let value=cell.value;
let valueType=value.type;
let text=value.value;
if(valueType==='dataset'){
text=value.datasetName+"."+value.aggregate+"("+value.property+")";
}
hot.setDataAtCell(i,j,text);
}else if(type==='style'){
let orgStyle=removeCellsMap.get(key);
if(!orgStyle){
alert(`${window.i18n.table.contextMenu.cancelStyleFail}`);
return;
}
cell.cellStyle=orgStyle;
}else if(type==='all'){
context.removeCell(cell);
let orgCell=removeCellsMap.get(key);
if(!orgCell){
alert(`${window.i18n.table.contextMenu.cancelClearFail}`);
return;
}
context.addCell(orgCell);
let value=orgCell.value;
let valueType=value.type;
let text=value.value;
if(valueType==='dataset'){
text=value.datasetName+"."+value.aggregate+"("+value.property+")";
}
hot.setDataAtCell(i,j,text);
}
}
}
Handsontable.hooks.run(hot, 'afterSelectionEnd',startRow,startCol,endRow,endCol);
hot.render();
};
function undoPasteStyle(context,startRow,endRow,startCol,endCol,oldStyleMap){
const style=window.__copy_cell_style__;
let cellsMap=new Map(),hot=context.hot;
for(let i=startRow;i<=endRow;i++){
for(let j=startCol;j<=endCol;j++){
let cell=context.getCell(i,j);
if(!cell){
continue;
}
let key=cell.rowNumber+","+cell.columnNumber;
const oldStyle=oldStyleMap.get(key);
if(oldStyle){
cell.cellStyle=oldStyle;
}
}
}
Handsontable.hooks.run(hot, 'afterSelectionEnd',startRow,startCol,endRow,endCol);
hot.render();
return cellsMap;
};
function pasteStyle(context,startRow,endRow,startCol,endCol){
const style=window.__copy_cell_style__;
let cellsMap=new Map(),hot=context.hot;
for(let i=startRow;i<=endRow;i++){
for(let j=startCol;j<=endCol;j++){
let cell=context.getCell(i,j);
if(!cell){
continue;
}
let key=cell.rowNumber+","+cell.columnNumber;
if(!cell.cellStyle){
cell.cellStyle={};
}
const oldStyle=JSON.parse(JSON.stringify(cell.cellStyle));
cellsMap.set(key,oldStyle);
cell.cellStyle.fontSize=style.fontSize;
cell.cellStyle.forecolor=style.forecolor;
cell.cellStyle.fontFamily=style.fontFamily;
cell.cellStyle.valign=style.valign;
cell.cellStyle.align=style.align;
cell.cellStyle.bgcolor=style.bgcolor;
cell.cellStyle.bold=style.bold;
cell.cellStyle.italic=style.italic;
cell.cellStyle.underline=style.underline;
}
}
Handsontable.hooks.run(hot, 'afterSelectionEnd',startRow,startCol,endRow,endCol);
hot.render();
return cellsMap;
};
function cleanCells(context,startRow,endRow,startCol,endCol,type){
let removeCellsMap=new Map(),hot=context.hot;
for(let i=startRow;i<=endRow;i++){
for(let j=startCol;j<=endCol;j++){
let cell=context.getCell(i,j);
if(!cell){
continue;
}
cell.cellStyle.format=null;
let key=cell.rowNumber+","+cell.columnNumber;
if(type==='content'){
removeCellsMap.set(key,cell.value);
cell.value={
type:'simple',
value:''
};
cell.expand='None';
cell.conditionPropertyItems=null;
hot.setDataAtCell(i,j,'');
}else if(type==='style'){
removeCellsMap.set(key,cell.cellStyle);
cell.cellStyle={fontSize:10,forecolor:'0,0,0',fontFamily:'宋体',align:'center',valign:'middle'};
}else if(type==='all'){
context.removeCell(cell);
removeCellsMap.set(key,cell);
let newCell={
rowNumber:cell.rowNumber,
columnNumber:cell.columnNumber,
expand:'None',
value:{
type:'simple',
value:''
},
cellStyle:{fontSize:10,forecolor:'0,0,0',fontFamily:'宋体',align:'center',valign:'middle'}
};
context.addCell(newCell);
hot.setDataAtCell(i,j,'');
}
}
}
Handsontable.hooks.run(hot, 'afterSelectionEnd',startRow,startCol,endRow,endCol);
hot.render();
return removeCellsMap;
};
function checkCopyOperationDisabled(){
const selected=this.getSelected();
if(!selected){
return true;
}
return false;
};
function checkPasteOperationDisabled(){
const selected=this.getSelected();
if(!selected){
return true;
}
if(window.__copy_cell_style__){
return false;
}
return true;
};
function checkRowDeleteOperationDisabled(){
const selected=this.getSelected();
if(!selected){
return true;
}
const startRow=selected[0], endRow=selected[2];
let dif=Math.abs(startRow-endRow)+1;
const countRows=this.countRows();
if(dif>=countRows){
return true;
}else{
return false;
}
};
function checkColDeleteOperationDisabled(){
const selected=this.getSelected();
if(!selected){
return true;
}
const startCol=selected[1], endCol=selected[3];
let dif=Math.abs(startCol-endCol)+1;
const countCols=this.countCols();
if(dif>=countCols){
return true;
}else{
return false;
}
};
function checkCleanOperationDisabled(){
const selected=this.getSelected();
if(!selected || selected.length===0){
return true;
}
return false;
};
}