| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775 |
- <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[this.field.fieldName] == undefined
- || this.modelData[this.field.fieldName].displayValue == undefined
- || this.modelData[this.field.fieldName].displayValue.length < this.field.entityFieldIndex + 1){
- return null;
- }
- return this.modelData[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>
|