Clark.Pan 发表于 2024-9-30 17:24:58

报表插件(ReportSheet),设计器添加表功能改造

本帖最后由 AlexZ 于 2024-10-9 13:37 编辑

背景:

有客户提出ReportSheet添加表的按钮弹出的菜单中的选项太简单,有一些定制的参数无法输入,所以希望能够弹出一个自定制的菜单,菜单中可以定制自身业务需要的项目。
解决方案:
SpreadJS 在线表格编辑器V17.1.6版本之后支持了上述设置,可以通过下面的方案来完成对添加表按钮弹出逻辑的改写。

1.首先找到添加表的按钮出发的命令
var insertDataManagerCommand = GC.Spread.Sheets.Designer.getCommand(GC.Spread.Sheets.Designer.CommandNames.InsertDataManager);2.判断需求中是否有需要沿用源生逻辑的地方,如果有就将上述命令的execute缓存在变量中,后续沿用时需要用到
var oldExecute = insertDataManagerCommand.execute;3.改写上述命令的execute方法,下面示例代码中进行了判断,部分逻辑下会沿用改写前的execute方法。
insertDataManagerCommand.execute = (designer, selectedName, newValue) => { // overwrite the command execute function.
if (designer.getWorkbook().getActiveSheetTab() instanceof GC.Spread.Report.ReportSheet) { // whether the active sheetTab is reportsheet.
    // customer add their own business logic here.
    GC.Spread.Sheets.Designer.showDialog("customDialog", {tableName: "学生信息表",url: "http://127.0.0.1:3000/studentListByPage",type:            "post",pageNum: 0}, (value) => {
      console.log(value);
    });
} else {
    // go with the old execute command.
    oldExecute(designer, selectedName, newValue);
}
                        };4.改写方法中弹出了一个自定义的dialog,dialog中定义了一些表单项供用户输入。自定义的dialog参考下面代码:
var template = { // add a customize dialog.
                              templateName: "customDialog",
                              title: "自定义页面",
                              content: [
                                        {
                                                type: "Container",
                                                children: [
                                                      {
                                                                type: "ColumnSet",
                                                                children: [
                                                                        {
                                                                              type: "Column",
                                                                              children: [
                                                                                        {
                                                                                                type: "TextBlock",
                                                                                                text: "表名:",
                                                                                                id: "tableName",
                                                                                                margin:"5px 10px"
                                                                                        }
                                                                              ],
                                                                        },
                                                                        {
                                                                              type: "Column",
                                                                              children: [
                                                                                        {
                                                                                                type: "TextEditor",
                                                                                                bindingPath: "tableName",
                                                                                                style:"width:400px"
                                                                                        }
                                                                              ]
                                                                        },
                                                                ]
                                                      },
                                                      {
                                                                type: "ColumnSet",
                                                                children: [
                                                                        {
                                                                              type: "Column",
                                                                              children: [
                                                                                        {
                                                                                                type: "TextBlock",
                                                                                                text: "地址:",
                                                                                                id: "url",
                                                                                                margin:"5px 10px"
                                                                                        }
                                                                              ],
                                                                        },
                                                                        {
                                                                              type: "Column",
                                                                              children: [
                                                                                        {
                                                                                                type: "TextEditor",
                                                                                                bindingPath: "url",
                                                                                                style:"width:600px"
                                                                                        }
                                                                              ]
                                                                        },
                                                                        {
                                                                              type: "Column",
                                                                              children: [
                                                                                        {
                                                                                                type: "TextBlock",
                                                                                                text: "类型:",
                                                                                                id: "type",
                                                                                                margin:"5px 10px"
                                                                                        }
                                                                              ],
                                                                        },
                                                                        {
                                                                              type: "Column",
                                                                              children: [
                                                                                        {
                                                                                                type: "ListComboEditor",
                                                                                                bindingPath: "type",
                                                                                                items: [
                                                                                                      {
                                                                                                                text: "GET",
                                                                                                                value: "get"
                                                                                                      },
                                                                                                      {
                                                                                                                text: "POST",
                                                                                                                value: "post"
                                                                                                      },
                                                                                                      {
                                                                                                                text: "PUT",
                                                                                                                value: "put"
                                                                                                      }      
                                                                                                ]
                                                                                        }
                                                                              ]
                                                                        }
                                                                ],
                                                                margin:"0px 0px 5px 0px"
                                                      },
                                                      {
                                                                type: "ColumnSet",
                                                                children: [
                                                                        {
                                                                              type: "Column",
                                                                              children: [
                                                                                        {
                                                                                                type: "TextBlock",
                                                                                                text: "页码:",
                                                                                                id: "pageNum",
                                                                                                margin:"5px 10px",
                                                                                        }
                                                                              ],
                                                                        },
                                                                        {
                                                                              type: "Column",
                                                                              children: [
                                                                                        {
                                                                                                type: "TextEditor",
                                                                                                bindingPath: "pageNum",
                                                                                                style: "width:50px",
                                                                                        }
                                                                              ]
                                                                        },
                                                                ]
                                                      }
                                                ]
                                        }
                              ]
                        };
                        // register this customized template.
                        GC.Spread.Sheets.Designer.registerTemplate("customDialog", template);
完成后运行效果如下:
点击ReportSheet的添加表按钮后,会打开新的自定义对话框:

点击确定后会执行重写后的execute方法,在控制台输出表单项中填写的内容。
示例中的控制台输出只是举一个例子,可根据实际情况自行来定制逻辑,例如添加一个数据表在数据源中等等。


完整的demo可以参考附件:





页: [1]
查看完整版本: 报表插件(ReportSheet),设计器添加表功能改造