3 changed files with 172 additions and 18 deletions
@ -0,0 +1,152 @@ |
|||||
|
<template> |
||||
|
<NotificationGroup group="customModal"> |
||||
|
<div class="fixed z-[100] top-0 inset-x-0 w-full"> |
||||
|
<Notification |
||||
|
v-slot="{ notifications, close }" |
||||
|
enter="transform ease-out duration-300 transition" |
||||
|
enter-from="translate-y-2 opacity-0 sm:translate-y-4" |
||||
|
enter-to="translate-y-0 opacity-100 sm:translate-y-0" |
||||
|
leave="transition ease-in duration-500" |
||||
|
leave-from="opacity-100" |
||||
|
leave-to="opacity-0" |
||||
|
move="transition duration-500" |
||||
|
move-delay="delay-300" |
||||
|
> |
||||
|
<div |
||||
|
v-for="notification in notifications" |
||||
|
:key="notification.id" |
||||
|
class="w-full" |
||||
|
role="alert" |
||||
|
> |
||||
|
<div |
||||
|
class="absolute inset-0 h-screen flex flex-col items-center justify-center bg-slate-900/50" |
||||
|
> |
||||
|
<div |
||||
|
class="flex w-11/12 max-w-sm mx-auto mb-3 overflow-hidden bg-white rounded-lg shadow-lg" |
||||
|
> |
||||
|
<div class="w-full px-6 py-6 text-slate-900 text-center"> |
||||
|
<span class="font-semibold text-lg">{{ title }}</span> |
||||
|
<p class="text-sm mb-2">{{ text }}</p> |
||||
|
|
||||
|
<button |
||||
|
@click="handleOption1(close)" |
||||
|
class="block w-full text-center text-md font-bold capitalize bg-blue-800 text-white px-2 py-2 rounded-md mb-2" |
||||
|
> |
||||
|
{{ option1Text }} |
||||
|
</button> |
||||
|
|
||||
|
<button |
||||
|
@click="handleOption2(close)" |
||||
|
class="block w-full text-center text-md font-bold capitalize bg-blue-700 text-white px-2 py-2 rounded-md mb-2" |
||||
|
> |
||||
|
{{ option2Text }} |
||||
|
</button> |
||||
|
|
||||
|
<button |
||||
|
@click="handleOption3(close)" |
||||
|
class="block w-full text-center text-md font-bold capitalize bg-blue-600 text-white px-2 py-2 rounded-md mb-2" |
||||
|
> |
||||
|
{{ option3Text }} |
||||
|
</button> |
||||
|
|
||||
|
<button |
||||
|
@click="handleCancel(close)" |
||||
|
class="block w-full text-center text-md font-bold capitalize bg-slate-600 text-white px-2 py-2 rounded-md" |
||||
|
> |
||||
|
Cancel |
||||
|
</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</Notification> |
||||
|
</div> |
||||
|
</NotificationGroup> |
||||
|
</template> |
||||
|
|
||||
|
<script lang="ts"> |
||||
|
import { Component, Vue } from "vue-facing-decorator"; |
||||
|
import { NotificationIface } from "@/constants/app"; |
||||
|
|
||||
|
@Component |
||||
|
export default class PromptDialog extends Vue { |
||||
|
$notify!: (notification: NotificationIface, timeout?: number) => void; |
||||
|
|
||||
|
title = ""; |
||||
|
text = ""; |
||||
|
option1Text = ""; |
||||
|
option2Text = ""; |
||||
|
option3Text = ""; |
||||
|
onOption1?: () => void; |
||||
|
onOption2?: () => void; |
||||
|
onOption3?: () => void; |
||||
|
onCancel?: () => Promise<void>; |
||||
|
|
||||
|
open(options: { |
||||
|
title: string; |
||||
|
text: string; |
||||
|
option1Text?: string; |
||||
|
option2Text?: string; |
||||
|
option3Text?: string; |
||||
|
onOption1?: () => void; |
||||
|
onOption2?: () => void; |
||||
|
onOption3?: () => void; |
||||
|
onCancel?: () => Promise<void>; |
||||
|
}) { |
||||
|
this.title = options.title; |
||||
|
this.text = options.text; |
||||
|
this.option1Text = options.option1Text || ""; |
||||
|
this.option2Text = options.option2Text || ""; |
||||
|
this.option3Text = options.option3Text || ""; |
||||
|
this.onOption1 = options.onOption1; |
||||
|
this.onOption2 = options.onOption2; |
||||
|
this.onOption3 = options.onOption3; |
||||
|
this.onCancel = options.onCancel; |
||||
|
|
||||
|
this.$notify( |
||||
|
{ |
||||
|
group: "customModal", |
||||
|
type: "confirm", |
||||
|
title: this.title, |
||||
|
text: this.text, |
||||
|
option1Text: this.option1Text, |
||||
|
option2Text: this.option2Text, |
||||
|
option3Text: this.option3Text, |
||||
|
onOption1: this.onOption1, |
||||
|
onOption2: this.onOption2, |
||||
|
onOption3: this.onOption3, |
||||
|
onCancel: this.onCancel, |
||||
|
} as NotificationIface, |
||||
|
-1 |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
handleOption1(close: (id: string) => void) { |
||||
|
if (this.onOption1) { |
||||
|
this.onOption1(); |
||||
|
} |
||||
|
close("string that does not matter"); |
||||
|
} |
||||
|
|
||||
|
handleOption2(close: (id: string) => void) { |
||||
|
if (this.onOption2) { |
||||
|
this.onOption2(); |
||||
|
} |
||||
|
close("string that does not matter"); |
||||
|
} |
||||
|
|
||||
|
handleOption3(close: (id: string) => void) { |
||||
|
if (this.onOption3) { |
||||
|
this.onOption3(); |
||||
|
} |
||||
|
close("string that does not matter"); |
||||
|
} |
||||
|
|
||||
|
handleCancel(close: (id: string) => void) { |
||||
|
if (this.onCancel) { |
||||
|
this.onCancel(); |
||||
|
} |
||||
|
close("string that does not matter"); |
||||
|
} |
||||
|
} |
||||
|
</script> |
Loading…
Reference in new issue