|
|
|
@ -1,7 +1,7 @@ |
|
|
|
<script lang="ts" setup> |
|
|
|
import type { ExtendedModalApi, ModalProps } from './modal'; |
|
|
|
|
|
|
|
import { computed, nextTick, provide, ref, useId, watch } from 'vue'; |
|
|
|
import { computed, nextTick, provide, ref, unref, useId, watch } from 'vue'; |
|
|
|
|
|
|
|
import { |
|
|
|
useIsMobile, |
|
|
|
@ -34,6 +34,7 @@ interface Props extends ModalProps { |
|
|
|
|
|
|
|
const props = withDefaults(defineProps<Props>(), { |
|
|
|
appendToMain: false, |
|
|
|
destroyOnClose: true, |
|
|
|
modalApi: undefined, |
|
|
|
}); |
|
|
|
|
|
|
|
@ -67,6 +68,7 @@ const { |
|
|
|
confirmText, |
|
|
|
contentClass, |
|
|
|
description, |
|
|
|
destroyOnClose, |
|
|
|
draggable, |
|
|
|
footer: showFooter, |
|
|
|
footerClass, |
|
|
|
@ -100,10 +102,15 @@ const { dragging, transform } = useModalDraggable( |
|
|
|
shouldDraggable, |
|
|
|
); |
|
|
|
|
|
|
|
const firstOpened = ref(false); |
|
|
|
const isClosed = ref(false); |
|
|
|
|
|
|
|
watch( |
|
|
|
() => state?.value?.isOpen, |
|
|
|
async (v) => { |
|
|
|
if (v) { |
|
|
|
isClosed.value = false; |
|
|
|
if (!firstOpened.value) firstOpened.value = true; |
|
|
|
await nextTick(); |
|
|
|
if (!contentRef.value) return; |
|
|
|
const innerContentRef = contentRef.value.getContentRef(); |
|
|
|
@ -113,6 +120,7 @@ watch( |
|
|
|
dialogRef.value.style.transform = `translate(${offsetX}px, ${offsetY}px)`; |
|
|
|
} |
|
|
|
}, |
|
|
|
{ immediate: true }, |
|
|
|
); |
|
|
|
|
|
|
|
watch( |
|
|
|
@ -176,6 +184,15 @@ const getAppendTo = computed(() => { |
|
|
|
? `#${ELEMENT_ID_MAIN_CONTENT}>div:not(.absolute)>div` |
|
|
|
: undefined; |
|
|
|
}); |
|
|
|
|
|
|
|
const getForceMount = computed(() => { |
|
|
|
return !unref(destroyOnClose); |
|
|
|
}); |
|
|
|
|
|
|
|
function handleClosed() { |
|
|
|
isClosed.value = true; |
|
|
|
props.modalApi?.onClosed(); |
|
|
|
} |
|
|
|
</script> |
|
|
|
<template> |
|
|
|
<Dialog |
|
|
|
@ -197,9 +214,11 @@ const getAppendTo = computed(() => { |
|
|
|
shouldFullscreen, |
|
|
|
'top-1/2 !-translate-y-1/2': centered && !shouldFullscreen, |
|
|
|
'duration-300': !dragging, |
|
|
|
hidden: isClosed, |
|
|
|
}, |
|
|
|
) |
|
|
|
" |
|
|
|
:force-mount="getForceMount" |
|
|
|
:modal="modal" |
|
|
|
:open="state?.isOpen" |
|
|
|
:show-close="closable" |
|
|
|
@ -207,7 +226,7 @@ const getAppendTo = computed(() => { |
|
|
|
:overlay-blur="overlayBlur" |
|
|
|
close-class="top-3" |
|
|
|
@close-auto-focus="handleFocusOutside" |
|
|
|
@closed="() => modalApi?.onClosed()" |
|
|
|
@closed="handleClosed" |
|
|
|
:close-disabled="submitting" |
|
|
|
@escape-key-down="escapeKeyDown" |
|
|
|
@focus-outside="handleFocusOutside" |
|
|
|
|