Files
ruoyi-plus-vben5/apps/web-antd/src/views/system/dict/data/index.vue
2024-11-14 14:58:42 +08:00

193 lines
4.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup lang="ts">
import type { Recordable } from '@vben/types';
import { ref } from 'vue';
import { useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
import { getVxePopupContainer } from '@vben/utils';
import { Modal, Popconfirm, Space } from 'ant-design-vue';
import {
tableCheckboxEvent,
useVbenVxeGrid,
type VxeGridProps,
} from '#/adapter/vxe-table';
import {
dictDataExport,
dictDataList,
dictDataRemove,
} from '#/api/system/dict/dict-data';
import { commonDownloadExcel } from '#/utils/file/download';
import { emitter } from '../mitt';
import { columns, querySchema } from './data';
import dictDataDrawer from './dict-data-drawer.vue';
const dictType = ref('');
const formOptions: VbenFormProps = {
commonConfig: {
labelWidth: 80,
componentProps: {
allowClear: true,
},
},
schema: querySchema(),
wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',
};
const gridOptions: VxeGridProps = {
checkboxConfig: {
// 高亮
highlight: true,
// 翻页时保留选中状态
reserve: true,
// 点击行选中
// trigger: 'row',
},
columns,
height: 'auto',
keepSource: true,
pagerConfig: {},
proxyConfig: {
ajax: {
query: async ({ page }, formValues = {}) => {
const params: any = {
pageNum: page.currentPage,
pageSize: page.pageSize,
...formValues,
};
if (dictType.value) {
params.dictType = dictType.value;
}
return await dictDataList(params);
},
},
},
rowConfig: {
isHover: true,
keyField: 'dictCode',
},
id: 'system-dict-data-index',
};
const checked = ref(false);
const [BasicTable, tableApi] = useVbenVxeGrid({
formOptions,
gridOptions,
gridEvents: {
checkboxChange: tableCheckboxEvent(checked),
checkboxAll: tableCheckboxEvent(checked),
},
});
const [DictDataDrawer, drawerApi] = useVbenDrawer({
connectedComponent: dictDataDrawer,
});
function handleAdd() {
drawerApi.setData({ dictType: dictType.value });
drawerApi.open();
}
async function handleEdit(record: Recordable<any>) {
drawerApi.setData({
dictType: dictType.value,
dictCode: record.dictCode,
});
drawerApi.open();
}
async function handleDelete(row: Recordable<any>) {
await dictDataRemove(row.dictCode);
await tableApi.query();
}
function handleMultiDelete() {
const rows = tableApi.grid.getCheckboxRecords();
const ids = rows.map((row: any) => row.dictCode);
Modal.confirm({
title: '提示',
okType: 'danger',
content: `确认删除选中的${ids.length}条记录吗?`,
onOk: async () => {
await dictDataRemove(ids);
await tableApi.query();
checked.value = false;
},
});
}
function handleDownloadExcel() {
commonDownloadExcel(dictDataExport, '字典数据', tableApi.formApi.form.values);
}
emitter.on('rowClick', async (value) => {
dictType.value = value;
await tableApi.query();
});
</script>
<template>
<div>
<BasicTable id="dict-data" table-title="字典数据列表">
<template #toolbar-tools>
<Space>
<a-button
v-access:code="['system:dict:export']"
@click="handleDownloadExcel"
>
{{ $t('pages.common.export') }}
</a-button>
<a-button
:disabled="!checked"
danger
type="primary"
v-access:code="['system:dict:remove']"
@click="handleMultiDelete"
>
{{ $t('pages.common.delete') }}
</a-button>
<a-button
:disabled="dictType === ''"
type="primary"
v-access:code="['system:dict:add']"
@click="handleAdd"
>
{{ $t('pages.common.add') }}
</a-button>
</Space>
</template>
<template #action="{ row }">
<Space>
<ghost-button
v-access:code="['system:dict:edit']"
@click="handleEdit(row)"
>
{{ $t('pages.common.edit') }}
</ghost-button>
<Popconfirm
:get-popup-container="
(node) => getVxePopupContainer(node, 'dict-data')
"
placement="left"
title="确认删除"
@confirm="handleDelete(row)"
>
<ghost-button
danger
v-access:code="['system:dict:remove']"
@click.stop=""
>
{{ $t('pages.common.delete') }}
</ghost-button>
</Popconfirm>
</Space>
</template>
</BasicTable>
<DictDataDrawer @reload="tableApi.query()" />
</div>
</template>