parent
a9d6fbbeda
commit
5904bd3b46
3 changed files with 363 additions and 0 deletions
@ -0,0 +1,137 @@ |
|||||||
|
<template> |
||||||
|
<div> |
||||||
|
<BasicTable @register="registerTable" @edit-change="handleEditChange"> |
||||||
|
<template #action="{ record, column }"> |
||||||
|
<TableAction :actions="createActions(record, column)" /> |
||||||
|
</template> |
||||||
|
</BasicTable> |
||||||
|
<a-button block class="mt-5" type="dashed" @click="handleAdd"> 新增成员 </a-button> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
<script lang="ts"> |
||||||
|
import { defineComponent } from 'vue'; |
||||||
|
import { BasicTable, useTable, TableAction, BasicColumn, ActionItem, EditRecordRow } from '/@/components/Table'; |
||||||
|
|
||||||
|
const columns: BasicColumn[] = [ |
||||||
|
{ |
||||||
|
title: '成员姓名', |
||||||
|
dataIndex: 'name', |
||||||
|
editRow: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
title: '工号', |
||||||
|
dataIndex: 'no', |
||||||
|
editRow: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
title: '所属部门', |
||||||
|
dataIndex: 'dept', |
||||||
|
editRow: true, |
||||||
|
}, |
||||||
|
]; |
||||||
|
|
||||||
|
const data: any[] = [ |
||||||
|
{ |
||||||
|
name: 'John Brown', |
||||||
|
no: '00001', |
||||||
|
dept: 'New York No. 1 Lake Park', |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: 'John Brown2', |
||||||
|
no: '00002', |
||||||
|
dept: 'New York No. 2 Lake Park', |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: 'John Brown3', |
||||||
|
no: '00003', |
||||||
|
dept: 'New York No. 3Lake Park', |
||||||
|
}, |
||||||
|
]; |
||||||
|
export default defineComponent({ |
||||||
|
components: { BasicTable, TableAction }, |
||||||
|
setup() { |
||||||
|
const [registerTable, { getDataSource }] = useTable({ |
||||||
|
columns: columns, |
||||||
|
showIndexColumn: false, |
||||||
|
dataSource: data, |
||||||
|
actionColumn: { |
||||||
|
width: 160, |
||||||
|
title: '操作', |
||||||
|
dataIndex: 'action', |
||||||
|
slots: { customRender: 'action' }, |
||||||
|
}, |
||||||
|
pagination: false, |
||||||
|
}); |
||||||
|
|
||||||
|
function handleEdit(record: EditRecordRow) { |
||||||
|
record.onEdit?.(true); |
||||||
|
} |
||||||
|
|
||||||
|
function handleCancel(record: EditRecordRow) { |
||||||
|
record.onEdit?.(false); |
||||||
|
if (record.isNew) { |
||||||
|
const data = getDataSource(); |
||||||
|
const index = data.findIndex((item) => item.key === record.key); |
||||||
|
data.splice(index, 1); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function handleSave(record: EditRecordRow) { |
||||||
|
record.onEdit?.(false, true); |
||||||
|
} |
||||||
|
|
||||||
|
function handleEditChange(data: Recordable) { |
||||||
|
console.log(data); |
||||||
|
} |
||||||
|
|
||||||
|
function handleAdd() { |
||||||
|
const data = getDataSource(); |
||||||
|
const addRow: EditRecordRow = { |
||||||
|
name: '', |
||||||
|
no: '', |
||||||
|
dept: '', |
||||||
|
editable: true, |
||||||
|
isNew: true, |
||||||
|
key: `${Date.now()}`, |
||||||
|
}; |
||||||
|
data.push(addRow); |
||||||
|
} |
||||||
|
|
||||||
|
function createActions(record: EditRecordRow, column: BasicColumn): ActionItem[] { |
||||||
|
if (!record.editable) { |
||||||
|
return [ |
||||||
|
{ |
||||||
|
label: '编辑', |
||||||
|
onClick: handleEdit.bind(null, record), |
||||||
|
}, |
||||||
|
{ |
||||||
|
label: '删除', |
||||||
|
}, |
||||||
|
]; |
||||||
|
} |
||||||
|
return [ |
||||||
|
{ |
||||||
|
label: '保存', |
||||||
|
onClick: handleSave.bind(null, record, column), |
||||||
|
}, |
||||||
|
{ |
||||||
|
label: '取消', |
||||||
|
popConfirm: { |
||||||
|
title: '是否取消编辑', |
||||||
|
confirm: handleCancel.bind(null, record, column), |
||||||
|
}, |
||||||
|
}, |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
return { |
||||||
|
registerTable, |
||||||
|
handleEdit, |
||||||
|
createActions, |
||||||
|
handleAdd, |
||||||
|
getDataSource, |
||||||
|
handleEditChange, |
||||||
|
}; |
||||||
|
}, |
||||||
|
}); |
||||||
|
</script> |
@ -0,0 +1,149 @@ |
|||||||
|
import { FormSchema } from '/@/components/Form'; |
||||||
|
|
||||||
|
const basicOptions: LabelValueOptions = [ |
||||||
|
{ |
||||||
|
label: '付晓晓', |
||||||
|
value: '1', |
||||||
|
}, |
||||||
|
{ |
||||||
|
label: '周毛毛', |
||||||
|
value: '2', |
||||||
|
}, |
||||||
|
]; |
||||||
|
|
||||||
|
const storeTypeOptions: LabelValueOptions = [ |
||||||
|
{ |
||||||
|
label: '私密', |
||||||
|
value: '1', |
||||||
|
}, |
||||||
|
{ |
||||||
|
label: '公开', |
||||||
|
value: '2', |
||||||
|
}, |
||||||
|
]; |
||||||
|
|
||||||
|
export const schemas: FormSchema[] = [ |
||||||
|
{ |
||||||
|
field: 'f1', |
||||||
|
component: 'Input', |
||||||
|
label: '仓库名', |
||||||
|
required: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 'f2', |
||||||
|
component: 'Input', |
||||||
|
label: '仓库域名', |
||||||
|
required: true, |
||||||
|
componentProps: { |
||||||
|
addonBefore: 'http://', |
||||||
|
addonAfter: 'com', |
||||||
|
}, |
||||||
|
colProps: { |
||||||
|
offset: 2, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 'f3', |
||||||
|
component: 'Select', |
||||||
|
label: '仓库管理员', |
||||||
|
componentProps: { |
||||||
|
options: basicOptions, |
||||||
|
}, |
||||||
|
required: true, |
||||||
|
colProps: { |
||||||
|
offset: 2, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 'f4', |
||||||
|
component: 'Select', |
||||||
|
label: '审批人', |
||||||
|
componentProps: { |
||||||
|
options: basicOptions, |
||||||
|
}, |
||||||
|
required: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 'f5', |
||||||
|
component: 'RangePicker', |
||||||
|
label: '生效日期', |
||||||
|
required: true, |
||||||
|
colProps: { |
||||||
|
offset: 2, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 'f6', |
||||||
|
component: 'Select', |
||||||
|
label: '仓库类型', |
||||||
|
componentProps: { |
||||||
|
options: storeTypeOptions, |
||||||
|
}, |
||||||
|
required: true, |
||||||
|
colProps: { |
||||||
|
offset: 2, |
||||||
|
}, |
||||||
|
}, |
||||||
|
]; |
||||||
|
export const taskSchemas: FormSchema[] = [ |
||||||
|
{ |
||||||
|
field: 't1', |
||||||
|
component: 'Input', |
||||||
|
label: '任务名', |
||||||
|
required: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 't2', |
||||||
|
component: 'Input', |
||||||
|
label: '任务描述', |
||||||
|
required: true, |
||||||
|
colProps: { |
||||||
|
offset: 2, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 't3', |
||||||
|
component: 'Select', |
||||||
|
label: '执行人', |
||||||
|
componentProps: { |
||||||
|
options: basicOptions, |
||||||
|
}, |
||||||
|
required: true, |
||||||
|
colProps: { |
||||||
|
offset: 2, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 't4', |
||||||
|
component: 'Select', |
||||||
|
label: '责任人', |
||||||
|
componentProps: { |
||||||
|
options: basicOptions, |
||||||
|
}, |
||||||
|
required: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 't5', |
||||||
|
component: 'TimePicker', |
||||||
|
label: '生效日期', |
||||||
|
required: true, |
||||||
|
componentProps: { |
||||||
|
style: { width: '100%' }, |
||||||
|
}, |
||||||
|
colProps: { |
||||||
|
offset: 2, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
field: 't6', |
||||||
|
component: 'Select', |
||||||
|
label: '任务类型', |
||||||
|
componentProps: { |
||||||
|
options: storeTypeOptions, |
||||||
|
}, |
||||||
|
required: true, |
||||||
|
colProps: { |
||||||
|
offset: 2, |
||||||
|
}, |
||||||
|
}, |
||||||
|
]; |
@ -0,0 +1,77 @@ |
|||||||
|
<template> |
||||||
|
<PageWrapper class="high-form" title="高级表单" content=" 高级表单常见于一次性输入和提交大批量数据的场景。"> |
||||||
|
<a-card title="仓库管理" :bordered="false"> |
||||||
|
<BasicForm @register="register" /> |
||||||
|
</a-card> |
||||||
|
<a-card title="任务管理" :bordered="false" class="!mt-5"> |
||||||
|
<BasicForm @register="registerTask" /> |
||||||
|
</a-card> |
||||||
|
<a-card title="成员管理" :bordered="false"> |
||||||
|
<PersonTable ref="tableRef" /> |
||||||
|
</a-card> |
||||||
|
|
||||||
|
<template #rightFooter> |
||||||
|
<a-button type="primary" @click="submitAll"> 提交 </a-button> |
||||||
|
</template> |
||||||
|
</PageWrapper> |
||||||
|
</template> |
||||||
|
<script lang="ts"> |
||||||
|
import { BasicForm, useForm } from '/@/components/Form'; |
||||||
|
import { defineComponent, ref } from 'vue'; |
||||||
|
import PersonTable from './PersonTable.vue'; |
||||||
|
import { PageWrapper } from '/@/components/Page'; |
||||||
|
import { schemas, taskSchemas } from './data'; |
||||||
|
import { Card } from 'ant-design-vue'; |
||||||
|
|
||||||
|
export default defineComponent({ |
||||||
|
name: 'FormHightPage', |
||||||
|
components: { BasicForm, PersonTable, PageWrapper, [Card.name]: Card }, |
||||||
|
setup() { |
||||||
|
const tableRef = ref<{ getDataSource: () => any } | null>(null); |
||||||
|
|
||||||
|
const [register, { validate }] = useForm({ |
||||||
|
baseColProps: { |
||||||
|
span: 6, |
||||||
|
}, |
||||||
|
labelWidth: 200, |
||||||
|
layout: 'vertical', |
||||||
|
schemas: schemas, |
||||||
|
showActionButtonGroup: false, |
||||||
|
}); |
||||||
|
|
||||||
|
const [registerTask, { validate: validateTaskForm }] = useForm({ |
||||||
|
baseColProps: { |
||||||
|
span: 6, |
||||||
|
}, |
||||||
|
labelWidth: 200, |
||||||
|
layout: 'vertical', |
||||||
|
schemas: taskSchemas, |
||||||
|
showActionButtonGroup: false, |
||||||
|
}); |
||||||
|
|
||||||
|
async function submitAll() { |
||||||
|
try { |
||||||
|
if (tableRef.value) { |
||||||
|
console.log('table data:', tableRef.value.getDataSource()); |
||||||
|
} |
||||||
|
|
||||||
|
const [values, taskValues] = await Promise.all([validate(), validateTaskForm()]); |
||||||
|
console.log('form data:', values, taskValues); |
||||||
|
} catch (error) {} |
||||||
|
} |
||||||
|
|
||||||
|
return { register, registerTask, submitAll, tableRef }; |
||||||
|
}, |
||||||
|
}); |
||||||
|
</script> |
||||||
|
<style lang="less" scoped> |
||||||
|
.high-form { |
||||||
|
padding-bottom: 48px; |
||||||
|
} |
||||||
|
|
||||||
|
/** update-begin-author:taoyan date:2022-5-16 for:/issues/63 下拉框z-index问题 */ |
||||||
|
:deep(.ant-select-dropdown) { |
||||||
|
z-index: 98 !important; |
||||||
|
} |
||||||
|
/** update-end-author:taoyan date:2022-5-16 for:/issues/63 下拉框z-index问题 */ |
||||||
|
</style> |
Loading…
Reference in new issue