找回密码
 立即注册

QQ登录

只需一步,快速开始

卑微的打工狗
金牌服务用户   /  发表于:2024-6-4 17:06  /   查看:1668  /  回复:12
5金币
如图所示,这是右键单击,出现的弹窗 image.png290854491.png ,已经实现了右键后添加按钮功能。

但现在要根据单元格的不同,右键单击出现的弹窗按钮内容也不相同。

请问:如何动态的添加弹窗的按钮内容?

最佳答案

查看完整内容

您好,我写了一个简单的Demo请参考:

12 个回复

倒序浏览
最佳答案
最佳答案
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-4 17:06:11
来自 8#
您好,我写了一个简单的Demo请参考:

  1. window.onload = function () {
  2.   let designerConfig = JSON.parse(
  3.     JSON.stringify(GC.Spread.Sheets.Designer.DefaultConfig)
  4.   );

  5.   let designer = new GC.Spread.Sheets.Designer.Designer(
  6.     "gc-designer-container",
  7.     designerConfig
  8.   );

  9.   let spread = designer.getWorkbook();

  10.   let sheet = spread.getActiveSheet();

  11.   window.designer = designer;
  12.   window.spread = spread;
  13.   window.sheet = sheet;

  14.   let character = 0;

  15.   let addSignSetting = {
  16.     canUndo: true,
  17.     name: "addSignSetting",
  18.     execute: function (context, options, isUndo) {
  19.       let Commands = GC.Spread.Sheets.Commands;
  20.       if (isUndo) {
  21.         Commands.undoTransaction(context, options);
  22.         return true;
  23.       } else {
  24.         Commands.startTransaction(context, options);
  25.         let sheet = context.getSheetFromName(options.sheetName);
  26.         sheet.setTag(
  27.           sheet.getActiveRowIndex(),
  28.           sheet.getActiveColumnIndex(),
  29.           JSON.stringify({ sign: true })
  30.         );
  31.         Commands.endTransaction(context, options);
  32.         return true;
  33.       }
  34.     },
  35.   };

  36.   let setSign = {
  37.     canUndo: true,
  38.     name: "setSign",
  39.     execute: function (context, options, isUndo) {
  40.       let Commands = GC.Spread.Sheets.Commands;
  41.       if (isUndo) {
  42.         Commands.undoTransaction(context, options);
  43.         return true;
  44.       } else {
  45.         Commands.startTransaction(context, options);
  46.         let sheet = context.getSheetFromName(options.sheetName);
  47.         sheet.setValue(
  48.           sheet.getActiveRowIndex(),
  49.           sheet.getActiveColumnIndex(),
  50.           "sign"
  51.         );
  52.         Commands.endTransaction(context, options);
  53.         return true;
  54.       }
  55.     },
  56.   };

  57.   spread.commandManager().register("addSignSetting", addSignSetting);
  58.   spread.commandManager().register("setSign", setSign);
  59.   let oldOpenMenu = spread.contextMenu.onOpenMenu;
  60.   spread.contextMenu.onOpenMenu = function (
  61.     menuData,
  62.     itemsDataForShown,
  63.     hitInfo,
  64.     spread
  65.   ) {
  66.     oldOpenMenu.apply(this, arguments);
  67.     console.log(itemsDataForShown);
  68.     if (character == 1) {
  69.       itemsDataForShown.push({
  70.         text: "addSignSetting",
  71.         name: "addSignSetting",
  72.         command: "addSignSetting",
  73.         workArea: "viewport",
  74.       });
  75.     }
  76.     if (character == 2) {
  77.       let { row, col } = hitInfo.worksheetHitInfo;
  78.       if (JSON.parse(sheet.getTag(row, col)).sign === true) {
  79.         itemsDataForShown.push({
  80.           text: "setSign",
  81.           name: "setSign",
  82.           command: "setSign",
  83.           workArea: "viewport",
  84.         });
  85.       }
  86.     }
  87.   };

  88.   document.querySelector("#button1").addEventListener("click", function () {
  89.     character = 1;
  90.   });

  91.   document.querySelector("#button2").addEventListener("click", function () {
  92.     character = 2;
  93.   });
  94. };
复制代码


动画 (1).gif17160338.png
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-4 17:32:37
2#
本帖最后由 Joestar.Xu 于 2024-6-5 12:19 编辑

您好,我根据下面的代码举一个简单的例子:

  1. let oldOpenMenu = spread.contextMenu.onOpenMenu;
  2. spread.contextMenu.onOpenMenu = function (
  3.   menuData,
  4.   itemsDataForShown,
  5.   hitInfo,
  6.   spread
  7. ) {
  8.   oldOpenMenu.apply(this, arguments);
  9.   console.log(itemsDataForShown);
  10.   itemsDataForShown.push({
  11.     text: "test",
  12.     name: "test",
  13.     command: "test",
  14.     workArea: "viewport",
  15.   });
  16. };
复制代码


比如说想要在第一行单元格中添加一个按钮,那么需要在onOpenMenu这个函数中判断hitInfo点击的单元格,然后修改itemsDataForShown来实现动态添加的效果。
回复 使用道具 举报
卑微的打工狗
金牌服务用户   /  发表于:2024-6-4 17:47:34
3#
Joestar.Xu 发表于 2024-6-4 17:32
您好,我根据下面的代码举一个简单的例子:

let oldOpenMenu = spread.contextMenu.onOpenMenu;

那如何捕获到右键的单击事件呢?
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-4 18:08:39
4#
没太明白,为什么要捕获右键的单击事件呢?
回复 使用道具 举报
卑微的打工狗
金牌服务用户   /  发表于:2024-6-5 10:04:33
5#
Joestar.Xu 发表于 2024-6-4 18:08
没太明白,为什么要捕获右键的单击事件呢?

需求是这样的。

模板的设置人员对某个单元格设置填报规则,比如,他右键点击按钮--设置单元格为图片。
则,模板的填报人员右键单击单元格,该单元格动态展示为上传图片。

根据规则设置人员对单元格设计的不同,填写人员右键单击单元格,动态展示不同的按钮。

image.png74805602.png

根据以上需求,是否可以利用自定义单元格来实现?
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-5 12:18:19
6#
本帖最后由 Joestar.Xu 于 2024-6-5 12:19 编辑

您好,根据您的描述,这个需求并没有复杂到需要使用自定义单元格来实现。

以下是一个简单的实现思路:

1、模板人员选择A1单元格,根据模板人员的权限只显示“设置为电子签名”选项,右键菜单点击“设置为电子签名”选项,然后给这个单元格的tag上设置一个标记,如:{sign: true}。

2、填报人员选择A1单元格,根据填报人员的权限只允许显示“电子签名”选项,但是这个时候还没有显示,然后根据选择的单元格,判断其tag中的数据,如果sign为true的话,就显示“电子签名”选项。

以上操作可以直接通过我最开始回复的重写右键菜单来实现。
回复 使用道具 举报
卑微的打工狗
金牌服务用户   /  发表于:2024-6-5 16:18:52
7#
Joestar.Xu 发表于 2024-6-5 12:18
您好,根据您的描述,这个需求并没有复杂到需要使用自定义单元格来实现。

以下是一个简单的实现思路:

您好,我可能没有表达完整我们的需求,我之后重新发一篇帖子来描述吧。

但是我刚才是试了您发给我的代码,毫无反应。
我之前添加右键菜单栏的代码如下所示
  1. designerConfig.commandMap["signPic"] = {
  2.                 text: "设置为签名",
  3.                 commandName: "signPic",
  4.                 execute: () => {
  5.                     this.$refs.sign.openDialog();
  6.                     this.selections = this.sheet.getSelections()[0];
  7.                 }
  8.             };
  9.             designerConfig.contextMenu.push("signPic");
复制代码
按理说,我应该再execute方法中添加tag,

问题一:请问,如何添加tag,有效代码是什么?

问题二:模板填报人员应该动态的展示按钮选项,我理解的是,,,捕获到用户右键单击该单元格的事件,然后在此判断该单元格相对应的tag,动态展示给用户需要的按钮。您上述的代码我粘贴了下,嗯,,,反正是没看懂,您能具体的解读一下吗?或者有没有具体的有效代码



回复 使用道具 举报
卑微的打工狗
金牌服务用户   /  发表于:2024-6-5 17:48:54
9#
Joestar.Xu 发表于 2024-6-5 17:31
您好,我写了一个简单的Demo请参考:

卑微的说一句,,,求注释
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-5 18:19:31
10#
您好,

21-41行代码为addSignSetting命令的定义,只需要关注32-36行代码。

21-41行代码为setSign命令的定义,只需要关注54-58行代码。

65、66行代码为以上两个命令的注册,命令需要注册才能正常使用。

67-95行代码为右键菜单的重写方法,通过判断character来判断显示哪个Command,setSign除了character要判断以外,还要判断Tag的sign。

97-103行代码是设置character按钮的监听方法。

如果还有不懂的地方请随时留言。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部