|
|
|
|
@ -1,7 +1,7 @@
|
|
|
|
|
<script lang="ts" setup>
|
|
|
|
|
import type { DrawerProps, ExtendedDrawerApi } from './drawer';
|
|
|
|
|
|
|
|
|
|
import { computed, provide, ref, useId, watch } from 'vue';
|
|
|
|
|
import { computed, provide, ref, unref, useId, watch } from 'vue';
|
|
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
useIsMobile,
|
|
|
|
|
@ -35,6 +35,7 @@ interface Props extends DrawerProps {
|
|
|
|
|
const props = withDefaults(defineProps<Props>(), {
|
|
|
|
|
appendToMain: false,
|
|
|
|
|
closeIconPlacement: 'right',
|
|
|
|
|
destroyOnClose: true,
|
|
|
|
|
drawerApi: undefined,
|
|
|
|
|
submitting: false,
|
|
|
|
|
zIndex: 1000,
|
|
|
|
|
@ -63,6 +64,7 @@ const {
|
|
|
|
|
confirmText,
|
|
|
|
|
contentClass,
|
|
|
|
|
description,
|
|
|
|
|
destroyOnClose,
|
|
|
|
|
footer: showFooter,
|
|
|
|
|
footerClass,
|
|
|
|
|
header: showHeader,
|
|
|
|
|
@ -131,6 +133,29 @@ const getAppendTo = computed(() => {
|
|
|
|
|
? `#${ELEMENT_ID_MAIN_CONTENT}>div:not(.absolute)>div`
|
|
|
|
|
: undefined;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* destroyOnClose功能完善
|
|
|
|
|
*/
|
|
|
|
|
// 是否打开过
|
|
|
|
|
const hasOpened = ref(false);
|
|
|
|
|
const isClosed = ref(true);
|
|
|
|
|
watch(
|
|
|
|
|
() => state?.value?.isOpen,
|
|
|
|
|
(value) => {
|
|
|
|
|
isClosed.value = false;
|
|
|
|
|
if (value && !unref(hasOpened)) {
|
|
|
|
|
hasOpened.value = true;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
function handleClosed() {
|
|
|
|
|
isClosed.value = true;
|
|
|
|
|
props.drawerApi?.onClosed();
|
|
|
|
|
}
|
|
|
|
|
const getForceMount = computed(() => {
|
|
|
|
|
return !unref(destroyOnClose) && unref(hasOpened);
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
<template>
|
|
|
|
|
<Sheet
|
|
|
|
|
@ -144,15 +169,17 @@ const getAppendTo = computed(() => {
|
|
|
|
|
cn('flex w-[520px] flex-col', drawerClass, {
|
|
|
|
|
'!w-full': isMobile || placement === 'bottom' || placement === 'top',
|
|
|
|
|
'max-h-[100vh]': placement === 'bottom' || placement === 'top',
|
|
|
|
|
hidden: isClosed,
|
|
|
|
|
})
|
|
|
|
|
"
|
|
|
|
|
:modal="modal"
|
|
|
|
|
:open="state?.isOpen"
|
|
|
|
|
:side="placement"
|
|
|
|
|
:z-index="zIndex"
|
|
|
|
|
:force-mount="getForceMount"
|
|
|
|
|
:overlay-blur="overlayBlur"
|
|
|
|
|
@close-auto-focus="handleFocusOutside"
|
|
|
|
|
@closed="() => drawerApi?.onClosed()"
|
|
|
|
|
@closed="handleClosed"
|
|
|
|
|
@escape-key-down="escapeKeyDown"
|
|
|
|
|
@focus-outside="handleFocusOutside"
|
|
|
|
|
@interact-outside="interactOutside"
|
|
|
|
|
|