import { shortcut, store } from '@core/core'; import { TableList } from './table_list/table_list'; import '../less/index.less'; import { DatabaseIndex } from './components/database_index/database_index'; import { RedisModel, ParameterType } from './app.model'; import { Preview } from './components/preview/preview'; import './app.less'; import { redisField } from './app.constant'; @shortcut() @store(RedisModel) export class RedisDataset extends BI.Widget { static xtype = 'dec.dcm.connection.plugin.redis.dataset' private textWidth = 100; databaseIndex: DatabaseIndex; iconCombo: any; queryCondition: any; tableList: TableList; parameterEditor: any; previewButton: any; store: RedisModel['store'] model: RedisModel['model'] props = { value: { datasetData: { database: '', orderValue: 0, query: '', parameters: [], }, }, } watch = { parameters: () => { this.parameterEditor.populate(this.renderItems(), [this.model.paramHeader]); }, ableSave: (ableSave: boolean) => { this.previewButton.setEnable(ableSave); }, } render() { const { database = '', orderValue = 0, query = '', parameters = [] } = this.options.value.datasetData || {}; this.store.setParameters(parameters); this.store.setAbleSave(!!query); const inputType = typeof orderValue === 'string' ? 'formula' : 'int'; return { type: BI.HTapeLayout.xtype, tgap: 15, items: [{ el: { type: TableList.xtype, cls: 'bi-border-right', database, ref: (_ref: any) => { this.tableList = _ref; }, }, width: 300, }, { type: BI.VerticalLayout.xtype, lgap: 5, bgap: 10, items: [{ type: BI.HTapeLayout.xtype, height: 22, items: [{ el: { type: BI.Label.xtype, text: BI.i18nText('Plugin-Redis_DB_Index'), textAlign: 'left', }, width: this.textWidth, }, { type: BI.HTapeLayout.xtype, items: [{ el: { type: BI.IconCombo.xtype, height: 22, width: 28, value: inputType, items: [{ text: BI.i18nText('Plugin-Redis_Parameter_Type_Int'), value: 'int', iconCls: 'input-int-font', }, { text: BI.i18nText('Plugin-Redis_Parameter_Type_Formula'), value: 'formula', iconCls: 'input-formula-font', }], ref: (_ref: any) => { this.iconCombo = _ref; }, listeners: [{ eventName: 'EVENT_CHANGE', action: () => { const typeValue = this.iconCombo.getValue()[0]; this.databaseIndex.setSelect(typeValue); }, }], }, width: 28, }, { type: DatabaseIndex.xtype, rgap: 11, value: orderValue, inputType, ref: (_ref: any) => { this.databaseIndex = _ref; }, }], }], }, { type: BI.HTapeLayout.xtype, height: 200, rgap: 5, items: [{ el: { type: BI.Label.xtype, text: BI.i18nText('Plugin-Redis_Query_Condition'), textAlign: 'left', }, width: this.textWidth, }, { type: BI.TextAreaEditor.xtype, cls: 'bi-border', height: 200, allowBlank: true, value: query, ref: (_ref: any) => { this.queryCondition = _ref; }, listeners: [{ eventName: 'EVENT_CHANGE', action: () => { const value = this.queryCondition.getValue(); this.store.setAbleSave(!!value); }, }], }], }, { type: BI.HTapeLayout.xtype, height: 24, rgap: 5, items: [{ type: BI.Label.xtype, height: 24, text: BI.i18nText('Plugin-Redis_Set_Parameter'), textAlign: 'left', }, { el: { type: BI.Button.xtype, text: BI.i18nText('Plugin-Redis_Refresh'), level: 'ignore', handler: () => { Dec.Utils.getDataSetParameters(this.getParamSearchValue(), res => { const newParameters = BI.Services.getService('dec.service.data.set').getParameters(res.data, this.model.parameters); this.store.setParameters(newParameters); }); }, }, width: 80, }, { el: { type: BI.Button.xtype, text: BI.i18nText('Plugin-Redis_Preview'), disabled: !BI.get(this.model, 'ableSave'), handler: () => { this.openPreview(); }, ref: (_ref: any) => { this.previewButton = _ref; }, }, width: 80, }], }, { type: BI.StyleTable.xtype, cls: 'param-table', height: 200, columnSize: [300, 300, ''], items: this.renderItems(), header: [this.model.paramHeader], ref: (_ref: any) => { this.parameterEditor = _ref; }, }], }], }; } private renderItems() { const self = this; return this.model.parameters.map((item, index) => [{ type: BI.Label.xtype, text: item.name, textAlign: 'left', height: 30, lgap: 10, }, { type: BI.IconTextValueCombo.xtype, cls: 'field-type-change', height: 30, items: redisField, value: item.type, listeners: [{ eventName: BI.IconTextValueCombo.EVENT_CHANGE, action () { self.store.setParamType(index, this.getValue()[0]); }, }], }, this.createParameterValueItem(item, (value: string) => { self.store.setParamValue(index, value); })]); } private createParameterValueItem(param: ParameterType, cb: Function) { return BI.Services.getService('dec.service.data.set').createParameterValueItem(param, cb); } public getValue() { return { database: this.tableList.getSelectedDatabase(), orderValue: this.databaseIndex.getValue(), query: this.queryCondition.getValue(), parameters: this.model.parameters, }; } private getParamSearchValue() { return { datasetType: 'Redis', datasetName: BI.get(this.model, 'dataSetName'), datasetData: this.getValue(), }; } private openPreview() { const id = BI.UUID(); BI.Popovers.create(id, { type: 'bi.popover', width: 800, height: 500, body: { type: Preview.xtype, previewedDataSet: this.getParamSearchValue(), }, }).open(id); } }