TabFormFieldView.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. <template>
  2. <div
  3. v-if="modelData != null && modelData.data != undefined && field.visible"
  4. v-show="showField"
  5. class="form-group"
  6. :class="formGroupClass"
  7. >
  8. <label
  9. v-tooltip.right="field.help"
  10. class="control-label"
  11. :class="formGroupLabelClass"
  12. :style="field.cssStyle"
  13. >
  14. <span v-if="field.mandatory" class="required-mark">*</span>
  15. <font size="2">{{ Language.getDisplayNameTrl($i18n.locale, field) }}</font><br />
  16. <font v-if="isChineseEnglish && $i18n.locale == 'zh-CN'" size="0.5">{{ field.displayNameEng }}</font>
  17. </label>
  18. <div class="input-group" :class="inputGroupClass">
  19. <p
  20. v-if="
  21. !fieldUtil.isManyToManySetType(field) &&
  22. !fieldUtil.isImageType(field) &&
  23. !fieldUtil.isImageListType(field) &&
  24. !fieldUtil.isCheckBoxType(field) &&
  25. !fieldUtil.isRedGreenEditorType(field) &&
  26. !fieldUtil.isVideoType(field) &&
  27. !fieldUtil.isEnumMultiType(field) &&
  28. !fieldUtil.isImageListType(field) &&
  29. !fieldUtil.isEnumListType(field) &&
  30. !fieldUtil.isTextAreaType(field) &&
  31. !fieldUtil.isFileType(field) &&
  32. !fieldUtil.isRichTextAreaEditor(field) &&
  33. !fieldUtil.isNumberType(field)
  34. "
  35. v-tooltip.left="getFieldStringValue()"
  36. class="form-control-static input-group-item"
  37. >
  38. {{ getFieldStringValue() }}
  39. </p>
  40. <p
  41. v-if="fieldUtil.isNumberType(field)"
  42. class="form-control-static input-group-item"
  43. >
  44. {{ getFieldNumberValue() }}
  45. </p>
  46. <p v-if="fieldUtil.isRichTextAreaEditor(field)" :style="field.cssStyle">
  47. {{ getFieldStringValue() }}
  48. </p>
  49. <p
  50. v-if="fieldUtil.isTextAreaType(field)"
  51. v-tooltip.left="getFieldStringValue()"
  52. class="form-control-static"
  53. :class="inputGroupItemClass"
  54. style="word-break: break-all; white-space: pre-line"
  55. >
  56. {{ getFieldStringValue() }}
  57. </p>
  58. <p
  59. v-if="fieldUtil.isManyToManySetType(field)"
  60. class="form-control-static input-group-item"
  61. :class="inputGroupItemClass"
  62. >
  63. <span
  64. v-for="item in getManyToManyValues()"
  65. :key="item"
  66. class="input-group-item-manytomany"
  67. >
  68. {{ item }}
  69. </span>
  70. </p>
  71. <p
  72. v-if="fieldUtil.isCheckBoxType(field)"
  73. class="form-control-static input-group-item"
  74. :class="inputGroupItemClass"
  75. >
  76. {{ getFieldStringValue() == "true" ? $t("lang.TabFormFieldView.yes") : $t("lang.TabFormFieldView.no") }}
  77. </p>
  78. <p
  79. v-if="fieldUtil.isRedGreenEditorType(field)"
  80. class="form-control-static input-group-item"
  81. :class="inputGroupItemClass"
  82. >
  83. {{ getFieldStringValue() == "true" ? "红单" : "蓝单" }}
  84. </p>
  85. <p
  86. v-if="fieldUtil.isEnumListType(field)"
  87. class="form-control-static input-group-item"
  88. :class="inputGroupItemClass"
  89. >
  90. {{ getEnmuValue() === "编辑中" ? $t("lang.TabFormFieldView.editing"):
  91. getEnmuValue() === "审批中" ? $t("lang.TabFormFieldView.pendingApproval"):
  92. getEnmuValue() === "审批通过" ? $t("lang.TabFormFieldView.approved"):
  93. getEnmuValue() === "审批不通过" ? $t("lang.TabFormFieldView.rejected"):
  94. getEnmuValue() === "单据已撤回" ? $t("lang.TabFormFieldView.withdraw"):
  95. getEnmuValue() === "转移" ? $t("lang.TabFormFieldView.transfer"):
  96. getEnmuValue() === "报废" ? $t("lang.TabFormFieldView.disposal"):
  97. getEnmuValue() === "全盘" ? $t("lang.TabFormFieldView.overall"):
  98. getEnmuValue() === "抽盘" ? $t("lang.TabFormFieldView.randomInventory"):getEnmuValue()
  99. }}
  100. </p>
  101. <p
  102. v-if="fieldUtil.isEnumMultiType(field)"
  103. class="form-control-static input-group-item"
  104. :class="inputGroupItemClass"
  105. >
  106. {{ getMultiEnmuValue() }}
  107. </p>
  108. <div
  109. v-if="fieldUtil.isImageType(field)"
  110. class="form-control-static input-group"
  111. :class="inputGroupItemClass"
  112. style="display: inline-block"
  113. :style="field.cssStyle"
  114. >
  115. <ImageViewWidget
  116. v-if="fieldUtil.isImageType(field)"
  117. :field="field"
  118. :field-value="fieldValue"
  119. :class-name="className"
  120. />
  121. </div>
  122. <div
  123. v-if="fieldUtil.isImageListType(field)"
  124. class="form-control-static"
  125. :class="inputGroupItemClass"
  126. :style="field.cssStyle"
  127. >
  128. <ImageListViewWidget
  129. v-if="fieldUtil.isImageListType(field)"
  130. :key="'ImageListViewWidget' + new Date().getTime()"
  131. :field="field"
  132. :field-value="fieldValue"
  133. :class-name="className"
  134. />
  135. </div>
  136. <div
  137. v-if="fieldUtil.isVideoType(field)"
  138. class="form-control-static"
  139. :class="inputGroupItemClass"
  140. :style="field.cssStyle"
  141. >
  142. <VideoListWidget
  143. v-if="fieldUtil.isVideoType(field)"
  144. :field="field"
  145. :field-value="fieldValue"
  146. :class-name="className"
  147. :readonly="readOnly"
  148. />
  149. </div>
  150. <div
  151. v-if="fieldUtil.isFileType(field)"
  152. :class="inputGroupItemClass"
  153. :style="field.cssStyle"
  154. style="display: inline-block"
  155. >
  156. <FileListWidget
  157. v-if="fieldUtil.isFileType(field)"
  158. :field="field"
  159. :field-value="fieldValue"
  160. :class-name="className"
  161. :readonly="true"
  162. />
  163. </div>
  164. <div v-if="fieldUtil.isButtonType(field)" style="display: inline-block">
  165. <ButtonWidget
  166. :field="field"
  167. :field-value="fieldValue"
  168. :readonly="readOnly"
  169. @execute-callout="executeCallout"
  170. />
  171. </div>
  172. </div>
  173. </div>
  174. </template>
  175. <script>
  176. import fieldUtil from '../../resource/dictionary/FieldUtil.js';
  177. import WindowClientUtil from '../../resource/dictionary/WindowClientUtil.js';
  178. import Language from '../../common/Language.js';
  179. import Context from '../common/Context.js';
  180. import EnumSelectWidget from '../tabFormWidget/EnumSelectWidget.vue';
  181. import SelectWidget from '../tabFormWidget/SelectWidget.vue';
  182. import EnumRadioGroupWidget from '../tabFormWidget/EnumRadioGroupWidget.vue';
  183. import VideoListWidget from '../tabFormWidget/VideoListWidget.vue';
  184. import FileListWidget from '../tabFormWidget/FileListWidget.vue';
  185. import ButtonWidget from '../tabFormWidget/ButtonWidget.vue';
  186. import ImageViewWidget from '../tabFormWidget/ImageViewWidget.vue';
  187. import ImageListViewWidget from '../tabFormWidget/ImageListViewWidget.vue';
  188. import JsUtil from '../../common/JsUtil.js';
  189. import { SqlApi } from 'pc-component-v3';
  190. import { Notify, Uuid } from 'pc-component-v3';
  191. export default {
  192. components: {
  193. ImageViewWidget,
  194. ImageListViewWidget,
  195. EnumSelectWidget,
  196. SelectWidget,
  197. EnumRadioGroupWidget,
  198. VideoListWidget,
  199. FileListWidget,
  200. ButtonWidget,
  201. },
  202. props: {
  203. className: {
  204. type: String,
  205. default: null,
  206. },
  207. multipleColumn: {
  208. type: Boolean,
  209. default: null,
  210. },
  211. jsUrl: {
  212. type: String,
  213. default: null,
  214. },
  215. field: {
  216. type: Object,
  217. default: function () {
  218. return null;
  219. },
  220. },
  221. modelData: {
  222. type: Object,
  223. default: function () {
  224. return null;
  225. },
  226. },
  227. isChineseEnglish: {
  228. type: Boolean,
  229. default: null,
  230. },
  231. },
  232. emits: ['executeCallout'],
  233. data: function () {
  234. this.Language = Language;
  235. var value =
  236. this.modelData.data == undefined ||
  237. this.modelData.data[this.field.fieldName] == undefined
  238. ? ''
  239. : this.modelData.data[this.field.fieldName].displayValue.join(', ');
  240. var fieldValue =
  241. this.modelData.data == undefined ? [] : this.modelData.data[this.field.fieldName];
  242. return {
  243. displayValue: value,
  244. fieldValue: fieldValue,
  245. fieldUtil: fieldUtil,
  246. showField: true, // 显示字段
  247. };
  248. },
  249. computed: {
  250. /**
  251. * 表单组的CSS样式
  252. * 对应 bootstrap 表单 form-group
  253. */
  254. formGroupClass: function () {
  255. return {
  256. 'form-group-single-row': this.field != undefined && this.field.singleRow,
  257. 'form-group-multiple-row': this.field != undefined && !this.field.singleRow,
  258. };
  259. },
  260. /**
  261. * 标题的CSS样式
  262. * 对应 bootstrap 表单 label 样式
  263. */
  264. formGroupLabelClass: function () {
  265. return {
  266. 'm-sr-only': this.field == null || !this.field.visible || !this.field.showLabel, // 显示/隐藏
  267. 'col-xs-5 col-sm-4 col-md-3 col-lg-2':
  268. this.field != null && this.multipleColumn == false, // 单列
  269. 'label-multiple-column': this.field != null && this.multipleColumn == true, // 多列
  270. };
  271. },
  272. /**
  273. * 控件的CSS样式
  274. * 对应 bootstrap 表单 input-group
  275. */
  276. inputGroupClass: function () {
  277. return {
  278. 'col-xs-7 col-sm-8 col-md-9 col-lg-10':
  279. this.field != null && this.multipleColumn == false, // 单列
  280. 'input-group-multiple-column': this.multipleColumn, // 多列
  281. 'input-group-single-row':
  282. this.field != undefined && this.field.singleRow == true && this.multipleColumn, // 单独一行
  283. };
  284. },
  285. /**
  286. * 控件的CSS样式
  287. * 对应 bootstrap 表单 input-group 内的元素
  288. */
  289. inputGroupItemClass: function () {
  290. return {};
  291. },
  292. readOnly: function () {
  293. if (this.field == undefined) {
  294. return true;
  295. }
  296. if (this.field != undefined && this.field.readOnly == true) {
  297. return true;
  298. }
  299. if (this.field != undefined && this.field.entityFieldIndex > 0) {
  300. return true;
  301. }
  302. if (
  303. this.modelData != undefined &&
  304. this.modelData.id > 0 &&
  305. (this.field.updatable == undefined || this.field.updatable == false)
  306. ) {
  307. return true;
  308. }
  309. return this.field.readOnly;
  310. },
  311. },
  312. watch: {
  313. 'modelData.data': {
  314. deep: true,
  315. handler(curVal, oldVal) {
  316. this.displayValue =
  317. curVal == undefined ||
  318. curVal[this.field.fieldName] == undefined ||
  319. curVal[this.field.fieldName].displayValue == undefined
  320. ? ''
  321. : curVal[this.field.fieldName].displayValue[0];
  322. this.fieldValue = curVal == undefined ? [] : curVal[this.field.fieldName];
  323. this.showLogical();
  324. },
  325. },
  326. },
  327. mounted: function () {
  328. },
  329. methods: {
  330. /**
  331. * 获取Context
  332. */
  333. getContext: Context,
  334. /**
  335. * 执行Callout
  336. */
  337. executeCallout: function (field) {
  338. this.$emit('executeCallout', field);
  339. },
  340. // 获取String字符串
  341. getFieldStringValue: function () {
  342. var value = '';
  343. if (
  344. this.fieldValue == undefined ||
  345. this.fieldValue.displayValue == undefined ||
  346. this.fieldValue.displayValue.length < this.field.entityFieldIndex
  347. ) {
  348. return '';
  349. } else {
  350. value = fieldUtil.formatNumbers(
  351. this.fieldValue.displayValue[this.field.entityFieldIndex],
  352. this.field.pattern,
  353. this.field.displayType,
  354. );
  355. return value;
  356. }
  357. },
  358. // 获取Number
  359. getFieldNumberValue: function () {
  360. if (
  361. this.fieldValue == undefined ||
  362. this.fieldValue.displayValue == undefined ||
  363. this.fieldValue.displayValue.length < this.field.entityFieldIndex
  364. ) {
  365. return '';
  366. } else {
  367. return this.fieldValue.displayValue[this.field.entityFieldIndex];
  368. }
  369. },
  370. showLogical: function (field) {
  371. let _self = this;
  372. var logic = this.field.showLogical;
  373. if (logic == null || logic == '') {
  374. this.showField = true;
  375. return;
  376. }
  377. let functionName = this.field.fieldName.replace('.', '_') + '_showLogical';
  378. let executeFunction = function(){
  379. try{
  380. let context = new _self.getContext(_self.modelData);
  381. _self.showField = _self[functionName](context);
  382. }catch(error){
  383. console.error(error);
  384. Notify.error('数据字典定义异常', '【' + logic + '】前端列显示逻辑定义异常,请联系管理员检查数据字典的定义。', false);
  385. }
  386. };
  387. if (_self[functionName] == null) {
  388. const jsUrl = _self.jsUrl;
  389. if (jsUrl == null || jsUrl == undefined) {
  390. Notify.error(
  391. '数据字典定义异常',
  392. '【' +
  393. logic +
  394. '】前端列显示逻辑的JS文件不存在,请联系管理员检查数据字典是否JS文件。',
  395. false,
  396. );
  397. return;
  398. }
  399. let promise = JsUtil.dynamicLoadJsFunction(jsUrl, logic);
  400. promise.then(
  401. targetFunction => {
  402. _self[functionName] = targetFunction;
  403. if(_self[functionName] == null){
  404. Notify.error('数据字典定义异常', '【' + logic + '】前端列显示逻辑方法不存在,请联系管理员检查数据字典。', false);
  405. return;
  406. }
  407. executeFunction();
  408. },
  409. errorData => {
  410. console.error(errorData);
  411. },
  412. );
  413. } else {
  414. executeFunction();
  415. }
  416. },
  417. /**
  418. * 获取枚举单选框的值
  419. */
  420. getEnmuValue: function () {
  421. var _self = this;
  422. var result;
  423. if (_self.fieldValue != undefined && _self.fieldValue.displayValue != undefined) {
  424. var value0 = _self.fieldValue.displayValue[0];
  425. if (_self.field != null && _self.field.keyValues != null) {
  426. _self.field.keyValues.forEach(function (item1) {
  427. if (value0 == item1.keyStr) {
  428. result = item1.value;
  429. }
  430. });
  431. }
  432. }
  433. return result;
  434. },
  435. /**
  436. * 获取枚举多选框的值
  437. */
  438. getMultiEnmuValue: function () {
  439. var _self = this;
  440. var result = [];
  441. if (_self.fieldValue != undefined && _self.fieldValue.displayValue != undefined) {
  442. var arr = _self.fieldValue.displayValue[0].split(',');
  443. arr.forEach(function (item) {
  444. _self.field.keyValues.forEach(function (item1) {
  445. if (item == item1.keyStr) {
  446. result.push(item1.value + ' ');
  447. }
  448. });
  449. });
  450. }
  451. return result.join(',');
  452. },
  453. // 获取ManyToManySetType值
  454. getManyToManyValues: function () {
  455. if (
  456. this.fieldValue == undefined ||
  457. this.fieldValue.displayValue == undefined ||
  458. this.fieldValue.displayValue.length < this.field.index
  459. ) {
  460. return [];
  461. } else {
  462. return this.fieldValue.displayValue;
  463. }
  464. },
  465. },
  466. };
  467. </script>
  468. <style scoped>
  469. .required-mark {
  470. color: red;
  471. margin-right: 10px;
  472. }
  473. .form-group-single-row {
  474. display: block;
  475. width: 100%;
  476. }
  477. .input-group-item {
  478. word-break: break-all;
  479. }
  480. .input-group-item-manytomany {
  481. color: #333;
  482. background-color: #f0f0f0;
  483. border: 1px solid #ccc;
  484. border-radius: 4px;
  485. height: 26px;
  486. margin: 4px 4px 0px 0px;
  487. padding: 6px 0.25em;
  488. }
  489. .label-multiple-column {
  490. width: 120px;
  491. }
  492. @media (max-width: 768px) {
  493. .input-group-single-row {
  494. width: 100%;
  495. }
  496. .input-group-item {
  497. padding-top: 0px;
  498. }
  499. }
  500. @media (min-width: 768px) {
  501. .label-multiple-column {
  502. text-overflow: ellipsis;
  503. text-align: right;
  504. padding-right: 5px;
  505. }
  506. .input-group-multiple-column {
  507. width: 230px;
  508. }
  509. .input-group-single-row {
  510. width: calc(100% - 200px) !important;
  511. word-wrap: break-word;
  512. }
  513. }
  514. .m-sr-only {
  515. visibility: hidden;
  516. }
  517. </style>