550 lines
20 KiB
Vue
550 lines
20 KiB
Vue
<script setup>
|
|
definePageMeta({
|
|
title: "Modal",
|
|
});
|
|
|
|
const showModal = ref({
|
|
modal1: false,
|
|
modal2: false,
|
|
modal3: false,
|
|
modal4: false,
|
|
modal5: false,
|
|
modal6: false,
|
|
modal7: false,
|
|
modal8: false,
|
|
modal9: false,
|
|
modal10: false,
|
|
modal11: false,
|
|
modal12: false,
|
|
modal13: false,
|
|
modal14: false,
|
|
});
|
|
|
|
const showCode = ref({
|
|
code1: false,
|
|
code2: false,
|
|
code3: false,
|
|
code4: false,
|
|
code5: false,
|
|
});
|
|
|
|
const tooltips = ref({});
|
|
|
|
const copyCode = (codeId) => {
|
|
const codeElement = document.getElementById(codeId);
|
|
if (codeElement) {
|
|
navigator.clipboard
|
|
.writeText(codeElement.textContent)
|
|
.then(() => {
|
|
showTooltip(codeId, "Kod disalin!");
|
|
})
|
|
.catch((err) => {
|
|
showTooltip(codeId, "Gagal menyalin kod");
|
|
});
|
|
}
|
|
};
|
|
|
|
const showTooltip = (codeId, message) => {
|
|
tooltips.value[codeId] = message;
|
|
setTimeout(() => {
|
|
tooltips.value[codeId] = null;
|
|
}, 2000); // Hide tooltip after 2 seconds
|
|
};
|
|
|
|
const clickOK = () => {
|
|
alert("Anda telah klik OK");
|
|
};
|
|
|
|
const clickCancel = () => {
|
|
alert("Anda telah klik Batal");
|
|
};
|
|
</script>
|
|
|
|
<template>
|
|
<div>
|
|
<LayoutsBreadcrumb />
|
|
|
|
<!-- Default Modal -->
|
|
<rs-card>
|
|
<template #header>Default</template>
|
|
<template #body>
|
|
<p class="mb-4">
|
|
Gunakan <code>rs-modal</code> untuk menunjukkan/menyembunyikan modal.
|
|
</p>
|
|
<div class="flex flex-wrap items-center justify-start gap-x-6">
|
|
<rs-button @click="showModal.modal1 = true"
|
|
>Tunjukkan Modal</rs-button
|
|
>
|
|
<rs-button @click="showModal.modal9 = true"
|
|
>Sembunyikan Overlay</rs-button
|
|
>
|
|
<rs-button @click="showModal.modal14 = true">
|
|
Persistent Overlay
|
|
</rs-button>
|
|
</div>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal1">
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-modal
|
|
title="Ini adalah modal"
|
|
v-model="showModal.modal9"
|
|
hide-overlay
|
|
>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-modal
|
|
title="Ini adalah modal"
|
|
v-model="showModal.modal14"
|
|
:overlayClose="false"
|
|
>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<div class="flex justify-end">
|
|
<button
|
|
class="text-sm border border-slate-200 py-1 px-3 rounded-lg"
|
|
@click="
|
|
showCode.code1
|
|
? (showCode.code1 = false)
|
|
: (showCode.code1 = true)
|
|
"
|
|
>
|
|
Tunjukkan Kod
|
|
</button>
|
|
</div>
|
|
<ClientOnly>
|
|
<transition name="fade">
|
|
<div class="relative" v-show="showCode.code1" v-highlight>
|
|
<button
|
|
@click="copyCode('code1')"
|
|
class="absolute top-4 right-2 text-sm bg-gray-300 hover:bg-gray-300 py-1 px-3 rounded z-10"
|
|
>
|
|
Salin Kod
|
|
</button>
|
|
<transition name="tooltip">
|
|
<span
|
|
v-if="tooltips['code1']"
|
|
class="absolute top-0 right-0 mt-12 mr-2 bg-black text-white text-xs rounded py-1 px-2 z-10"
|
|
>
|
|
{{ tooltips["code1"] }}
|
|
</span>
|
|
</transition>
|
|
<NuxtScrollbar style="max-height: 300px">
|
|
<pre id="code1" class="language-html shadow-none">
|
|
<code>
|
|
<template>
|
|
<rs-button @click="showModal.modal1 = true">Tunjukkan Modal</rs-button>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal1">
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-button @click="showModal.modal2 = true">Sembunyikan Overlay</rs-button>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal2" hide-overlay>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-button @click="showModal.modal3 = true">Persistent Overlay</rs-button>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal3" :overlayClose="false">
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
</template>
|
|
|
|
<script setup>
|
|
const showModal = ref({
|
|
modal1: false,
|
|
modal2: false,
|
|
modal3: false,
|
|
});
|
|
</script>
|
|
</code>
|
|
</pre>
|
|
</NuxtScrollbar>
|
|
</div>
|
|
</transition>
|
|
</ClientOnly>
|
|
</template>
|
|
</rs-card>
|
|
|
|
<!-- Size Modal -->
|
|
<rs-card>
|
|
<template #header>Saiz</template>
|
|
<template #body>
|
|
<p class="mb-4">
|
|
Saiz modal menggunakan prop <code>size</code> untuk menukar saiz
|
|
modal. Terdapat 3 saiz: <code>sm</code>, <code>md</code>, dan
|
|
<code>lg</code>. Saiz lalai ialah <code>md</code>.
|
|
</p>
|
|
<div class="flex flex-wrap items-center justify-start gap-x-6">
|
|
<rs-button @click="showModal.modal2 = true">Saiz Kecil</rs-button>
|
|
<rs-button @click="showModal.modal3 = true">Saiz Sederhana</rs-button>
|
|
<rs-button @click="showModal.modal4 = true">Saiz Besar</rs-button>
|
|
</div>
|
|
<rs-modal title="Ini adalah modal" size="sm" v-model="showModal.modal2">
|
|
Ini adalah kandungan modal kecil.
|
|
</rs-modal>
|
|
<rs-modal title="Ini adalah modal" size="md" v-model="showModal.modal3">
|
|
Ini adalah kandungan modal sederhana.
|
|
</rs-modal>
|
|
<rs-modal title="Ini adalah modal" size="lg" v-model="showModal.modal4">
|
|
Ini adalah kandungan modal besar.
|
|
</rs-modal>
|
|
<div class="flex justify-end">
|
|
<button
|
|
class="text-sm border border-slate-200 py-1 px-3 rounded-lg"
|
|
@click="
|
|
showCode.code2
|
|
? (showCode.code2 = false)
|
|
: (showCode.code2 = true)
|
|
"
|
|
>
|
|
Tunjukkan Kod
|
|
</button>
|
|
</div>
|
|
<ClientOnly>
|
|
<transition name="fade">
|
|
<div class="relative" v-show="showCode.code2" v-highlight>
|
|
<button
|
|
@click="copyCode('code2')"
|
|
class="absolute top-4 right-2 text-sm bg-gray-300 hover:bg-gray-300 py-1 px-3 rounded z-10"
|
|
>
|
|
Salin Kod
|
|
</button>
|
|
<transition name="tooltip">
|
|
<span
|
|
v-if="tooltips['code2']"
|
|
class="absolute top-0 right-0 mt-12 mr-2 bg-black text-white text-xs rounded py-1 px-2 z-10"
|
|
>
|
|
{{ tooltips["code2"] }}
|
|
</span>
|
|
</transition>
|
|
<NuxtScrollbar style="max-height: 300px">
|
|
<pre id="code2" class="language-html shadow-none">
|
|
<code>
|
|
<template>
|
|
<rs-button @click="showModal.modal2 = true">Saiz Kecil</rs-button>
|
|
<rs-modal title="Ini adalah modal" size="sm" v-model="showModal.modal2">
|
|
Ini adalah kandungan modal kecil.
|
|
</rs-modal>
|
|
<rs-button @click="showModal.modal3 = true">Saiz Sederhana</rs-button>
|
|
<rs-modal title="Ini adalah modal" size="md" v-model="showModal.modal3">
|
|
Ini adalah kandungan modal sederhana.
|
|
</rs-modal>
|
|
<rs-button @click="showModal.modal4 = true">Saiz Besar</rs-button>
|
|
<rs-modal title="Ini adalah modal" size="lg" v-model="showModal.modal4">
|
|
Ini adalah kandungan modal besar.
|
|
</rs-modal>
|
|
</template>
|
|
|
|
<script setup>
|
|
const showModal = ref({
|
|
modal2: false,
|
|
modal3: false,
|
|
modal4: false,
|
|
});
|
|
</script>
|
|
</code>
|
|
</pre>
|
|
</NuxtScrollbar>
|
|
</div>
|
|
</transition>
|
|
</ClientOnly>
|
|
</template>
|
|
</rs-card>
|
|
|
|
<!-- Position Modal -->
|
|
<rs-card>
|
|
<template #header>Kedudukan</template>
|
|
<template #body>
|
|
<p class="mb-4">
|
|
Kedudukan modal menggunakan prop <code>position</code> untuk menukar
|
|
kedudukan modal. Terdapat 3 kedudukan: <code>top</code>,
|
|
<code>center</code>, dan <code>bottom</code>.
|
|
</p>
|
|
<div class="flex flex-wrap items-center justify-start gap-x-6">
|
|
<rs-button @click="showModal.modal5 = true">Atas</rs-button>
|
|
<rs-button @click="showModal.modal6 = true">Tengah</rs-button>
|
|
<rs-button @click="showModal.modal7 = true">Bawah</rs-button>
|
|
</div>
|
|
<rs-modal
|
|
title="Ini adalah modal"
|
|
position="top"
|
|
v-model="showModal.modal5"
|
|
>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-modal
|
|
title="Ini adalah modal"
|
|
position="center"
|
|
v-model="showModal.modal6"
|
|
>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-modal
|
|
title="Ini adalah modal"
|
|
position="bottom"
|
|
v-model="showModal.modal7"
|
|
>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<div class="flex justify-end">
|
|
<button
|
|
class="text-sm border border-slate-200 py-1 px-3 rounded-lg"
|
|
@click="
|
|
showCode.code3
|
|
? (showCode.code3 = false)
|
|
: (showCode.code3 = true)
|
|
"
|
|
>
|
|
Tunjukkan Kod
|
|
</button>
|
|
</div>
|
|
<ClientOnly>
|
|
<transition name="fade">
|
|
<div class="relative" v-show="showCode.code3" v-highlight>
|
|
<button
|
|
@click="copyCode('code3')"
|
|
class="absolute top-4 right-2 text-sm bg-gray-300 hover:bg-gray-300 py-1 px-3 rounded z-10"
|
|
>
|
|
Salin Kod
|
|
</button>
|
|
<transition name="tooltip">
|
|
<span
|
|
v-if="tooltips['code3']"
|
|
class="absolute top-0 right-0 mt-12 mr-2 bg-black text-white text-xs rounded py-1 px-2 z-10"
|
|
>
|
|
{{ tooltips["code3"] }}
|
|
</span>
|
|
</transition>
|
|
<NuxtScrollbar style="max-height: 300px">
|
|
<pre id="code3" class="language-html shadow-none">
|
|
<code>
|
|
<template>
|
|
<rs-button @click="showModal.modal5 = true">Atas</rs-button>
|
|
<rs-modal title="Ini adalah modal" position="top" v-model="showModal.modal5">
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-button @click="showModal.modal6 = true">Tengah</rs-button>
|
|
<rs-modal title="Ini adalah modal" position="center" v-model="showModal.modal6">
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-button @click="showModal.modal7 = true">Bawah</rs-button>
|
|
<rs-modal title="Ini adalah modal" position="bottom" v-model="showModal.modal7">
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
</template>
|
|
|
|
<script setup>
|
|
const showModal = ref({
|
|
modal5: false,
|
|
modal6: false,
|
|
modal7: false,
|
|
});
|
|
</script>
|
|
</code>
|
|
</pre>
|
|
</NuxtScrollbar>
|
|
</div>
|
|
</transition>
|
|
</ClientOnly>
|
|
</template>
|
|
</rs-card>
|
|
|
|
<!-- Customize Modal -->
|
|
<rs-card>
|
|
<template #header>Sesuaikan</template>
|
|
<template #body>
|
|
<p class="mb-4 text-justify">
|
|
Tajuk, badan dan footer modal boleh disesuaikan dengan menggunakan
|
|
slot templat. Slot tajuk dinamakan <code>header</code>, slot badan
|
|
dinamakan <code>body</code> dan slot footer dinamakan
|
|
<code>footer</code>. Tajuk OK boleh disesuaikan dengan menggunakan
|
|
prop <code>ok-title</code>. Tajuk lalai ialah <code>OK</code>. Tajuk
|
|
Batal boleh disesuaikan dengan menggunakan prop
|
|
<code>cancel-title</code>. Tajuk lalai ialah <code>Batal</code>.
|
|
Butang OK dan batal boleh disembunyikan dengan menggunakan prop
|
|
<code>ok-only</code> atau <code>cancel-only</code>. Nilai lalai ialah
|
|
<code>false</code> untuk kedua-duanya.
|
|
</p>
|
|
<div class="flex flex-wrap items-center justify-start gap-x-6">
|
|
<rs-button @click="showModal.modal8 = true"
|
|
>Tunjukkan Modal</rs-button
|
|
>
|
|
<rs-button @click="showModal.modal10 = true"
|
|
>Butang Tersuai</rs-button
|
|
>
|
|
<rs-button @click="showModal.modal11 = true">OK Sahaja</rs-button>
|
|
<rs-button @click="showModal.modal12 = true">Batal Sahaja</rs-button>
|
|
</div>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal8">
|
|
<template #header> Tajuk Tersuai </template>
|
|
<template #body> Badan Tersuai </template>
|
|
<template #footer> Footer Tersuai </template>
|
|
</rs-modal>
|
|
<rs-modal
|
|
title="Ini adalah modal"
|
|
v-model="showModal.modal10"
|
|
cancel-title="Tutup"
|
|
ok-title="Terima"
|
|
>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal11" ok-only>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-modal
|
|
title="Ini adalah modal"
|
|
v-model="showModal.modal12"
|
|
cancel-only
|
|
>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<div class="flex justify-end">
|
|
<button
|
|
class="text-sm border border-slate-200 py-1 px-3 rounded-lg"
|
|
@click="
|
|
showCode.code4
|
|
? (showCode.code4 = false)
|
|
: (showCode.code4 = true)
|
|
"
|
|
>
|
|
Tunjukkan Kod
|
|
</button>
|
|
</div>
|
|
<ClientOnly>
|
|
<transition name="fade">
|
|
<div class="relative" v-show="showCode.code4" v-highlight>
|
|
<button
|
|
@click="copyCode('code4')"
|
|
class="absolute top-4 right-2 text-sm bg-gray-300 hover:bg-gray-300 py-1 px-3 rounded z-10"
|
|
>
|
|
Salin Kod
|
|
</button>
|
|
<transition name="tooltip">
|
|
<span
|
|
v-if="tooltips['code4']"
|
|
class="absolute top-0 right-0 mt-12 mr-2 bg-black text-white text-xs rounded py-1 px-2 z-10"
|
|
>
|
|
{{ tooltips["code4"] }}
|
|
</span>
|
|
</transition>
|
|
<NuxtScrollbar style="max-height: 300px">
|
|
<pre id="code4" class="language-html shadow-none">
|
|
<code>
|
|
<template>
|
|
<rs-button @click="showModal.modal8 = true">Tunjukkan Modal</rs-button>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal8">
|
|
<template #header> Tajuk Tersuai </template>
|
|
<template #body> Badan Tersuai </template>
|
|
<template #footer> Footer Tersuai </template>
|
|
</rs-modal>
|
|
<rs-button @click="showModal.modal10 = true">Butang Tersuai</rs-button>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal10" cancel-title="Tutup" ok-title="Terima">
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-button @click="showModal.modal11 = true">OK Sahaja</rs-button>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal11" ok-only>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<rs-button @click="showModal.modal12 = true">Batal Sahaja</rs-button>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal12" cancel-only>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
</template>
|
|
|
|
<script setup>
|
|
const showModal = ref({
|
|
modal8: false,
|
|
modal10: false,
|
|
modal11: false,
|
|
modal12: false,
|
|
});
|
|
</script>
|
|
</code>
|
|
</pre>
|
|
</NuxtScrollbar>
|
|
</div>
|
|
</transition>
|
|
</ClientOnly>
|
|
</template>
|
|
</rs-card>
|
|
|
|
<!-- Bind Function Modal -->
|
|
<rs-card>
|
|
<template #header>Bind Fungsi</template>
|
|
<template #body>
|
|
<p class="mb-4">
|
|
Anda boleh mengikat fungsi untuk butang OK dan batal dalam modal
|
|
dengan menggunakan prop <code>ok-callback</code> dan
|
|
<code>cancel-callback</code>.
|
|
</p>
|
|
<div class="flex flex-wrap items-center justify-start gap-x-6">
|
|
<rs-button @click="showModal.modal13 = true">Bind Fungsi</rs-button>
|
|
</div>
|
|
<rs-modal
|
|
title="Ini adalah modal"
|
|
v-model="showModal.modal13"
|
|
:ok-callback="clickOK"
|
|
:cancel-callback="clickCancel"
|
|
>
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
<div class="flex justify-end">
|
|
<button
|
|
class="text-sm border border-slate-200 py-1 px-3 rounded-lg"
|
|
@click="
|
|
showCode.code5
|
|
? (showCode.code5 = false)
|
|
: (showCode.code5 = true)
|
|
"
|
|
>
|
|
Tunjukkan Kod
|
|
</button>
|
|
</div>
|
|
<ClientOnly>
|
|
<transition name="fade">
|
|
<div class="relative" v-show="showCode.code5" v-highlight>
|
|
<button
|
|
@click="copyCode('code5')"
|
|
class="absolute top-4 right-2 text-sm bg-gray-300 hover:bg-gray-300 py-1 px-3 rounded z-10"
|
|
>
|
|
Salin Kod
|
|
</button>
|
|
<transition name="tooltip">
|
|
<span
|
|
v-if="tooltips['code5']"
|
|
class="absolute top-0 right-0 mt-12 mr-2 bg-black text-white text-xs rounded py-1 px-2 z-10"
|
|
>
|
|
{{ tooltips["code5"] }}
|
|
</span>
|
|
</transition>
|
|
<NuxtScrollbar style="max-height: 300px">
|
|
<pre id="code5" class="language-html shadow-none">
|
|
<code>
|
|
<template>
|
|
<rs-button @click="showModal.modal13 = true">Bind Fungsi</rs-button>
|
|
<rs-modal title="Ini adalah modal" v-model="showModal.modal13" :ok-callback="clickOK" :cancel-callback="clickCancel">
|
|
Ini adalah kandungan modal.
|
|
</rs-modal>
|
|
</template>
|
|
|
|
<script setup>
|
|
const showModal = ref({
|
|
modal13: false,
|
|
});
|
|
|
|
const clickOK = () => {
|
|
alert("Anda telah klik OK");
|
|
};
|
|
|
|
const clickCancel = () => {
|
|
alert("Anda telah klik Batal");
|
|
};
|
|
</script>
|
|
</code>
|
|
</pre>
|
|
</NuxtScrollbar>
|
|
</div>
|
|
</transition>
|
|
</ClientOnly>
|
|
</template>
|
|
</rs-card>
|
|
</div>
|
|
</template>
|