|
|
@@ -1,5 +1,6 @@
|
|
|
<template>
|
|
|
<el-dialog
|
|
|
+ v-if="!isPageVariant"
|
|
|
v-model="visible"
|
|
|
:title="dialogTitle"
|
|
|
width="1680px"
|
|
|
@@ -33,81 +34,192 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
+
|
|
|
+ <div v-else class="mp-quote-form-page">
|
|
|
+ <QuoteFormPanel
|
|
|
+ ref="panelRef"
|
|
|
+ variant="page"
|
|
|
+ hide-footer
|
|
|
+ :auto-init="false"
|
|
|
+ @success="handleSuccess"
|
|
|
+ @close="emit('close')"
|
|
|
+ />
|
|
|
+ <div class="mp-plan-form-footer">
|
|
|
+ <el-button class="btn-ghost" @click="emit('close')">
|
|
|
+ <el-icon><Close /></el-icon>取消
|
|
|
+ </el-button>
|
|
|
+ <el-button class="btn-ghost" :loading="saveLoading" @click="handleSaveDraft">
|
|
|
+ <el-icon><DocumentCopy /></el-icon>保存草稿
|
|
|
+ </el-button>
|
|
|
+ <el-button class="btn-main" type="primary" @click="handleSubmit">
|
|
|
+ <el-icon><CircleCheck /></el-icon>提交审批
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { computed, nextTick, ref } from 'vue'
|
|
|
-import { CircleCheck, Close, DocumentCopy } from '@element-plus/icons-vue'
|
|
|
-import QuoteFormPanel from './QuoteFormPanel.vue'
|
|
|
-
|
|
|
-const emit = defineEmits<{
|
|
|
- success: []
|
|
|
-}>()
|
|
|
-
|
|
|
-const visible = ref(false)
|
|
|
-const dialogMode = ref<'add' | 'edit' | 'copy'>('add')
|
|
|
-const editId = ref<string | number>('')
|
|
|
-const copyId = ref<string | number>('')
|
|
|
-const panelRef = ref<InstanceType<typeof QuoteFormPanel> | null>(null)
|
|
|
-const saveLoading = computed(() => Boolean(panelRef.value?.saveLoading))
|
|
|
-const dialogTitle = computed(() => {
|
|
|
- if (dialogMode.value === 'edit') return '编辑报价单'
|
|
|
- if (dialogMode.value === 'copy') return '复制新增报价单'
|
|
|
- return '新增报价单'
|
|
|
-})
|
|
|
-
|
|
|
-const handleOpened = async () => {
|
|
|
- await nextTick()
|
|
|
- if (dialogMode.value === 'edit' && editId.value) {
|
|
|
- await panelRef.value?.initEdit(editId.value)
|
|
|
- return
|
|
|
+ import { computed, nextTick, onMounted, ref, watch } from 'vue'
|
|
|
+ import { CircleCheck, Close, DocumentCopy } from '@element-plus/icons-vue'
|
|
|
+ import QuoteFormPanel from './QuoteFormPanel.vue'
|
|
|
+
|
|
|
+ const props = withDefaults(
|
|
|
+ defineProps<{
|
|
|
+ modelValue?: boolean
|
|
|
+ variant?: 'dialog' | 'page'
|
|
|
+ pageMode?: 'add' | 'edit' | 'copy'
|
|
|
+ quoteId?: string | number | null
|
|
|
+ copyFromId?: string | number | null
|
|
|
+ }>(),
|
|
|
+ {
|
|
|
+ modelValue: false,
|
|
|
+ variant: 'dialog',
|
|
|
+ pageMode: 'add',
|
|
|
+ quoteId: null,
|
|
|
+ copyFromId: null
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ const emit = defineEmits<{
|
|
|
+ success: []
|
|
|
+ close: []
|
|
|
+ 'update:modelValue': [value: boolean]
|
|
|
+ 'loading-change': [loading: boolean]
|
|
|
+ }>()
|
|
|
+
|
|
|
+ const isPageVariant = computed(() => props.variant === 'page')
|
|
|
+ const visible = ref(false)
|
|
|
+ const dialogMode = ref<'add' | 'edit' | 'copy'>('add')
|
|
|
+ const editId = ref<string | number>('')
|
|
|
+ const copyId = ref<string | number>('')
|
|
|
+ const panelRef = ref<InstanceType<typeof QuoteFormPanel> | null>(null)
|
|
|
+ const pageBooting = ref(false)
|
|
|
+
|
|
|
+ const saveLoading = computed(() => Boolean(panelRef.value?.saveLoading))
|
|
|
+ const dialogTitle = computed(() => {
|
|
|
+ if (dialogMode.value === 'edit') return '编辑报价单'
|
|
|
+ if (dialogMode.value === 'copy') return '复制新增报价单'
|
|
|
+ return '新增报价单'
|
|
|
+ })
|
|
|
+
|
|
|
+ const handleOpened = async () => {
|
|
|
+ await nextTick()
|
|
|
+ if (dialogMode.value === 'edit' && editId.value) {
|
|
|
+ await panelRef.value?.initEdit(editId.value)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (dialogMode.value === 'copy' && copyId.value) {
|
|
|
+ await panelRef.value?.initCopy(copyId.value)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ await panelRef.value?.initNew()
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleSaveDraft = () => {
|
|
|
+ panelRef.value?.handleSaveDraft()
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleSubmit = () => {
|
|
|
+ panelRef.value?.handleSubmit()
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleSuccess = () => {
|
|
|
+ if (!isPageVariant.value) {
|
|
|
+ visible.value = false
|
|
|
+ }
|
|
|
+ emit('success')
|
|
|
}
|
|
|
- if (dialogMode.value === 'copy' && copyId.value) {
|
|
|
- await panelRef.value?.initCopy(copyId.value)
|
|
|
- return
|
|
|
+
|
|
|
+ async function bootPageMode() {
|
|
|
+ pageBooting.value = true
|
|
|
+ emit('loading-change', true)
|
|
|
+ await nextTick()
|
|
|
+ try {
|
|
|
+ if (props.pageMode === 'edit' && props.quoteId) {
|
|
|
+ await panelRef.value?.initEdit(props.quoteId)
|
|
|
+ } else if (props.pageMode === 'copy' && props.copyFromId) {
|
|
|
+ await panelRef.value?.initCopy(props.copyFromId)
|
|
|
+ } else {
|
|
|
+ await panelRef.value?.initNew()
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ pageBooting.value = false
|
|
|
+ emit('loading-change', false)
|
|
|
+ }
|
|
|
}
|
|
|
- await panelRef.value?.initNew()
|
|
|
-}
|
|
|
-
|
|
|
-const handleSaveDraft = () => {
|
|
|
- panelRef.value?.handleSaveDraft()
|
|
|
-}
|
|
|
-
|
|
|
-const handleSubmit = () => {
|
|
|
- panelRef.value?.handleSubmit()
|
|
|
-}
|
|
|
-
|
|
|
-const handleSuccess = () => {
|
|
|
- visible.value = false
|
|
|
- emit('success')
|
|
|
-}
|
|
|
-
|
|
|
-const open = () => {
|
|
|
- dialogMode.value = 'add'
|
|
|
- editId.value = ''
|
|
|
- copyId.value = ''
|
|
|
- visible.value = true
|
|
|
-}
|
|
|
-
|
|
|
-const openEdit = (id: string | number) => {
|
|
|
- dialogMode.value = 'edit'
|
|
|
- editId.value = id
|
|
|
- copyId.value = ''
|
|
|
- visible.value = true
|
|
|
-}
|
|
|
-
|
|
|
-const openCopy = (id: string | number) => {
|
|
|
- dialogMode.value = 'copy'
|
|
|
- copyId.value = id
|
|
|
- editId.value = ''
|
|
|
- visible.value = true
|
|
|
-}
|
|
|
-
|
|
|
-defineExpose({ open, openEdit, openCopy })
|
|
|
+
|
|
|
+ watch(
|
|
|
+ () =>
|
|
|
+ [
|
|
|
+ isPageVariant.value,
|
|
|
+ props.pageMode,
|
|
|
+ props.quoteId,
|
|
|
+ props.copyFromId
|
|
|
+ ] as const,
|
|
|
+ () => {
|
|
|
+ if (isPageVariant.value) {
|
|
|
+ void bootPageMode()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ if (isPageVariant.value) {
|
|
|
+ void bootPageMode()
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ const open = () => {
|
|
|
+ dialogMode.value = 'add'
|
|
|
+ editId.value = ''
|
|
|
+ copyId.value = ''
|
|
|
+ visible.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ const openEdit = (id: string | number) => {
|
|
|
+ dialogMode.value = 'edit'
|
|
|
+ editId.value = id
|
|
|
+ copyId.value = ''
|
|
|
+ visible.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ const openCopy = (id: string | number) => {
|
|
|
+ dialogMode.value = 'copy'
|
|
|
+ copyId.value = id
|
|
|
+ editId.value = ''
|
|
|
+ visible.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ defineExpose({ open, openEdit, openCopy })
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
-:deep(.quote-form-dialog .el-dialog__body) {
|
|
|
- padding-top: 8px;
|
|
|
-}
|
|
|
+ :deep(.quote-form-dialog .el-dialog__body) {
|
|
|
+ padding-top: 8px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .mp-quote-form-page {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ min-height: calc(100vh - 120px);
|
|
|
+ padding: 0 12px 72px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .mp-plan-form-footer {
|
|
|
+ position: sticky;
|
|
|
+ bottom: 0;
|
|
|
+ z-index: 12;
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 8px;
|
|
|
+ margin: 0 -12px;
|
|
|
+ padding: 10px 12px calc(10px + env(safe-area-inset-bottom, 0px));
|
|
|
+ background: #fff;
|
|
|
+ border-top: 1px solid #dcebe4;
|
|
|
+
|
|
|
+ .el-button {
|
|
|
+ flex: 1 1 0;
|
|
|
+ min-width: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
</style>
|