|
@@ -36,6 +36,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
appendToMain: false,
|
|
|
closeIconPlacement: 'right',
|
|
|
drawerApi: undefined,
|
|
|
+ submitting: false,
|
|
|
zIndex: 1000,
|
|
|
});
|
|
|
|
|
@@ -73,6 +74,7 @@ const {
|
|
|
placement,
|
|
|
showCancelButton,
|
|
|
showConfirmButton,
|
|
|
+ submitting,
|
|
|
title,
|
|
|
titleTooltip,
|
|
|
zIndex,
|
|
@@ -91,12 +93,12 @@ watch(
|
|
|
);
|
|
|
|
|
|
function interactOutside(e: Event) {
|
|
|
- if (!closeOnClickModal.value) {
|
|
|
+ if (!closeOnClickModal.value || submitting.value) {
|
|
|
e.preventDefault();
|
|
|
}
|
|
|
}
|
|
|
function escapeKeyDown(e: KeyboardEvent) {
|
|
|
- if (!closeOnPressEscape.value) {
|
|
|
+ if (!closeOnPressEscape.value || submitting.value) {
|
|
|
e.preventDefault();
|
|
|
}
|
|
|
}
|
|
@@ -104,7 +106,11 @@ function escapeKeyDown(e: KeyboardEvent) {
|
|
|
function pointerDownOutside(e: Event) {
|
|
|
const target = e.target as HTMLElement;
|
|
|
const dismissableDrawer = target?.dataset.dismissableDrawer;
|
|
|
- if (!closeOnClickModal.value || dismissableDrawer !== id) {
|
|
|
+ if (
|
|
|
+ submitting.value ||
|
|
|
+ !closeOnClickModal.value ||
|
|
|
+ dismissableDrawer !== id
|
|
|
+ ) {
|
|
|
e.preventDefault();
|
|
|
}
|
|
|
}
|
|
@@ -169,6 +175,7 @@ const getAppendTo = computed(() => {
|
|
|
<SheetClose
|
|
|
v-if="closable && closeIconPlacement === 'left'"
|
|
|
as-child
|
|
|
+ :disabled="submitting"
|
|
|
class="data-[state=open]:bg-secondary ml-[2px] cursor-pointer rounded-full opacity-80 transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none"
|
|
|
>
|
|
|
<slot name="close-icon">
|
|
@@ -209,6 +216,7 @@ const getAppendTo = computed(() => {
|
|
|
<SheetClose
|
|
|
v-if="closable && closeIconPlacement === 'right'"
|
|
|
as-child
|
|
|
+ :disabled="submitting"
|
|
|
class="data-[state=open]:bg-secondary ml-[2px] cursor-pointer rounded-full opacity-80 transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none"
|
|
|
>
|
|
|
<slot name="close-icon">
|
|
@@ -233,7 +241,11 @@ const getAppendTo = computed(() => {
|
|
|
})
|
|
|
"
|
|
|
>
|
|
|
- <VbenLoading v-if="showLoading" class="size-full" spinning />
|
|
|
+ <VbenLoading
|
|
|
+ v-if="showLoading || submitting"
|
|
|
+ class="size-full"
|
|
|
+ spinning
|
|
|
+ />
|
|
|
|
|
|
<slot></slot>
|
|
|
</div>
|
|
@@ -253,6 +265,7 @@ const getAppendTo = computed(() => {
|
|
|
:is="components.DefaultButton || VbenButton"
|
|
|
v-if="showCancelButton"
|
|
|
variant="ghost"
|
|
|
+ :disabled="submitting"
|
|
|
@click="() => drawerApi?.onCancel()"
|
|
|
>
|
|
|
<slot name="cancelText">
|
|
@@ -263,7 +276,7 @@ const getAppendTo = computed(() => {
|
|
|
<component
|
|
|
:is="components.PrimaryButton || VbenButton"
|
|
|
v-if="showConfirmButton"
|
|
|
- :loading="confirmLoading"
|
|
|
+ :loading="confirmLoading || submitting"
|
|
|
@click="() => drawerApi?.onConfirm()"
|
|
|
>
|
|
|
<slot name="confirmText">
|