You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
7.4 KiB
224 lines
7.4 KiB
<template> |
|
<div ref="modal" :class="prefixCls"> |
|
<BasicModal |
|
v-bind="$attrs" |
|
width="820px" |
|
:getContainer="modal" |
|
@register="registerModal" |
|
@ok="handleSubmit" |
|
> |
|
<BasicForm @register="registerForm"/> |
|
<BasicTable v-show="state.tableVisible" @register="gencodeCustomFieldRegisterTable"> |
|
<template #toolbar> |
|
<a-button |
|
v-show="state.tag != 'view'" |
|
type="primary" |
|
@click="handleAdd()" |
|
>新增</a-button> |
|
</template> |
|
<template #bodyCell="{ index, column, record }"> |
|
<template v-if="column.key === 'action'"> |
|
<TableAction |
|
:actions="[ |
|
{ |
|
label: '查看', |
|
icon: 'fa-regular:eye', |
|
onClick: handleViewEdit.bind(null, record) |
|
}, |
|
{ |
|
label: '编辑', |
|
icon: 'fa6-regular:pen-to-square', |
|
onClick: handleEdit.bind(null, record, index) |
|
}, |
|
{ |
|
label: '删除', |
|
icon: 'ant-design:delete-outlined', |
|
color: 'error', |
|
onClick: handleDel.bind(null, record, index) |
|
}]" |
|
/> |
|
</template> |
|
</template> |
|
</BasicTable> |
|
<GencodeCustomFieldModal @register="gencodeCustomFieldRegisterModal" @success="handleGencodeCustomField"/> |
|
</BasicModal> |
|
</div> |
|
</template> |
|
<script lang="ts" setup> |
|
import { reactive, computed, ref } from 'vue'; |
|
import { BasicForm, useForm } from '/@/components/Form/index'; |
|
import { formSchema, gencodeCustomFieldColumns } from './genCustomObj.data'; |
|
import { saveAndGencodeCustomField, getGencodeCustomObj, selectListByValue } from '/@/api/platform/system/controller/gencodeCustomObj'; |
|
import { BasicModal, ModalProps, useModal, useModalInner } from '/@/components/Modal'; |
|
import { BasicTable, TableAction, useTable } from '/@/components/Table'; |
|
import GencodeCustomFieldModal from './GencodeCustomFieldModal.vue'; |
|
import { useMessage } from '/@/hooks/web/useMessage'; |
|
import { isNil } from 'lodash-es'; |
|
import { isEmpty } from '/@/utils/is'; |
|
import {useDesign} from '/@/hooks/web/useDesign'; |
|
|
|
/** 通用变量统一声明区域 */ |
|
interface WindowState { |
|
tag: string; |
|
dataSource: Recordable[]; |
|
tableVisible: boolean; |
|
} |
|
const state = reactive<WindowState>({ |
|
tag: '', |
|
dataSource: [], |
|
tableVisible: false |
|
}); |
|
const modal = ref(); |
|
const { prefixCls } = useDesign('gen-custom-obj'); |
|
const { createConfirm, createMessage } = useMessage(); |
|
/** https://v3.cn.vuejs.org/api/options-data.html#emits */ |
|
const emit = defineEmits(['success', 'register']); |
|
const [gencodeCustomFieldRegisterModal, { openModal: gencodeCustomFieldOpenModal }] = useModal(); |
|
const getDataSource = computed(() => state.dataSource.filter(item => item._action != 'del')); |
|
const [registerForm, { resetFields, setFieldsValue, validate, clearValidate, setProps, updateSchema }] = useForm({ |
|
labelWidth: 100, |
|
schemas: formSchema, |
|
showActionButtonGroup: false, |
|
baseColProps: { span: 24 } |
|
}); |
|
const [gencodeCustomFieldRegisterTable] = useTable({ |
|
dataSource: getDataSource, |
|
rowKey: 'id', |
|
columns: gencodeCustomFieldColumns, |
|
useSearchForm: false, |
|
showTableSetting: false, |
|
bordered: true, |
|
pagination: false, |
|
clickToRowSelect: false, |
|
showIndexColumn: false, |
|
maxHeight: 380, |
|
actionColumn: { |
|
width: 220, |
|
title: '操作', |
|
dataIndex: 'action', |
|
fixed: false, |
|
ifShow: () => state.tag != 'view' |
|
}, |
|
}); |
|
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data: BoxPayload = { _tag: '' }) => { |
|
// 处理清除脏数据 |
|
await resetFields(); |
|
await clearValidate(); |
|
// 处理设置数据 |
|
state.tag = data._tag; |
|
state.dataSource = []; |
|
state.tableVisible = false; |
|
const id = data.record?.id; |
|
const classValue = data.record?.value; |
|
const props: Partial<ModalProps> = { confirmLoading: false, showOkBtn: true }; |
|
await setProps({ disabled: false }); |
|
await updateSchema([{ |
|
field: 'value', |
|
componentProps: { |
|
disabled: state.tag != 'add' |
|
}, |
|
rules: [ |
|
{ |
|
required: true, |
|
message: '请输入完整类名' |
|
}, |
|
{ |
|
validator: async (rule, value) => { |
|
if (!isEmpty(value)) { |
|
const result = await selectListByValue(value); |
|
const list = result.filter(item => item.value != classValue); |
|
if(list?.length > 0) return Promise.reject('该完整类名已存在'); |
|
} |
|
return Promise.resolve(); |
|
}, |
|
validateTrigger: 'blur' |
|
}] |
|
}, |
|
{ |
|
field: 'type', |
|
componentProps: { |
|
onChange: (e: ChangeEvent) => e.target?.value && (state.tableVisible = e.target.value == '0') |
|
} |
|
}]); |
|
// 采用tag标签区分操作 |
|
switch (state.tag) { |
|
case 'add': |
|
props.title = '新建java类型'; |
|
break; |
|
case 'view': |
|
props.title = '查看java类型'; |
|
props.showOkBtn = false; |
|
await setProps({ disabled: true }); |
|
const getGencodeCustomObjView = await getGencodeCustomObj(id); |
|
state.dataSource = getGencodeCustomObjView?.gencodeCustomFieldList || []; |
|
state.tableVisible = getGencodeCustomObjView.type == '0'; |
|
await setFieldsValue(getGencodeCustomObjView); |
|
break; |
|
case 'edit': |
|
props.title = '编辑java类型'; |
|
const getGencodeCustomObjEdit = await getGencodeCustomObj(id); |
|
state.dataSource = getGencodeCustomObjEdit?.gencodeCustomFieldList || []; |
|
state.tableVisible = getGencodeCustomObjEdit.type == '0'; |
|
await setFieldsValue(getGencodeCustomObjEdit); |
|
break; |
|
} |
|
// 尾部:设置处理后的最终配置数据 |
|
setModalProps(props); |
|
}); |
|
|
|
function handleAdd() { |
|
gencodeCustomFieldOpenModal(true,{ _tag: 'add' }); |
|
} |
|
|
|
function handleEdit(record: Recordable, index: number) { |
|
gencodeCustomFieldOpenModal(true, { _tag: 'edit', record, index }); |
|
} |
|
|
|
function handleViewEdit(record: Recordable) { |
|
gencodeCustomFieldOpenModal(true, { _tag: 'view', record }); |
|
} |
|
|
|
async function handleDel(record: Recordable, index: number) { |
|
createConfirm({ |
|
iconType: 'warning', |
|
title: '警告', |
|
content: `是否确认删除java属性为${record.name}的数据?`, |
|
onOk: async () => { |
|
if (record.id) { |
|
record._action = 'del'; |
|
} else state.dataSource.splice(index, 1); |
|
} |
|
}); |
|
} |
|
|
|
function handleGencodeCustomField(record: Recordable, index?: number) { |
|
if (!isNil(index) && index !== -1) { |
|
state.dataSource.splice(index, 1, record); |
|
} else state.dataSource.push(record); |
|
} |
|
|
|
async function handleSubmit() { |
|
try { |
|
// 提取验证数据 |
|
const formData = await validate(); |
|
formData.gencodeCustomFieldList = state.dataSource; |
|
// 处理提交之前逻辑 |
|
setModalProps({ confirmLoading: true }); |
|
await saveAndGencodeCustomField(formData); |
|
// 处理提交完成之后逻辑 |
|
closeModal(); |
|
emit('success'); |
|
} finally { |
|
setModalProps({ confirmLoading: false }); |
|
} |
|
} |
|
</script> |
|
<style scoped lang="less"> |
|
@prefix-cls: ~'@{namespace}-gen-custom-obj'; |
|
|
|
.@{prefix-cls} { |
|
:deep(.ant-modal) { |
|
top: 40px; |
|
} |
|
} |
|
</style>
|
|
|