KevinChen 发表于 2021-2-2 10:23:26

SpreadJS在线表格编辑器自定义功能 -- 自定制图片属性侧边栏(SidePanel)

本帖最后由 Derrick.Jiao 于 2022-8-12 11:28 编辑

本文主要讲述怎样在组件版设计器 (Component Designer) 中自定制图片的边栏, 如图:



SpreadJS V14 新推出的组件版设计器, 解决了框架兼容, 加载性能等一系列问题. 针对自定义特性的定制, 它采用了目前流行的"声明式" 开发模型, 支持利用JSON的方式定义功能UI的template, 并且能够声明相关的交互事件(命令式command声明), 以下代码以设置背景色为例说明:

{
    "type": "ColumnSet",
    "margin": "5px 0px",
    "children": [
      {
            "type": "Column",
            "children": [
                {
                  "type": "Radio",
                  "bindingPath": "pictureFill",
                  "items": [
                        {
                            "text": "无填充",
                            "value": 0
                        },
                        {
                            "text": "纯色填充",
                            "value": 1
                        }
                  ]
                }
            ]
      }
    ]
},在这段JSON声明中, type是布局声明, 这里是列组ColumnSet的方式, 列组中可以包含多列元素, 在children中声明.
需要说明的是pictureFill, 这是一个数据声明的key, 在下边的命令中可以获取到元素的状态.

var sidePanelsPictureCommands = {pictureOptionPanel: {
    commandName: "pictureOptionPanel",
    enableContext: "AllowEditObject",
    visibleContext: "pictureSelected && !pictureAltTextPanel_Visible",
    execute: function(context, propertyName, newValue){
      if(!propertyName){
            return;
      }
      let sheet = context.Spread.getActiveSheet();
      let activePicture = getSelectedPicture(sheet);
      switch(propertyName){
            case "pictureFill":
                if(newValue === 0){
                  activePicture.backColor(null)
                }
                else{
                  activePicture.backColor("white")
                }
                break;
            case "pictureLine":
                if(newValue === 0){
                  activePicture.borderStyle("none")
                }
                else{
                  activePicture.borderStyle("double")
                }
                break;
            default:
                Reflect.apply(activePicture, activePicture, )
                break;
      }
    },
    getState: function(context){
      let sheet = context.Spread.getActiveSheet();
      let activePicture = getSelectedPicture(sheet);
      const pictureStatus = {
            pictureFill: 0,
            backColor: "",
            pictureLine: 0,
            borderWidth: 0,
            borderColor: ""
      };
      if (activePicture) {

            for(let key in pictureStatus) {
                switch(key){
                  case "backColor":
                        let backColor = activePicture.backColor();
                        if(backColor){
                            pictureStatus.backColor = backColor;
                            pictureStatus.pictureFill = 1;
                        }else {
                            pictureStatus.backColor = "#000000";
                            pictureStatus.pictureFill = 0;
                        }
                        break;
                  case "borderWidth":
                        pictureStatus.borderWidth = activePicture.borderWidth();
                        break;
                  case "borderColor":
                        pictureStatus.borderColor = activePicture.borderColor();
                        break;
                }
            }

            let borderStyle = activePicture.borderStyle();
            if(borderStyle && borderStyle !== "none"){
                pictureStatus.pictureLine = 1
            }else {
                pictureStatus.pictureLine = 0
            }
      }
      return pictureStatus;
    },
}
}这段代码声明了元素对应的行为命令, 可以看到命令的主体有两个关键函数: execute 和 getState,
getState可以用来获取UI元素的状态, 这里与bindingPath相关
execute用来执行修改, 本例中可以用来修改picture的状态.

KevinChen 发表于 2021-2-2 10:25:10

完整示例请参考附件

紫缘 发表于 2022-2-21 15:48:06

本帖最后由 紫缘 于 2022-2-21 16:04 编辑

KevinChen 发表于 2021-2-2 10:25
完整示例请参考附件
这里构造的时候 Type有哪些分别是什么

Derrick.Jiao 发表于 2022-2-21 16:40:31

紫缘 发表于 2022-2-21 15:48
这里构造的时候 Type有哪些分别是什么

可以下载上面的demo的sidePanels.picture.js看一下,包含了一些常用的type。



如果是文本输入框就是,TextEdtor

紫缘 发表于 2022-2-21 16:44:13

Derrick.Jiao 发表于 2022-2-21 16:40
可以下载上面的demo的sidePanels.picture.js看一下,包含了一些常用的type。




TextEditor文本框能否禁止输入禁止输入的添加什么参数

Derrick.Jiao 发表于 2022-2-21 16:57:33

紫缘 发表于 2022-2-21 16:44
TextEditor文本框能否禁止输入禁止输入的添加什么参数

目前暂不支持禁止输入

紫缘 发表于 2022-2-22 08:59:07

Derrick.Jiao 发表于 2022-2-21 16:57
目前暂不支持禁止输入

好的谢谢

Derrick.Jiao 发表于 2022-2-22 09:43:52

紫缘 发表于 2022-2-22 08:59
好的谢谢

不用客气,有新问题建议在求助中心发一个新帖,这样也方便后续的跟踪和处理。
页: [1]
查看完整版本: SpreadJS在线表格编辑器自定义功能 -- 自定制图片属性侧边栏(SidePanel)