cnhis-design-vue 0.3.2-beta → 0.3.5-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 +1 -0
  3. package/es/big-table/index.js +97 -64
  4. package/es/button-print/index.css +1 -0
  5. package/es/button-print/index.js +8806 -11
  6. package/es/drag-layout/index.css +2 -1
  7. package/es/drag-layout/index.js +33 -58
  8. package/es/grid/index.css +2 -1
  9. package/es/grid/index.js +3 -4
  10. package/es/index.css +2 -1
  11. package/es/index.js +9467 -664
  12. package/package.json +5 -2
  13. package/packages/big-table/index.ts +17 -0
  14. package/packages/big-table/src/BigTable.vue +2514 -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,705 @@
1
+ import { nextTick } from 'vue';
2
+ import vexutils from '@/utils/vexutils';
3
+ import xb_small from './assets/img/xb_small.png';
4
+
5
+ const isJSON = (str: any) => {
6
+ if (typeof str == "string") {
7
+ try {
8
+ const obj = JSON.parse(str);
9
+ if (typeof obj == "object" && obj) {
10
+ return true;
11
+ } else {
12
+ return false;
13
+ }
14
+ } catch (e) {
15
+ return false;
16
+ }
17
+ }
18
+ return false;
19
+ };
20
+
21
+ /** 评价组件 */
22
+ export const getEvaluate = (row: any, item: any) => {
23
+ let str = row[item.columnName];
24
+ if (isJSON(str)) {
25
+ let obj = JSON.parse(str);
26
+ return obj.star ? `${obj.star}星` : "";
27
+ }
28
+ return str;
29
+ };
30
+
31
+ export const getMapVal = (row: any, item: any) => {
32
+ let str = row[item.columnName];
33
+ if (isJSON(str)) {
34
+ let obj = JSON.parse(str);
35
+ return obj.address || "";
36
+ }
37
+ return str;
38
+ };
39
+
40
+ /** 年龄 json 解析 */
41
+ export const getageShowType = (row: any, item: any) => {
42
+ /**
43
+ * 3个月以下了显示到天,3个月到1岁只显示到月,1岁到3岁显示几岁几月,3岁以上的只显示岁
44
+ */
45
+ let objStr = row[item.columnName];
46
+ if (isJSON(objStr)) {
47
+ let obj = JSON.parse(objStr);
48
+ let days = obj.days || 0;
49
+ if (days > 0) {
50
+ if (days < 91) {
51
+ return `${days} 天`;
52
+ } else if (90 < days && days < 365) {
53
+ return `${Math.floor(days / 30)} 个月`;
54
+ } else if (365 < days && days < 1095) {
55
+ return `${obj.year} 岁 ${obj.month} 月`;
56
+ } else if (1095 < days) {
57
+ return `${obj.year}岁`;
58
+ }
59
+ } else {
60
+ return "";
61
+ }
62
+ }
63
+ return objStr || "";
64
+ };
65
+
66
+ // 格式化设置搜索条件参数
67
+ const getConObj = (arr: any, state: any) => {
68
+ // this.quickSearch
69
+ if (!Array.isArray(arr)) {
70
+ return [];
71
+ }
72
+ let conObj = [];
73
+ for (let i = 0; i < arr.length; i++) {
74
+ let item: any = arr[i];
75
+ let value = 0;
76
+ let limit_date = "";
77
+ if (item.EQ || item.CL) {
78
+ value = item.EQ || item.CL;
79
+ if (item.settingObj?.attr === "PERCENTAGE") {
80
+ value = Number(value) / 100;
81
+ }
82
+ if (item.EVALUATEAttr) {
83
+ value = item.selecteds.join("|#|");
84
+ }
85
+ } else if (!vexutils.isEmpty(item.QUOTE)) {
86
+ value = item.QUOTE.join("|#|");
87
+ } else if (!vexutils.isEmpty(item.CONVERT)) {
88
+ value = item.CONVERT.map((item: any) => JSON.parse(item));
89
+ } else if (item.DATE) {
90
+ if (item.DATE.start_val || item.DATE.end_val) {
91
+ item.DATE.con = "IN";
92
+ }
93
+ item.tempCon = item.DATE.con;
94
+ item.start_val = item.DATE.start_val ? item.DATE.start_val.format("YYYY-MM-DD HH:mm:ss") : "";
95
+ item.end_val = item.DATE.end_val ? item.DATE.end_val.format("YYYY-MM-DD HH:mm:ss") : "";
96
+ } else if (item.BIRTHDAY) {
97
+ // 生日
98
+ let isChange = false;
99
+ if (item.BIRTHDAY.limit_date.length > 0 || item.BIRTHDAY.start_val || item.BIRTHDAY.end_val) {
100
+ item.BIRTHDAY.con = "IN";
101
+ }
102
+ item.tempCon = item.BIRTHDAY.con;
103
+ // 因为年龄下拉有个默认值, 当输入框中有值时才取下拉值
104
+ if (item.BIRTHDAY.start_val || item.BIRTHDAY.end_val) {
105
+ isChange = true;
106
+ } else {
107
+ isChange = false;
108
+ }
109
+
110
+ // 校验
111
+ if (item.BIRTHDAY.start_val) {
112
+ let res = vexutils.validateBirthday(
113
+ item.BIRTHDAY.start_val,
114
+ item.title,
115
+ item.BIRTHDAY.unit
116
+ );
117
+ if (!res) return;
118
+ }
119
+ if (item.BIRTHDAY.end_val) {
120
+ let res = vexutils.validateBirthday(
121
+ item.BIRTHDAY.end_val,
122
+ item.title,
123
+ item.BIRTHDAY.unit
124
+ );
125
+ if (!res) return;
126
+ }
127
+ if (+item.BIRTHDAY.start_val > +item.BIRTHDAY.end_val) {
128
+ (window as any).$message.warning(`${item.title}请输入有效范围`, 2);
129
+ return;
130
+ }
131
+
132
+ limit_date = state.limit_date || "";
133
+ item.unit = isChange ? item.BIRTHDAY.unit || "" : "";
134
+ item.start_val = item.BIRTHDAY.start_val || "";
135
+ item.end_val = item.BIRTHDAY.end_val || "";
136
+ } else if (item.LABELAttr) {
137
+ let valList: any = [];
138
+ item.labelSelectList.forEach((v: any) => {
139
+ valList.push(v.labelName);
140
+ });
141
+ value = valList.join("|#|");
142
+ } else if (item.EVALUATEAttr) {
143
+ value = item.selecteds.join("|#|");
144
+ }
145
+ let temp = {
146
+ field_key: item.columnName, // 一级value
147
+ con: item.DATE || item.BIRTHDAY ? item.tempCon : item.con, // 二级选择项value
148
+ value: value, // input输入值
149
+ limit_date: limit_date || "", // 生日
150
+ start_val: item.start_val || "", // 开始时间
151
+ end_val: item.end_val || "", // 结束时间
152
+ unit: item.unit || "", // 年龄
153
+ };
154
+ conObj.push(temp);
155
+ }
156
+ // let dateCons = this.dateTeam.map(item => item.con);
157
+ let res = conObj.filter(
158
+ item => item.value || item.limit_date || item.start_val || item.end_val
159
+ // dateCons.includes(item.con)
160
+ );
161
+ return res;
162
+ };
163
+
164
+ export const reScrollFilterWrap = () => {
165
+ let filterWrapEl = document.querySelectorAll(".big-table-filter-wrap");
166
+ let checkboxWrapEl: any =
167
+ filterWrapEl[filterWrapEl.length - 1].querySelector(".js-checkbox-wrap");
168
+
169
+ let tableScrollTop = checkboxWrapEl.scrollTop;
170
+
171
+ nextTick(() => {
172
+ checkboxWrapEl.scrollTop = tableScrollTop;
173
+ });
174
+ };
175
+
176
+ export const showFilter = (field: any, columnName: any, event: any, props: any, state: any) => {
177
+ if (props.isInlineOperating) return false;
178
+ let target = event.target;
179
+ const FILTER_BOX_WIDTH = 400;
180
+ const FILTER_BOX_TOP_OFFSET = 20;
181
+
182
+ let transformWrap = document.body;
183
+ let {
184
+ left: btnRectLeft,
185
+ right: btnRectRight,
186
+ top: btnRectTop,
187
+ width: btnWidth,
188
+ } = target.getBoundingClientRect();
189
+
190
+ field.left = "initial";
191
+ field.right = "initial";
192
+ field.top = "initial";
193
+
194
+ let transformWrapWidth = transformWrap.clientWidth;
195
+ if (btnRectLeft + FILTER_BOX_WIDTH > transformWrapWidth) {
196
+ let transformWrapRight = transformWrap?.getBoundingClientRect().right || 0;
197
+ field.right = transformWrapRight - btnRectRight - btnWidth / 2 + "px";
198
+ } else {
199
+ field.left = btnRectLeft + "px";
200
+ }
201
+
202
+ field.top = (btnRectTop + FILTER_BOX_TOP_OFFSET) + (props.filterTopOffset || 0) + "px";
203
+
204
+ field.visible = !field.visible;
205
+
206
+ let len = state.filterFields[columnName]?.CONVERT.length;
207
+ field.checkAll = len === field.setting.showSetting.length;
208
+ field.indeterminate = !!len && len !== field.setting.showSetting.length;
209
+ field.searchFilterText = "";
210
+ };
211
+
212
+ // 处理分组columns
213
+ const handleRowColumns = (rowColumns: any, columns: any, key: any) => {
214
+ rowColumns.map((item: any) => {
215
+ let children: any = [];
216
+ let spliceIndex = -1;
217
+ let indexArr: any = [];
218
+ item.list?.length &&
219
+ item.list.forEach((v: any) => {
220
+ let matchItem = columns?.find((column: any) => column[key] === v);
221
+ if (matchItem) {
222
+ let matchIndex = columns.findIndex((column: any) => column[key] === v);
223
+ indexArr.push(matchIndex);
224
+ delete matchItem.fixed;
225
+ children.push(matchItem);
226
+ columns.splice(matchIndex, 1);
227
+ }
228
+ });
229
+ let obj = {
230
+ title: item.title,
231
+ align: "center",
232
+ children,
233
+ };
234
+ spliceIndex = Math.min.apply(Math, indexArr);
235
+ spliceIndex > -1 && columns.splice(spliceIndex, 0, obj);
236
+ });
237
+ };
238
+ // 分组表头处理
239
+ export const handleGroupColums = (columns: any, props: any) => {
240
+ let { rowGroupSetting } = props;
241
+ if (!rowGroupSetting || !Object.keys(rowGroupSetting).length) return columns;
242
+ let { firstRowGroup, secondRowGroup } = rowGroupSetting;
243
+ if (!firstRowGroup || !firstRowGroup.length) return columns;
244
+ handleRowColumns(firstRowGroup, columns, "columnName");
245
+ if (!secondRowGroup || !secondRowGroup.length) return columns;
246
+ handleRowColumns(secondRowGroup, columns, "title");
247
+ return columns;
248
+ };
249
+
250
+ export const handlerInitSearchItem = (arr: any) => {
251
+ if (!Array.isArray(arr)) return;
252
+ arr.forEach(el => {
253
+ if (el.setting) {
254
+ // el.seting 可能是 string / object
255
+ el.setting = typeof el.setting == "string" ? JSON.parse(el.setting) : el.setting;
256
+ if (!vexutils.isEmpty(el.setting.wordbook)) {
257
+ el["con"] = "QUOTE";
258
+ el["dataSource"] = [];
259
+ el["QUOTE"] = [];
260
+ return;
261
+ } else if (el.setting.showSetting && el.setting.showSetting.length > 0) {
262
+ el["con"] = "CONVERT";
263
+ el.setting.showSetting.forEach((set: any) => {
264
+ set["label"] = set.change_text;
265
+ set["value"] = JSON.stringify(set.filter);
266
+ });
267
+ el["CONVERT"] = [];
268
+ return;
269
+ }
270
+ }
271
+ if (el.fieldType.includes("DATE")) {
272
+ if (el.settingObj && el.settingObj.attr == "BIRTHDAY") {
273
+ el["con"] = "BIRTHDAY";
274
+ el["showDate"] = false;
275
+ el["marginx"] = "ml";
276
+ // el['BIRTHDAY'] = initBirthdayParams();
277
+ } else {
278
+ el["con"] = "DATE";
279
+ el["showDate"] = false;
280
+ el["marginx"] = "ml";
281
+ el["DATE"] = {
282
+ con: null,
283
+ start_val: null,
284
+ end_val: null,
285
+ };
286
+ }
287
+ } else if (el.fieldType == "TEXT") {
288
+ el["con"] = "CL";
289
+ el["CL"] = "";
290
+ } else if (el.fieldType == "NUMBER") {
291
+ el["con"] = "EQ";
292
+ el["EQ"] = "";
293
+ } else if (el.fieldType == "JSONB") {
294
+ el["con"] = "EQ";
295
+ el["EQ"] = "";
296
+ }
297
+ if (el.setting.attr === "LABEL") {
298
+ el["con"] = "EQ";
299
+ el["LABELAttr"] = true;
300
+ el["labelSelectList"] = [];
301
+ // handleSetLabelOptions(el.setting.labelType, el);
302
+ }
303
+ if (el.setting.attr === "EVALUATE") {
304
+ el["con"] = "CL";
305
+ el["selecteds"] = [];
306
+ el["EVALUATEAttr"] = true;
307
+ }
308
+ });
309
+ };
310
+
311
+ export const generateEditRender = (fieldItem: any) => {
312
+ if (fieldItem.columnName === "operatorColumn") {
313
+ return undefined;
314
+ }
315
+
316
+ return {
317
+ name: "EditInput",
318
+ enabled: fieldItem.isEdit == 1,
319
+ };
320
+ };
321
+
322
+ const footerFieldSum = (list: any, field: any, conObj: any[] = [], props: any) => {
323
+ let sum = 0,
324
+ count = 0;
325
+ let { fieldList = [] } = props.columnConfig;
326
+ list.forEach((i: any) => {
327
+ DFS(i, (node: any) => {
328
+ if (!node.childrenList || !node.childrenList.length) {
329
+ let isShow = true;
330
+ // conObj 过滤单条数据 是否显示
331
+ if (conObj.length) {
332
+ let paramObj = {
333
+ table: node,
334
+ form: {},
335
+ sys: props?.userInfo?.map?.sysParams || {},
336
+ };
337
+ isShow = vexutils.parseCondition(conObj, paramObj, fieldList);
338
+ }
339
+ if (isShow) {
340
+ let value = node[field] || 0;
341
+ sum += Number(value);
342
+ ++count;
343
+ }
344
+ }
345
+ });
346
+ });
347
+ return { sum, count };
348
+ };
349
+
350
+ export const getFooterGroup = (columns: any, data: any, props: any) => {
351
+ let { groupCountMap } = props;
352
+ let res: any = [];
353
+ props.groupCountFields.forEach((item: any) => {
354
+ let tips = item.tips;
355
+ let color = item.color || "#000";
356
+ // 全部页
357
+ let value;
358
+ if (item.range == "all") {
359
+ value = groupCountMap[item.key];
360
+ } else if (item.range == "page") {
361
+ // 当前页
362
+ // avg 平均值 sum 合计 count 数量
363
+ let { sum = 0, count = 0 } = footerFieldSum(data, item.field, item.conObj, props);
364
+ value = count;
365
+ if (item.method == "avg") {
366
+ value = sum / count || 0;
367
+ } else if (item.method == "sum") {
368
+ value = sum;
369
+ }
370
+ }
371
+ // 保留四位小数
372
+ value = vexutils.round(value, 4);
373
+ res.push(`<span style="color: ${color}">${tips}:${value}</span>`);
374
+ });
375
+ return res.join("、");
376
+ };
377
+
378
+ // 深度遍历tree
379
+ const DFS = (node: any, fn: Function) => {
380
+ if (!node) return;
381
+ const stack = [node];
382
+ while (stack.length > 0) {
383
+ const first = stack.shift();
384
+ if (first) {
385
+ fn(first);
386
+ }
387
+ first.childrenList &&
388
+ first.childrenList.reverse().forEach((child: any) => {
389
+ stack.unshift(child);
390
+ });
391
+ }
392
+ };
393
+
394
+ export const checkMethod = ({ row }: { row: any }) => {
395
+ return !row.forbiddenBatchSelect;
396
+ };
397
+
398
+ /**
399
+ * 单选行数据 树结构 扁平化处理
400
+ */
401
+ export const flattenRow = (row: any, newRow: any, newTheUniqueKeyArr: any, handleRowId: any) => {
402
+ newRow.push(row);
403
+ newTheUniqueKeyArr.push(row[handleRowId]);
404
+ if (row.childrenList && row.childrenList.length) {
405
+ row.childrenList.forEach((item: any) => {
406
+ if (item.childrenList && item.childrenList.length) {
407
+ flattenRow(item, newRow, newTheUniqueKeyArr, handleRowId);
408
+ } else {
409
+ newTheUniqueKeyArr.push(item[handleRowId]);
410
+ newRow.push(item);
411
+ }
412
+ });
413
+ }
414
+ }
415
+
416
+ /**
417
+ * 树结构 选中交集
418
+ */
419
+ export const intersectRow = (checkedRow: any, newTheUniqueKeyArr: any, handleRowId: any) => {
420
+ let theUniqueKeyArr: any = [];
421
+ if (!checkedRow.length) return 1;
422
+ checkedRow.forEach((item: any) => theUniqueKeyArr.push(item[handleRowId]));
423
+ if (!theUniqueKeyArr.length) return 1;
424
+ if (theUniqueKeyArr.length !== newTheUniqueKeyArr.length) return 1;
425
+ let res = theUniqueKeyArr.filter((x: any) => {
426
+ newTheUniqueKeyArr.includes(x);
427
+ });
428
+ return res.length;
429
+ }
430
+
431
+ // 清除已选择的禁用多选项
432
+ export const removeCheckedDisabledRows = (state: any) => {
433
+ // 禁用多选的项可单选,判断是否符合条件并移除
434
+ if (state.checkedRows.length == 1 && !checkMethod({ row: state.checkedRows[0] })) {
435
+ state.checkedRows.pop();
436
+ }
437
+ }
438
+
439
+ export const setFilterStatus = (state: any, props: any) => {
440
+ // 表头没有过滤字段 不需要设置
441
+ if (!state.filterFields || !Object.keys(state.filterFields).length) return;
442
+ let val = props.quickSearchConfig;
443
+
444
+ if (!val || !val.length) {
445
+ let keys = Object.keys(state.filterFields);
446
+ keys.forEach(key => {
447
+ state.filterFields[key]["CONVERT"] = [];
448
+ });
449
+ return false;
450
+ }
451
+ // 修复 val长度和this.filterFields个数对不上 会少清空选中项
452
+ for (let key in state.filterFields) {
453
+ let item = state.filterFields[key];
454
+ item && (item["CONVERT"] = []);
455
+ }
456
+
457
+ val.forEach((item: any) => {
458
+ let itemKey = item.field_key;
459
+ // 参与搜索的字段必须在 filterFields中
460
+ if (itemKey in state.filterFields) {
461
+ if (!state.filterFields[item.field_key]) {
462
+ state.filterFields[item.field_key]["CONVERT"] = [];
463
+ return false;
464
+ }
465
+
466
+ let value = item.value.map((item: any) => JSON.stringify(item));
467
+ state.filterFields[item.field_key]["CONVERT"] = value;
468
+ }
469
+ });
470
+ };
471
+
472
+ // 设置 行样式
473
+ export const getRowStyle = ({ row }: any) => {
474
+ if (row.rowColor) {
475
+ let rowRGBA = vexutils.hexToRGBA(row.rowColor, 0.2);
476
+ let rowBg = `rgba(${rowRGBA.r}, ${rowRGBA.g}, ${rowRGBA.b}, ${rowRGBA.a})`;
477
+ return `background-color:${rowBg}`;
478
+ }
479
+ // return demo();
480
+ return null;
481
+ };
482
+
483
+ export const handleTableHeight = (state: any, props: any) => {
484
+ if (!props.isNestTable) return props.height;
485
+ // 嵌套子表需要根据行数设置高
486
+ let tableHeight = props.styleSetting?.tableHeight || "table-simple";
487
+ let dataLen = props.data?.length || 1;
488
+ let height = state.checkWidth[tableHeight] * dataLen + 90;
489
+ return `${height}px`;
490
+ };
491
+
492
+ export const handleName = (item: any, key = "name") => {
493
+ return item.alias || item[key];
494
+ };
495
+
496
+ const formatField = (value: any) => {
497
+ if (value && typeof value == "string" && value.startsWith("###")) {
498
+ value = value.slice(3);
499
+ value = JSON.parse(value);
500
+ value = value.tooltip || value.value;
501
+ }
502
+ return value;
503
+ };
504
+
505
+ export const handleImgArr = (imgs: any, type: any, imgs2imgArr: Function) => {
506
+ // 当表格属性为头像时,该列中没有头像情况下,使用小标头像
507
+ if (type === "HEADPORTRAIT") {
508
+ if (!imgs) imgs = xb_small;
509
+ }
510
+ return imgs2imgArr(imgs);
511
+ };
512
+
513
+ export const handleImgSrc = (curSrc: any, imageArr: any, type: any) => {
514
+ if (!imageArr || !imageArr.length) return curSrc;
515
+ let matchItem = imageArr.find((item: any) => item.type === type);
516
+ if (!matchItem) return curSrc;
517
+ if (matchItem.suffix) return curSrc + matchItem.suffix;
518
+ let h = matchItem.h;
519
+ let w = matchItem.w;
520
+ if (matchItem.h === "adaptive" && matchItem.w != "adaptive") {
521
+ h = matchItem.w;
522
+ }
523
+ if (matchItem.w === "adaptive" && matchItem.h != "adaptive") {
524
+ h = matchItem.h;
525
+ }
526
+ let size = `_${h}x${w}`;
527
+ return curSrc + size;
528
+ };
529
+
530
+ // 图片放大
531
+ export const modalDetailImage = (imageArr: any, type: any, defaultHeight: any) => {
532
+ if (!imageArr || !imageArr.length)
533
+ return {
534
+ display: "inline-block",
535
+ maxWidth: "100%",
536
+ maxheight: defaultHeight,
537
+ };
538
+ const matchItem = imageArr.find((item: any) => item.type === type);
539
+ if (!matchItem) {
540
+ return { display: "inline-block", height: defaultHeight };
541
+ }
542
+ const res = vexutils.handleImageSize(matchItem, defaultHeight);
543
+ return res;
544
+ };
545
+
546
+ /** 选人组件数据解析 */
547
+ export const getCandidateComponents = (row: any, item: any) => {
548
+ /**
549
+ * 一人展示名字,多人展示数量 => 方晶晶(产品)
550
+ */
551
+ let str = row[item.columnName];
552
+ if (vexutils.isJSON(str)) {
553
+ let hasNameField = str.includes('user_name');
554
+ let obj = JSON.parse(str);
555
+ if (Array.isArray(obj)) {
556
+ let len = obj.length;
557
+ if (len > 1) {
558
+ return `已选${len}人`;
559
+ } else if (len === 1) {
560
+ return (hasNameField && obj[0]?.user_name) || `已选${len}人`;
561
+ }
562
+ }
563
+ }
564
+ };
565
+
566
+ export const handleQrCodeContent = (row: any, field: any) => {
567
+ let { settingObj = {}, fieldSetting = {} } = field;
568
+ let { mergedFeildExpression } = fieldSetting;
569
+ let content = row[field.field];
570
+ // 合并字段
571
+ if (mergedFeildExpression) {
572
+ const regexp = /#{(.+?)\}/g;
573
+ let formatHtml = mergedFeildExpression.replace(regexp, (match: any, $1: any) => {
574
+ let value = row[$1] || "";
575
+ return value;
576
+ });
577
+ content = formatHtml;
578
+ }
579
+ let params = {
580
+ content,
581
+ };
582
+ let btnObj = {
583
+ btnName: settingObj?.qrCode?.name,
584
+ trigger_id: settingObj?.qrCode?.id,
585
+ params,
586
+ };
587
+ return btnObj;
588
+ };
589
+
590
+ export const getInlineEditBtn = (row: any, btnListKey: any) => {
591
+ if (!row[btnListKey]?.length) return [];
592
+
593
+ return row[btnListKey].filter((item: any) => {
594
+ return item.settingObj[0].trigger_type === "EDIT_ROW";
595
+ });
596
+ };
597
+
598
+ // 判断是否复制
599
+ export const isCopy = (item: any, row: any) => {
600
+ return row[item.columnName] && item.fieldSetting && item.fieldSetting.fontContentCopy == 1;
601
+ };
602
+
603
+ // 设置 domPropsInnerHTML中富文本 img样式
604
+ export const handleTableImageSize = (imageArr: any, type: any, defaultHeight: any) => {
605
+ if (!imageArr || imageArr.length === 0) {
606
+ document.body.style.setProperty('--tableImageHeight', defaultHeight);
607
+ document.body.style.setProperty('--tableImageWidth', 'auto');
608
+ return;
609
+ }
610
+ const matchItem = imageArr.find((item: any) => item.type === type);
611
+ if (!matchItem) {
612
+ document.body.style.setProperty('--tableImageHeight', defaultHeight);
613
+ document.body.style.setProperty('--tableImageWidth', 'auto');
614
+ return;
615
+ }
616
+ let height = defaultHeight,
617
+ width = 'auto';
618
+ if (matchItem.h) {
619
+ height = matchItem.h === 'adaptive' ? 'auto' : matchItem.h + 'px';
620
+ }
621
+ if (matchItem.w) {
622
+ width = matchItem.w === 'adaptive' ? 'auto' : matchItem.w + 'px';
623
+ }
624
+ document.body.style.setProperty('--tableImageHeight', height);
625
+ document.body.style.setProperty('--tableImageWidth', width);
626
+ }
627
+
628
+ export const setDefaultFormData = (property: any, fieldItem: any, originalRow: any = {}) => {
629
+ let defaultValue = originalRow[property];
630
+
631
+ return {
632
+ [fieldItem.name]: formatField(defaultValue),
633
+ };
634
+ };
635
+
636
+ export const hideFilterWrap = (state: any, props: any) => {
637
+ let values = Object.values(state.filterFields);
638
+ values.forEach((item: any) => {
639
+ item.visible = false;
640
+ });
641
+
642
+ setFilterStatus(state, props);
643
+ };
644
+
645
+ export const mergeConObjFn = (state: any, props: any) => {
646
+ let fields = Object.values(state.filterFields);
647
+ let fieldkeys = Object.keys(state.filterFields);
648
+ let conObj: any = getConObj(fields, state);
649
+ let mergeConObj = [...conObj];
650
+ let qqConObj = props.tableParams.qqConObj ? JSON.parse(props.tableParams.qqConObj) : [];
651
+
652
+ qqConObj.forEach((i: any) => {
653
+ if (!fieldkeys.includes(i.field_key)) {
654
+ mergeConObj.push(i);
655
+ }
656
+ });
657
+
658
+ return mergeConObj;
659
+ };
660
+
661
+ // 判断是否链接字段
662
+ export const isLink = (props: any, item: any, row: any) => {
663
+ return (
664
+ item.clickFieldKey == item.columnName ||
665
+ (props.relatedItems.triggerMethodPc == "field" &&
666
+ item.columnName == props.relatedItems.triggerMethodField) ||
667
+ (item.isbtnLink && row.btnLinks && row.btnLinks?.includes(item.columnName))
668
+ );
669
+ };
670
+
671
+ export const setTableConfig = (config: any, state: any) => {
672
+ state.showButtonTop = config.showButtonTop;
673
+ state.isTree = config.isTree;
674
+ state.openOnly = config.openOnly;
675
+ state.isExpand = config.spreadAllBtn;
676
+ state.levelLazyLoadSetting = Object.assign({}, config.levelLazyLoadSetting);
677
+ };
678
+
679
+ export const setTreeGroupTitle = (formatList: any, key: any, GROUP_TITLE_KEY: any) => {
680
+ formatList.forEach((row: any) => {
681
+ if (vexutils.has(row, "childrenList")) {
682
+ setTreeGroupTitle(row["childrenList"], key, GROUP_TITLE_KEY);
683
+ }
684
+
685
+ if (!vexutils.has(row, GROUP_TITLE_KEY)) return;
686
+ row[key] = row[GROUP_TITLE_KEY];
687
+ });
688
+ };
689
+
690
+ export const setVisibleCheckAllWrap = (state: any, props: any, currentCheckedKeys: any) => {
691
+ if (props.isNestTable) return;
692
+ if (state.isTree == 1) {
693
+ state.visibleCheckAllWrap = false;
694
+ return false;
695
+ }
696
+
697
+ state.visibleCheckAllWrap = currentCheckedKeys.length > 1;
698
+
699
+ let len = currentCheckedKeys.length;
700
+ let isLargerOrEqualPageSize = len >= state.curAbleCheckedLen;
701
+ let isShowAllTable = props.pageVO.pageSize === props.pageVO.total;
702
+ let isSpreadSelected = currentCheckedKeys.length > state.currentPageSelectedLength;
703
+
704
+ state.visibleCheckAllWrapMore = isSpreadSelected || (isLargerOrEqualPageSize && !isShowAllTable);
705
+ }