145 lines
2.7 KiB
Vue
145 lines
2.7 KiB
Vue
<script setup lang="ts">
|
|
import { Form } from '@/components/Form'
|
|
import { useForm } from '@/hooks/web/useForm'
|
|
import { PropType, reactive, watch } from 'vue'
|
|
import { TableData } from '@/api/table/types'
|
|
import { useI18n } from '@/hooks/web/useI18n'
|
|
import { required } from '@/utils/formRules'
|
|
import { IDomEditor } from '@wangeditor/editor'
|
|
|
|
const props = defineProps({
|
|
currentRow: {
|
|
type: Object as PropType<Nullable<TableData>>,
|
|
default: () => null
|
|
}
|
|
})
|
|
|
|
const { t } = useI18n()
|
|
|
|
const schema = reactive<FormSchema[]>([
|
|
{
|
|
field: 'title',
|
|
label: t('exampleDemo.title'),
|
|
component: 'Input',
|
|
formItemProps: {
|
|
rules: [required]
|
|
},
|
|
colProps: {
|
|
span: 24
|
|
}
|
|
},
|
|
{
|
|
field: 'author',
|
|
label: t('exampleDemo.author'),
|
|
component: 'Input',
|
|
formItemProps: {
|
|
rules: [required]
|
|
}
|
|
},
|
|
{
|
|
field: 'display_time',
|
|
label: t('exampleDemo.displayTime'),
|
|
component: 'DatePicker',
|
|
componentProps: {
|
|
type: 'datetime',
|
|
valueFormat: 'YYYY-MM-DD HH:mm:ss'
|
|
},
|
|
formItemProps: {
|
|
rules: [required]
|
|
}
|
|
},
|
|
{
|
|
field: 'importance',
|
|
label: t('exampleDemo.importance'),
|
|
component: 'Select',
|
|
formItemProps: {
|
|
rules: [required]
|
|
},
|
|
componentProps: {
|
|
options: [
|
|
{
|
|
label: '重要',
|
|
value: 3
|
|
},
|
|
{
|
|
label: '良好',
|
|
value: 2
|
|
},
|
|
{
|
|
label: '一般',
|
|
value: 1
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
field: 'pageviews',
|
|
label: t('exampleDemo.pageviews'),
|
|
component: 'InputNumber',
|
|
value: 0,
|
|
formItemProps: {
|
|
rules: [required]
|
|
}
|
|
},
|
|
{
|
|
field: 'content',
|
|
component: 'Editor',
|
|
colProps: {
|
|
span: 24
|
|
},
|
|
componentProps: {
|
|
defaultHtml: '',
|
|
onChange: (edit: IDomEditor) => {
|
|
const { setValues } = methods
|
|
setValues({
|
|
content: edit.getHtml()
|
|
})
|
|
}
|
|
},
|
|
label: t('exampleDemo.content')
|
|
}
|
|
])
|
|
|
|
const rules = reactive({
|
|
title: [required],
|
|
author: [required],
|
|
importance: [required],
|
|
pageviews: [required],
|
|
display_time: [required],
|
|
content: [required]
|
|
})
|
|
|
|
const { register, methods, elFormRef } = useForm({
|
|
schema
|
|
})
|
|
|
|
watch(
|
|
() => props.currentRow,
|
|
(currentRow) => {
|
|
if (!currentRow) return
|
|
const { setValues, setSchema } = methods
|
|
setValues(currentRow)
|
|
setSchema([
|
|
{
|
|
field: 'content',
|
|
path: 'componentProps.defaultHtml',
|
|
value: currentRow.content
|
|
}
|
|
])
|
|
},
|
|
{
|
|
deep: true,
|
|
immediate: true
|
|
}
|
|
)
|
|
|
|
defineExpose({
|
|
elFormRef,
|
|
getFormData: methods.getFormData
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<Form :rules="rules" @register="register" />
|
|
</template>
|