2025-05-27 19:31:37 +08:00

359 lines
8.4 KiB
Vue

<script setup lang="ts">
import type { VbenFormProps } from '@vben/common-ui';
import type { VxeGridProps } from '#/adapter/vxe-table';
import { ref } from 'vue';
import { Page, useVbenModal } from '@vben/common-ui';
import {
Button,
Col,
message,
Modal,
Row,
Space,
Switch,
} from 'ant-design-vue';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import {
postDataDictionaryDelete,
postDataDictionaryDeleteDataDictionaryType,
postDataDictionaryPage,
postDataDictionaryPageDetail,
postDataDictionaryStatus,
} from '#/api-client/index';
import { TableAction } from '#/components/table-action';
import { $t } from '#/locales';
import DataDictionaryDetail from './DataDictionaryDetailModal.vue';
import DataDictionaryModal from './DataDictionaryModal.vue';
defineOptions({
name: 'DataDictionary',
});
/** ============左侧表格相关逻辑 start ============== */
const formOptions: VbenFormProps = {
schema: [
{
component: 'Input',
fieldName: 'filter',
label: '',
componentProps: {
allowClear: true,
},
},
],
wrapperClass: 'grid-cols-2',
showDefaultActions: true,
submitOnEnter: true,
showCollapseButton: false,
commonConfig: {
hideLabel: true,
},
};
const gridOptions: VxeGridProps<any> = {
columns: [
{ type: 'radio', width: '50' },
{
field: 'codeName',
title: $t('abp.dataDictionary.codeName'),
minWidth: '75',
slots: { default: 'codeName' },
},
{
title: $t('common.action'),
field: 'action',
fixed: 'right',
width: '180',
slots: { default: 'action' },
},
],
minHeight: '800',
keepSource: true,
pagerConfig: {},
radioConfig: {
highlight: true,
},
proxyConfig: {
ajax: {
query: async ({ page }, formValues) => {
const { data } = await postDataDictionaryPage({
body: {
pageIndex: page.currentPage,
pageSize: page.pageSize,
...formValues,
},
});
return data;
},
},
},
};
const gridEvents = {
radioChange: handleDataDictionaryItemChange,
};
const [Grid, gridApi] = useVbenVxeGrid({
gridOptions,
formOptions,
gridEvents,
});
const [DataDictionaryModalComponent, dataDictionaryModalApi] = useVbenModal({
// 连接抽离的组件
connectedComponent: DataDictionaryModal,
});
const openDataDictionaryModal = () => {
dataDictionaryModalApi.setData({
isEdit: false,
});
dataDictionaryModalApi.open();
};
const editDataDictionary = (row: Record<string, any>) => {
dataDictionaryModalApi.setData({
isEdit: true,
row,
});
dataDictionaryModalApi.open();
};
const deleteDataDictionary = async (row: Record<string, any>) => {
Modal.confirm({
title: `${$t('common.confirmDelete')}${row.displayText} ?`,
async onOk() {
await postDataDictionaryDeleteDataDictionaryType({
body: { id: row.id },
});
message.success($t('common.deleteSuccess'));
gridApi.reload();
},
});
};
const current = ref<Record<string, any>>({});
async function handleDataDictionaryItemChange(item: Record<string, any>) {
current.value = item;
gridTableApi.reload({
dataDictionaryId: 'current.value?.row?.id',
});
}
/** ============>左侧表格相关逻辑 end ============== */
/** ============>右侧表格相关逻辑 start ============== */
const rightFormOptions: VbenFormProps = {
schema: [
{
component: 'Input',
fieldName: 'filter',
componentProps: {
allowClear: true,
},
},
],
wrapperClass: 'grid-cols-2',
showDefaultActions: true,
submitOnEnter: true,
showCollapseButton: false,
commonConfig: {
hideLabel: true,
},
};
const rightGridOptions: VxeGridProps<any> = {
columns: [
{ field: 'code', title: $t('abp.dataDictionary.code'), minWidth: '75' },
{
field: 'displayText',
title: $t('abp.dataDictionary.name'),
minWidth: '150',
},
{ field: 'order', title: $t('abp.dataDictionary.order'), minWidth: '150' },
{
field: 'isEnabled',
title: $t('abp.dataDictionary.status'),
minWidth: '150',
slots: { default: 'isEnabled' },
},
{
field: 'description',
title: $t('abp.dataDictionary.description'),
minWidth: '150',
},
{
title: $t('common.action'),
field: 'action',
fixed: 'right',
width: '150',
slots: { default: 'action' },
},
],
toolbarConfig: {
custom: true,
},
customConfig: {
storage: true,
},
minHeight: '800',
keepSource: true,
proxyConfig: {
ajax: {
query: async ({ page }, formValues) => {
const { data } = await postDataDictionaryPageDetail({
body: {
pageIndex: page.currentPage,
pageSize: page.pageSize,
...formValues,
dataDictionaryId: current.value?.row?.id,
},
});
return data;
},
},
},
};
const [GridTable, gridTableApi] = useVbenVxeGrid({
gridOptions: rightGridOptions,
formOptions: rightFormOptions,
});
const handleItemStausChange = async (
enabled: any,
row: Record<string, any>,
) => {
await postDataDictionaryStatus({
body: {
dataDictionaryId: current.value?.row?.id,
dataDictionayDetailId: row.id,
isEnabled: enabled,
},
});
};
const [DataDictionaryDetailComponent, dataDictionaryDetailModalApi] =
useVbenModal({
// 连接抽离的组件
connectedComponent: DataDictionaryDetail,
});
const openDataDictionaryDetailModal = () => {
dataDictionaryDetailModalApi.setData({
isEdit: false,
type: current.value?.row?.displayText,
id: current.value?.row?.id,
});
dataDictionaryDetailModalApi.open();
};
const editDetailRow = (row: Record<string, any>) => {
dataDictionaryDetailModalApi.setData({
isEdit: true,
type: current.value?.row?.displayText,
id: current.value?.row?.id,
row,
});
dataDictionaryDetailModalApi.open();
};
const removeDetailRow = async (row: Record<string, any>) => {
Modal.confirm({
title: `${$t('common.confirmDelete')}${row.displayText} ?`,
async onOk() {
await postDataDictionaryDelete({
body: {
dataDictionaryId: current.value?.row?.id,
dataDictionayDetailId: row.id,
},
});
message.success($t('common.deleteSuccess'));
gridTableApi.reload();
},
});
};
/** ============>右侧表格相关逻辑 end ============== */
</script>
<template>
<Page>
<Row :gutter="16">
<Col :span="8">
<Grid>
<template #toolbar-actions>
<Button type="primary" @click="openDataDictionaryModal">
{{ $t('common.add') }}
</Button>
</template>
<template #codeName="{ row }">
<div>{{ `${row.code}|${row.displayText}` }}</div>
</template>
<template #action="{ row }">
<TableAction
:actions="[
{
label: $t('common.edit'),
type: 'link',
size: 'small',
onClick: editDataDictionary.bind(null, row),
},
{
label: $t('common.delete'),
type: 'link',
size: 'small',
onClick: deleteDataDictionary.bind(null, row),
},
]"
/>
</template>
</Grid>
</Col>
<Col :span="16">
<GridTable>
<template #toolbar-actions>
<Button
:disabled="!current.row"
type="primary"
@click="openDataDictionaryDetailModal"
>
{{ $t('common.add') }}
</Button>
</template>
<template #isEnabled="{ row }">
<Switch
v-model:checked="row.isEnabled"
@change="handleItemStausChange($event, row)"
/>
</template>
<template #action="{ row }">
<Space>
<Button type="link" @click="editDetailRow(row)">
{{ $t('common.edit') }}
</Button>
<Button danger type="link" @click="removeDetailRow(row)">
{{ $t('common.delete') }}
</Button>
</Space>
</template>
</GridTable>
</Col>
</Row>
<DataDictionaryModalComponent @reload="gridApi.reload" />
<DataDictionaryDetailComponent @reload="gridTableApi.reload" />
</Page>
</template>
<style scoped></style>