sohelp-eleplus 1.1.18 → 1.1.20
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.
- package/README.md +24 -0
- package/cache/ModuleCache.js +2 -32
- package/components.js +2 -0
- package/http/SohelpHttp.js +14 -5
- package/package.json +1 -1
- package/sohelp-card/index.vue +13 -0
- package/sohelp-dict/index.vue +25 -1
- package/sohelp-entity-grid/index.vue +3 -3
- package/sohelp-grid/components/filter-condition-item.vue +7 -3
- package/sohelp-grid/index.vue +341 -125
- package/sohelp-grid/js/DefaultGridOptions.js +30 -17
- package/sohelp-grid/js/DefaultProps.js +3 -3
- package/sohelp-grid/js/useSohelpGridConfig.js +163 -87
- package/sohelp-grid-select/index.vue +2 -2
- package/sohelp-grid-view/filter/filter-form.vue +41 -16
- package/sohelp-grid-view/filter/index.vue +6 -3
- package/sohelp-grid-view/index.vue +15 -6
- package/sohelp-icon-select/index.vue +2 -2
- package/sohelp-import/index.vue +470 -0
- package/sohelp-modal/index.vue +33 -22
- package/sohelp-module/useSohelpModule.js +9 -11
- package/sohelp-org-user-tree/index.vue +1 -1
- package/sohelp-page/index.vue +13 -0
- package/sohelp-table/index.vue +3 -3
- package/sohelp-vform-drawer/index.vue +1 -1
- package/sohelp-vxe-grid/DefaultGridOptions.js +56 -40
- package/sohelp-vxe-grid/DefaultProps.js +10 -20
- package/sohelp-vxe-grid/SohelpGridConfig.js +28 -27
- package/sohelp-vxe-grid/index.vue +345 -387
- package/sohelp-vxe-table/index.vue +3 -3
- package/sohelp-workflow/nodes/approver.vue +0 -1
- package/style/index.scss +0 -0
|
@@ -12,13 +12,12 @@
|
|
|
12
12
|
@radioChange="onRadioChange"
|
|
13
13
|
@cellClick.stop="onCellClick"
|
|
14
14
|
>
|
|
15
|
-
<template #
|
|
15
|
+
<template #keywords>
|
|
16
16
|
<div class="search-wrap">
|
|
17
17
|
<div class="search-box">
|
|
18
|
-
<ele-tooltip
|
|
18
|
+
<ele-tooltip content="请输入关键字按回车搜索." placement="top" :offset="3">
|
|
19
19
|
<sohelp-input
|
|
20
20
|
v-model="keywords"
|
|
21
|
-
:placeholder="getKeywordsPlaceholder"
|
|
22
21
|
clearable
|
|
23
22
|
@keyup.enter="reload(gridOptions.params)"
|
|
24
23
|
class="input-with-select"
|
|
@@ -47,410 +46,363 @@
|
|
|
47
46
|
</div>
|
|
48
47
|
</template>
|
|
49
48
|
|
|
50
|
-
<script>
|
|
49
|
+
<script setup>
|
|
51
50
|
import { EleMessage } from '@/components/ele-admin-plus/components';
|
|
52
51
|
import { DragOutlined } from '../sohelp-icon-select/icons';
|
|
53
|
-
import {
|
|
52
|
+
import { nextTick, onMounted, reactive, ref, watch } from 'vue';
|
|
53
|
+
import { merge, cloneDeep } from 'lodash-es'; // 正确导入
|
|
54
54
|
import DefaultProps from './DefaultProps';
|
|
55
|
-
import initial from './SohelpGridConfig';
|
|
56
55
|
import { Search } from '@element-plus/icons-vue';
|
|
56
|
+
import DefaultGridOptions from './DefaultGridOptions';
|
|
57
|
+
|
|
58
|
+
/**判断配置是否初始化完毕*/
|
|
59
|
+
const emit = defineEmits([
|
|
60
|
+
'filter',
|
|
61
|
+
'reset',
|
|
62
|
+
'pageChange',
|
|
63
|
+
'checkboxAll',
|
|
64
|
+
'checkboxChange',
|
|
65
|
+
'toolbarButtonClick',
|
|
66
|
+
'menuClick',
|
|
67
|
+
'cellClick',
|
|
68
|
+
'pageChange',
|
|
69
|
+
'refresh',
|
|
70
|
+
'radioChange',
|
|
71
|
+
'update:value',
|
|
72
|
+
'update:value'
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
const isPage = ref(false);
|
|
76
|
+
const selectedValue = ref([]);
|
|
77
|
+
const selectedData = ref([]);
|
|
78
|
+
const keywords = ref('');
|
|
79
|
+
const props = defineProps(cloneDeep(DefaultProps));
|
|
80
|
+
|
|
81
|
+
/**列表实例*/
|
|
82
|
+
const sohelpVxeGridRef = ref(null);
|
|
83
|
+
|
|
84
|
+
const gridOptions = reactive(cloneDeep(DefaultGridOptions));
|
|
85
|
+
if (props.gridOptions) {
|
|
86
|
+
merge(gridOptions, props.gridOptions);
|
|
87
|
+
}
|
|
57
88
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
props: DefaultProps,
|
|
62
|
-
emits: [
|
|
63
|
-
'pageChange',
|
|
64
|
-
'checkboxAll',
|
|
65
|
-
'checkboxChange',
|
|
66
|
-
'toolbarButtonClick',
|
|
67
|
-
'menuClick',
|
|
68
|
-
'cellClick',
|
|
69
|
-
'pageChange',
|
|
70
|
-
'refresh',
|
|
71
|
-
'radioChange',
|
|
72
|
-
'update:value',
|
|
73
|
-
'update:value'
|
|
74
|
-
],
|
|
75
|
-
setup(props, { emit }) {
|
|
76
|
-
/**判断配置是否初始化完毕*/
|
|
77
|
-
const isConfigInitialized = ref(false);
|
|
78
|
-
const sohelpConfig = reactive({});
|
|
79
|
-
const isPage = ref(false);
|
|
80
|
-
const selectedValue = ref([]);
|
|
81
|
-
const selectedData = ref([]);
|
|
82
|
-
const keywords = ref('');
|
|
83
|
-
const propertiesMap = reactive({});
|
|
84
|
-
|
|
85
|
-
/**列表实例*/
|
|
86
|
-
const sohelpVxeGridRef = ref(null);
|
|
87
|
-
const gridOptions = reactive({});
|
|
88
|
-
/**初始化配置*/
|
|
89
|
-
initial(sohelpVxeGridRef, props)
|
|
90
|
-
.then((config) => {
|
|
91
|
-
/**配置刷新功能 */
|
|
92
|
-
config.gridOptions = {
|
|
93
|
-
...config.gridOptions,
|
|
94
|
-
toolbarConfig: {
|
|
95
|
-
...config.gridOptions?.toolbarConfig,
|
|
96
|
-
refresh: true,
|
|
97
|
-
zoom: true
|
|
98
|
-
},
|
|
99
|
-
proxyConfig: {
|
|
100
|
-
ajax: {
|
|
101
|
-
query: () => refresh() // 简写箭头函数
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
Object.assign(gridOptions, config.gridOptions);
|
|
107
|
-
Object.assign(sohelpConfig, config.sohelpConfig);
|
|
108
|
-
Object.assign(propertiesMap, config.propertiesMap);
|
|
109
|
-
|
|
110
|
-
/**配置初始化完成*/
|
|
111
|
-
isConfigInitialized.value = true;
|
|
112
|
-
})
|
|
113
|
-
.catch((e) => {
|
|
114
|
-
EleMessage.error(e.message);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
const getKeywordsPlaceholder = computed(() => {
|
|
118
|
-
if (sohelpConfig?.filter?.keywords?.length) {
|
|
119
|
-
return (
|
|
120
|
-
'请输入关键 ' +
|
|
121
|
-
sohelpConfig.filter.keywords
|
|
122
|
-
.filter((key) => propertiesMap[key])
|
|
123
|
-
.map((key) => propertiesMap[key].label)
|
|
124
|
-
.join('、') +
|
|
125
|
-
' 进行查询'
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
return '请输入关键字';
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
/**判断配置是否初始化完毕*/
|
|
132
|
-
const isConfigDone = async () => {
|
|
133
|
-
return new Promise((resolve) => {
|
|
134
|
-
if (isConfigInitialized.value) {
|
|
135
|
-
resolve();
|
|
136
|
-
} else {
|
|
137
|
-
let timer = setInterval(() => {
|
|
138
|
-
if (isConfigInitialized.value) {
|
|
139
|
-
clearInterval(timer);
|
|
140
|
-
resolve();
|
|
141
|
-
}
|
|
142
|
-
}, 10);
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
/**根据参数加载数据*/
|
|
148
|
-
const reload = async (param = {}) => {
|
|
149
|
-
gridOptions.loading = true;
|
|
150
|
-
gridOptions.params = param;
|
|
151
|
-
//配置初始化完毕后,才可以执行刷新
|
|
152
|
-
await isConfigDone();
|
|
153
|
-
const $grid = sohelpVxeGridRef.value;
|
|
154
|
-
if ($grid) {
|
|
155
|
-
const url = props.url || sohelpConfig.requestValue;
|
|
156
|
-
if (!url) {
|
|
157
|
-
gridOptions.loading = false;
|
|
158
|
-
return { results: [], total: 0 };
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
let pageConfig = {};
|
|
162
|
-
// 是否分页
|
|
163
|
-
if (gridOptions.pagerConfig?.enabled) {
|
|
164
|
-
pageConfig.page = gridOptions.pagerConfig?.currentPage ?? 1;
|
|
165
|
-
pageConfig.limit = gridOptions.pagerConfig?.pageSize ?? 50;
|
|
166
|
-
}
|
|
89
|
+
if (props.gridOptions) {
|
|
90
|
+
merge(gridOptions, props.gridOptions);
|
|
91
|
+
}
|
|
167
92
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
EleMessage.error(res.meta.message);
|
|
180
|
-
return { results: [], total: 0 };
|
|
181
|
-
}
|
|
182
|
-
$grid.loadData(res.data.results || res.data);
|
|
183
|
-
if (gridOptions?.pagerConfig?.enabled) {
|
|
184
|
-
gridOptions.pagerConfig.total = res.data.total;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
gridOptions.loading = false;
|
|
188
|
-
initValue();
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
/**实现分页事件*/
|
|
192
|
-
const pageChangeEvent = (page) => {
|
|
193
|
-
isPage.value = true;
|
|
194
|
-
gridOptions.pagerConfig.currentPage = page.currentPage;
|
|
195
|
-
gridOptions.pagerConfig.pageSize = page.pageSize;
|
|
196
|
-
emit('pageChange', page);
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
/**刷新数据*/
|
|
200
|
-
const refresh = () => {
|
|
201
|
-
if (!isPage.value) {
|
|
202
|
-
keywords.value = '';
|
|
203
|
-
if (gridOptions.pagerConfig && gridOptions.pagerConfig.enabled) {
|
|
204
|
-
gridOptions.pagerConfig.currentPage = 1;
|
|
205
|
-
} else {
|
|
206
|
-
gridOptions.pagerConfig = {
|
|
207
|
-
currentPage: 1
|
|
208
|
-
};
|
|
93
|
+
/**根据URL动态加载数据**/
|
|
94
|
+
if (props.url) {
|
|
95
|
+
merge(gridOptions, {
|
|
96
|
+
proxyConfig: {
|
|
97
|
+
response: {
|
|
98
|
+
result: 'result',
|
|
99
|
+
total: 'page.total'
|
|
100
|
+
},
|
|
101
|
+
ajax: {
|
|
102
|
+
query: () => {
|
|
103
|
+
refresh();
|
|
209
104
|
}
|
|
210
|
-
//清空选中
|
|
211
|
-
selectedValue.value = [];
|
|
212
|
-
sohelpVxeGridRef.value?.clearCheckboxRow();
|
|
213
|
-
emit('refresh');
|
|
214
105
|
}
|
|
215
|
-
|
|
216
|
-
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
217
109
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
$grid.setCurrentRow(row);
|
|
231
|
-
switch (menu.code) {
|
|
232
|
-
case 'insert':
|
|
233
|
-
const { row } = await $grid.insertAt(
|
|
234
|
-
{
|
|
235
|
-
role_name: 'sales user'
|
|
236
|
-
},
|
|
237
|
-
rowIndex
|
|
238
|
-
);
|
|
239
|
-
break;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* 工具栏点击事件
|
|
246
|
-
* @param params
|
|
247
|
-
*/
|
|
248
|
-
const onToolbarButtonClick = (params) => {
|
|
249
|
-
emit('toolbarButtonClick', params);
|
|
250
|
-
};
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* checkbox 点击
|
|
254
|
-
* @param params
|
|
255
|
-
*/
|
|
256
|
-
const onCheckboxChange = (params) => {
|
|
257
|
-
emit('checkboxChange', params);
|
|
258
|
-
if (props.multiple) {
|
|
259
|
-
setSelectedValue(params.row);
|
|
260
|
-
updateData();
|
|
261
|
-
}
|
|
262
|
-
};
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* 获取表格当前页数据
|
|
266
|
-
*/
|
|
267
|
-
const getTableData = () => {
|
|
268
|
-
return JSON.parse(JSON.stringify(sohelpVxeGridRef.value?.getTableData().tableData));
|
|
269
|
-
};
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* 全选、取消全选 更新value,data值
|
|
273
|
-
* @param param0
|
|
274
|
-
*/
|
|
275
|
-
const onCheckboxAllChange = (params) => {
|
|
276
|
-
const data = getTableData();
|
|
277
|
-
const ids = data.map((item) => item.id);
|
|
278
|
-
if (params.checked) {
|
|
279
|
-
selectedValue.value = [...new Set([...selectedValue.value, ...ids])];
|
|
280
|
-
selectedData.value = Array.from(
|
|
281
|
-
[...selectedData.value, ...data].reduce((map, item) => map.set(item.id, item), new Map()).values()
|
|
282
|
-
);
|
|
283
|
-
} else {
|
|
284
|
-
selectedValue.value = selectedValue.value.filter((item) => !ids.includes(item));
|
|
285
|
-
}
|
|
110
|
+
/**根据参数加载数据*/
|
|
111
|
+
const reload = async (param = {}) => {
|
|
112
|
+
emit('filter', param);
|
|
113
|
+
gridOptions.loading = true;
|
|
114
|
+
gridOptions.params = param;
|
|
115
|
+
//配置初始化完毕后,才可以执行刷新
|
|
116
|
+
|
|
117
|
+
const url = props.url;
|
|
118
|
+
if (!url) {
|
|
119
|
+
gridOptions.loading = false;
|
|
120
|
+
return { results: [], total: 0 };
|
|
121
|
+
}
|
|
286
122
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
* @param row
|
|
294
|
-
*/
|
|
295
|
-
const setSelectedValue = (row) => {
|
|
296
|
-
let idx = selectedValue.value.findIndex((id) => id === row.id);
|
|
297
|
-
if (idx != -1) {
|
|
298
|
-
selectedValue.value.splice(idx, 1);
|
|
299
|
-
} else {
|
|
300
|
-
selectedValue.value.push(row.id);
|
|
301
|
-
let _idx = selectedData.value.findIndex((item) => item.id === row.id);
|
|
302
|
-
if (_idx === -1) {
|
|
303
|
-
selectedData.value.push({ ...row });
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* 行点击
|
|
310
|
-
* @param params
|
|
311
|
-
*/
|
|
312
|
-
const onCellClick = (params) => {
|
|
313
|
-
emit('cellClick', params);
|
|
314
|
-
};
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
*
|
|
318
|
-
* @param params 单选框点击
|
|
319
|
-
*/
|
|
320
|
-
const onRadioChange = (params) => {
|
|
321
|
-
emit('radioChange', params);
|
|
322
|
-
if (!props.multiple) {
|
|
323
|
-
clear();
|
|
324
|
-
const row = sohelpVxeGridRef.value?.getRadioRecord();
|
|
325
|
-
if (row) {
|
|
326
|
-
selectedValue.value = [row.id];
|
|
327
|
-
selectedData.value = Array.from(
|
|
328
|
-
new Map([row, ...selectedData.value].map((item) => [item.id, item])).values()
|
|
329
|
-
);
|
|
330
|
-
} else {
|
|
331
|
-
selectedData.value = props.data;
|
|
332
|
-
selectedValue.value = [];
|
|
333
|
-
}
|
|
123
|
+
let pageConfig = {};
|
|
124
|
+
// 是否分页
|
|
125
|
+
if (gridOptions.pagerConfig?.enabled) {
|
|
126
|
+
pageConfig.page = gridOptions.pagerConfig?.currentPage ?? 1;
|
|
127
|
+
pageConfig.limit = gridOptions.pagerConfig?.pageSize ?? 50;
|
|
128
|
+
}
|
|
334
129
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
},
|
|
355
|
-
menuClick({ menu, column, row, rowIndex }) {
|
|
356
|
-
const $grid = sohelpVxeGridRef.value;
|
|
357
|
-
if ($grid) {
|
|
358
|
-
switch (menu.code) {
|
|
359
|
-
case 'insert':
|
|
360
|
-
// $grid.insert();
|
|
361
|
-
$grid.insertAt({}, rowIndex);
|
|
362
|
-
|
|
363
|
-
let _table = $grid.getTableData();
|
|
364
|
-
|
|
365
|
-
break;
|
|
366
|
-
case 'copy':
|
|
367
|
-
break;
|
|
368
|
-
}
|
|
130
|
+
const res = await SohelpHttp.get(url, {
|
|
131
|
+
...param,
|
|
132
|
+
keywords: keywords.value,
|
|
133
|
+
...pageConfig
|
|
134
|
+
}).catch((e) => {
|
|
135
|
+
gridOptions.loading = false;
|
|
136
|
+
EleMessage.error(e);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
gridOptions.loading = false;
|
|
140
|
+
if (!res.meta.success) {
|
|
141
|
+
EleMessage.error(res.meta.message);
|
|
142
|
+
return { results: [], total: 0 };
|
|
143
|
+
}
|
|
144
|
+
const $grid = sohelpVxeGridRef.value;
|
|
145
|
+
$grid.loadData(res.data.results || res.data);
|
|
146
|
+
if (gridOptions?.pagerConfig?.enabled) {
|
|
147
|
+
gridOptions.pagerConfig.total = res.data.total;
|
|
148
|
+
}
|
|
369
149
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
};
|
|
150
|
+
gridOptions.loading = false;
|
|
151
|
+
initValue();
|
|
152
|
+
};
|
|
374
153
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
154
|
+
/**实现分页事件*/
|
|
155
|
+
const pageChangeEvent = (page) => {
|
|
156
|
+
isPage.value = true;
|
|
157
|
+
gridOptions.pagerConfig.currentPage = page.currentPage;
|
|
158
|
+
gridOptions.pagerConfig.pageSize = page.pageSize;
|
|
159
|
+
emit('pageChange', page);
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**刷新数据*/
|
|
163
|
+
const refresh = () => {
|
|
164
|
+
if (!isPage.value) {
|
|
165
|
+
keywords.value = '';
|
|
166
|
+
if (gridOptions.pagerConfig && gridOptions.pagerConfig.enabled) {
|
|
167
|
+
gridOptions.pagerConfig.currentPage = 1;
|
|
168
|
+
} else {
|
|
169
|
+
gridOptions.pagerConfig = {
|
|
170
|
+
currentPage: 1
|
|
171
|
+
};
|
|
378
172
|
}
|
|
173
|
+
//清空选中
|
|
174
|
+
selectedValue.value = [];
|
|
175
|
+
sohelpVxeGridRef.value?.clearCheckboxRow();
|
|
176
|
+
emit('refresh');
|
|
177
|
+
}
|
|
178
|
+
isPage.value = false;
|
|
179
|
+
reload({ ...gridOptions.params });
|
|
180
|
+
};
|
|
379
181
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
182
|
+
/**
|
|
183
|
+
* grid事件
|
|
184
|
+
* @param param0
|
|
185
|
+
*/
|
|
186
|
+
const menuEvents = async ({ menu, row, column, rowIndex }) => {
|
|
187
|
+
const $grid = sohelpVxeGridRef.value;
|
|
188
|
+
if ($grid) {
|
|
189
|
+
$grid.setCurrentRow(row);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* 工具栏点击事件
|
|
195
|
+
* @param params
|
|
196
|
+
*/
|
|
197
|
+
const onToolbarButtonClick = (params) => {
|
|
198
|
+
emit('toolbarButtonClick', params);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* checkbox 点击
|
|
203
|
+
* @param params
|
|
204
|
+
*/
|
|
205
|
+
const onCheckboxChange = (params) => {
|
|
206
|
+
emit('checkboxChange', params);
|
|
207
|
+
if (props.multiple) {
|
|
208
|
+
setSelectedValue(params.row);
|
|
209
|
+
updateData();
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* 获取表格当前页数据
|
|
215
|
+
*/
|
|
216
|
+
const getTableData = () => {
|
|
217
|
+
return JSON.parse(JSON.stringify(sohelpVxeGridRef.value?.getTableData().tableData));
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* 全选、取消全选 更新value,data值
|
|
222
|
+
* @param param0
|
|
223
|
+
*/
|
|
224
|
+
const onCheckboxAllChange = (params) => {
|
|
225
|
+
const data = getTableData();
|
|
226
|
+
const ids = data.map((item) => item.id);
|
|
227
|
+
if (params.checked) {
|
|
228
|
+
selectedValue.value = [...new Set([...selectedValue.value, ...ids])];
|
|
229
|
+
selectedData.value = Array.from(
|
|
230
|
+
[...selectedData.value, ...data].reduce((map, item) => map.set(item.id, item), new Map()).values()
|
|
420
231
|
);
|
|
232
|
+
} else {
|
|
233
|
+
selectedValue.value = selectedValue.value.filter((item) => !ids.includes(item));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
emit('checkboxAll', params);
|
|
237
|
+
updateData();
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* checkbox row click selectValue, selectedData设置是否选中
|
|
242
|
+
* @param row
|
|
243
|
+
*/
|
|
244
|
+
const setSelectedValue = (row) => {
|
|
245
|
+
let idx = selectedValue.value.findIndex((id) => id === row.id);
|
|
246
|
+
if (idx != -1) {
|
|
247
|
+
selectedValue.value.splice(idx, 1);
|
|
248
|
+
} else {
|
|
249
|
+
selectedValue.value.push(row.id);
|
|
250
|
+
let _idx = selectedData.value.findIndex((item) => item.id === row.id);
|
|
251
|
+
if (_idx === -1) {
|
|
252
|
+
selectedData.value.push({ ...row });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
};
|
|
421
256
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
257
|
+
/**
|
|
258
|
+
* 行点击
|
|
259
|
+
* @param params
|
|
260
|
+
*/
|
|
261
|
+
const onCellClick = (params) => {
|
|
262
|
+
emit('cellClick', params);
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
*
|
|
267
|
+
* @param params 单选框点击
|
|
268
|
+
*/
|
|
269
|
+
const onRadioChange = (params) => {
|
|
270
|
+
emit('radioChange', params);
|
|
271
|
+
if (!props.multiple) {
|
|
272
|
+
clear();
|
|
273
|
+
const row = sohelpVxeGridRef.value?.getRadioRecord();
|
|
274
|
+
if (row) {
|
|
275
|
+
selectedValue.value = [row.id];
|
|
276
|
+
selectedData.value = Array.from(new Map([row, ...selectedData.value].map((item) => [item.id, item])).values());
|
|
277
|
+
} else {
|
|
278
|
+
selectedData.value = props.data;
|
|
279
|
+
selectedValue.value = [];
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
updateData();
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* 更新value,data
|
|
288
|
+
*/
|
|
289
|
+
const updateData = () => {
|
|
290
|
+
emit('update:value', [...selectedValue.value]);
|
|
291
|
+
emit('update:data', [...selectedData.value]);
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
/**grid 事件处理 */
|
|
295
|
+
const gridEvents = {
|
|
296
|
+
cellMenu({ row, rowIndex }) {
|
|
297
|
+
const $grid = sohelpVxeGridRef.value;
|
|
298
|
+
if ($grid) {
|
|
299
|
+
$grid.setCurrentRow(row);
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
menuClick({ menu, column, row, rowIndex }) {
|
|
303
|
+
const $grid = sohelpVxeGridRef.value;
|
|
304
|
+
if ($grid) {
|
|
305
|
+
switch (menu.code) {
|
|
306
|
+
case 'insert':
|
|
307
|
+
// $grid.insert();
|
|
308
|
+
$grid.insertAt({}, rowIndex);
|
|
309
|
+
|
|
310
|
+
let _table = $grid.getTableData();
|
|
311
|
+
|
|
312
|
+
break;
|
|
313
|
+
case 'copy':
|
|
314
|
+
break;
|
|
450
315
|
}
|
|
451
|
-
|
|
316
|
+
|
|
317
|
+
emit('menuClick', $grid, code);
|
|
318
|
+
}
|
|
452
319
|
}
|
|
453
320
|
};
|
|
321
|
+
|
|
322
|
+
const loadData = (data) => {
|
|
323
|
+
const $grid = sohelpVxeGridRef.value;
|
|
324
|
+
$grid.loadData(data);
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* 数据回显
|
|
329
|
+
*/
|
|
330
|
+
const initValue = () => {
|
|
331
|
+
nextTick(() => {
|
|
332
|
+
const $grid = sohelpVxeGridRef.value;
|
|
333
|
+
if ($grid && selectedValue.value.length) {
|
|
334
|
+
setTimeout(() => {
|
|
335
|
+
$grid.setCheckboxRowKey(selectedValue.value, true);
|
|
336
|
+
}, 100);
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
onMounted(() => {
|
|
342
|
+
if (props.autoLoad) {
|
|
343
|
+
// reload({});
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* 清空
|
|
349
|
+
*/
|
|
350
|
+
const clear = () => {
|
|
351
|
+
const $grid = sohelpVxeGridRef.value;
|
|
352
|
+
$grid?.clearCheckboxReserve();
|
|
353
|
+
$grid?.clearCheckboxRow();
|
|
354
|
+
$grid.clearSelected();
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
const getSelection = () => {
|
|
358
|
+
return sohelpVxeGridRef.value?.getCheckboxRecords() || [];
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
watch(
|
|
362
|
+
() => props.value,
|
|
363
|
+
(val) => {
|
|
364
|
+
let arr = Array.isArray(val) ? val : val ? [val] : [];
|
|
365
|
+
selectedValue.value = props.multiple ? [...arr] : [arr[0]];
|
|
366
|
+
if (props.data && props.data?.length > 0) {
|
|
367
|
+
selectedData.value = [...props.data];
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
immediate: true
|
|
372
|
+
}
|
|
373
|
+
);
|
|
374
|
+
|
|
375
|
+
defineExpose({
|
|
376
|
+
$grid: sohelpVxeGridRef,
|
|
377
|
+
getSelection,
|
|
378
|
+
gridOptions,
|
|
379
|
+
loadData,
|
|
380
|
+
refresh,
|
|
381
|
+
reload,
|
|
382
|
+
pageChangeEvent,
|
|
383
|
+
gridEvents,
|
|
384
|
+
menuEvents,
|
|
385
|
+
onToolbarButtonClick,
|
|
386
|
+
onCheckboxChange,
|
|
387
|
+
onCellClick,
|
|
388
|
+
onCheckboxAllChange,
|
|
389
|
+
onRadioChange,
|
|
390
|
+
selectedData,
|
|
391
|
+
selectedValue,
|
|
392
|
+
updateData,
|
|
393
|
+
initValue,
|
|
394
|
+
clear,
|
|
395
|
+
getTableData,
|
|
396
|
+
keywords,
|
|
397
|
+
clearRadioRow: () => {
|
|
398
|
+
sohelpVxeGridRef.value.clearRadioRow();
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
</script>
|
|
402
|
+
<script>
|
|
403
|
+
export default {
|
|
404
|
+
name: 'SohelpVxeGrid'
|
|
405
|
+
};
|
|
454
406
|
</script>
|
|
455
407
|
|
|
456
408
|
<style lang="scss" scoped>
|
|
@@ -458,6 +410,7 @@
|
|
|
458
410
|
width: 100%;
|
|
459
411
|
height: 100%;
|
|
460
412
|
box-sizing: border-box;
|
|
413
|
+
|
|
461
414
|
:deep(.vxe-grid) {
|
|
462
415
|
height: 100%;
|
|
463
416
|
width: 100%;
|
|
@@ -477,12 +430,16 @@
|
|
|
477
430
|
.vxe-grid--table-container {
|
|
478
431
|
flex: 1;
|
|
479
432
|
height: 100%;
|
|
433
|
+
|
|
480
434
|
.vxe-table {
|
|
481
435
|
height: 100%;
|
|
436
|
+
|
|
482
437
|
.vxe-table--render-wrapper {
|
|
483
438
|
height: 100%;
|
|
439
|
+
|
|
484
440
|
.vxe-table--layout-wrapper {
|
|
485
441
|
height: calc(100% - 10px);
|
|
442
|
+
|
|
486
443
|
.col--selected {
|
|
487
444
|
//去除单元格选中效果
|
|
488
445
|
box-shadow: none;
|
|
@@ -511,6 +468,7 @@
|
|
|
511
468
|
justify-content: flex-start;
|
|
512
469
|
gap: 10px;
|
|
513
470
|
margin-right: 10px;
|
|
471
|
+
|
|
514
472
|
.search-box {
|
|
515
473
|
width: 200px;
|
|
516
474
|
}
|