|
|
@@ -0,0 +1,777 @@
|
|
|
+<template>
|
|
|
+ <div
|
|
|
+ v-if="modelData && modelData.data != undefined && field.visible"
|
|
|
+ v-show="showField"
|
|
|
+ class="form-group"
|
|
|
+ :class="formGroupClass"
|
|
|
+ >
|
|
|
+ <label
|
|
|
+ v-tooltip.right="field.help"
|
|
|
+ class="control-label"
|
|
|
+ :class="formGroupLabelClass"
|
|
|
+ :style="field.cssStyle"
|
|
|
+ >
|
|
|
+ <span v-if="field.mandatory" class="required-mark">*</span>
|
|
|
+ <font size="2">{{ Language.getDisplayNameTrl($i18n.locale, field) }}</font><br />
|
|
|
+ <font v-if="isChineseEnglish && $i18n.locale == 'zh-CN'" size="0.5">{{ field.displayNameEng }}</font>
|
|
|
+ </label>
|
|
|
+ <div class="input-group" :class="inputGroupClass">
|
|
|
+ <input
|
|
|
+ v-if="fieldUtil.isTextType(field)"
|
|
|
+ v-model="displayValue"
|
|
|
+ autocomplete="off"
|
|
|
+ type="text"
|
|
|
+ class="form-control"
|
|
|
+ :name="field.displayName"
|
|
|
+ :readonly="readOnly"
|
|
|
+ :disabled="readOnly"
|
|
|
+ />
|
|
|
+
|
|
|
+ <input
|
|
|
+ v-if="fieldUtil.isNumberType(field)"
|
|
|
+ v-model="displayValue"
|
|
|
+ autocomplete="off"
|
|
|
+ type="number"
|
|
|
+ class="form-control"
|
|
|
+ :name="field.displayName"
|
|
|
+ :readonly="readOnly"
|
|
|
+ :disabled="readOnly"
|
|
|
+ onmousewheel="return false;"
|
|
|
+ @mousewheel="mouseWheelEvent"
|
|
|
+ @change="numberFormat"
|
|
|
+ />
|
|
|
+
|
|
|
+ <switches
|
|
|
+ v-if="fieldUtil.isCheckBoxType(field)"
|
|
|
+ v-model="displayValue"
|
|
|
+ :selected="displayValue"
|
|
|
+ color="green"
|
|
|
+ :type-bold="true"
|
|
|
+ :disabled="readOnly"
|
|
|
+ />
|
|
|
+
|
|
|
+ <RedGreenSelect
|
|
|
+ v-if="fieldUtil.isRedGreenEditorType(field)"
|
|
|
+ v-model="displayValue"
|
|
|
+ type="string"
|
|
|
+ :disabled="readOnly"
|
|
|
+ />
|
|
|
+
|
|
|
+ <input
|
|
|
+ v-if="fieldUtil.isPasswordType(field)"
|
|
|
+ v-model="displayValue"
|
|
|
+ autocomplete="off"
|
|
|
+ type="password"
|
|
|
+ class="form-control"
|
|
|
+ :name="field.displayName"
|
|
|
+ :readonly="readOnly"
|
|
|
+ :disabled="readOnly"
|
|
|
+ />
|
|
|
+
|
|
|
+ <textarea
|
|
|
+ v-if="fieldUtil.isTextAreaType(field)"
|
|
|
+ v-model="displayValue"
|
|
|
+ class="form-control"
|
|
|
+ rows="3"
|
|
|
+ :name="field.displayName"
|
|
|
+ :style="field.cssStyle"
|
|
|
+ :readonly="readOnly"
|
|
|
+ :disabled="readOnly"
|
|
|
+ />
|
|
|
+
|
|
|
+ <Date
|
|
|
+ v-if="fieldUtil.isDateType(field)"
|
|
|
+ :model-value="displayValue"
|
|
|
+ :data-vv-name="field.displayName"
|
|
|
+ :name="field.displayName"
|
|
|
+ :data-vv-value-path="displayValue"
|
|
|
+ :readonly="readOnly"
|
|
|
+ style="width:100%"
|
|
|
+ @update:model-value="textChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <Time
|
|
|
+ v-if="fieldUtil.isTimeType(field)"
|
|
|
+ v-model="displayValue"
|
|
|
+ class="form-control"
|
|
|
+ :data-vv-name="field.displayName"
|
|
|
+ :name="field.displayName"
|
|
|
+ :data-vv-value-path="displayValue"
|
|
|
+ :readonly="readOnly"
|
|
|
+ />
|
|
|
+
|
|
|
+ <DateTime
|
|
|
+ v-if="fieldUtil.isDateTimeType(field)"
|
|
|
+ :model-value="displayValue"
|
|
|
+ :readonly="readOnly"
|
|
|
+ style="width:100%"
|
|
|
+ @update:model-value="textChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <YearPicker
|
|
|
+ v-if="fieldUtil.isYearType(field)"
|
|
|
+ :value="displayValue"
|
|
|
+ :readonly="readOnly"
|
|
|
+ @selected="textChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <VueMonthlyPicker
|
|
|
+ v-if="fieldUtil.isYearMonthType(field)"
|
|
|
+ id="month-picker"
|
|
|
+ v-model="month"
|
|
|
+ date-format="YYYY-MM"
|
|
|
+ class="vue-monthly-picker m-date-fieldEditView"
|
|
|
+ @selected="refresh"
|
|
|
+ />
|
|
|
+
|
|
|
+ <ImageWidget
|
|
|
+ v-if="fieldUtil.isImageType(field)"
|
|
|
+ :uuid="uuid1"
|
|
|
+ :pattern-json="field.pattern"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :class-name="className"
|
|
|
+ :readonly="readOnly"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <ImageListWidget
|
|
|
+ v-if="fieldUtil.isImageListType(field)"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :class-name="className"
|
|
|
+ :readonly="readOnly"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <VideoListWidget
|
|
|
+ v-if="fieldUtil.isVideoType(field)"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :class-name="className"
|
|
|
+ :readonly="readOnly"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <FileListWidget
|
|
|
+ v-if="fieldUtil.isFileType(field)"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :class-name="className"
|
|
|
+ :readonly="readOnly"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <EnumRadioGroupWidget
|
|
|
+ v-if="fieldUtil.isRadioButtonGroupType(field)"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :data-vv-name="field.displayName"
|
|
|
+ :name="field.displayName"
|
|
|
+ :data-vv-value-path="displayValue"
|
|
|
+ :readonly="readOnly"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <ManyToManySetSearchWidget
|
|
|
+ v-if="fieldUtil.isManyToManySetType(field)"
|
|
|
+ :info-window-no="field.infoWindowNo"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :readonly="readOnly"
|
|
|
+ :model-data="modelData"
|
|
|
+ :window-no="windowNo"
|
|
|
+ :tab-index="tabIndex"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <SearchWidget
|
|
|
+ v-if="fieldUtil.isSearchType(field)"
|
|
|
+ :info-window-no="field.infoWindowNo"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :readonly="readOnly"
|
|
|
+ :model-data="modelData"
|
|
|
+ :window-no="windowNo"
|
|
|
+ :tab-index="tabIndex"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <EnumSelectWidget
|
|
|
+ v-if="fieldUtil.isEnumListType(field)"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :name="field.displayName"
|
|
|
+ :readonly="readOnly"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <EnumMultiSelectWidget
|
|
|
+ v-if="fieldUtil.isEnumMultiType(field)"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :name="field.displayName"
|
|
|
+ :readonly="readOnly"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <SelectWidget
|
|
|
+ v-if="fieldUtil.isSelectType(field)"
|
|
|
+ ref="selectWidget"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :window-no="windowNo"
|
|
|
+ :tab-index="tabIndex"
|
|
|
+ :readonly="readOnly"
|
|
|
+ :model-data="modelData"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <ButtonWidget
|
|
|
+ v-if="fieldUtil.isButtonType(field)"
|
|
|
+ :field="field"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :readonly="readOnly"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ @execute-callout="executeCallout"
|
|
|
+ />
|
|
|
+
|
|
|
+ <RichTextAreaEditorWidget
|
|
|
+ v-if="fieldUtil.isRichTextAreaEditor(field)"
|
|
|
+ :display-value="displayValue"
|
|
|
+ :class-name="className"
|
|
|
+ :field-value="fieldValue"
|
|
|
+ :readonly="isReadOnly"
|
|
|
+ @value-changed="valueChanged"
|
|
|
+ />
|
|
|
+
|
|
|
+ <p v-show="!validateMandatory" class="required-mark required-error">
|
|
|
+ 该字段为必填字段
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import fieldUtil from '../../resource/dictionary/FieldUtil.js';
|
|
|
+
|
|
|
+import WindowClientUtil from '../../resource/dictionary/WindowClientUtil.js';
|
|
|
+import Language from '../../common/Language.js';
|
|
|
+import Context from '../common/Context.js';
|
|
|
+
|
|
|
+import SearchWidget from '../tabFormWidget/SearchWidget.vue';
|
|
|
+import ImageListWidget from '../tabFormWidget/ImageListWidget.vue';
|
|
|
+import EnumSelectWidget from '../tabFormWidget/EnumSelectWidget.vue';
|
|
|
+import SelectWidget from '../tabFormWidget/SelectWidget.vue';
|
|
|
+import EnumRadioGroupWidget from '../tabFormWidget/EnumRadioGroupWidget.vue';
|
|
|
+import VideoListWidget from '../tabFormWidget/VideoListWidget.vue';
|
|
|
+import FileListWidget from '../tabFormWidget/FileListWidget.vue';
|
|
|
+import ButtonWidget from '../tabFormWidget/ButtonWidget.vue';
|
|
|
+
|
|
|
+import EnumMultiSelectWidget from '../tabFormWidget/EnumMultiSelectWidget.vue';
|
|
|
+import ManyToManySetSearchWidget from '../tabFormWidget/ManyToManySetSearchWidget.vue';
|
|
|
+import RedGreenSelect from '../../widget/RedGreenSelect.vue';
|
|
|
+import ImageWidget from '../tabFormWidget/ImageWidget.vue';
|
|
|
+import RichTextAreaEditorWidget from '../tabFormWidget/RichTextAreaEditorWidget.vue';
|
|
|
+import JsUtil from '../../common/JsUtil.js';
|
|
|
+import { Notify, Uuid } from 'pc-component-v3';
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+export default {
|
|
|
+
|
|
|
+ components: {
|
|
|
+ SearchWidget,
|
|
|
+ ImageListWidget,
|
|
|
+ EnumSelectWidget,
|
|
|
+ SelectWidget,
|
|
|
+ EnumRadioGroupWidget,
|
|
|
+ VideoListWidget,
|
|
|
+ FileListWidget,
|
|
|
+ EnumMultiSelectWidget,
|
|
|
+ ManyToManySetSearchWidget,
|
|
|
+ ImageWidget,
|
|
|
+ RedGreenSelect,
|
|
|
+ ButtonWidget,
|
|
|
+ RichTextAreaEditorWidget,
|
|
|
+ },
|
|
|
+
|
|
|
+ props: {
|
|
|
+
|
|
|
+ windowNo: {
|
|
|
+ type: String,
|
|
|
+ default: null,
|
|
|
+ },
|
|
|
+ tabIndex: {
|
|
|
+ type: Number,
|
|
|
+ default: null,
|
|
|
+ },
|
|
|
+ className: {
|
|
|
+ type: String,
|
|
|
+ default: null,
|
|
|
+ },
|
|
|
+ multipleColumn: {
|
|
|
+ type: Boolean,
|
|
|
+ default: null,
|
|
|
+ },
|
|
|
+ jsUrl: {
|
|
|
+ type: String,
|
|
|
+ default: null,
|
|
|
+ },
|
|
|
+ field: {
|
|
|
+ type: Object,
|
|
|
+ default : function(){
|
|
|
+ return null;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ modelData: {
|
|
|
+ type: Object,
|
|
|
+ default : function(){
|
|
|
+ return null;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ isChineseEnglish: {
|
|
|
+ type: Boolean,
|
|
|
+ default: null,
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ emits: ['executeCallout', 'valueChanged'],
|
|
|
+
|
|
|
+ data: function () {
|
|
|
+ this.Language = Language;
|
|
|
+ // eslint-disable-next-line
|
|
|
+ var value =
|
|
|
+ this.modelData == undefined ||
|
|
|
+ this.modelData.data == undefined ||
|
|
|
+ this.modelData.data[this.field.fieldName] == undefined
|
|
|
+ ? ''
|
|
|
+ : this.modelData.data[this.field.fieldName].displayValue[
|
|
|
+ this.field.entityFieldIndex
|
|
|
+ ];
|
|
|
+
|
|
|
+ var fieldValue =
|
|
|
+ this.modelData == undefined || this.modelData.data == undefined
|
|
|
+ ? []
|
|
|
+ : this.modelData.data[this.field.fieldName];
|
|
|
+
|
|
|
+ return {
|
|
|
+ displayValue: value,
|
|
|
+ fieldValue: fieldValue,
|
|
|
+ fieldUtil: fieldUtil,
|
|
|
+ validateMandatory: true, // 验证强制字段是否通过
|
|
|
+ month: undefined,
|
|
|
+ uuid1: Uuid.createUUID(),
|
|
|
+ showField: true, // 显示字段
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+ computed: {
|
|
|
+ readOnly: function () {
|
|
|
+ if (this.field == undefined) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.field != undefined && this.field.readOnly == true) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.field != undefined && this.field.entityFieldIndex > 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (
|
|
|
+ this.modelData != undefined &&
|
|
|
+ this.modelData.id > 0 &&
|
|
|
+ (this.field.updatable == undefined || this.field.updatable == false)
|
|
|
+ ) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return this.field.readOnly;
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 表单组的CSS样式
|
|
|
+ * 对应 bootstrap 表单 form-group
|
|
|
+ */
|
|
|
+ formGroupClass: function () {
|
|
|
+ return {
|
|
|
+ 'form-group-single-row':
|
|
|
+ this.field != undefined && this.field.singleRow,
|
|
|
+ 'form-group-multiple-row':
|
|
|
+ this.field != undefined && !this.field.singleRow,
|
|
|
+ 'form-group-multiple-column':
|
|
|
+ this.field != undefined && this.multipleColumn == true, // 多列
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 标题的CSS样式
|
|
|
+ * 对应 bootstrap 表单 label 样式
|
|
|
+ */
|
|
|
+ formGroupLabelClass: function () {
|
|
|
+ return {
|
|
|
+ 'm-sr-only':
|
|
|
+ this.field == null || !this.field.visible || !this.field.showLabel, // 显示/隐藏
|
|
|
+ 'col-xs-5 col-sm-4 col-md-3 col-lg-2':
|
|
|
+ this.field != null && this.multipleColumn == false, // 单列
|
|
|
+ 'label-multiple-column':
|
|
|
+ this.field != null && this.multipleColumn == true, // 多列
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 控件的CSS样式
|
|
|
+ * 对应 bootstrap 表单 input-group
|
|
|
+ */
|
|
|
+ inputGroupClass: function () {
|
|
|
+ return {
|
|
|
+ 'col-xs-7 col-sm-8 col-md-9 col-lg-10':
|
|
|
+ this.field != null && this.multipleColumn == false, // 单列
|
|
|
+ 'input-group-multiple-column': this.multipleColumn, // 多列
|
|
|
+ 'input-group-single-row':
|
|
|
+ this.field != undefined &&
|
|
|
+ this.field.singleRow == true &&
|
|
|
+ this.multipleColumn, // 单独一行
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 控件的CSS样式
|
|
|
+ * 对应 bootstrap 表单 input-group 内的元素
|
|
|
+ */
|
|
|
+ inputGroupItemClass: function () {
|
|
|
+ return {};
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ watch: {
|
|
|
+ displayValue: function (currentValue, oldValue) {
|
|
|
+ if (
|
|
|
+ fieldUtil.isSearchType(this.field) == false &&
|
|
|
+ this.field.entityFieldIndex == 0 &&
|
|
|
+ fieldUtil.isSelectType(this.field) == false &&
|
|
|
+ fieldUtil.isRadioButtonGroupType(this.field) == false &&
|
|
|
+ fieldUtil.isEnumListType(this.field) == false &&
|
|
|
+ fieldUtil.isManyToManySetType(this.field) == false
|
|
|
+ ) {
|
|
|
+ // add by jack 20240220
|
|
|
+ // 修复bug:当modelData.data的值从外部修改以后,修改执行 watch->'modelData.data' 中的 this.displayValue = ? 方法
|
|
|
+ // 执行完成以后,watch->displayValue 又会执行,会触发valueChanged事件,这会导致 callout/calloutjs 会被多次执行。
|
|
|
+ // 所以在触发 valueChanged 的之前,先判断currentValue与modelData中的值是否相等,
|
|
|
+ // 如果相等,说明是外部修改了modelData,然后执行了 watch->'modelData.data' 方法修改了 displayValue,此时不触发valueChanged事件。
|
|
|
+ // 如果不相等,说明是DOM修改了,触发修改了displayValue,此时触发valueChanged事件。
|
|
|
+
|
|
|
+ const modelDataFieldDisplayValue = this.getModelDataFieldDisplayValue();
|
|
|
+
|
|
|
+ if (currentValue !== oldValue && currentValue !== modelDataFieldDisplayValue) {
|
|
|
+ var newFieldValue = {
|
|
|
+ displayValue: [currentValue],
|
|
|
+ fieldType: 'String',
|
|
|
+ };
|
|
|
+ this.$emit('valueChanged', newFieldValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ 'modelData.data': {
|
|
|
+ deep: true,
|
|
|
+ handler(curVal, oldVal) {
|
|
|
+ if(curVal == undefined ||
|
|
|
+ curVal[this.field.fieldName] == undefined ||
|
|
|
+ curVal[this.field.fieldName].displayValue == undefined ||
|
|
|
+ curVal[this.field.fieldName].displayValue.length < this.field.entityFieldIndex + 1){
|
|
|
+ this.displayValue = '';
|
|
|
+ }else{
|
|
|
+ let tempValue = curVal[this.field.fieldName].displayValue[this.field.entityFieldIndex];
|
|
|
+ if(fieldUtil.isCheckBoxType(this.field)){
|
|
|
+ if(typeof(tempValue) =='string'){
|
|
|
+ this.displayValue = (tempValue === 'true') ? true : false;
|
|
|
+ }
|
|
|
+ if(typeof(tempValue) =='boolean'){
|
|
|
+ this.displayValue = (tempValue === true) ? true : false;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ this.displayValue = tempValue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.fieldValue = curVal == undefined ? [] : curVal[this.field.fieldName];
|
|
|
+ this.showLogical();
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ month: function () {
|
|
|
+ this.textChanged(this.month);
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ mounted: function () {},
|
|
|
+
|
|
|
+ methods: {
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取Context
|
|
|
+ */
|
|
|
+ getContext: Context,
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取modelData中字段的显示值
|
|
|
+ */
|
|
|
+ getModelDataFieldDisplayValue : function(){
|
|
|
+ if(this.modelData == null
|
|
|
+ || this.field == null
|
|
|
+ || this.modelData.data[this.field.fieldName] == undefined
|
|
|
+ || this.modelData.data[this.field.fieldName].displayValue == undefined
|
|
|
+ || this.modelData.data[this.field.fieldName].displayValue.length < this.field.entityFieldIndex + 1){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return this.modelData.data[this.field.fieldName].displayValue[this.field.entityFieldIndex];
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ // 值改变事件
|
|
|
+ valueChanged: function (newFieldValue) {
|
|
|
+ // this.fieldValue = newFieldValue;
|
|
|
+ this.$emit('valueChanged', newFieldValue);
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 执行Callout
|
|
|
+ */
|
|
|
+ executeCallout: function (field) {
|
|
|
+ this.$emit('executeCallout', field);
|
|
|
+ },
|
|
|
+
|
|
|
+ //年份选择器值改变
|
|
|
+ textChanged: function (value) {
|
|
|
+ var newFieldValue = {
|
|
|
+ displayValue: [value],
|
|
|
+ fieldType: 'String',
|
|
|
+ };
|
|
|
+ this.$emit('valueChanged', newFieldValue);
|
|
|
+ },
|
|
|
+
|
|
|
+ validateRule: function (field) {
|
|
|
+ return field.mandatory ? 'required' : '';
|
|
|
+ },
|
|
|
+
|
|
|
+ performValide: function () {
|
|
|
+ var _self = this;
|
|
|
+ _self.validateMandatory = true;
|
|
|
+
|
|
|
+ if (this.field.mandatory == true) {
|
|
|
+ if (
|
|
|
+ fieldUtil.isRadioButtonGroupType(this.field) ||
|
|
|
+ fieldUtil.isSelectType(this.field) ||
|
|
|
+ fieldUtil.isSearchType(this.field)
|
|
|
+ ) {
|
|
|
+ var idValue =
|
|
|
+ this.modelData == undefined ||
|
|
|
+ this.modelData.data == undefined ||
|
|
|
+ this.modelData.data[this.field.fieldName] == undefined
|
|
|
+ ? undefined
|
|
|
+ : this.modelData.data[this.field.fieldName].id;
|
|
|
+ if (idValue == null || idValue == '' || idValue < 1) {
|
|
|
+ _self.validateMandatory = false;
|
|
|
+ }
|
|
|
+ } else if (fieldUtil.isCheckBoxType(this.field)) {
|
|
|
+ return true;
|
|
|
+ } else if (fieldUtil.isRedGreenEditorType(this.field)) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ var stringValue =
|
|
|
+ this.modelData == undefined ||
|
|
|
+ this.modelData.data == undefined ||
|
|
|
+ this.modelData.data[this.field.fieldName] == undefined
|
|
|
+ ? ''
|
|
|
+ : this.modelData.data[this.field.fieldName].displayValue[0];
|
|
|
+ if (stringValue == undefined || stringValue === '') {
|
|
|
+ _self.validateMandatory = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return _self.validateMandatory;
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 年份变化
|
|
|
+ */
|
|
|
+ yearChange: function () {},
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 年月选择完成
|
|
|
+ */
|
|
|
+ refresh: function () {},
|
|
|
+
|
|
|
+ numberFormat: function () {
|
|
|
+ if (
|
|
|
+ this.fieldItem &&
|
|
|
+ this.fieldItem.pattern &&
|
|
|
+ this.fieldItem.pattern != ''
|
|
|
+ ) {
|
|
|
+ var _self = this;
|
|
|
+ fieldUtil.formatNumber(
|
|
|
+ this.displayValue,
|
|
|
+ this.fieldItem.pattern,
|
|
|
+ function (formatValue) {
|
|
|
+ _self.displayValue = formatValue;
|
|
|
+ },
|
|
|
+ );
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 禁止滚轮滚动影响数字
|
|
|
+ */
|
|
|
+ mouseWheelEvent: function (event) {
|
|
|
+ if (event || Window.event) {
|
|
|
+ event.preventDefault();
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 响应显示逻辑
|
|
|
+ */
|
|
|
+ showLogical: function () {
|
|
|
+ let _self = this;
|
|
|
+ var logic = this.field.showLogical;
|
|
|
+ if (logic == null || logic == '') {
|
|
|
+ this.showField = true;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const functionName =
|
|
|
+ this.field.fieldName.replace('.', '_') + '_showLogical';
|
|
|
+
|
|
|
+
|
|
|
+ let executeFunction = function(){
|
|
|
+ try{
|
|
|
+ let context = new _self.getContext(_self.modelData);
|
|
|
+ _self.showField = _self[functionName](context);
|
|
|
+ }catch(error){
|
|
|
+ console.error(error);
|
|
|
+ Notify.error('数据字典定义异常', '【' + logic + '】前端列显示逻辑定义异常,请联系管理员检查数据字典的定义。', false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ if (_self[functionName] == null) {
|
|
|
+ const jsUrl = _self.jsUrl;
|
|
|
+ if(jsUrl == null || jsUrl == undefined){
|
|
|
+ Notify.error('数据字典定义异常', '【' + logic + '】前端列显示逻辑的JS文件不存在,请联系管理员检查数据字典是否JS文件。', false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ let promise = JsUtil.dynamicLoadJsFunction(jsUrl, logic);
|
|
|
+
|
|
|
+ promise.then(targetFunction => {
|
|
|
+ _self[functionName] = targetFunction;
|
|
|
+ if(_self[functionName] == null){
|
|
|
+ Notify.error('数据字典定义异常', '【' + logic + '】前端列显示逻辑方法不存在,请联系管理员检查数据字典。', false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ executeFunction();
|
|
|
+ }, errorData => {
|
|
|
+ console.error(errorData);
|
|
|
+ });
|
|
|
+ }else{
|
|
|
+ executeFunction();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+<style scoped>
|
|
|
+.required-mark {
|
|
|
+ color: red;
|
|
|
+ margin-right: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+input::-webkit-outer-spin-button,
|
|
|
+input::-webkit-inner-spin-button {
|
|
|
+ -webkit-appearance: none !important;
|
|
|
+ margin: 0;
|
|
|
+}
|
|
|
+
|
|
|
+input[type="number"] {
|
|
|
+ -moz-appearance: textfield;
|
|
|
+}
|
|
|
+textarea {
|
|
|
+ overflow-y: auto !important;
|
|
|
+ overflow-x: hidden !important;
|
|
|
+}
|
|
|
+
|
|
|
+.form-group-single-row {
|
|
|
+ display: block;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.input-group-item {
|
|
|
+ word-break: break-all;
|
|
|
+}
|
|
|
+
|
|
|
+.input-group-item-manytomany {
|
|
|
+ color: #333;
|
|
|
+ background-color: #f0f0f0;
|
|
|
+ border: 1px solid #ccc;
|
|
|
+ border-radius: 4px;
|
|
|
+ height: 26px;
|
|
|
+ margin: 4px 4px 0px 0px;
|
|
|
+ padding: 6px 0.25em;
|
|
|
+}
|
|
|
+
|
|
|
+.label-multiple-column {
|
|
|
+ width: 120px;
|
|
|
+}
|
|
|
+
|
|
|
+.form-group-multiple-column {
|
|
|
+ margin-top: 5px;
|
|
|
+}
|
|
|
+
|
|
|
+@media (max-width: 768px) {
|
|
|
+ .input-group-single-row {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .input-group-item {
|
|
|
+ padding-top: 0px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@media (min-width: 768px) {
|
|
|
+ .label-multiple-column {
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ text-align: right;
|
|
|
+ padding-right: 5px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .input-group-multiple-column {
|
|
|
+ width: 230px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .input-group-single-row {
|
|
|
+ width: calc(100% - 200px) !important;
|
|
|
+ word-wrap: break-word;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.m-sr-only {
|
|
|
+ visibility: hidden;
|
|
|
+}
|
|
|
+</style>
|
|
|
+
|
|
|
+
|
|
|
+<style>
|
|
|
+.m-date-fieldEditView > div:first-child {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+</style>
|