|
<template> |
|
<!-- Button --> |
|
<div @click="showModal">[img]</div> |
|
<TransitionRoot as="template" :show="open"> |
|
<Dialog as="div" class="fixed z-10 inset-0 overflow-y-auto" @close="open = false"> |
|
<div |
|
class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0" |
|
> |
|
<TransitionChild |
|
as="template" |
|
enter="ease-out duration-300" |
|
enter-from="opacity-0" |
|
enter-to="opacity-100" |
|
leave="ease-in duration-200" |
|
leave-from="opacity-100" |
|
leave-to="opacity-0" |
|
> |
|
<DialogOverlay |
|
class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity" |
|
/> |
|
</TransitionChild> |
|
|
|
<!-- This element is to trick the browser into centering the modal contents. --> |
|
<span |
|
class="hidden sm:inline-block sm:align-middle sm:h-screen" |
|
aria-hidden="true" |
|
>​</span |
|
> |
|
<TransitionChild |
|
as="template" |
|
enter="ease-out duration-300" |
|
enter-from="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" |
|
enter-to="opacity-100 translate-y-0 sm:scale-100" |
|
leave="ease-in duration-200" |
|
leave-from="opacity-100 translate-y-0 sm:scale-100" |
|
leave-to="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" |
|
> |
|
<div |
|
class="inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-sm sm:w-full sm:p-6" |
|
> |
|
<div> |
|
<div |
|
class="mx-auto flex items-center justify-center h-12 w-12 rounded-full bg-indigo-100" |
|
> |
|
<CloudUploadIcon class="h-6 w-6 text-indigo-600" aria-hidden="true" /> |
|
</div> |
|
<div class="mt-3 text-center sm:mt-5"> |
|
<DialogTitle as="h3" class="text-lg leading-6 font-medium text-gray-900"> |
|
Carica immagine |
|
</DialogTitle> |
|
<div class="mt-2"> |
|
<p class="text-sm text-gray-500 p-4"> |
|
<span class="text-red-500">JPEG, Max 4M</span> |
|
</p> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="mt-5 sm:mt-6"> |
|
<fieldset> |
|
<legend class="text-base font-medium text-gray-900">Immagine</legend> |
|
<div class="flex space-x-4"> |
|
<div class="bg-gray-100 my-auto"> |
|
<input |
|
type="file" |
|
accept="image/*" |
|
@change="uploadImage($event)" |
|
id="file-input" |
|
/> |
|
</div> |
|
</div> |
|
</fieldset> |
|
</div> |
|
</div> |
|
</TransitionChild> |
|
</div> |
|
</Dialog> |
|
</TransitionRoot> |
|
</template> |
|
|
|
<script> |
|
import { ref } from "vue"; |
|
|
|
import { |
|
Dialog, |
|
DialogOverlay, |
|
DialogTitle, |
|
TransitionChild, |
|
TransitionRoot, |
|
} from "@headlessui/vue"; |
|
import { CloudUploadIcon } from "@heroicons/vue/outline"; |
|
|
|
export default { |
|
components: { |
|
Dialog, |
|
DialogOverlay, |
|
DialogTitle, |
|
TransitionChild, |
|
TransitionRoot, |
|
CloudUploadIcon, |
|
}, |
|
methods: { |
|
showModal() { |
|
this.open = true; |
|
}, |
|
uploadImage(event) { |
|
const URL = "/articles/upload-image"; |
|
|
|
let data = new FormData(); |
|
data.append("name", "my-picture"); |
|
data.append("file", event.target.files[0]); |
|
|
|
axios.post(URL, data).then((response) => { |
|
console.log("image upload response > ", response); |
|
this.$parent.editor |
|
.chain() |
|
.focus() |
|
.setImage({ src: "/storage/" + response.data.file }) // hard coding |
|
.run(); |
|
this.open = false; |
|
}); |
|
}, |
|
}, |
|
setup() { |
|
const open = ref(false); |
|
|
|
return { |
|
open, |
|
}; |
|
}, |
|
}; |
|
</script> |