lw-cdp-ui 1.2.47 → 1.2.49

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 (88) hide show
  1. package/package.json +1 -1
  2. package/dist/assets/images/empty.jpg +0 -0
  3. package/dist/assets/images/login.svg +0 -558
  4. package/dist/assets/images/logo.jpg +0 -0
  5. package/dist/assets/images/logo.svg +0 -78
  6. package/dist/assets/images/logo1.svg +0 -86
  7. package/dist/assets/images/register.svg +0 -351
  8. package/dist/components/lwCronSelect/index.vue +0 -218
  9. package/dist/components/lwFlow/components/lfControl.vue +0 -126
  10. package/dist/components/lwFlow/components/lfNodePanel.vue +0 -98
  11. package/dist/components/lwFlow/config/dagre.js +0 -279
  12. package/dist/components/lwFlow/config/nodesList.js +0 -243
  13. package/dist/components/lwFlow/index.vue +0 -781
  14. package/dist/components/lwFlow/nodeEdit/audienceReceive.vue +0 -262
  15. package/dist/components/lwFlow/nodeEdit/basicSettings.vue +0 -88
  16. package/dist/components/lwFlow/nodeEdit/eventReceive.vue +0 -145
  17. package/dist/components/lwFlow/nodeEdit/index.vue +0 -306
  18. package/dist/components/lwFlow/nodeEdit/sms.vue +0 -107
  19. package/dist/components/lwFlow/nodeEdit/styleSettings.vue +0 -236
  20. package/dist/components/lwFlow/nodes/basisEnd.js +0 -56
  21. package/dist/components/lwFlow/nodes/basisStart.js +0 -56
  22. package/dist/components/lwFlow/nodes/custom.js +0 -129
  23. package/dist/components/lwFlow/nodes/et2lTable.js +0 -132
  24. package/dist/components/lwFlow/nodesData/datas/audienceReceive.js +0 -137
  25. package/dist/components/lwFlow/nodesData/datas/base.js +0 -190
  26. package/dist/components/lwFlow/nodesData/datas/collap.js +0 -95
  27. package/dist/components/lwFlow/nodesData/datas/eventReceive.js +0 -106
  28. package/dist/components/lwFlow/nodesData/datas/expand.js +0 -85
  29. package/dist/components/lwFlow/nodesData/datas/filter.js +0 -85
  30. package/dist/components/lwFlow/nodesData/datas/joiner.js +0 -96
  31. package/dist/components/lwFlow/nodesData/datas/mapper.js +0 -111
  32. package/dist/components/lwFlow/nodesData/datas/reduce.js +0 -69
  33. package/dist/components/lwFlow/nodesData/datas/sms.js +0 -69
  34. package/dist/components/lwFlow/nodesData/datas/source.js +0 -142
  35. package/dist/components/lwFlow/nodesData/datas/target.js +0 -95
  36. package/dist/components/lwFlow/nodesData/datas/timer.js +0 -180
  37. package/dist/components/lwFlow/nodesData/index.js +0 -41
  38. package/dist/components/lwForm/index.vue +0 -631
  39. package/dist/components/lwFormJson/JsonItem.vue +0 -302
  40. package/dist/components/lwFormJson/StatsConfig.vue +0 -544
  41. package/dist/components/lwFormJson/TreeItem.vue +0 -149
  42. package/dist/components/lwFormJson/index.vue +0 -362
  43. package/dist/components/lwFormJson/menuList.js +0 -324
  44. package/dist/components/lwFormMini/FormItem.vue +0 -466
  45. package/dist/components/lwFormMini/ViewItem.vue +0 -391
  46. package/dist/components/lwFormMini/index.vue +0 -421
  47. package/dist/components/lwFormMini/textToPassword.vue +0 -61
  48. package/dist/components/lwFormView/index.vue +0 -390
  49. package/dist/components/lwFormView/textToPassword.vue +0 -59
  50. package/dist/components/lwIconSelect/iconSelect.js +0 -289
  51. package/dist/components/lwIconSelect/index.vue +0 -142
  52. package/dist/components/lwLayout/components/NavMenu.vue +0 -36
  53. package/dist/components/lwLayout/components/aside.vue +0 -295
  54. package/dist/components/lwLayout/components/bu.vue +0 -88
  55. package/dist/components/lwLayout/components/iframeView.vue +0 -57
  56. package/dist/components/lwLayout/components/lang.vue +0 -77
  57. package/dist/components/lwLayout/components/setting.vue +0 -102
  58. package/dist/components/lwLayout/components/sideM.vue +0 -135
  59. package/dist/components/lwLayout/components/tags.vue +0 -388
  60. package/dist/components/lwLayout/components/topbar.vue +0 -69
  61. package/dist/components/lwLayout/components/userbar.vue +0 -214
  62. package/dist/components/lwLayout/index.vue +0 -460
  63. package/dist/components/lwLogin/index.vue +0 -506
  64. package/dist/components/lwLogin/locale/en-us.js +0 -37
  65. package/dist/components/lwLogin/locale/zh-cn.js +0 -37
  66. package/dist/components/lwSearch/date/date.vue +0 -113
  67. package/dist/components/lwSearch/dateRange/dateRange.vue +0 -118
  68. package/dist/components/lwSearch/dates/dates.vue +0 -366
  69. package/dist/components/lwSearch/index.vue +0 -628
  70. package/dist/components/lwSearch/input/input.vue +0 -55
  71. package/dist/components/lwSearch/locale/en-us.js +0 -15
  72. package/dist/components/lwSearch/locale/zh-cn.js +0 -15
  73. package/dist/components/lwSearch/select/select.vue +0 -58
  74. package/dist/components/lwSvgIcon/index.vue +0 -29
  75. package/dist/components/lwTable/index.js +0 -286
  76. package/dist/components/lwTable/index.scss +0 -238
  77. package/dist/components/lwTable/index.vue +0 -344
  78. package/dist/components/lwTable/locale/en-US.js +0 -26
  79. package/dist/components/lwTable/locale/zh-CN.js +0 -26
  80. package/dist/components/lwTable/useFullscreen.js +0 -73
  81. package/dist/components/lwTableForm/index.vue +0 -662
  82. package/dist/components/lwTableSelect/index.vue +0 -266
  83. package/dist/components/lwTableSelect/tableSelect.js +0 -23
  84. package/dist/components/lwUpload/index.vue +0 -564
  85. package/dist/lw-cdp-ui.esm.js +0 -19893
  86. package/dist/lw-cdp-ui.umd.js +0 -22
  87. package/dist/style.css +0 -1
  88. package/dist/vite.svg +0 -1
@@ -1,662 +0,0 @@
1
- <template>
2
- <el-table :data="dataList"
3
- stripe
4
- ref="table"
5
- :columns="config.formItems"
6
- :max-height="maxHeight"
7
- :row-key="config.rowKey || 'id'"
8
- :tree-props="config?.treeProps || { children: 'children', hasChildren: 'hasChildren' }"
9
- style="width: 100%">
10
- <el-table-column v-for="(item, index) in config.formItems"
11
- :width="item.width"
12
- :min-width="item.minWidth"
13
- :key="index"
14
- :label="item.label"
15
- :prop="getPropName(item)"
16
- :align="item.align ?? 'left'"
17
- :fixed="item.fixed"
18
- :sortable="item.sortable"
19
- :show-overflow-tooltip="item.tooltip"
20
- :filters="item.filters ? getFilters(item.name) : null"
21
- :filter-method="item.filters ? filterHandler : null">
22
- <template #header>
23
- <div class="table-name"
24
- :style="{ justifyContent: item.align || 'flex-start'}">
25
- <span v-if="item?.rules">*</span>
26
- {{ item.label }}
27
- </div>
28
- </template>
29
- <template #default="{ row, $index, column }">
30
- <!-- input -->
31
- <template v-if="item.component=='input'">
32
- <el-input v-model="row[item.name]"
33
- :placeholder="item.options.placeholder"
34
- clearable
35
- :size="config.size || 'small'"
36
- :type="item.options.type"
37
- :disabled="isDisabled(item, row)"
38
- :maxlength="item.options.maxlength"
39
- show-word-limit></el-input>
40
- </template>
41
- <!-- upload -->
42
- <template v-else-if="item.component=='upload'">
43
- <el-col v-for="(_item, _index) in item.options.items"
44
- :key="_index">
45
- <lw-upload v-model="row[_item.name]"
46
- :maxSize="_item.maxSize"
47
- :accept="_item.accept"
48
- :title="_item.label"
49
- :parseData="item.parseData"
50
- :disabled="_item?.disabled"
51
- :multiple="_item?.multiple"
52
- :limit="_item?.limit"
53
- :returnFile="_item?.returnFile"
54
- :tip="_item?.tip"
55
- :apiObj="item.apiObj"></lw-upload>
56
- <div class="error-tips">
57
- {{ row['errorMsg'][_item.name] }}
58
- </div>
59
-
60
- </el-col>
61
- </template>
62
- <!-- checkbox -->
63
- <template v-else-if="item.component=='checkbox'">
64
- <template v-if="item.name">
65
- <template v-for="(_item, _index) in item.options.items"
66
- :key="_index">
67
- <el-checkbox v-model="row[item.name]"
68
- :label="_item.label"
69
- :size="config.size || 'small'"></el-checkbox>
70
- <div class="error-tips">
71
- {{ row['errorMsg'][item.name] }}</div>
72
- </template>
73
-
74
- </template>
75
- <template v-else>
76
- <el-checkbox v-model="row[_item.name]"
77
- :label="_item.label"
78
- v-for="(_item, _index) in item.options.items"
79
- :key="_index"></el-checkbox>
80
- <div class="error-tips">
81
- {{ row['errorMsg'][_item.name] }}</div>
82
- </template>
83
- </template>
84
- <!-- checkboxGroup -->
85
- <template v-else-if="item.component=='checkboxGroup'">
86
- <el-checkbox-group v-model="row[item.name]"
87
- :size="config.size || 'small'">
88
- <el-checkbox v-for="_item in item.options.items"
89
- :key="_item.value"
90
- :label="_item.value">{{_item.label}}</el-checkbox>
91
- </el-checkbox-group>
92
-
93
- </template>
94
-
95
- <!-- switch -->
96
- <template v-else-if="item.component=='switch'">
97
- <el-switch :size="config.size || 'small'"
98
- :disabled="isDisabled(item, row)"
99
- v-model="row[item.name]" />
100
- </template>
101
- <!-- select -->
102
- <template v-else-if="item.component=='select'">
103
- <el-select v-model="row[item.name]"
104
- :multiple="item.options?.multiple"
105
- :allow-create="item.options?.allowCreate"
106
- default-first-option
107
- :placeholder="item.options?.placeholder || ''"
108
- :clearable="item.options?.clearable"
109
- :disabled="isDisabled(item, row)"
110
- filterable
111
- :size="config.size || 'small'"
112
- style="width: 100%;">
113
- <el-option v-for="option in item.options.items"
114
- :key="option.value"
115
- :label="option.label"
116
- :value="option.value"></el-option>
117
- </el-select>
118
-
119
- </template>
120
- <!-- cascader -->
121
- <template v-else-if="item.component=='cascader'">
122
- <el-cascader :size="config.size || 'small'"
123
- v-model="row[item.name]"
124
- :options="item.options.items"
125
- :disabled="isDisabled(item, row)"
126
- clearable></el-cascader>
127
- </template>
128
- <!-- date -->
129
- <template v-else-if="item.component=='date'">
130
- <el-date-picker v-model="row[item.name]"
131
- style="width: 100%;"
132
- :size="config.size || 'small'"
133
- :type="item.options.type"
134
- :disabled="isDisabled(item, row)"
135
- :start-placeholder="item.options.startPlaceholder"
136
- :end-placeholder="item.options.endPlaceholder"
137
- :shortcuts="item.options.shortcuts"
138
- :default-time="item.options.defaultTime"
139
- :value-rowat="item.options.valuerowat"
140
- :placeholder="item.options.placeholder || '请选择'"></el-date-picker>
141
-
142
- </template>
143
- <!-- number -->
144
- <template v-else-if="item.component=='number'">
145
- <el-input-number v-model="row[item.name]"
146
- :disabled="item.options?.disabled"
147
- :min="item?.options?.min"
148
- :max="item?.options?.max"
149
- :size="config.size || 'small'"
150
- :step="item?.options?.step || 1"
151
- :precision="item?.options?.precision"
152
- :placeholder="item?.options?.placeholder || ''"
153
- :controls-position="item?.options?.controlsPosition || 'right'">
154
- <template v-if="item?.options?.suffix"
155
- #suffix>
156
- <span>{{ item.options.suffix }}</span>
157
- </template>
158
- </el-input-number>
159
-
160
- </template>
161
- <!-- radio -->
162
- <template v-else-if="item.component=='radio'">
163
- <el-radio-group v-model="row[item.name]"
164
- :disabled="isDisabled(item, row)"
165
- :size="config.size || 'small'">
166
- <el-radio v-for="_item in item.options.items"
167
- :key="_item.value"
168
- :disabled="isDisabled(item, row)"
169
- :value="_item.value">{{_item.label}}</el-radio>
170
- </el-radio-group>
171
- </template>
172
- <!-- color -->
173
- <template v-else-if="item.component=='color'">
174
- <el-color-picker v-model="row[item.name]"
175
- :disabled="isDisabled(item, row)"
176
- :size="config.size || 'small'" />
177
- </template>
178
- <!-- rate -->
179
- <template v-else-if="item.component=='rate'">
180
- <el-rate style="margin-top: 6px;"
181
- :disabled="isDisabled(item, row)"
182
- v-model="row[item.name]"
183
- :size="config.size || 'small'"></el-rate>
184
-
185
- </template>
186
- <!-- slider -->
187
- <template v-else-if="item.component=='slider'">
188
- <el-slider v-model="row[item.name]"
189
- :marks="item.options.marks"
190
- :disabled="isDisabled(item, row)"
191
- :size="config.size || 'small'"></el-slider>
192
-
193
- </template>
194
-
195
- <!-- tags -->
196
- <template v-else-if="item.component=='tags'">
197
- <div class="tags-list">
198
- <el-tag v-for="tag in row[item.name]"
199
- :key="tag"
200
- closable
201
- :disable-transitions="false"
202
- @close="tagClose(tag, row[item.name])">
203
- {{ tag }}
204
- </el-tag>
205
- <el-input v-if="row?.tagVisible"
206
- v-model="tagValue"
207
- class="w-20"
208
- :size="config.size || 'small'"
209
- @keyup.enter="tagInputConfirm(item, row)"
210
- @blur="tagInputConfirm(item, row)" />
211
- <el-button v-else
212
- class="button-new-tag"
213
- :size="config.size || 'small'"
214
- :disabled="isDisabled(item, row)"
215
- @click="row.tagVisible = true">
216
- + 添加
217
- </el-button>
218
- </div>
219
- </template>
220
-
221
- <!-- 按钮 -->
222
- <template v-else-if="item.component == 'operation'">
223
- <!-- 默认新增/删除 -->
224
- <span v-for="o in item.options.addDelete"
225
- :key="o"
226
- v-show="o.isShow ? o.isShow(row) : true">
227
- <el-tooltip v-if="o.icon"
228
- :content="o.label"
229
- placement="top">
230
- <el-button type="primary"
231
- :size="config.size || 'small'"
232
- @click="o.clickFun ? o.clickFun(row, $index, column, tableData) : clickFun(o.type, row, $index)"
233
- :disabled="o.disabled ? o.disabled(row) : false"
234
- :icon="o.icon"
235
- circle></el-button>
236
- </el-tooltip>
237
- <el-button v-else
238
- type="primary"
239
- text
240
- :size="config.size || 'small'"
241
- @click="o.clickFun ? o.clickFun(row, $index, column, tableData) : clickFun(o.type, row, $index)"
242
- :disabled="o.disabled ? o.disabled(row) : false">
243
- {{ o.label }}
244
- </el-button>
245
- </span>
246
-
247
- <!-- 自定义按钮 省略号 -->
248
- <el-dropdown
249
- v-if="item.options?.items && item.options.items.length > 0">
250
- <el-button :size="config.size || 'small'"
251
- type="primary"
252
- link>
253
- <el-icon class="more-btn"
254
- size="16"><el-icon-more-filled /></el-icon>
255
- </el-button>
256
-
257
- <template #dropdown>
258
- <el-dropdown-menu>
259
- <el-dropdown-item v-for="o in item.options.items.filter(o => !o.isShow || o.isShow(row))"
260
- :key="o"
261
- @click="o.clickFun(row, $index, column, tableData)">
262
- {{ o.label }}
263
- </el-dropdown-item>
264
- </el-dropdown-menu>
265
- </template>
266
-
267
- </el-dropdown>
268
- </template>
269
- <!-- 没有组件是component值 就是插槽名称 -->
270
- <template v-else>
271
- <slot :name="item.component"
272
- :row="row">
273
- <el-tag type="danger">[{{item.component}}]
274
- 没有这个默认组件也未自定义插槽内容</el-tag>
275
- </slot>
276
- </template>
277
- <div v-if="item.message"
278
- class="el-row-item-msg">{{item.message}}</div>
279
-
280
- <!-- 错误提示 -->
281
- <div v-if="row.errorMsg"
282
- class="error-tips">
283
- {{ row['errorMsg'][item?.name] }}
284
- </div>
285
- </template>
286
- </el-table-column>
287
- </el-table>
288
- <div v-if="isPagination && tableData.length > pageSize"
289
- class="pagination-body">
290
- <el-pagination size="small"
291
- background
292
- :page-size="pageSize"
293
- v-model:current-page="currentPage"
294
- layout="prev, pager, next"
295
- :total="tableData.length" />
296
- </div>
297
- <div v-if="!isView"
298
- class="btn-list">
299
- <el-button type="primary"
300
- class="add-btn"
301
- plain
302
- icon="el-icon-plus"
303
- @click="addItem()">{{ $t('btn.add') }}</el-button>
304
- <slot name="deleteBtn"></slot>
305
- </div>
306
- </template>
307
-
308
- <script>
309
- import lwUpload from '../lwUpload'
310
- export default {
311
- components: {
312
- lwUpload
313
- },
314
- props: {
315
- modelValue: { type: Object, default: () => { } },
316
- config: { type: Object, default: () => { } },
317
- maxHeight: { type: String, default: 'calc(100vh - 280px)' },
318
- // 是否是查看模式
319
- isView: { type: Boolean, default: false },
320
- // 是否分页
321
- isPagination: { type: Boolean, default: false },
322
- },
323
- data() {
324
- return {
325
- tableData: [],
326
- tagValue: '',
327
- currentPage: 1,
328
- pageSize: 8,
329
- ids: [],
330
- internalUpdate: true,
331
- tagVisible: false,
332
- }
333
- },
334
- watch: {
335
- tableData: {
336
- handler(val) {
337
- if (!this.internalUpdate) {
338
- this.$emit("update:modelValue", this.unflattenObject(val));
339
- }
340
- this.internalUpdate = false;
341
- },
342
- deep: true
343
- },
344
- modelValue: {
345
- handler(val) {
346
- if (!this.internalUpdate) {
347
- this.internalUpdate = true; // 设置标志位,避免递归
348
- this.tableData = this.flattenObject(val);
349
- }
350
- },
351
- deep: true
352
- }
353
- },
354
- computed: {
355
- hasConfig() {
356
- return Object.keys(this.config).length > 0
357
- },
358
- hasValue() {
359
- return Object.keys(this.modelValue).length > 0
360
- },
361
- dataList() {
362
- if (!this.isPagination) {
363
- // 如果不需要分页,直接返回所有数据
364
- return this.tableData;
365
- }
366
-
367
- const currentPage = this.currentPage; // 当前页码
368
-
369
- // 计算分页起始位置
370
- const startIndex = (currentPage - 1) * this.pageSize;
371
-
372
- // 返回分页后的数据
373
- return this.tableData.slice(startIndex, startIndex + this.pageSize);
374
- }
375
- },
376
- mounted() {
377
- this.tableData = this.flattenObject(this.modelValue)
378
- },
379
- methods: {
380
- flattenObject(array) {
381
- let list = []
382
- function getObj(obj, prefix = '') {
383
- let result = {};
384
-
385
- for (let key in obj) {
386
- if (obj.hasOwnProperty(key)) {
387
- const newKey = prefix ? `${prefix}.${key}` : key;
388
-
389
- if ( key != 'errorMsg' && typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
390
- // 递归处理嵌套对象
391
- Object.assign(result, getObj(obj[key], newKey));
392
- } else {
393
- result[newKey] = obj[key];
394
- }
395
- }
396
- }
397
-
398
- return result;
399
- }
400
- array?.forEach(obj => {
401
- list.push(getObj(obj))
402
- })
403
-
404
- return list;
405
- },
406
- unflattenObject(array) {
407
- let list = []
408
- array?.forEach(obj => {
409
- const result = {};
410
- for (let key in obj) {
411
- if (obj.hasOwnProperty(key)) {
412
- const keys = key.split('.'); // 按 `.` 分割键名
413
- keys.reduce((acc, part, index) => {
414
- if (index === keys.length - 1) {
415
- acc[part] = obj[key];
416
- } else {
417
- acc[part] = acc[part] || {}; // 如果没有该键,创建一个空对象
418
- }
419
- return acc[part];
420
- }, result);
421
- }
422
- }
423
- list.push(result)
424
- })
425
-
426
-
427
- return list;
428
- },
429
- // 非空校验
430
- isEmpty(value) {
431
- if (value == null) return true; // null 和 undefined
432
- if (typeof value === 'string' && value.trim() === '') return true; // 空字符串
433
- if (Array.isArray(value) && value.length === 0) return true; // 空数组
434
- if (typeof value === 'object' && Object.keys(value).length === 0) return true; // 空对象
435
- return false; // 其他情况非空
436
- },
437
- // 非空校验
438
- isValue(tableData, formItems) {
439
- // 校验 tableData 中的字段
440
- const validationMessages = [];
441
- tableData.forEach((data) => {
442
- formItems.forEach((item) => {
443
- if (item.rules && item.rules.length > 0) {
444
- item.rules.forEach((rule) => {
445
- let isVal = false;
446
- if (item.component == 'checkbox' || item.component == 'upload') {
447
- item.options.items.forEach((option) => {
448
- if (this.isEmpty(data[option.name])) {
449
- if (!data?.errorMsg) {
450
- data.errorMsg = {}
451
- }
452
- data['errorMsg'][option.name] = rule.message
453
- }
454
- })
455
- } else {
456
- if (rule.required && this.isEmpty(data[item.name])) {
457
- if (!data?.errorMsg) {
458
- data.errorMsg = {}
459
- }
460
- data['errorMsg'][item.name] = rule.message
461
-
462
- validationMessages.push(`${item.label} ${rule.message}`);
463
- } else {
464
- if (data?.errorMsg) {
465
- delete data['errorMsg'][item.name];
466
- }
467
- if (data.errorMsg?.length === 0) {
468
- delete data.errorMsg;
469
- }
470
- }
471
- }
472
- });
473
- }
474
- });
475
- });
476
- if (validationMessages.length > 0) {
477
- this.$message.warning(`校验失败,存在必填字段为空,请检查`)
478
- return true; // 如果有校验失败
479
- }
480
-
481
- return false; // 如果没有校验失败
482
- },
483
- // 新增表单
484
- addItem(tableData = this.tableData) {
485
- let form = {};
486
- let formItems = JSON.parse(JSON.stringify(this.config.formItems));
487
- let isVal = this.isValue(tableData, formItems)
488
- if (isVal) { return false }
489
-
490
- formItems.forEach((item) => {
491
- if (item.component == 'checkbox' || item.component == 'upload') {
492
- if (item.name) {
493
- const value = [];
494
- item.options.items.forEach((option) => {
495
- value.push(option.value)
496
- });
497
- form[item.name] = value;
498
- } else if (item?.options?.items) {
499
- item.options.items.forEach((option) => {
500
- form[option.name] = option.value;
501
- });
502
- }
503
- } else {
504
- form[item.name] = item.value;
505
- }
506
- });
507
-
508
- // 校验通过后才推送数据
509
- let id = this.$tool.getUUID(this.config.rowKey, '4')
510
- tableData.push({
511
- [this.config.rowKey]: id,
512
- ...form
513
- });
514
-
515
- // 用于识别是否是新增的
516
- this.ids.push(id);
517
- },
518
- // 二级 新增/删除
519
- clickFun(type, row, index) {
520
- if (type == 'delete') {
521
- this.deleteItem(row)
522
- }
523
- if (type == 'add') {
524
- if (!row?.fields) {
525
- row.fields = []
526
- }
527
- this.addItem(row.fields)
528
- }
529
- },
530
- // 删除
531
- removeNode(data, item) {
532
- for (let i = 0; i < data.length; i++) {
533
- // 比较整个 item 对象是否相同
534
- if (JSON.stringify(data[i]) === JSON.stringify(item)) {
535
- data.splice(i, 1)
536
- return
537
- }
538
- // 如果有子节点,则递归调用
539
- if (data[i][this.config.treeProps.children]) {
540
- this.removeNode(data[i][this.config.treeProps.children], item)
541
- }
542
- }
543
- },
544
- deleteItem(item) {
545
- this.removeNode(this.tableData, item)
546
- },
547
- // 是否禁用
548
- isDisabled(item, row) {
549
- return !this.ids.includes(row[this.config.rowKey]) && item.options?.disabled
550
- },
551
- //合并深结构对象
552
- deepMerge(obj1, obj2) {
553
- obj2.forEach((item) => {
554
- if (obj2.hasOwnProperty(key)) {
555
- // 确保 obj1[key] 和 obj2[key] 不是 null 或 undefined
556
- const isObj1Valid = obj1[key] !== null && obj1[key] !== undefined;
557
- const isObj2Valid = obj2[key] !== null && obj2[key] !== undefined;
558
-
559
- if (
560
- isObj1Valid &&
561
- typeof obj1[key] === "object" &&
562
- !Array.isArray(obj1[key]) &&
563
- isObj2Valid &&
564
- typeof obj2[key] === "object" &&
565
- !Array.isArray(obj2[key])
566
- ) {
567
- obj1[key] = this.deepMerge(obj1[key], obj2[key]);
568
- } else {
569
-
570
- if (isObj2Valid) {
571
- obj1[key] = obj2[key];
572
- } else if (!isObj2Valid) {
573
- delete obj1[key];
574
- }
575
- }
576
- }
577
- })
578
- return obj1;
579
- },
580
- // 删除tag
581
- tagClose(tag, item) {
582
- item.splice(item.indexOf(tag), 1)
583
- },
584
- // 增加tag
585
- tagInputConfirm(item, row) {
586
- if (this.tagValue) {
587
- row[item.name] = row[item.name] || []
588
- row[item.name].push(this.tagValue)
589
- }
590
- row.tagVisible = false
591
- this.tagValue = ''
592
- },
593
- // prop NAME
594
- getPropName(item) {
595
- if (item.component == 'checkbox' || item.component == 'upload') {
596
- return item.options.items[0].name
597
-
598
- } else {
599
- return item.name
600
- }
601
- },
602
- getFilters(name) {
603
- let list = []
604
- this.tableData.forEach(item => {
605
- if (!list.includes(item[name])) {
606
- list.push(item[name])
607
- }
608
- })
609
- return list.map(item => ({
610
- text: item,
611
- value: item
612
- }))
613
- },
614
- filterHandler(value, row, column) {
615
- const property = column['property'];
616
- return row[property] === value;
617
- },
618
- }
619
- }
620
- </script>
621
-
622
- <style lang="scss" scoped>
623
- .tags-list {
624
- display: flex;
625
- flex-wrap: wrap;
626
- gap: 5px;
627
- }
628
- .table-name {
629
- display: flex;
630
- align-items: center;
631
- justify-content: center;
632
- width: 100%;
633
- gap: 2px;
634
- span {
635
- color: var(--el-color-error);
636
- }
637
- }
638
- :deep(.cell) {
639
- display: flex;
640
- align-items: center;
641
- }
642
- .error-tips {
643
- position: absolute;
644
- bottom: -7px;
645
- font-size: 10px;
646
- color: var(--el-color-error);
647
- }
648
- .btn-list {
649
- display: flex;
650
- align-items: center;
651
- margin-top: 10px;
652
- width: 100%;
653
- .add-btn {
654
- width: 100%;
655
- }
656
- }
657
- .pagination-body {
658
- padding-top: 10px;
659
- display: flex;
660
- justify-content: flex-end;
661
- }
662
- </style>