feat: 导出按钮支持仅导出勾选行模式

This commit is contained in:
2026-07-03 13:27:40 +08:00
parent ebbd967664
commit a23fd5bfd5
+50 -4
View File
@@ -106,7 +106,7 @@ export default defineComponent({
} }
// 导出 // 导出
async function toExport(columns: ClTable.Column[]) { async function toExport(columns: ClTable.Column[], mode: 'all' | 'selected' = 'all') {
// 加载 // 加载
loading.value = true; loading.value = true;
@@ -117,7 +117,38 @@ export default defineComponent({
const header = await getHeader(columns, fields); const header = await getHeader(columns, fields);
// 数据 // 数据
let data = await getData(); let data: any[];
if (mode === 'selected') {
// 导出勾选行 — 直接从 crud.selection 取数据
data = Crud.value?.selection;
if (!data || data.length === 0) {
loading.value = false;
return ElMessage.warning('请先勾选要导出的行');
}
// 应用 formatter 和 dict
data = data.map((e, i) => {
const row = { ...e };
for (const k in row) {
const col = props.columns?.find(c => c.prop == k);
if (col) {
if (col.formatter) {
row[k] = col.formatter(row, col, row[k], i);
}
if (col.dict) {
row[k] = deepFind(row[k], col.dict as any)?.label || row[k];
}
}
}
return row;
});
} else {
data = await getData();
}
if (!data) { if (!data) {
loading.value = false; loading.value = false;
@@ -165,9 +196,21 @@ export default defineComponent({
labelPosition: 'top' labelPosition: 'top'
}, },
form: { form: {
mode: 'all',
checked: columns.map(e => e.prop) checked: columns.map(e => e.prop)
}, },
items: [ items: [
{
label: t('导出范围'),
prop: 'mode',
component: {
name: 'el-radio-group',
options: [
{ label: '全部数据', value: 'all' },
{ label: '仅导出勾选', value: 'selected' }
]
}
},
{ {
label: t('选择列'), label: t('选择列'),
prop: 'checked', prop: 'checked',
@@ -184,11 +227,14 @@ export default defineComponent({
], ],
on: { on: {
submit(data, { close, done }) { submit(data, { close, done }) {
if (isEmpty(data.checked)) { if (data.mode === 'selected' && (!Crud.value?.selection || Crud.value.selection.length === 0)) {
ElMessage.warning('请先勾选要导出的行');
done();
} else if (isEmpty(data.checked)) {
ElMessage.warning(t('请先选择要导出的列')); ElMessage.warning(t('请先选择要导出的列'));
done(); done();
} else { } else {
toExport(columns.filter(e => data.checked.includes(e.prop))); toExport(columns.filter(e => data.checked.includes(e.prop)), data.mode);
close(); close();
} }
} }