第一步,注入组件接口

实现如下图所示效果

 

代码如下:

public class  XXXProvider extends AbstractCustomWidgetProvider {
    /**
     * 自定义组件名称或国际化key
     */
    @Override
    public String getName() {
        return "自定义组件demo";
    }

    /**
     * 自定义组件类型
     */
    @Override
    public String getType() {
        return "demo";
    }

    /**
     * 自定义组件 icon
     */
    @Override
    public String getIcon() {
        return "http://webapi.amap.com/theme/v1.3/mapinfo_05.png";
    }

    /**
     * 自定义选项 xtype
     */
    @Override
    public String getCustomTool() {
        return "bi.plugin.testwidget";
    }

	// 下面的接口再下方介绍
    ......
}

第二步 构造渲染页面

分编辑和预览两个场景

public class XXXProvider extends  AbstractCustomWidgetProvider {
 
 	@Override
	// 组件编辑界面的html,不写默认取预览
   public String getEditPageHTML(XXContext context) {
        return `<div id="container"></div>`;
    }
 
    @Override
	public Atom editClient() {
		return XXXComponent.KEY;
	}
 
    @Override
	// 组件预览界面的html
    public String getPreviewPageHTML(XXContext context) {
        return `<div id="container"></div>`;
    }
 
    @Override
	public Atom previewClient() {
		return XXXComponent.KEY;
	}
}

其中js规范如下:

1. 实现自定义组件渲染

// data:过滤信息,包括 控件过滤(controlFilterParamsMap) 及 自定义联动过滤(linkageParamsMap )
// config:配置信息,包括 自定义保存配置(customWidgetConfig)及 自定义选项保存配置(customWidgetToolConfig)
// closeSessionCallback:调用该接口会结束当前页面会话,把主动权交给BI
// saveSessionCallback(json: Object): Promise保存回调函数,入参为保存的json对象,返回值为Promise对象,返回保存成功或失败状态,比如: saveSessionCallback({ renderTimes: renderTimes + 1 })
// extensionCallBack:回调函数,用于刷新:extensionCallBack('refresh')
function render (data, config, closeSessionCallback, saveSessionCallback, extensionCallBack) {
     
}
new BIPlugin().init(render)

2.实现自定义选项组件,对应 js 注入到主题编辑页面

const widget = BI.inherit(BI.Widget, {
    ......
    render: function () {
		// 自定义选项保存配置及保存方法,saveCustomWidgetToolConfig({...})
        const {
            customWidgetToolConfig = {},
            saveCustomWidgetToolConfig
        } = this.options;
        ......
    }
});
BI.shortcut('bi.plugin.testwidget', widget);

插件demo:https://github.com/finereport-overseas/plugin-bi-custom-widget-demo