import {CtlBase} from './CtlBase'
import {YvEvent, YvEventDispatch} from './YvanEvent'
import {parseYvanPropChangeVJson} from './CtlUtils'
import webix from 'webix'
/**
* 扩展 echarts 组件
*/
webix.protoUI(
{
name: 'echarts',
defaults: {},
$init: function (config: any) {
this._domid = webix.uid();
this.$view.innerHTML = `
`
this.$ready.push(this._ready)
_.extend(this.config, config)
if (config.on && typeof config.on.onInited === 'function') {
config.on.onInited.call(this)
}
},
_ready: function (this: any) {
this.isCtlLoad = false;
},
_set_inner_size: function () {
if (!this.wrapper)
return
this.wrapper.resize();
// this._updateScrollSize()
// this._editor.scrollTo(0, 0) //force repaint, mandatory for IE
},
destructor: function () {
if (this.$destructed) {
return;
}
this.$destructed = true;
if (this.config.on && typeof this.config.on.onDestruct === 'function') {
this.config.on.onDestruct.call(this)
}
},
$setSize: function (this: any, x: any, y: any) {
const that = this;
if (webix.ui.view.prototype.$setSize.call(this, x, y)) {
_.defer(() => {
this._set_inner_size()
if (this.isCtlLoad == false) {
this.isCtlLoad = true
//@ts-ignore
require(['echarts'], (echarts) => {
const el = that.$view.children[0]
that.wrapper._echartsHandler = echarts.init(el)
that.config.on.onEchartRender.call(this)
})
}
})
}
}
},
webix.ui.view
)
export class CtlECharts extends CtlBase {
static create(module: any, vjson: any): CtlECharts {
const that = new CtlECharts(_.cloneDeep(vjson))
that._module = module
if (vjson.hasOwnProperty('debugger')) {
debugger
}
// 提取基础属性 onRender / ctlName / entityName 等等
const yvanProp = parseYvanPropChangeVJson(vjson, [
'onEchartRender',
'onClick',
'option'
])
// 将 vjson 存至 _webixConfig
that._webixConfig = vjson
// 将 yvanProp 合并至当前 CtlBase 对象
_.assign(that, yvanProp)
// 删除 vjson 所有数据, 替换为 template 语法
_.forOwn(vjson, (value, key) => {
delete vjson[key]
})
// 将 事件与 _webixConfig 一起存至 vjson 交给 webix 框架做渲染
_.merge(vjson, that._webixConfig, {
view: 'echarts',
on: {
onInited(this: any) {
// 初始化时回调
that.attachHandle(this, {...vjson, ...yvanProp})
this.wrapper = that
},
onEchartRender() {
// echarts.init 运行完毕之后回调
that._echartsHandler.on('click', (params: any) => {
YvEventDispatch(that.onClick, that, params)
})
if (yvanProp.option) {
that.setOption(yvanProp.option)
}
YvEventDispatch(yvanProp.onEchartRender, that, that)
},
onDestruct(this: any) {
if (that._echartsHandler) {
that._echartsHandler.dispose()
delete that._echartsHandler
}
that.removeHandle()
}
}
})
return that
}
private _echartsHandler!: echarts.ECharts
/*============================ 公共属性部分 ============================*/
/**
* 数据绑定完毕后触发
*/
onClick?: YvEvent
setOption(option: any, opts?: any): void {
this._echartsHandler.setOption(option, opts)
_.defer(() => {
this._echartsHandler.resize()
})
}
public get handle() {
return this._echartsHandler
}
resize() {
if (this._echartsHandler) {
this._echartsHandler.resize()
}
}
clear() {
if (this._echartsHandler) {
this._echartsHandler.clear();
}
}
}