admin-vben/apps/web-antd/src/views/infra/codegen/index.vue

224 lines
5.6 KiB
Vue

<script lang="ts" setup>
import { defineAsyncComponent, reactive, ref } from 'vue';
import { Page, useVbenModal, type VbenFormProps } from '@vben/common-ui';
import {
useVbenVxeGrid,
type VxeGridListeners,
type VxeGridProps,
} from '#/adapter/vxe-table';
import { type CodegenApi, getCodegenTablePage } from '#/api/infra/codegen';
import { ActionButtons, IconEnum } from '#/components/action-buttons';
import { CodegenDefaultData } from './codegen.data';
// checked
const checkedStatus = ref<boolean>(false);
/**
* 查看详情
*/
const handleView = (_row: CodegenApi.CodegenTableRespVO) => {
// console.log('查看详情', row);
};
/**
* 编辑
*/
const handleEdit = (_row: CodegenApi.CodegenTableRespVO) => {
// console.log('编辑', row);
};
/**
* 删除
*/
const handleDelete = (_row: CodegenApi.CodegenTableRespVO) => {
// console.log('删除', row);
};
/**
* 批量删除
*/
const handleBatchDelete = (_rows: CodegenApi.CodegenTableRespVO[]) => {
// console.log('批量删除', rows);
};
/**
* 同步
*/
const handleSync = (_row: CodegenApi.CodegenTableRespVO) => {
// console.log('同步', row);
};
/**
* 批量同步
*/
const handleBatchSync = (_rows: CodegenApi.CodegenTableRespVO[]) => {
// console.log('批量同步', rows);
};
/**
* 生成代码
*/
const handleGenerateCode = (_row: CodegenApi.CodegenTableRespVO) => {
// console.log('生成代码', row);
};
/**
* 批量生成代码
*/
const handleBatchGenerateCode = (_rows: CodegenApi.CodegenTableRespVO[]) => {
// console.log('批量生成代码', rows);
};
/**
* 表格查询表单配置
*/
const formOptions = reactive<any>({
// 默认展开
collapsed: false,
schema: CodegenDefaultData.formSchema,
// 控制表单是否显示折叠按钮
showCollapseButton: true,
submitButtonOptions: {
content: '查询',
},
// 按下回车时是否提交表单
submitOnEnter: false,
} as VbenFormProps);
/**
* 表格配置
*/
const gridOptions = reactive<any>({
columns: CodegenDefaultData.tableColumns,
height: 'auto',
checkboxConfig: {
reserve: true,
},
proxyConfig: {
ajax: {
query: async ({ page }, params) => {
const data = await getCodegenTablePage({
pageNo: page.currentPage,
pageSize: page.pageSize,
...params,
});
return data;
},
},
},
} as VxeGridProps);
const gridEvents = reactive<any>({
checkboxChange: (params) => {
const { checked } = params;
checkedStatus.value = checked;
},
checkboxAll: (params) => {
const { checked } = params;
checkedStatus.value = checked;
},
} as VxeGridListeners);
// 使用表格组件
const [Grid, gridApi] = useVbenVxeGrid({
formOptions,
gridOptions,
gridEvents,
});
// 使用导入表弹窗组件
const [ImportTableModal, importTableModalApi] = useVbenModal({
connectedComponent: defineAsyncComponent(
() => import('./components/import-table-modal.vue'),
),
onClosed: () => {
gridApi.reload(formOptions.values);
},
});
</script>
<template>
<Page auto-content-height>
<Grid>
<template #toolbar-actions>
<ActionButtons
:actions="[
{
type: 'primary',
label: '导入表',
icon: IconEnum.ADD,
onClick: () => importTableModalApi.open(),
},
{
label: '批量同步',
disabled: !checkedStatus,
class: checkedStatus
? 'bg-emerald-500 text-white border-emerald-400 hover:bg-emerald-400 hover:!text-white hover:!border-emerald-400 active:!bg-emerald-600 active:!text-white active:!border-emerald-600'
: '',
icon: 'ant-design:sync-outlined',
onClick: handleBatchSync,
},
{
label: '批量生成',
disabled: !checkedStatus,
class: checkedStatus
? 'bg-emerald-500 text-white border-emerald-400 hover:bg-emerald-400 hover:!text-white hover:!border-emerald-400 active:!bg-emerald-600 active:!text-white active:!border-emerald-600'
: '',
icon: 'ant-design:code-outlined',
onClick: handleBatchGenerateCode,
},
{
label: '批量删除',
disabled: !checkedStatus,
danger: true,
icon: 'ant-design:delete-outlined',
onClick: handleBatchDelete,
},
]"
/>
</template>
<template #action="{ row }">
<ActionButtons
:actions="[
{
type: 'link',
label: '查看',
icon: 'ant-design:eye-outlined',
onClick: handleView.bind(null, row),
},
{
type: 'link',
label: '编辑',
icon: 'ant-design:edit-outlined',
onClick: handleEdit.bind(null, row),
},
{
type: 'link',
label: '删除',
danger: true,
icon: 'ant-design:delete-outlined',
onClick: handleDelete.bind(null, row),
},
]"
:drop-down-actions="[
{
label: '',
icon: 'ant-design:sync-outlined',
onClick: handleSync.bind(null, row),
},
{
label: '',
icon: 'ant-design:code-outlined',
onClick: handleGenerateCode.bind(null, row),
},
]"
/>
</template>
</Grid>
<ImportTableModal />
</Page>
</template>