这是基于vue-vben-admin 模板适用于abp vNext的前端管理项目
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.
 
 
 
 
 
 

171 lines
4.6 KiB

<script setup lang="ts">
import type {
TextTemplateContentDto,
TextTemplateDefinitionDto,
} from '../../types';
import { computed, defineAsyncComponent, ref } from 'vue';
import { useVbenForm, useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { MarkdownViewer } from '@abp/components/vditor';
import { useAbpStore } from '@abp/core';
import {
Alert,
Modal as AntdvModal,
Button,
Card,
message,
} from 'ant-design-vue';
import { useTemplateContentsApi } from '../../api/useTemplateContentsApi';
const emits = defineEmits<{
(event: 'change', data: TextTemplateContentDto): void;
}>();
const { cancel, getApi, restoreToDefaultApi, updateApi } =
useTemplateContentsApi();
const abpStore = useAbpStore();
const textTemplate = ref<TextTemplateDefinitionDto>();
const getCardTitle = computed(() => {
if (!textTemplate.value) {
return '';
}
return `${$t('AbpTextTemplating.DisplayName:Name')} - ${textTemplate.value.name}`;
});
const [Form, formApi] = useVbenForm({
commonConfig: {
componentProps: {
class: 'w-full',
},
},
handleSubmit: onSubmit,
layout: 'vertical',
schema: [
{
component: 'Textarea',
componentProps: {
autoSize: {
minRows: 20,
},
showCount: true,
},
fieldName: 'content',
label: $t('AbpTextTemplating.DisplayName:Content'),
rules: 'required',
},
],
showDefaultActions: false,
});
const [Modal, modalApi] = useVbenModal({
confirmText: $t('AbpTextTemplating.SaveContent'),
fullscreen: true,
fullscreenButton: false,
onCancel() {
modalApi.close();
},
onClosed() {
cancel('TemplateDefinitionModal has closed!');
},
onConfirm: async () => {
await formApi.validateAndSubmitForm();
},
onOpenChange: async (isOpen: boolean) => {
textTemplate.value = undefined;
if (isOpen) {
const textTemplateDefine = modalApi.getData<TextTemplateDefinitionDto>();
textTemplate.value = textTemplateDefine;
await onGet();
}
},
});
const [TemplateContentCurtuleModal, curtuleModalApi] = useVbenModal({
connectedComponent: defineAsyncComponent(
() => import('./TemplateContentCurtuleModal.vue'),
),
});
async function onGet() {
try {
modalApi.setState({ loading: true });
const textTemplateDefine = modalApi.getData<TextTemplateDefinitionDto>();
const culture = textTemplateDefine.isInlineLocalized
? undefined
: abpStore.application?.localization.currentCulture.cultureName;
const dto = await getApi({ culture, name: textTemplateDefine.name });
formApi.setFieldValue('content', dto.content);
} finally {
modalApi.setState({ loading: false });
}
}
function onRestoreToDefault() {
AntdvModal.confirm({
centered: true,
content: $t('AbpTextTemplating.RestoreToDefaultMessage'),
onOk: async () => {
await restoreToDefaultApi(textTemplate.value!.name, {});
message.success($t('AbpTextTemplating.TemplateContentRestoredToDefault'));
await onGet();
},
title: $t('AbpTextTemplating.RestoreToDefault'),
});
}
function onCustomizePerCulture() {
curtuleModalApi.setData(textTemplate.value);
curtuleModalApi.open();
}
async function onSubmit(values: Record<string, string>) {
try {
modalApi.setState({ submitting: true });
const textTemplateDefine = modalApi.getData<TextTemplateDefinitionDto>();
const culture = textTemplateDefine.isInlineLocalized
? undefined
: abpStore.application?.localization.currentCulture.cultureName;
const dto = await updateApi(textTemplateDefine.name, {
content: values.content!,
culture,
});
emits('change', dto);
message.success($t('AbpTextTemplating.TemplateContentUpdated'));
modalApi.close();
} finally {
modalApi.setState({ submitting: false });
}
}
</script>
<template>
<Modal :title="$t('AbpTextTemplating.EditContents')">
<Alert v-if="textTemplate?.isInlineLocalized" type="warning" show-icon>
<template #description>
<MarkdownViewer
:value="$t('AbpTextTemplating.InlineContentDescription')"
/>
</template>
</Alert>
<Card :title="getCardTitle">
<template #extra>
<div class="flex flex-row gap-2">
<Button danger type="primary" @click="onRestoreToDefault">
{{ $t('AbpTextTemplating.RestoreToDefault') }}
</Button>
<Button type="dashed" @click="onCustomizePerCulture">
{{ $t('AbpTextTemplating.CustomizePerCulture') }}
</Button>
</div>
</template>
<Form />
</Card>
<TemplateContentCurtuleModal :title="getCardTitle" />
</Modal>
</template>
<style scoped></style>