From 23ff5f831a8ebe05a6e4a4884fdff25824706aac Mon Sep 17 00:00:00 2001 From: Cristiano Magro <cristiano.magro@vola.it> Date: Tue, 07 Jan 2025 17:35:45 +0100 Subject: [PATCH] add modal dialog --- 10 - course project/xno-prj-cmp-01-starting-setup/src/main.js | 2 + 10 - course project/xno-prj-cmp-01-starting-setup/src/components/learning-resource/AddResource.vue | 27 +++++++++++++ 10 - course project/xno-prj-cmp-01-starting-setup/src/components/UI/BaseDialog.vue | 86 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 1 deletions(-) diff --git a/10 - course project/xno-prj-cmp-01-starting-setup/src/components/UI/BaseDialog.vue b/10 - course project/xno-prj-cmp-01-starting-setup/src/components/UI/BaseDialog.vue new file mode 100644 index 0000000..c63603d --- /dev/null +++ b/10 - course project/xno-prj-cmp-01-starting-setup/src/components/UI/BaseDialog.vue @@ -0,0 +1,86 @@ +<template> + <div @click="$emit('close')"></div> + <dialog open> + <header> + <slot name="header"> + <h2>{{ title }}</h2> + </slot> + </header> + <section> + <slot></slot> + </section> + <menu> + <slot name="action"> + <base-button @click="$emit('close')"></base-button> + </slot> + </menu> + </dialog> +</template> + +<script> +export default { + // props: ['title'], + props: { + title: { + type: String, + required: false, + }, + }, + emits: ['close'], +}; +</script> + +<style scoped> +div { + position: fixed; + top: 0; + left: 0; + height: 100vh; + width: 100%; + background-color: rgba(0, 0, 0, 0.75); + z-index: 10; +} + +dialog { + position: fixed; + top: 20vh; + left: 10%; + width: 80%; + z-index: 100; + border-radius: 12px; + border: none; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26); + padding: 0; + margin: 0; + overflow: hidden; +} + +header { + background-color: #3a0061; + color: white; + width: 100%; + padding: 1rem; +} + +header h2 { + margin: 0; +} + +section { + padding: 1rem; +} + +menu { + padding: 1rem; + display: flex; + justify-content: flex-end; + margin: 0; +} + +@media (min-width: 768px) { + dialog { + left: calc(50% - 20rem); + width: 40rem; + } +} +</style> diff --git a/10 - course project/xno-prj-cmp-01-starting-setup/src/components/learning-resource/AddResource.vue b/10 - course project/xno-prj-cmp-01-starting-setup/src/components/learning-resource/AddResource.vue index be52373..5ddea32 100644 --- a/10 - course project/xno-prj-cmp-01-starting-setup/src/components/learning-resource/AddResource.vue +++ b/10 - course project/xno-prj-cmp-01-starting-setup/src/components/learning-resource/AddResource.vue @@ -1,5 +1,13 @@ <template> - <h2>Add Resource</h2> + <base-dialog v-if="inputIsInvalid" title="Invalid Input" @close="confirmError"> + <template #default> + <p>Sfortunatamente un input รจ invalido</p> + <p>Controlla che tutti gli input contengano qualche carattere valido.</p> + </template> + <template #action> + <base-button @click="confirmError">Okay</base-button> + </template> + </base-dialog> <base-card> <form @submit.prevent="submitData"> <div class="form-control"> @@ -30,14 +38,31 @@ <script> export default { inject: ['addResource'], + data() { + return { + inputIsInvalid: false, + }; + }, methods: { submitData() { const enteredTitle = this.$refs.titleInput.value; const enteredDescription = this.$refs.descInput.value; const enteredUrl = this.$refs.linkInput.value; + if ( + enteredTitle.trim() === '' || + enteredDescription.trim() || + enteredUrl.trim() + ) { + this.inputIsInvalid = true; + return; + } + this.addResource(enteredTitle, enteredDescription, enteredUrl); }, + confirmError() { + this.inputIsInvalid = false; + }, }, }; </script> diff --git a/10 - course project/xno-prj-cmp-01-starting-setup/src/main.js b/10 - course project/xno-prj-cmp-01-starting-setup/src/main.js index f398b1d..bc89692 100644 --- a/10 - course project/xno-prj-cmp-01-starting-setup/src/main.js +++ b/10 - course project/xno-prj-cmp-01-starting-setup/src/main.js @@ -3,11 +3,13 @@ import App from './App.vue'; import BaseCard from './components/UI/BaseCard.vue'; import BaseButton from './components/UI/BaseButton.vue'; +import BaseDialog from './components/UI/BaseDialog.vue'; const app = createApp(App); app.component('base-card', BaseCard); app.component('base-button', BaseButton); +app.component('base-dialog', BaseDialog); app.mount('#app'); -- Gitblit v1.8.0