| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- <template>
- <div
- class="avatar-wrapper relative-position"
- :class="{ 'drag-over': isDragOver }"
- @dragover.prevent="isDragOver = true"
- @dragleave="isDragOver = false"
- @drop.prevent="onDrop"
- >
- <div
- v-if="!imageUrl"
- class="full-width full-height flex flex-center column gap-xs no-image-state"
- @click="openChangeDialog"
- >
- <q-icon name="add_photo_alternate" size="32px" color="grey-5" />
- <span class="text-grey-6" style="font-size: 12px">adicione uma imagem</span>
- </div>
- <template v-else>
- <img :src="imageUrl" class="avatar-image" />
- <div class="actions-overlay absolute row no-wrap" style="top: 6px; right: 6px; gap: 4px">
- <q-btn
- round
- unelevated
- size="xs"
- icon="edit"
- color="grey-8"
- text-color="white"
- @click.stop="openChangeDialog"
- >
- <q-tooltip>Trocar imagem</q-tooltip>
- </q-btn>
- <q-btn
- round
- unelevated
- size="xs"
- icon="delete"
- color="negative"
- text-color="white"
- @click.stop="removeImage"
- >
- <q-tooltip>Remover imagem</q-tooltip>
- </q-btn>
- </div>
- </template>
- </div>
- </template>
- <script setup>
- import { ref } from "vue";
- import { useQuasar } from "quasar";
- import ChangeImageDialog from "src/components/shared/ChangeImageDialog.vue";
- const emit = defineEmits(["update:file"]);
- const $q = useQuasar();
- const imageUrl = ref(null);
- const isDragOver = ref(false);
- function openChangeDialog() {
- $q.dialog({ component: ChangeImageDialog }).onOk(({ file, previewUrl }) => {
- imageUrl.value = previewUrl;
- emit("update:file", file);
- });
- }
- function removeImage() {
- imageUrl.value = null;
- emit("update:file", null);
- }
- function onDrop(event) {
- isDragOver.value = false;
- const file = event.dataTransfer.files[0];
- if (file && file.type.startsWith("image/")) {
- const reader = new FileReader();
- reader.onload = (e) => {
- imageUrl.value = e.target.result;
- };
- reader.readAsDataURL(file);
- emit("update:file", file);
- }
- }
- </script>
- <style scoped>
- .avatar-wrapper {
- width: 174px;
- height: 149px;
- border-radius: 8px;
- border: 2px dashed #ccc;
- overflow: hidden;
- background-color: #f5f5f5;
- cursor: pointer;
- transition: border-color 0.2s, background-color 0.2s;
- }
- .avatar-wrapper:hover,
- .avatar-wrapper.drag-over {
- border-color: #ff8340;
- background-color: #fff5ef;
- }
- .no-image-state {
- height: 100%;
- }
- .avatar-image {
- width: 100%;
- height: 100%;
- object-fit: cover;
- display: block;
- }
- .actions-overlay {
- opacity: 0;
- transition: opacity 0.2s;
- }
- .avatar-wrapper:hover .actions-overlay {
- opacity: 1;
- }
- </style>
|