104 lines
2.4 KiB
Vue
104 lines
2.4 KiB
Vue
<template>
|
|
<div class="aksrt-page-container">
|
|
<PageHeader :title="title" :desc="desc">
|
|
<template #actions>
|
|
<n-space v-if="links.length">
|
|
<n-button v-for="link in links" :key="link.path" quaternary @click="go(link.path)">
|
|
{{ link.label }}
|
|
</n-button>
|
|
</n-space>
|
|
</template>
|
|
</PageHeader>
|
|
|
|
<n-card v-if="note" class="aksrt-section-card">
|
|
<n-alert type="info" :show-icon="false">
|
|
{{ note }}
|
|
</n-alert>
|
|
</n-card>
|
|
|
|
<slot name="before-form" />
|
|
|
|
<AksFormRenderer
|
|
:schema="pageMeta.groups"
|
|
:form-data="formData"
|
|
:dirty="dirty"
|
|
:loading="loading"
|
|
:saving="saving"
|
|
:load-error="loadError"
|
|
:show-search="false"
|
|
@update:form-data="formData = $event"
|
|
@save="handleSave"
|
|
@reload="handleReload"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { computed } from 'vue'
|
|
import { useRouter } from 'vue-router'
|
|
import { useMessage } from 'naive-ui'
|
|
import api from '@/api'
|
|
import PageHeader from '@/components/PageHeader.vue'
|
|
import AksFormRenderer from '@/components/form/AksFormRenderer.vue'
|
|
import { useSectionForm } from '@/composables/useSectionForm'
|
|
import { getSchema } from '@/schema'
|
|
|
|
const props = defineProps({
|
|
section: { type: String, required: true },
|
|
title: { type: String, required: true },
|
|
desc: { type: String, default: '' },
|
|
note: { type: String, default: '' },
|
|
links: { type: Array, default: () => [] },
|
|
})
|
|
|
|
const router = useRouter()
|
|
const message = useMessage()
|
|
|
|
const pageMeta = computed(() => getSchema('payment', props.section) || { groups: [] })
|
|
const defaults = computed(() => {
|
|
const result = {}
|
|
;(pageMeta.value.groups || []).forEach((group) => {
|
|
;(group.fields || []).forEach((field) => {
|
|
if (field.default !== undefined) {
|
|
result[field.key] = field.default
|
|
}
|
|
})
|
|
})
|
|
return result
|
|
})
|
|
|
|
const {
|
|
formData,
|
|
loading,
|
|
saving,
|
|
loadError,
|
|
dirty,
|
|
save: doSave,
|
|
reload,
|
|
} = useSectionForm({
|
|
fetch: () => api.getSchemaPage('payment', props.section),
|
|
submit: (data) => api.saveSchemaPage('payment', props.section, data),
|
|
defaults: defaults.value,
|
|
onSaved: () => {
|
|
message.success('设置已保存')
|
|
},
|
|
})
|
|
|
|
function go(path) {
|
|
router.push(path)
|
|
}
|
|
|
|
async function handleSave() {
|
|
try {
|
|
await doSave()
|
|
} catch (error) {
|
|
message.error(error.message || '保存失败')
|
|
}
|
|
}
|
|
|
|
function handleReload() {
|
|
reload()
|
|
message.info('已放弃更改')
|
|
}
|
|
</script>
|