cnhis-design-vue 0.3.1-beta → 0.3.4-beta

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.
Files changed (82) hide show
  1. package/env.d.ts +2 -0
  2. package/es/big-table/index.css +2 -0
  3. package/es/big-table/index.js +42785 -4
  4. package/es/button-print/index.css +3 -1
  5. package/es/button-print/index.js +21615 -3
  6. package/es/drag-layout/index.css +4 -2
  7. package/es/drag-layout/index.js +13173 -9
  8. package/es/grid/index.css +3 -1
  9. package/es/grid/index.js +30828 -1
  10. package/es/index.css +3 -1
  11. package/es/index.js +53358 -10
  12. package/package.json +11 -3
  13. package/packages/big-table/index.ts +17 -0
  14. package/packages/big-table/src/BigTable.vue +2513 -0
  15. package/packages/big-table/src/assets/iconfont/iconfont.less +21 -0
  16. package/packages/big-table/src/assets/iconfont/iconfont.ttf +0 -0
  17. package/packages/big-table/src/assets/img/failure.png +0 -0
  18. package/packages/big-table/src/assets/img/icon-asc.png +0 -0
  19. package/packages/big-table/src/assets/img/icon-desc.png +0 -0
  20. package/packages/big-table/src/assets/img/no-permission.png +0 -0
  21. package/packages/big-table/src/assets/img/nodata.png +0 -0
  22. package/packages/big-table/src/assets/img/notfound.png +0 -0
  23. package/packages/big-table/src/assets/img/qr.png +0 -0
  24. package/packages/big-table/src/assets/img/video_default_cover.png +0 -0
  25. package/packages/big-table/src/assets/img/xb_big.png +0 -0
  26. package/packages/big-table/src/assets/img/xb_small.png +0 -0
  27. package/packages/big-table/src/assets/style/table-base.less +275 -0
  28. package/packages/big-table/src/assets/style/table-global.less +167 -0
  29. package/packages/big-table/src/bigTableEmits.ts +46 -0
  30. package/packages/big-table/src/bigTableProps.ts +125 -0
  31. package/packages/big-table/src/bigTableState.ts +62 -0
  32. package/packages/big-table/src/components/NoData.vue +90 -0
  33. package/packages/big-table/src/components/SvgIcon.vue +49 -0
  34. package/packages/big-table/src/components/TextOverTooltip.vue +110 -0
  35. package/packages/big-table/src/components/edit-form/EditForm.vue +426 -0
  36. package/packages/big-table/src/components/edit-form/edit-component/edit-date-picker/edit-date-picker.vue +66 -0
  37. package/packages/big-table/src/components/edit-form/edit-component/edit-digital/edit-digital.vue +60 -0
  38. package/packages/big-table/src/components/edit-form/edit-component/edit-input/edit-input.vue +38 -0
  39. package/packages/big-table/src/components/edit-form/edit-component/edit-input-password/edit-input-password.vue +89 -0
  40. package/packages/big-table/src/components/edit-form/edit-component/edit-month-picker/edit-month-picker.vue +38 -0
  41. package/packages/big-table/src/components/edit-form/edit-component/edit-search/edit-search.vue +63 -0
  42. package/packages/big-table/src/components/edit-form/edit-component/edit-search-more/edit-search-more.vue +69 -0
  43. package/packages/big-table/src/components/edit-form/edit-component/edit-select/edit-select.vue +51 -0
  44. package/packages/big-table/src/components/edit-form/edit-component/edit-select-multiple/edit-select-multiple.vue +60 -0
  45. package/packages/big-table/src/components/edit-form/edit-component/edit-textarea/edit-textarea.vue +34 -0
  46. package/packages/big-table/src/components/edit-form/edit-component/edit-time-picker/edit-time-picker.vue +42 -0
  47. package/packages/big-table/src/components/edit-form/edit-component/editFormProps.ts +91 -0
  48. package/packages/big-table/src/components/edit-form/edit-component/register-com.ts +18 -0
  49. package/packages/big-table/src/components/edit-form/hooks/useConfigData.ts +79 -0
  50. package/packages/big-table/src/components/edit-form/hooks/useDateType.ts +184 -0
  51. package/packages/big-table/src/components/edit-form/hooks/useFormCommon.ts +373 -0
  52. package/packages/big-table/src/components/edit-form/hooks/useItemDefault.ts +638 -0
  53. package/packages/big-table/src/components/edit-form/hooks/useSearch.ts +910 -0
  54. package/packages/big-table/src/components/edit-form/hooks/useValidateRules.ts +387 -0
  55. package/packages/big-table/src/components/edit-form/interface.ts +53 -0
  56. package/packages/big-table/src/components/edit-form/types.ts +3 -0
  57. package/packages/big-table/src/components/edit-form/utils.ts +247 -0
  58. package/packages/big-table/src/hooks/useBatchEditing.ts +574 -0
  59. package/packages/big-table/src/hooks/useFormat.ts +612 -0
  60. package/packages/big-table/src/hooks/useNestTable.ts +109 -0
  61. package/packages/big-table/src/hooks/useTableParse.ts +169 -0
  62. package/packages/big-table/src/utils.ts +705 -0
  63. package/packages/button-print/index.ts +15 -0
  64. package/packages/button-print/src/ButtonPrint.vue +697 -0
  65. package/packages/button-print/src/components/IdentityVerification.vue +149 -0
  66. package/packages/button-print/src/interfaces.ts +19 -0
  67. package/packages/button-print/src/utils/crypto.js +25 -0
  68. package/packages/button-print/src/utils/print.es.min.js +1 -0
  69. package/packages/drag-layout/index.ts +15 -0
  70. package/packages/drag-layout/src/DragFormLeftItem.vue +131 -0
  71. package/packages/drag-layout/src/DragFormRightItem.vue +277 -0
  72. package/packages/drag-layout/src/DragLayout.vue +712 -0
  73. package/packages/grid/index.ts +17 -0
  74. package/packages/grid/src/Grid.tsx +22 -0
  75. package/packages/grid/src/hooks.ts +168 -0
  76. package/packages/index.ts +36 -0
  77. package/src/component/svg/index.vue +49 -0
  78. package/src/core/create.ts +5 -0
  79. package/src/global/variable.ts +2 -0
  80. package/src/utils/clickoutside.ts +80 -0
  81. package/src/utils/crypto.js +25 -0
  82. package/src/utils/vexutils.ts +811 -0
@@ -0,0 +1,612 @@
1
+ import vexutils from '@/utils/vexutils';
2
+ interface Idata {
3
+ tableList: any[];
4
+ fieldList: any[];
5
+ btnList: any[];
6
+ oldtableData: any[];
7
+ showButtonTop: number;
8
+ isNestTabel?: boolean;
9
+ mainTableTheUniqueKey?: string;
10
+ mainTableRow?: {
11
+ [key: string]: any;
12
+ };
13
+ nestTableId?: string;
14
+ }
15
+
16
+ export const useFormat = (state: any) => {
17
+ // 行数据解析逻辑
18
+ const formatData = (
19
+ data: Idata = {
20
+ tableList: [],
21
+ fieldList: [],
22
+ btnList: [],
23
+ oldtableData: [],
24
+ showButtonTop: 0,
25
+ isNestTabel: false,
26
+ mainTableTheUniqueKey: "",
27
+ mainTableRow: {},
28
+ nestTableId: "",
29
+ }
30
+ ) => {
31
+ const {
32
+ tableList,
33
+ fieldList,
34
+ btnList,
35
+ oldtableData,
36
+ showButtonTop,
37
+ isNestTabel,
38
+ mainTableTheUniqueKey,
39
+ mainTableRow,
40
+ nestTableId,
41
+ } = data;
42
+ const { nobutton = false } = state.options?.config || {}; // 调用表格,设置表格是否要按钮操作。
43
+ return tableList.map((item, index) => {
44
+ if (isNestTabel) {
45
+ // 嵌套列表中, 点击子表需要获取主表theUniqueKey, 所以格式化子表数据时, 保存主表 theUniqueKey
46
+ Object.assign(item, {
47
+ __mainTableTheUniqueKey__: mainTableTheUniqueKey,
48
+ __isNestTabel__: isNestTabel,
49
+ __mainTableRow__: mainTableRow,
50
+ __nestTableId__: nestTableId
51
+ })
52
+ }
53
+ // 因为存在树形表格,这里一定要用theUniqueKey,后面才能找到对应节点
54
+ Object.assign(item, {
55
+ my_index: item.theUniqueKey,
56
+ isClick: false,
57
+ isChecked: false
58
+ })
59
+ item._triggerMethodField = state.triggerMethodField;
60
+ const originalValue: any = {}; // 记录修改前的值
61
+ Object.keys(item).forEach(key => {
62
+ originalValue[key] = item[key];
63
+ if (vexutils.isPlainObject(item[key])) {
64
+ item[key] = JSON.stringify(item[key]);
65
+ }
66
+ const matchFieldList = fieldList.find(field => field.columnName === key);
67
+ if (!matchFieldList) return;
68
+ // attrType colorAndIcon 在 formatData 方法外处理的。
69
+ const { attrType, colorAndIcon, settingObj } = matchFieldList || {};
70
+ if (!attrType) {
71
+ matchFieldList.attrType = settingObj?.attr || undefined;
72
+ }
73
+ if (!colorAndIcon) {
74
+ matchFieldList.colorAndIcon = settingObj?.colorAndIcon || undefined;
75
+ }
76
+
77
+ // 将字段为百分数类型的值 先转化
78
+ if (item[key] && matchFieldList?.settingObj?.attr === "PERCENTAGE") {
79
+ if (vexutils.isNumber(+item[key])) {
80
+ // item[key] = ((+item[key] > 1 ? 1 : +item[key]) * 1000000) / 10000 + "%";
81
+ item[key] = accMul(+item[key], 100) + "%";
82
+ }
83
+ }
84
+ if (vexutils.isString(item[key])) {
85
+ if (matchFieldList && matchFieldList.attrType) {
86
+ if (
87
+ item[key] &&
88
+ (item[key].includes("http://") || item[key].includes("https://")) &&
89
+ matchFieldList.attrType != "PICTURE"
90
+ ) {
91
+ if (vexutils.isJSON(item[key])) {
92
+ item[key] = JSON.parse(item[key]);
93
+ }
94
+ }
95
+ // MULTISELECT PICTURE FILE
96
+ if (matchFieldList.attrType == "FILE") {
97
+ item[key] = handleJson(item[key], "str", "");
98
+ } else if (matchFieldList.attrType == "MULTISELECT") {
99
+ if (vexutils.isJSON(item[key])) {
100
+ item[key] = JSON.parse(item[key]);
101
+ }
102
+ item[key] = handleMULTISELECT(item[key], "objStr");
103
+ } else if (matchFieldList.attrType == "LABEL") {
104
+ if (vexutils.isJSON(item[key])) {
105
+ item[key] = JSON.parse(item[key]);
106
+ if (!item[key].labels) {
107
+ item[key] = handleJson(item[key], "type", "labelStr");
108
+ }
109
+ }
110
+ if (item[key]) {
111
+ const labels = item[key].labels || item[key].split(",");
112
+ let curHtml = [];
113
+ if (labels?.length > 0) {
114
+ curHtml = handleLabel(labels);
115
+ }
116
+ item[key] = state.source === "guageChoice" ? curHtml.join("、") : curHtml.join("");
117
+ }
118
+ } else if (matchFieldList.attrType == "CASCADE") {
119
+ if (vexutils.isJSON(item[key])) {
120
+ item[key] = JSON.parse(item[key]);
121
+ }
122
+ item[key] = handleJson(item[key], "type", "objStr");
123
+ } else if (matchFieldList.attrType == "EVALUATE") {
124
+ const str = item[key];
125
+ if (vexutils.isJSON(str)) {
126
+ const obj = JSON.parse(str);
127
+ item[key] = obj.star ? `${obj.star}星` : "";
128
+ } else {
129
+ item[key] = str;
130
+ }
131
+ } else if (matchFieldList.attrType == "MAP") {
132
+ const str = item[key];
133
+ if (vexutils.isJSON(str)) {
134
+ const obj = JSON.parse(str);
135
+ item[key] = obj.address || "";
136
+ } else {
137
+ item[key] = str;
138
+ }
139
+ } else if (
140
+ matchFieldList.attrType == "PICTURE" &&
141
+ vexutils.isJSON(item[key])
142
+ ) {
143
+ let pics = JSON.parse(item[key]);
144
+ pics = pics.map((ii: any) => ii.url);
145
+ item[key] = pics.join(",");
146
+ }
147
+ } else if (item[key].includes("http://") || item[key].includes("https://")) {
148
+ try {
149
+ item[key] = JSON.parse(item[key]);
150
+ item[key] = handleJson(item[key], "str", "");
151
+ } catch (e) {
152
+ e;
153
+ }
154
+ }
155
+ // 样式处理
156
+ if (
157
+ item[key] &&
158
+ vexutils.isString(item[key]) &&
159
+ item[key].startsWith("###{")
160
+ ) {
161
+ const temp = JSON.parse(item[key].replace("###", ""));
162
+ // 格式化时间
163
+ if ("tooltip" in temp) {
164
+ item[key] = temp;
165
+ // item[key] = temp.value;
166
+ } else {
167
+ if (state.source === "guageChoice") {
168
+ item[key] = temp.change_text;
169
+ } else {
170
+ if (temp.background != "#ffffff") {
171
+ item[key] = `<span class="field-span" style="color:${
172
+ temp.background
173
+ }"><span class="${temp.icon}"></span>${temp.change_text || ""}</span>`;
174
+ } else {
175
+ item[key] = temp.change_text;
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ const SPANTAG_REGEXP = /<\/?span.*?>/g;
182
+ if (
183
+ item[key] &&
184
+ matchFieldList &&
185
+ matchFieldList.colorAndIcon &&
186
+ !SPANTAG_REGEXP.test(item[key])
187
+ ) {
188
+ const { colorAndIcon = [] } = matchFieldList;
189
+ if (colorAndIcon && colorAndIcon.length) {
190
+ const findC = colorAndIcon.find((c: any) =>
191
+ vexutils.parseCondition(
192
+ c.condition,
193
+ {
194
+ form: {},
195
+ table: { ...oldtableData[index] },
196
+ sys: {},
197
+ },
198
+ fieldList
199
+ )
200
+ );
201
+ if (findC) {
202
+ if (state.source !== "guageChoice") {
203
+ item[key] = `<span style="color:${findC.color}"><span class="${
204
+ findC.icon
205
+ }"></span>${item[key] || ""}</span>`;
206
+ }
207
+ }
208
+ }
209
+ }
210
+ });
211
+ if (item.operatorColumn) {
212
+ item["btnList"] = [];
213
+ item["allBtnList"] = [];
214
+ item["tileBtnList"] = [];
215
+ item["foldBtnList"] = [];
216
+ // this.$set(item, 'btnList', []);
217
+ // this.$set(item, 'allBtnList', []);
218
+ // this.$set(item, 'tileBtnList', []);
219
+ // this.$set(item, 'foldBtnList', []);
220
+ const btnLinks: any[] = [];
221
+ if (!nobutton) {
222
+ btnList.forEach(btn => {
223
+ const rowOperatorId = item.operatorColumn.find((v: any) => v.includes(btn.sid));
224
+ if (rowOperatorId) {
225
+ /** 获取按钮的操作对象 */
226
+ if (btn.isShow == "1") {
227
+ if (btn.type == "LINK") {
228
+ btnLinks.push(btn.name);
229
+ // 如果是 switch 类型的 需要取原始值(###开头的值会被解析,switch的有一套自己的解析逻辑)
230
+ const settingObj = Array.isArray(btn.settingObj)
231
+ ? btn.settingObj[0]
232
+ : btn.settingObj;
233
+ const name = btn.name;
234
+ if (settingObj && settingObj.linkShowType == "switch") {
235
+ item[name] = originalValue[name] || item[name];
236
+ }
237
+ }
238
+ item.btnList.push(btn);
239
+ item.allBtnList.push(btn);
240
+ if (!isPrintBtn(btn)) {
241
+ // 不是打印按钮才显示在列表的操作按钮
242
+ if (btn.toggle == "fold") {
243
+ // if (showButtonTop == 1) {
244
+ // if (
245
+ // ["EDIT", "DELETE"].includes(btn.type) &&
246
+ // btn.showStyle == "only_icon"
247
+ // ) {
248
+ // item.foldBtnList.push(btn);
249
+ // item.showOperatorBtn = true;
250
+ // }
251
+ // } else {
252
+ // item.foldBtnList.push(btn);
253
+ // }
254
+ item.foldBtnList.push(btn);
255
+ } else {
256
+ // if (showButtonTop == 1) {
257
+ // if (
258
+ // ["EDIT", "DELETE"].includes(btn.type) &&
259
+ // btn.showStyle == "only_icon"
260
+ // ) {
261
+ // item.tileBtnList.push(btn);
262
+ // item.showOperatorBtn = true;
263
+ // }
264
+ // } else {
265
+ // item.tileBtnList.push(btn);
266
+ // }
267
+ item.tileBtnList.push(btn);
268
+ }
269
+ }
270
+ }
271
+ } else if (btn.type == "ADD" || btn.type == "BATCH") {
272
+ btn.isShow == "1" ? item.allBtnList.push(btn) : null;
273
+ }
274
+ });
275
+ }
276
+ item["btnLinks"] = btnLinks;
277
+ // this.$set(item, 'btnLinks', btnLinks);
278
+ }
279
+ fieldList.forEach(field => {
280
+ if (
281
+ field.fieldType == "DATE" ||
282
+ field.fieldType == "DATETIME" ||
283
+ field.fieldType == "TIME"
284
+ ) {
285
+ if (field.settingObj && field.settingObj.attr == "BIRTHDAY" && field.settingObj.format) {
286
+ const year = 31536000000;
287
+ const nowDate = +new Date();
288
+ let curAge, curStr, mmdd;
289
+ const hasAge = field.settingObj.format.includes("age");
290
+ if (vexutils.isNumber(+item[field.columnName])) {
291
+ curStr = new Date(+item[field.columnName]).toLocaleDateString().replace(/\//g, "-");
292
+ } else {
293
+ curStr = item[field.columnName];
294
+ }
295
+ if (!curStr) return;
296
+ // let curDate = +new Date(curStr.replace((/-/g, '/')));
297
+ const curDate = +new Date(curStr.replace("/"));
298
+ if (hasAge) {
299
+ mmdd = curStr.split("-");
300
+ mmdd.shift();
301
+ curAge = (nowDate - curDate) / year;
302
+ if (curAge < 0 || isNaN(curAge)) {
303
+ curAge = 0;
304
+ }
305
+ item[field.columnName] =
306
+ field.settingObj.format == "age"
307
+ ? curAge + "岁"
308
+ : mmdd.join("-") + `(${curAge}岁)`;
309
+ } else {
310
+ item[field.columnName] = vexutils.toDateString(
311
+ curStr,
312
+ field.settingObj.format
313
+ );
314
+ }
315
+ } else if (vexutils.isNumber(+item[field.columnName])) {
316
+ item[field.columnName] = vexutils.formatTime(
317
+ field.fieldType,
318
+ item[field.columnName]
319
+ );
320
+ } else if (vexutils.isJSON(field.guageSetting)) {
321
+ const guageSetting = JSON.parse(field.guageSetting);
322
+ if (guageSetting.startToStop === "1") {
323
+ try {
324
+ const arr = JSON.parse(item[field.columnName]);
325
+ item[field.columnName] = arr.join("~");
326
+ } catch {
327
+ item[field.columnName] = "";
328
+ }
329
+ }
330
+ }
331
+ }
332
+ if (field.settingObj && field.settingObj.attr == "WEBSITE") {
333
+ if (item[field.columnName]) {
334
+ let showKey = field.columnName;
335
+ let showName = "";
336
+ if (field.settingObj.websiteAttr) {
337
+ if (field.settingObj.websiteAttr.startsWith("table.")) {
338
+ showKey = field.settingObj.websiteAttr.split(".")[1];
339
+ } else {
340
+ showName = field.settingObj.websiteAttr;
341
+ }
342
+ }
343
+ showName = showName ? showName : item[showKey] || item[field.columnName];
344
+ if (state.source === "guageChoice") {
345
+ item[field.columnName] = showName;
346
+ } else {
347
+ item[field.columnName] = `<span ><a href="${item[field.columnName]}" title="${
348
+ item[field.columnName]
349
+ }" target="_blank">${showName}</a></span>`;
350
+ }
351
+ }
352
+ } else if (field.fieldSetting) {
353
+ item.fieldSetting = field.fieldSetting;
354
+ }
355
+
356
+ // 处理量表数据
357
+ if (field.guageType) {
358
+ const { guageType, columnName, guageSetting, settingObj = {} } = field;
359
+ let guageSettingObj = null;
360
+ if (vexutils.isJSON(guageSetting)) {
361
+ guageSettingObj = JSON.parse(guageSetting);
362
+ }
363
+ if (guageType == "CHECKBOX_BLOCK" || guageType == "EVALUATE_CHECKBOX_BLOCK") {
364
+ if (vexutils.isJSON(item[columnName])) {
365
+ item[columnName] = JSON.parse(item[columnName]).join(",");
366
+ }
367
+ } else if (guageType == "SELECT") {
368
+ if (guageSettingObj.isMultiple) {
369
+ if (vexutils.isJSON(item[columnName])) {
370
+ item[columnName] = item[columnName] ? JSON.parse(item[columnName]).join(",") : "";
371
+ }
372
+ }
373
+ } else if (guageType == "SEARCH_CASCADE") {
374
+ if (item[columnName]) {
375
+ if (vexutils.isJSON(item[columnName])) {
376
+ item[columnName] = JSON.parse(item[columnName]).join(",");
377
+ } else {
378
+ if (Array.isArray(item[columnName])) {
379
+ item[columnName] = item[columnName].join(",");
380
+ }
381
+ }
382
+ }
383
+ } else if (guageType == "DATE" || guageType == "TIME") {
384
+ if (guageSettingObj.startToStop == 1) {
385
+ item[columnName] = item[columnName] ? JSON.parse(item[columnName]).join(",") : "";
386
+ }
387
+ } else if (guageType == "LOCATION") {
388
+ if (vexutils.isJSON(item[columnName])) {
389
+ const valObj = JSON.parse(item[columnName]);
390
+ item[columnName] = valObj.address || valObj.name || "";
391
+ }
392
+ } else if (guageType == "LABEL" && settingObj.attr !== "LABEL") {
393
+ if (vexutils.isJSON(item[columnName])) {
394
+ item[columnName] = JSON.parse(item[columnName]);
395
+ if (!item[columnName].labels) {
396
+ item[columnName] = handleJson(item[columnName], "type", "labelStr");
397
+ }
398
+ }
399
+ if (item[columnName]) {
400
+ let { labels } = item[columnName];
401
+ let curHtml = [];
402
+ if (labels && vexutils.isJSON(labels)) {
403
+ labels = JSON.parse(labels);
404
+ }
405
+ if (Array.isArray(labels) && labels?.length > 0) {
406
+ curHtml = handleLabel(labels);
407
+ }
408
+ item[columnName] =
409
+ state.source === "guageChoice" ? curHtml.join("、") : curHtml.join("");
410
+ }
411
+ } else if (guageType == "ADDRESS") {
412
+ if (vexutils.isJSON(item[columnName])) {
413
+ const valObj: any = JSON.parse(item[columnName]);
414
+ const p = valObj.province?.label || "";
415
+ const c = valObj.city?.label || "";
416
+ const a = valObj.area?.label || "";
417
+ const d = valObj.address || "";
418
+ if (!!p && !c && !a && !d) {
419
+ item[columnName] = `${p}`;
420
+ } else if (!!p && !!c && !a && !d) {
421
+ item[columnName] = `${p}/${c}`;
422
+ } else if (!!p && !!c && !!a && !d) {
423
+ item[columnName] = `${p}/${c}/${a}`;
424
+ } else if (!!p && !!c && !!a && !!d) {
425
+ item[columnName] = `${p}/${c}/${a}/${d}`;
426
+ }
427
+ }
428
+ }
429
+ }
430
+
431
+ // 过滤"{}" "[]" 字符串
432
+
433
+ if (item[field.columnName] == "[]" || item[field.columnName] == "{}") {
434
+ item[field.columnName] = "";
435
+ }
436
+ });
437
+
438
+ if (item.children) {
439
+ item.childrenList = item.children;
440
+ item.hasChildren = true;
441
+ delete item.children;
442
+ formatData({
443
+ tableList: item.childrenList,
444
+ fieldList,
445
+ btnList,
446
+ oldtableData,
447
+ showButtonTop,
448
+ });
449
+ }
450
+ return item;
451
+ });
452
+ };
453
+ const isPrintBtn = (btn: any) => {
454
+ if (!btn.settingList) return false;
455
+ const copySettingObj = JSON.parse(btn.settingList);
456
+ let settingObj: any = {};
457
+ if (Array.isArray(copySettingObj)) {
458
+ settingObj = copySettingObj[0];
459
+ } else {
460
+ settingObj = copySettingObj;
461
+ }
462
+ return settingObj.trigger_type === "PRINT";
463
+ };
464
+ /**
465
+ * 量表下拉框为数据源时 需要解析数据
466
+ * @param {*} labels
467
+ */
468
+ const handleLabel = (labels: any) => {
469
+ return labels.map((v: any) => {
470
+ if (state.source === "guageChoice") {
471
+ return v.labelName || v;
472
+ } else {
473
+ let color = "#5585f5";
474
+ if (v?.color?.includes("-")) {
475
+ color = "#5585f5";
476
+ } else {
477
+ color = v.color || "#5585f5";
478
+ }
479
+ return `<span class="table-label" style="background: ${color}; border-color: ${color}; color: #fff;">${
480
+ v.labelName || v
481
+ }</span>`;
482
+ }
483
+ });
484
+ };
485
+ const handleJson = (target: any, func: any, type: any) => {
486
+ if (target && target.length > 0) {
487
+ if (func == "str") {
488
+ target = toStr(target);
489
+ } else if (func == "type") {
490
+ target = dataTypeFormat(target, type);
491
+ }
492
+ } else if (target.value && target.value.length > 0) {
493
+ if (func == "str") {
494
+ target = toStr(JSON.parse(target.value));
495
+ } else if (func == "type") {
496
+ target = dataTypeFormat(JSON.parse(target.value), type);
497
+ }
498
+ } else {
499
+ if (target[type]) {
500
+ return target[type];
501
+ }
502
+ // 没有解析的属性 “type” 返回空,避免列表展示出 json 字符串
503
+ return "";
504
+ }
505
+ return target;
506
+ };
507
+ // 单独处理搜索多选
508
+ const handleMULTISELECT = (target: any, type: any) => {
509
+ if (Array.isArray(target)) {
510
+ return "";
511
+ } else {
512
+ target = dataTypeFormat(target, type);
513
+ return target;
514
+ }
515
+ };
516
+ // 处理表格中附件
517
+ const toStr = (list: any) => {
518
+ const text: any = [];
519
+ if (!Array.isArray(list) || list.length === 0) return "";
520
+ list.forEach(obj => {
521
+ let res = `<span ><a href="${obj.url}" target="_blank">${obj.name}</a></span>`;
522
+ if (state.source === "guageChoice") {
523
+ res = obj.name;
524
+ }
525
+ text.push(res);
526
+ });
527
+ if (state.source === "guageChoice") {
528
+ return text.join("、");
529
+ }
530
+ return text.join(",");
531
+ };
532
+ // MULTISELECT 搜索多选
533
+ const dataTypeFormat = (list: any, type: any) => {
534
+ let text = "";
535
+
536
+ if (Array.isArray(list)) return text || list;
537
+ if (vexutils.isPlainObject(list)) {
538
+ text = list[type];
539
+ } else {
540
+ return text;
541
+ }
542
+ return text;
543
+ };
544
+ /**
545
+ * 百分比精度计算
546
+ */
547
+ const accMul = (value: number | string, percent: number | string) => {
548
+ let m = 0;
549
+ const s1 = value.toString();
550
+ const s2 = percent.toString();
551
+ try {
552
+ const len = s1.split(".")[1]?.length || 0;
553
+ m += len;
554
+ } catch (e) {
555
+ console.log(e);
556
+ }
557
+ try {
558
+ const len = s2.split(".")[1]?.length || 0;
559
+ m += len;
560
+ } catch (e) {
561
+ console.log(e);
562
+ }
563
+
564
+ return (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) / Math.pow(10, m);
565
+ };
566
+ /**
567
+ * @description: 将HTML格式转换为纯文本
568
+ */
569
+ const htmlToText = (HTML: any) => {
570
+ const input = HTML;
571
+ return input
572
+ .replace(/<(style|script|iframe)[^>]*?>[\s\S]+?<\/\1\s*>/gi, "")
573
+ .replace(/<[^>]+?>/g, "")
574
+ .replace(/\s+/g, " ")
575
+ .replace(/ /g, " ")
576
+ .replace(/>/g, " ");
577
+ };
578
+
579
+ /**
580
+ * 获取按钮自定义颜色
581
+ * @param {string} v
582
+ */
583
+ const getBtnStyle = (v: any) => {
584
+ // custom_bg, white_bg, none_bg
585
+ if (v.showStyle == "white_bg") {
586
+ return {
587
+ "border-color": v.color,
588
+ color: v.color,
589
+ };
590
+ } else if (v.showStyle == "none_bg") {
591
+ return {
592
+ color: v.color,
593
+ };
594
+ } else if (v.showStyle == "only_icon") {
595
+ return {
596
+ "background-color": v.color,
597
+ "border-color": v.color,
598
+ // color: v.color
599
+ };
600
+ }
601
+ return {
602
+ "background-color": v.color,
603
+ "border-color": v.color,
604
+ };
605
+ };
606
+
607
+ return {
608
+ formatData,
609
+ htmlToText,
610
+ getBtnStyle,
611
+ };
612
+ };