<template>
|
<div class="container">
|
<Breadcrumb :items="['menu.form', 'menu.form.step']" />
|
<a-spin :loading="loading" style="width: 100%">
|
<a-card class="general-card">
|
<template #title>
|
{{ $t('stepForm.step.title') }}
|
</template>
|
<div class="wrapper">
|
<a-steps
|
v-model:current="step"
|
style="width: 580px"
|
line-less
|
class="steps"
|
>
|
<a-step :description="$t('stepForm.step.subTitle.baseInfo')">
|
{{ $t('stepForm.step.title.baseInfo') }}
|
</a-step>
|
<a-step :description="$t('stepForm.step.subTitle.channel')">
|
{{ $t('stepForm.step.title.channel') }}
|
</a-step>
|
<a-step :description="$t('stepForm.step.subTitle.finish')">
|
{{ $t('stepForm.step.title.finish') }}
|
</a-step>
|
</a-steps>
|
<keep-alive>
|
<BaseInfo v-if="step === 1" @change-step="changeStep" />
|
<ChannelInfo v-else-if="step === 2" @change-step="changeStep" />
|
<Success v-else-if="step === 3" @change-step="changeStep" />
|
</keep-alive>
|
</div>
|
</a-card>
|
</a-spin>
|
</div>
|
</template>
|
|
<script lang="ts" setup>
|
import { ref } from 'vue';
|
import useLoading from '@/hooks/loading';
|
import {
|
submitChannelForm,
|
BaseInfoModel,
|
ChannelInfoModel,
|
UnitChannelModel,
|
} from '@/api/form';
|
import BaseInfo from './components/base-info.vue';
|
import ChannelInfo from './components/channel-info.vue';
|
import Success from './components/success.vue';
|
|
const { loading, setLoading } = useLoading(false);
|
const step = ref(1);
|
const submitModel = ref<UnitChannelModel>({} as UnitChannelModel);
|
const submitForm = async () => {
|
setLoading(true);
|
try {
|
await submitChannelForm(submitModel.value); // The mock api default success
|
step.value = 3;
|
submitModel.value = {} as UnitChannelModel; // init
|
} catch (err) {
|
// you can report use errorHandler or other
|
} finally {
|
setLoading(false);
|
}
|
};
|
const changeStep = (
|
direction: string | number,
|
model: BaseInfoModel | ChannelInfoModel
|
) => {
|
if (typeof direction === 'number') {
|
step.value = direction;
|
return;
|
}
|
|
if (direction === 'forward' || direction === 'submit') {
|
submitModel.value = {
|
...submitModel.value,
|
...model,
|
};
|
if (direction === 'submit') {
|
submitForm();
|
return;
|
}
|
step.value += 1;
|
} else if (direction === 'backward') {
|
step.value -= 1;
|
}
|
};
|
</script>
|
|
<script lang="ts">
|
export default {
|
name: 'Step',
|
};
|
</script>
|
|
<style scoped lang="less">
|
.container {
|
padding: 0 20px 20px 20px;
|
}
|
.wrapper {
|
display: flex;
|
flex-direction: column;
|
align-items: center;
|
padding: 64px 0;
|
background-color: var(--color-bg-2);
|
:deep(.arco-form) {
|
.arco-form-item {
|
&:last-child {
|
margin-top: 20px;
|
}
|
}
|
}
|
}
|
|
.steps {
|
margin-bottom: 76px;
|
}
|
</style>
|