renderUtils.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import { h } from 'vue';
  2. import { Avatar, Tag, Tooltip } from 'ant-design-vue';
  3. import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
  4. import { Tinymce } from '/@/components/Tinymce';
  5. import Icon from '/@/components/Icon';
  6. import { getDictItemsByCode } from '/@/utils/dict/index';
  7. import { filterMultiDictText } from '/@/utils/dict/JDictSelectUtil.js';
  8. import { isEmpty } from '/@/utils/is';
  9. import { useMessage } from '/@/hooks/web/useMessage';
  10. const { createMessage } = useMessage();
  11. const render = {
  12. /**
  13. * 渲染列表头像
  14. */
  15. renderAvatar: ({ record }) => {
  16. if (record.avatar) {
  17. let avatarList = record.avatar.split(',');
  18. return h(
  19. 'span',
  20. avatarList.map((item) => {
  21. return h(Avatar, {
  22. src: getFileAccessHttpUrl(item),
  23. shape: 'square',
  24. size: 'default',
  25. style: { marginRight: '5px' },
  26. });
  27. })
  28. );
  29. } else {
  30. return h(
  31. Avatar,
  32. { shape: 'square', size: 'default' },
  33. {
  34. icon: () => h(Icon, { icon: 'ant-design:file-image-outlined', size: 30 }),
  35. }
  36. );
  37. }
  38. },
  39. /**
  40. * 根据字典编码 渲染
  41. * @param v 值
  42. * @param code 字典编码
  43. * @param renderTag 是否使用tag渲染
  44. */
  45. renderDict: (v, code, renderTag = false) => {
  46. let text = '';
  47. let array = getDictItemsByCode(code) || [];
  48. let obj = array.filter((item) => {
  49. return item.value == v;
  50. });
  51. if (obj.length > 0) {
  52. text = obj[0].text;
  53. }
  54. return isEmpty(text) || !renderTag ? h('span', text) : h(Tag, text);
  55. },
  56. /**
  57. * 渲染图片
  58. * @param text
  59. */
  60. renderImage: ({ text }) => {
  61. if (!text) {
  62. //update-begin-author:taoyan date:2022-5-24 for: VUEN-1084 【vue3】online表单测试发现的新问题 41、生成的代码,树默认图大小未改
  63. return h(
  64. Avatar,
  65. { shape: 'square', size: 25 },
  66. {
  67. icon: () => h(Icon, { icon: 'ant-design:file-image-outlined', size: 25 }),
  68. }
  69. );
  70. }
  71. let avatarList = text.split(',');
  72. return h(
  73. 'span',
  74. avatarList.map((item) => {
  75. return h(Avatar, {
  76. src: getFileAccessHttpUrl(item),
  77. shape: 'square',
  78. size: 25,
  79. style: { marginRight: '5px' },
  80. });
  81. })
  82. );
  83. //update-end-author:taoyan date:2022-5-24 for: VUEN-1084 【vue3】online表单测试发现的新问题 41、生成的代码,树默认图大小未改
  84. },
  85. /**
  86. * 渲染 Tooltip
  87. * @param text
  88. * @param len
  89. */
  90. renderTip: (text, len = 20) => {
  91. if (text) {
  92. let showText = text + '';
  93. if (showText.length > len) {
  94. showText = showText.substr(0, len) + '...';
  95. }
  96. return h(Tooltip, { title: text }, () => showText);
  97. }
  98. return text;
  99. },
  100. /**
  101. * 渲染a标签
  102. * @param text
  103. */
  104. renderHref: ({ text }) => {
  105. if (!text) {
  106. return '';
  107. }
  108. const len = 20;
  109. if (text.length > len) {
  110. text = text.substr(0, len);
  111. }
  112. return h('a', { href: text, target: '_blank' }, text);
  113. },
  114. /**
  115. * 根据字典渲染
  116. * @param v
  117. * @param array
  118. */
  119. renderDictNative: (v, array, renderTag = false) => {
  120. let text = '';
  121. let color = '';
  122. let obj = array.filter((item) => {
  123. return item.value == v;
  124. });
  125. if (obj.length > 0) {
  126. text = obj[0].label;
  127. color = obj[0].color;
  128. }
  129. return isEmpty(text) || !renderTag ? h('span', text) : h(Tag, { color }, () => text);
  130. },
  131. /**
  132. * 渲染富文本
  133. */
  134. renderTinymce: ({ model, field }) => {
  135. return h(Tinymce, {
  136. showImageUpload: false,
  137. height: 300,
  138. value: model[field],
  139. onChange: (value: string) => {
  140. model[field] = value;
  141. },
  142. });
  143. },
  144. renderSwitch: (text, arr) => {
  145. return text ? filterMultiDictText(arr, text) : '';
  146. },
  147. renderCategoryTree: (text, code) => {
  148. let array = getDictItemsByCode(code);
  149. return filterMultiDictText(array, text);
  150. },
  151. renderTag(text, color) {
  152. return isEmpty(text) ? h('span', text) : h(Tag, { color }, () => text);
  153. },
  154. };
  155. /**
  156. * 文件下载
  157. */
  158. function downloadFile(url) {
  159. if (!url) {
  160. createMessage.warning('未知的文件');
  161. return;
  162. }
  163. if (url.indexOf(',') > 0) {
  164. url = url.substring(0, url.indexOf(','));
  165. }
  166. url = getFileAccessHttpUrl(url.split(',')[0]);
  167. if (url) {
  168. window.open(url);
  169. }
  170. }
  171. export { render, downloadFile };