renderUtils.ts 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import { h } from 'vue';
  2. import { Avatar, Tag, Tooltip, Image } 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. const 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. const array = getDictItemsByCode(code) || [];
  48. const 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 v 值
  59. * @param code 字典编码
  60. * @param renderTag 是否使用tag渲染
  61. */
  62. renderDictText: (v, code) => {
  63. let text = '';
  64. const array = getDictItemsByCode(code) || [];
  65. const obj = array.filter((item) => {
  66. return item.value == v;
  67. });
  68. if (obj.length > 0) {
  69. text = obj[0].text;
  70. }
  71. return text;
  72. },
  73. /**
  74. * 渲染图片
  75. * @param text
  76. */
  77. renderImage: ({ text }) => {
  78. if (!text) {
  79. return h(Image, {
  80. width: 30,
  81. height: 30,
  82. src: '',
  83. fallback:
  84. 'data:image/png;base64,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',
  85. });
  86. }
  87. const avatarList = text.split(',');
  88. return h(
  89. 'span',
  90. avatarList.map((item) => {
  91. return h(Image, {
  92. src: getFileAccessHttpUrl(item),
  93. width: 30,
  94. height: 30,
  95. style: { marginRight: '5px' },
  96. previewMask: () => {
  97. return h(Icon, { icon: 'ant-design:eye-outlined', size: 20 });
  98. },
  99. });
  100. })
  101. );
  102. //update-end-author:taoyan date:2022-5-24 for: VUEN-1084 【vue3】online表单测试发现的新问题 41、生成的代码,树默认图大小未改
  103. },
  104. /**
  105. * 渲染 Tooltip
  106. * @param text
  107. * @param len
  108. */
  109. renderTip: (text, len = 20) => {
  110. if (text) {
  111. let showText = text + '';
  112. if (showText.length > len) {
  113. showText = showText.substr(0, len) + '...';
  114. }
  115. return h(Tooltip, { title: text }, () => showText);
  116. }
  117. return text;
  118. },
  119. /**
  120. * 渲染a标签
  121. * @param text
  122. */
  123. renderHref: ({ text }) => {
  124. if (!text) {
  125. return '';
  126. }
  127. const len = 20;
  128. if (text.length > len) {
  129. text = text.substr(0, len);
  130. }
  131. return h('a', { href: text, target: '_blank' }, text);
  132. },
  133. /**
  134. * 根据字典渲染
  135. * @param v
  136. * @param array
  137. */
  138. renderDictNative: (v, array, renderTag = false) => {
  139. let text = '';
  140. let color = '';
  141. const obj = array.filter((item) => {
  142. return item.value == v;
  143. });
  144. if (obj.length > 0) {
  145. text = obj[0].label;
  146. color = obj[0].color;
  147. }
  148. return isEmpty(text) || !renderTag ? h('span', text) : h(Tag, { color }, () => text);
  149. },
  150. /**
  151. * 渲染富文本
  152. */
  153. renderTinymce: ({ model, field }) => {
  154. return h(Tinymce, {
  155. showImageUpload: false,
  156. height: 300,
  157. value: model[field],
  158. onChange: (value: string) => {
  159. model[field] = value;
  160. },
  161. });
  162. },
  163. renderSwitch: (text, arr) => {
  164. return text ? filterMultiDictText(arr, text) : '';
  165. },
  166. renderCategoryTree: (text, code) => {
  167. const array = getDictItemsByCode(code);
  168. return filterMultiDictText(array, text);
  169. },
  170. renderTag(text, color) {
  171. return isEmpty(text) ? h('span', text) : h(Tag, { color }, () => text);
  172. },
  173. };
  174. /**
  175. * 文件下载
  176. */
  177. function downloadFile(url) {
  178. if (!url) {
  179. createMessage.warning('未知的文件');
  180. return;
  181. }
  182. if (url.indexOf(',') > 0) {
  183. url = url.substring(0, url.indexOf(','));
  184. }
  185. url = getFileAccessHttpUrl(url.split(',')[0]);
  186. if (url) {
  187. window.open(url);
  188. }
  189. }
  190. export { render, downloadFile };