@ibiz-template/vue3-components 0.7.41-alpha.152 → 0.7.41-alpha.154

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -225,6 +225,11 @@ class AIChatUtil {
225
225
  } else {
226
226
  chatOptions.chatMessagePageSize = ibiz.config.common.aiChatMessagePageSize;
227
227
  }
228
+ if (editorParams.srfaienableworkspace) {
229
+ chatOptions.enableWorkSpace = editorParams.srfaienableworkspace === "true";
230
+ } else {
231
+ chatOptions.enableWorkSpace = ibiz.config.common.aiEnableWorkSpace;
232
+ }
228
233
  chatOptions.fetchAgentList = (args2 = {}) => {
229
234
  const { query, agentid } = args2;
230
235
  return this.getAIAgentList(
@@ -250,10 +255,21 @@ class AIChatUtil {
250
255
  }
251
256
  const sessionid = this.getChatSessionId("TEMP");
252
257
  chatOptions.sessionid = sessionid;
253
- let id = "";
254
- let abortController;
258
+ const chatStateMap = /* @__PURE__ */ new WeakMap();
259
+ const getChatState = (aiChat) => {
260
+ let state = chatStateMap.get(aiChat);
261
+ if (!state) {
262
+ state = { id: "", abortController: new AbortController() };
263
+ chatStateMap.set(aiChat, state);
264
+ }
265
+ return state;
266
+ };
255
267
  const { chatInstance, view, ctrl } = args;
256
- const fileSystemOptions = await this.getAIFileSystemOptions();
268
+ let filePreviewMode = ibiz.config.common.aiFilePreviewMode;
269
+ if (editorParams.srfaifilepreviewmode) {
270
+ filePreviewMode = editorParams.srfaifilepreviewmode;
271
+ }
272
+ const fileSystemOptions = await this.getAIFileSystemOptions(filePreviewMode);
257
273
  chatOptions.fileSystemOptions = fileSystemOptions;
258
274
  chatOptions.history = async (ctx, param, other) => {
259
275
  const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, other.appDataEntityId);
@@ -316,8 +332,10 @@ class AIChatUtil {
316
332
  };
317
333
  chatOptions.question = async (aiChat, ctx, param, other, arr, sessionid2, srfaiagent, srfmode, srfscope, srfknowledgebases, srfaiagentconfig, appendcurdata, mcpservers, sessionmeta, srfproject, localMsgID) => {
318
334
  let updateFlag = true;
319
- id = qxUtil.createUUID();
320
- abortController = new AbortController();
335
+ const state = getChatState(aiChat);
336
+ state.id = qxUtil.createUUID();
337
+ state.abortController = new AbortController();
338
+ const { id, abortController } = state;
321
339
  const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, other.appDataEntityId);
322
340
  try {
323
341
  const questionRequestData = {
@@ -439,6 +457,7 @@ class AIChatUtil {
439
457
  }
440
458
  };
441
459
  chatOptions.abortQuestion = async (aiChat, ctx, param, other) => {
460
+ const { id, abortController } = getChatState(aiChat);
442
461
  abortController == null ? void 0 : abortController.abort();
443
462
  const asyncacitonid = aiChat.getActiveAsyncacitonId();
444
463
  if (asyncacitonid) {
@@ -473,8 +492,10 @@ class AIChatUtil {
473
492
  };
474
493
  chatOptions.resumeQuestion = async (aiChat, ctx, param, other, arr) => {
475
494
  if (other.asyncacitonid) {
476
- id = qxUtil.createUUID();
477
- abortController = new AbortController();
495
+ const state = getChatState(aiChat);
496
+ state.id = qxUtil.createUUID();
497
+ state.abortController = new AbortController();
498
+ const { id, abortController } = state;
478
499
  const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, other.appDataEntityId);
479
500
  const resumeRequestData = { asyncacitonid: other.asyncacitonid };
480
501
  if (other.sessionid) {
@@ -492,11 +513,9 @@ class AIChatUtil {
492
513
  srfproject: other.srfproject
493
514
  });
494
515
  try {
495
- aiChat.addWaitingMessage(id);
496
516
  await deService.aiResumeSse(
497
517
  (msg) => {
498
518
  if (msg.actionstate === 20 && msg.actionresult) {
499
- aiChat.removeWaitingMessage(id);
500
519
  aiChat.isLoading.value = true;
501
520
  if (!aiChat.getActiveAsyncacitonId()) {
502
521
  aiChat.setActiveAsyncacitonId(msg.asyncacitonid);
@@ -566,7 +585,6 @@ class AIChatUtil {
566
585
  }
567
586
  abortController == null ? void 0 : abortController.abort();
568
587
  } finally {
569
- aiChat.removeWaitingMessage(id);
570
588
  aiChat.isLoading.value = false;
571
589
  aiChat.completeMessage(id, true);
572
590
  aiChat.setActiveAsyncacitonId("");
@@ -726,7 +744,7 @@ class AIChatUtil {
726
744
  chatOptions.uploader.maxSize = uploadMaxSize;
727
745
  chatOptions.extendToolbarClick = async (event, source, context2, params2, data2) => {
728
746
  var _a2, _b, _c;
729
- const { id: id2, isPluginApp } = source;
747
+ const { id, isPluginApp } = source;
730
748
  let appId = source.appId;
731
749
  const tempContext = core.IBizContext.create(context2);
732
750
  if (isPluginApp) {
@@ -741,7 +759,7 @@ class AIChatUtil {
741
759
  }
742
760
  }
743
761
  const result = await runtime.UIActionUtil.exec(
744
- id2,
762
+ id,
745
763
  {
746
764
  view,
747
765
  ctrl,
@@ -1030,6 +1048,12 @@ class AIChatUtil {
1030
1048
  } else {
1031
1049
  chatOptions.chatMessagePageSize = ibiz.config.common.aiChatMessagePageSize;
1032
1050
  }
1051
+ if (params.hasOwnProperty("srfaienableworkspace")) {
1052
+ chatOptions.enableWorkSpace = params.srfaienableworkspace === "true";
1053
+ delete params.srfaienableworkspace;
1054
+ } else {
1055
+ chatOptions.enableWorkSpace = ibiz.config.common.aiEnableWorkSpace;
1056
+ }
1033
1057
  chatOptions.fetchAgentList = (args2 = {}) => {
1034
1058
  const { query, agentid } = args2;
1035
1059
  return this.getAIAgentList(context, {
@@ -1053,10 +1077,22 @@ class AIChatUtil {
1053
1077
  chatOptions.questionToolbarItems = questionToolbarItems;
1054
1078
  chatOptions.otherToolbarItems = otherToolbarItems;
1055
1079
  }
1056
- let id = "";
1057
- let abortController;
1080
+ const chatStateMap = /* @__PURE__ */ new WeakMap();
1081
+ const getChatState = (aiChat) => {
1082
+ let state = chatStateMap.get(aiChat);
1083
+ if (!state) {
1084
+ state = { id: "", abortController: new AbortController() };
1085
+ chatStateMap.set(aiChat, state);
1086
+ }
1087
+ return state;
1088
+ };
1058
1089
  const { chatInstance, view, ctrl } = args;
1059
- const fileSystemOptions = await this.getAIFileSystemOptions();
1090
+ let filePreviewMode = ibiz.config.common.aiFilePreviewMode;
1091
+ if (params.hasOwnProperty("srfaifilepreviewmode")) {
1092
+ filePreviewMode = params.srfaifilepreviewmode;
1093
+ delete params.srfaifilepreviewmode;
1094
+ }
1095
+ const fileSystemOptions = await this.getAIFileSystemOptions(filePreviewMode);
1060
1096
  chatOptions.fileSystemOptions = fileSystemOptions;
1061
1097
  chatOptions.history = async (ctx, param, other) => {
1062
1098
  const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, other.appDataEntityId);
@@ -1119,8 +1155,10 @@ class AIChatUtil {
1119
1155
  };
1120
1156
  chatOptions.question = async (aiChat, ctx, param, other, arr, sessionid, srfaiagent, srfmode, srfscope, srfknowledgebases, srfaiagentconfig, appendcurdata, mcpservers, sessionmeta, srfproject, localMsgID) => {
1121
1157
  let updateFlag = true;
1122
- id = qxUtil.createUUID();
1123
- abortController = new AbortController();
1158
+ const state = getChatState(aiChat);
1159
+ state.id = qxUtil.createUUID();
1160
+ state.abortController = new AbortController();
1161
+ const { id, abortController } = state;
1124
1162
  const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, other.appDataEntityId);
1125
1163
  try {
1126
1164
  const questionRequestData = {
@@ -1240,6 +1278,7 @@ class AIChatUtil {
1240
1278
  }
1241
1279
  };
1242
1280
  chatOptions.abortQuestion = async (aiChat, ctx, param, other) => {
1281
+ const { id, abortController } = getChatState(aiChat);
1243
1282
  abortController == null ? void 0 : abortController.abort();
1244
1283
  const asyncacitonid = aiChat.getActiveAsyncacitonId();
1245
1284
  if (asyncacitonid) {
@@ -1274,8 +1313,10 @@ class AIChatUtil {
1274
1313
  };
1275
1314
  chatOptions.resumeQuestion = async (aiChat, ctx, param, other, arr) => {
1276
1315
  if (other.asyncacitonid) {
1277
- id = qxUtil.createUUID();
1278
- abortController = new AbortController();
1316
+ const state = getChatState(aiChat);
1317
+ state.id = qxUtil.createUUID();
1318
+ state.abortController = new AbortController();
1319
+ const { id, abortController } = state;
1279
1320
  const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, other.appDataEntityId);
1280
1321
  const resumeRequestData = { asyncacitonid: other.asyncacitonid };
1281
1322
  if (other.sessionid) {
@@ -1293,11 +1334,9 @@ class AIChatUtil {
1293
1334
  srfproject: other.srfproject
1294
1335
  });
1295
1336
  try {
1296
- aiChat.addWaitingMessage(id);
1297
1337
  await deService.aiResumeSse(
1298
1338
  (msg) => {
1299
1339
  if (msg.actionstate === 20 && msg.actionresult) {
1300
- aiChat.removeWaitingMessage(id);
1301
1340
  aiChat.isLoading.value = true;
1302
1341
  if (!aiChat.getActiveAsyncacitonId()) {
1303
1342
  aiChat.setActiveAsyncacitonId(msg.asyncacitonid);
@@ -1367,7 +1406,6 @@ class AIChatUtil {
1367
1406
  }
1368
1407
  abortController == null ? void 0 : abortController.abort();
1369
1408
  } finally {
1370
- aiChat.removeWaitingMessage(id);
1371
1409
  aiChat.isLoading.value = false;
1372
1410
  aiChat.completeMessage(id, true);
1373
1411
  aiChat.setActiveAsyncacitonId("");
@@ -1529,7 +1567,7 @@ class AIChatUtil {
1529
1567
  chatOptions.uploader.maxSize = uploadMaxSize;
1530
1568
  chatOptions.extendToolbarClick = async (event, source, context2, params2, data2) => {
1531
1569
  var _a2, _b, _c;
1532
- const { id: id2, isPluginApp } = source;
1570
+ const { id, isPluginApp } = source;
1533
1571
  let appId = source.appId;
1534
1572
  const tempContext = core.IBizContext.create(context2);
1535
1573
  if (isPluginApp) {
@@ -1544,7 +1582,7 @@ class AIChatUtil {
1544
1582
  }
1545
1583
  }
1546
1584
  const result = await runtime.UIActionUtil.exec(
1547
- id2,
1585
+ id,
1548
1586
  {
1549
1587
  view,
1550
1588
  ctrl,
@@ -1893,8 +1931,34 @@ class AIChatUtil {
1893
1931
  * @returns {*} {Promise<IData>}
1894
1932
  * @memberof AIChatUtil
1895
1933
  */
1896
- async getAIFileSystemOptions() {
1934
+ async getAIFileSystemOptions(filePreviewMode) {
1897
1935
  const fileSystemOptions = {};
1936
+ fileSystemOptions.filePreviewMode = filePreviewMode;
1937
+ fileSystemOptions.getCustomFilePreviewUrl = async (ctx, param, other) => {
1938
+ var _a;
1939
+ const filePreviewAddress = (_a = ibiz.env.customParams) == null ? void 0 : _a.file_preview_address;
1940
+ if (!filePreviewAddress) {
1941
+ ibiz.message.error(
1942
+ ibiz.i18n.t("util.aiChartUtil.noFilePreviewAddress")
1943
+ );
1944
+ return "";
1945
+ }
1946
+ const { id, name, folder } = other;
1947
+ let { downloadUrl } = ibiz.util.file.calcFileUpDownUrl(
1948
+ ctx,
1949
+ param,
1950
+ {},
1951
+ { osscat: folder }
1952
+ );
1953
+ downloadUrl = downloadUrl.replace("%fileId%", id);
1954
+ const { protocol, hostname, port } = window.location;
1955
+ const actualPort = port || (protocol === "https:" ? "443" : "80");
1956
+ const windowInfo = "".concat(protocol, "//").concat(hostname, ":").concat(actualPort);
1957
+ const filedownloadurl = "".concat(windowInfo).concat(downloadUrl, "?fullfilename=").concat(name);
1958
+ const b64Encoded = ibiz.util.base64.encode(filedownloadurl);
1959
+ const previewUrl = "".concat(filePreviewAddress, "/onlinePreview?url=").concat(encodeURIComponent(b64Encoded));
1960
+ return previewUrl;
1961
+ };
1898
1962
  fileSystemOptions.getFileList = async (ctx, param, other) => {
1899
1963
  const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, param.appDataEntityId);
1900
1964
  const response = await deService.aiChatProject(
@@ -1911,12 +1975,57 @@ class AIChatUtil {
1911
1975
  const response = await deService.aiChatProject(
1912
1976
  ctx,
1913
1977
  { srfactag: param.srfactag },
1914
- { ...other, action: "UPLOAD" }
1978
+ { action: "UPLOAD", ...other }
1915
1979
  );
1916
1980
  if (response.ok)
1917
1981
  return response.data;
1918
1982
  return void 0;
1919
1983
  };
1984
+ fileSystemOptions.createFolder = async (ctx, param, other) => {
1985
+ const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, param.appDataEntityId);
1986
+ const response = await deService.aiChatProject(
1987
+ ctx,
1988
+ { srfactag: param.srfactag },
1989
+ { action: "MKDIR", ...other }
1990
+ );
1991
+ return response.data;
1992
+ };
1993
+ fileSystemOptions.createFile = async (ctx, param, other) => {
1994
+ const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, param.appDataEntityId);
1995
+ const response = await deService.aiChatProject(
1996
+ ctx,
1997
+ { srfactag: param.srfactag },
1998
+ { action: "WRITE", ...other }
1999
+ );
2000
+ return response.data;
2001
+ };
2002
+ fileSystemOptions.move = async (ctx, param, other) => {
2003
+ const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, param.appDataEntityId);
2004
+ const response = await deService.aiChatProject(
2005
+ ctx,
2006
+ { srfactag: param.srfactag },
2007
+ { action: "MOVE", ...other }
2008
+ );
2009
+ return response.data;
2010
+ };
2011
+ fileSystemOptions.delete = async (ctx, param, other) => {
2012
+ const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, param.appDataEntityId);
2013
+ const response = await deService.aiChatProject(
2014
+ ctx,
2015
+ { srfactag: param.srfactag },
2016
+ { recursive: true, action: "DELETE", ...other }
2017
+ );
2018
+ return response.data;
2019
+ };
2020
+ fileSystemOptions.readFile = async (ctx, param, other) => {
2021
+ const deService = await ibiz.hub.getApp(ctx.srfappid).deService.getService(ctx, param.appDataEntityId);
2022
+ const response = await deService.aiChatProject(
2023
+ ctx,
2024
+ { srfactag: param.srfactag },
2025
+ { action: "READ", ...other }
2026
+ );
2027
+ return response.data;
2028
+ };
1920
2029
  fileSystemOptions.getContent = async (ctx, param, id, type, cat) => {
1921
2030
  const app = await ibiz.hub.getAppAsync(ctx.appId);
1922
2031
  const requestUrl = "/ibizutil/downloadtxt/".concat(cat ? "".concat(cat, "/") : "").concat(id, "?type=").concat(type);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibiz-template/vue3-components",
3
- "version": "0.7.41-alpha.152",
3
+ "version": "0.7.41-alpha.154",
4
4
  "description": "web端组件库(vue3)",
5
5
  "main": "lib/index.cjs",
6
6
  "module": "es/index.mjs",
@@ -31,16 +31,16 @@
31
31
  "dependencies": {
32
32
  "@amap/amap-jsapi-loader": "^1.0.1",
33
33
  "@floating-ui/dom": "^1.5.3",
34
- "@ibiz-template-plugin/ai-chat": "^0.0.117",
34
+ "@ibiz-template-plugin/ai-chat": "^0.0.119",
35
35
  "@ibiz-template-plugin/gantt": "0.1.8-alpha.468",
36
36
  "@ibiz-template-plugin/bi-report": "0.0.32",
37
37
  "@ibiz-template-plugin/data-view": "0.0.8",
38
38
  "@ibiz-template/core": "0.7.41-alpha.152",
39
39
  "@ibiz-template/devtool": "0.0.17",
40
- "@ibiz-template/model-helper": "0.7.41-alpha.152",
41
- "@ibiz-template/runtime": "0.7.41-alpha.152",
40
+ "@ibiz-template/model-helper": "0.7.41-alpha.154",
41
+ "@ibiz-template/runtime": "0.7.41-alpha.154",
42
42
  "@ibiz-template/theme": "0.7.39",
43
- "@ibiz-template/vue3-util": "0.7.41-alpha.152",
43
+ "@ibiz-template/vue3-util": "0.7.41-alpha.154",
44
44
  "@ibiz-template/web-theme": "3.16.0",
45
45
  "@ibiz/model-core": "^0.1.89",
46
46
  "@imengyu/vue3-context-menu": "^1.3.5",
@@ -10,6 +10,7 @@ import {
10
10
  IRawItemContainer,
11
11
  } from '@ibiz/model-core';
12
12
  import { isBase64, isBase64Image, isSvg } from '@ibiz-template/core';
13
+ import { isObject } from 'lodash-es';
13
14
  import { IControlController, IViewController } from '@ibiz-template/runtime';
14
15
  import { parseHtml } from '../../util';
15
16
  import './rawitem.scss';
@@ -119,8 +120,9 @@ export const IBizRawItem = defineComponent({
119
120
  }
120
121
  } else if (['INFO', 'WARNING', 'ERROR'].includes(contentType!)) {
121
122
  rawItemContent.value = (rawItem as IUnkownItem).rawContent!;
122
- } else if (['VIDEO', 'DIVIDER'].includes(contentType!)) {
123
- // 暂不处理
123
+ // 分割线内容解析,视频模型缺少,暂不处理(有rawItemParams则为面板直接内容)
124
+ } else if (contentType === 'DIVIDER' && !rawItem!.rawItemParams) {
125
+ rawItemContent.value = (rawItem as IUnkownItem).rawContent!;
124
126
  } else if (contentType === 'IMAGE' && sysImage) {
125
127
  rawItemContent.value = sysImage;
126
128
  }
@@ -179,6 +181,21 @@ export const IBizRawItem = defineComponent({
179
181
  // 文本类型显示值
180
182
  const rawItemText: Ref<string | number | IData> = ref('');
181
183
 
184
+ // 获取面板项直接内容项参数
185
+ const getRawItemParams = () => {
186
+ const tempParams: IData = {};
187
+ if (
188
+ rawItem &&
189
+ rawItem.rawItemParams &&
190
+ rawItem.rawItemParams.length > 0
191
+ ) {
192
+ rawItem.rawItemParams.forEach((item: IData) => {
193
+ tempParams[item.key] = item.value;
194
+ });
195
+ }
196
+ return tempParams;
197
+ };
198
+
182
199
  // 转换各类值操作
183
200
  const convertValue = () => {
184
201
  // 图片类型
@@ -243,25 +260,43 @@ export const IBizRawItem = defineComponent({
243
260
  )
244
261
  ) {
245
262
  if (rawItemContent.value) {
246
- let rawConfig = {};
263
+ let rawConfig: IData | string = {};
247
264
  try {
265
+ // 兼容json字符串格式与字符串文本模式
248
266
  if (typeof rawItemContent.value === 'string') {
249
- // eslint-disable-next-line no-new-func
250
- const func = new Function(`return (${rawItemContent.value});`);
251
- rawConfig = func();
267
+ // 以 { 或 [ 开头的使用脚本解析,不是则做为文本字符串
268
+ if (/^[[{]/.test(rawItemContent.value)) {
269
+ // eslint-disable-next-line no-new-func
270
+ const func = new Function(`return (${rawItemContent.value});`);
271
+ rawConfig = func();
272
+ } else {
273
+ rawConfig = rawItemContent.value;
274
+ }
252
275
  switch (rawItemType.value) {
253
276
  case 'VIDEO':
254
- Object.assign(playerParams.value, rawConfig);
277
+ if (isObject(rawConfig)) {
278
+ Object.assign(playerParams.value, rawConfig);
279
+ } else {
280
+ playerParams.value.path = rawConfig;
281
+ }
255
282
  break;
256
283
  case 'DIVIDER':
257
- Object.assign(dividerParams.value, rawConfig);
284
+ if (isObject(rawConfig)) {
285
+ Object.assign(dividerParams.value, rawConfig);
286
+ } else {
287
+ dividerParams.value.html = rawConfig;
288
+ }
258
289
  break;
259
290
  case 'INFO':
260
291
  case 'WARNING':
261
292
  case 'ERROR':
262
293
  alertParams.value.type =
263
294
  rawItemType.value.toLocaleLowerCase();
264
- Object.assign(alertParams.value, rawConfig);
295
+ if (isObject(rawConfig)) {
296
+ Object.assign(alertParams.value, rawConfig);
297
+ } else {
298
+ alertParams.value.title = rawConfig;
299
+ }
265
300
  break;
266
301
  default:
267
302
  break;
@@ -274,17 +309,13 @@ export const IBizRawItem = defineComponent({
274
309
  }),
275
310
  );
276
311
  }
277
- } else if (rawItemType.value === 'VIDEO') {
278
- if (
279
- rawItem &&
280
- rawItem.rawItemParams &&
281
- rawItem.rawItemParams.length > 0
282
- ) {
283
- const tempParams: IData = {};
284
- rawItem.rawItemParams.forEach((item: IData) => {
285
- tempParams[item.key] = item.value;
286
- });
312
+ // 面板中分割线、视频支持直接内容项参数
313
+ } else if (['DIVIDER', 'VIDEO'].includes(rawItemType.value)) {
314
+ const tempParams = getRawItemParams();
315
+ if (rawItemType.value === 'VIDEO') {
287
316
  Object.assign(playerParams.value, tempParams);
317
+ } else {
318
+ Object.assign(dividerParams.value, tempParams);
288
319
  }
289
320
  }
290
321
  }
@@ -130,6 +130,9 @@ export const IBizEmbedAIChat = defineComponent({
130
130
  container: aiChatElementRef.value,
131
131
  compWrapperId: editorParams.compwrapperid || 'DEFAULT',
132
132
  enableBackFill: false,
133
+ isEmbedAiHeaderHidden: editorParams.isembedaiheaderhidden
134
+ ? editorParams.isembedaiheaderhidden === 'true'
135
+ : ibiz.config.common.isEmbedAiHeaderHidden,
133
136
  },
134
137
  topicOptions: {
135
138
  appid: ibiz.env.appId,
@@ -979,6 +979,8 @@ export default {
979
979
  violationPrivacy: 'Violation of Privacy',
980
980
  contentInfringement: 'Content infringement',
981
981
  placeholder: 'Please enter',
982
+ noFilePreviewAddress:
983
+ 'No attachment preview service. Please contact the administrator to add it!',
982
984
  },
983
985
  screenShotUtil: {
984
986
  prepareCanvas: 'Prepare the canvas...',
@@ -922,6 +922,7 @@ export default {
922
922
  violationPrivacy: '侵犯隐私',
923
923
  contentInfringement: '内容侵权',
924
924
  placeholder: '请输入',
925
+ noFilePreviewAddress: '无附件预览服务,请联系管理员添加!',
925
926
  },
926
927
  screenShotUtil: {
927
928
  prepareCanvas: '准备画布中...',