import { IPSAppDEField } from '@ibizstudio/runtime'; import { DataTypes, ModelTool, Util } from '@ibizstudio/runtime'; import { Component, Prop } from 'vue-property-decorator'; import { VueLifeCycleProcessing } from '../../../decorators'; import { EditorBase } from '../editor-base/editor-base'; /** * 文本框编辑器 * * @export * @class TextboxEditor * @extends {EditorBase} */ @Component({}) @VueLifeCycleProcessing() export default class TextboxEditor extends EditorBase { /** * 是否防抖 * * @type {boolean} * @memberof TextboxEditor */ @Prop() isDebounce?: boolean; /** * 编辑器初始化 * * @memberof TextboxEditor */ async initEditor() { await super.initEditor(); let unitName = this.parentItem?.unitName; let appDeField: IPSAppDEField = this.parentItem?.getPSAppDEField?.(); switch (this.editorInstance?.editorType) { case 'TEXTBOX': this.customProps.isDebounce = this.isDebounce; this.customProps.type = ModelTool.isNumberField(appDeField) ? 'number' : 'text'; this.customProps.unit = unitName; this.customProps.precision = ModelTool.getPrecision(this.editorInstance, appDeField); break; case 'PASSWORD': this.customProps.isDebounce = this.isDebounce; this.customProps.type = 'password'; break; case 'TEXTAREA': this.customProps.isDebounce = this.isDebounce; this.customProps.type = 'textarea'; break; case 'TEXTAREA_10': this.customProps.isDebounce = this.isDebounce; this.customProps.type = 'textarea'; this.customProps.textareaId = Util.createUUID(); // todo lxm getEditorCssStyle // this.customProps.textareaStyle = this.editorInstance?.getEditorCssStyle || ""; this.customProps.rows = 10; break; case 'NUMBER': this.customProps.isDebounce = this.isDebounce; this.customProps.type = 'number'; this.customProps.unit = unitName; this.customProps.precision = ModelTool.getPrecision(this.editorInstance, appDeField); break; case 'MARKDOWN': this.customProps.mode = (this.editorInstance as any).mode ? (this.editorInstance as any).mode : 'EDIT'; break; } this.initFormatParams(); } /** * 初始化格式化参数 * * @param {*} value * @memberof TextboxEditor */ initFormatParams() { this.customProps.valueFormat = ''; let unitName = this.parentItem?.unitName; let appDeField: IPSAppDEField = this.parentItem?.getPSAppDEField?.(); if (appDeField?.stdDataType) { this.customProps.dataType = DataTypes.toString(appDeField.stdDataType); } if (appDeField?.valueFormat) { this.customProps.valueFormat = appDeField?.valueFormat; } if (this.valueFormat) { this.customProps.valueFormat = this.valueFormat; } if (this.editorInstance.editorParams?.valueFormat) { this.customProps.valueFormat = this.editorInstance.editorParams?.valueFormat; } if (unitName) { this.customProps.unitName = unitName; } } /** * 编辑器change事件 * * @param {*} value * @memberof TextboxEditor */ handleChange($event: any) { this.editorChange({ name: this.editorInstance.name, value: $event }); } /** * 编辑器enter事件 * * @param {*} value * @memberof TextboxEditor */ handleEnter($event: any) { this.$emit('enter', arguments); } /** * 绘制默认内容 * * @returns {*} * @memberof TextboxEditor */ renderTextbox() { return this.$createElement(this.editorComponentName, { props: { name: this.editorInstance.name, itemValue: this.value, disabled: this.disabled, ...this.customProps, }, on: { change: this.handleChange, enter: this.handleEnter, }, style: this.customStyle, }); } /** * 绘制默认内容 * * @returns {*} * @memberof TextboxEditor */ renderParameterDefinition() { return this.$createElement(this.editorComponentName, { props: { name: this.editorInstance.name, value: this.value, disabled: this.disabled, ...this.customProps, }, on: { 'data-change': this.handleChange, enter: this.handleEnter, }, style: this.customStyle, }); } /** * 绘制内置插件内容 * * @returns {*} * @memberof TextboxEditor */ renderTextboxColorPicker() { return this.$createElement(this.editorComponentName, { props: { name: this.editorInstance.name, value: this.value, data: this.contextData, ...this.customProps, }, on: { change: this.handleChange, colorChange: ($event: any) => { this.editorChange($event); }, }, style: this.customStyle, }); } /** * 绘制工作流审批组件 * * @returns {*} * @memberof TextareaEditor */ renderWfapproval(editorTypeStyle: string) { const param = { context: this.context, viewparams: this.viewparams, appEntityCodeName: this.containerCtrl?.getPSAppDataEntity?.()?.codeName, }; if (Object.is(editorTypeStyle, 'TEXTAREA_WFAPPROVAL') || Object.is(editorTypeStyle, 'TEXTAREA_WFAPPROVALEXTENDTIMELINE')) { Object.assign(param, { value: this.value, }); } return this.$createElement(this.editorComponentName, { props: param, on: { change: this.handleChange }, style: this.customStyle, }); } /** * 绘制内容 * * @returns {*} * @memberof TextboxEditor */ render(): any { if (!this.editorIsLoaded) { return null; } const { editorType: type, editorStyle: style } = this.editorInstance; const editorTypeStyle: string = `${type}${style && style != 'DEFAULT' ? '_' + style : ''}`; switch (editorTypeStyle) { case 'TEXTBOX': case 'PASSWORD': case 'TEXTAREA': case 'TEXTAREA_10': case 'NUMBER': if (this.editorInstance.editorParams?.['max']) { this.customProps.max = parseInt(this.editorInstance.editorParams?.['max']); } if (this.editorInstance.editorParams?.['min']) { this.customProps.min = parseInt(this.editorInstance.editorParams?.['min']); } case 'MARKDOWN': return this.renderTextbox(); case 'TEXTBOX_COLORPICKER': return this.renderTextboxColorPicker(); case 'TEXTAREA_WFAPPROVAL': case 'TEXTAREA_WFAPPROVALTIMELINE': case 'TEXTAREA_WFAPPROVALEXTENDTIMELINE': return this.renderWfapproval(editorTypeStyle); case 'TEXTAREA_ParameterDefinition': return this.renderParameterDefinition(); } } }