diff --git a/src/components/BaseComponents/FormImageDisplay.vue b/src/components/BaseComponents/FormImageDisplay.vue new file mode 100644 index 0000000000000000000000000000000000000000..f0b5de3a8add044a48c7d8586ad8605b5d573598 --- /dev/null +++ b/src/components/BaseComponents/FormImageDisplay.vue @@ -0,0 +1,47 @@ +<template> + <img + :src="image" + class="w-2/5 inline" + alt="Bilde av gjenstanden" + @click="toggleModal" + /> + <custom-footer-modal + @close="toggleModal" + :message="'Bilder som fjernes kan ikke lastes opp på nytt uten å laste opp et annet bilde først.'" + :title="'Er du sikker på at du vil fjene bilde?'" + :visible="show" + > + <div class="flex justify-center p-2"> + <colored-button :text="'Avbryt'" @click="toggleModal" class="m-2" /> + <colored-button :text="'Slett'" @click="removeImage" class="m-2" /> + </div> + </custom-footer-modal> +</template> + +<script> +import ColoredButton from "@/components/BaseComponents/ColoredButton"; +import CustomFooterModal from "@/components/BaseComponents/CustomFooterModal.vue"; + +export default { + components: { + ColoredButton, + CustomFooterModal, + }, + data() { + return { + show: false, + }; + }, + props: { + image: String, + }, + methods: { + removeImage() { + this.$emit("remove"); + }, + toggleModal() { + this.show = !this.show; + }, + }, +}; +</script> diff --git a/src/components/ItemComponents/EditItemForm.vue b/src/components/ItemComponents/EditItemForm.vue index 5ec681920f74b6a1a2a2adc304b7f1a7156c96f4..b5fed83d4c3eac9073d1a09ca34ae95e40599163 100644 --- a/src/components/ItemComponents/EditItemForm.vue +++ b/src/components/ItemComponents/EditItemForm.vue @@ -195,7 +195,6 @@ </div> <!-- Images --> - <!-- <div> <label class="block mb-2 text-sm font-medium text-gray-900 dark:text-gray-400" @@ -209,30 +208,29 @@ ref="file" style="display: none" @change="addImage" - multiple accept="image/png" /> - <Button :text="'Velg bilde'" @click="$refs.file.click()" /> + <ColoredButton :text="'Velg bilde'" @click="$refs.file.click()" /> <div v-for="image in updatedItem.images" :key="image" class="m-2"> - <img :src="image" class="w-2/5 inline" alt="Bilde av gjenstanden" /> + <form-image-display :image="image" @remove="removeImage(image)" /> </div> </div> - --> <!-- Save item button --> <div class="float-right"> - <Button :text="'Lagre'" @click="saveClicked" id="saveButton" /> + <ColoredButton :text="'Lagre'" @click="saveClicked" id="saveButton" /> </div> </div> </template> <script> import useVuelidate from "@vuelidate/core"; -import Button from "@/components/BaseComponents/ColoredButton"; +import ColoredButton from "@/components/BaseComponents/ColoredButton"; import ListingService from "@/services/listing.service"; import CommunityService from "@/services/community.service"; +import ImageService from "@/services/image.service"; import { parseCurrentUser } from "@/utils/token-utils"; import { @@ -247,7 +245,7 @@ export default { name: "EditNewItem", components: { - Button, + ColoredButton, }, setup() { @@ -368,12 +366,23 @@ export default { communityIDs: this.updatedItem.selectedCommunities, }; await ListingService.putItem(itemInfo); + await ImageService.putListingImages(this.images); this.$router.push("/itempage/" + this.initialItem.listingID); } }, - addImage(event) { - this.updatedItem.images.push(URL.createObjectURL(event.target.files[0])); + async addImage(event) { + var that = this; + let image = event.target.files[0]; + let fileReader = new FileReader(); + fileReader.onloadend = async function () { + const res = fileReader.result; + const id = await ImageService.postNewImage(res); + + const API_URL = process.env.VUE_APP_BASEURL; + that.item.images.push(API_URL + "images/" + id); + }; + fileReader.readAsArrayBuffer(image); }, onChangeCommunity(e) { @@ -416,6 +425,15 @@ export default { } return false; }, + removeImage(image) { + let newImages = []; + for (let i in this.item.images) { + if (this.item.images[i] != image) { + newImages.push(this.item.images[i]); + } + } + this.item.images = newImages; + }, }, async beforeMount() { diff --git a/src/components/ItemComponents/NewItemForm.vue b/src/components/ItemComponents/NewItemForm.vue index 2fd16fe3b736db08e26b37a8a8880ae8e89ae407..9850b9bbec00f6d7ebef0968d02527254f766953 100644 --- a/src/components/ItemComponents/NewItemForm.vue +++ b/src/components/ItemComponents/NewItemForm.vue @@ -195,21 +195,19 @@ ref="file" style="display: none" @change="addImage" - multiple accept="image/png" /> - <Button :text="'Velg bilde'" @click="$refs.file.click()" /> + <colored-button :text="'Velg bilde'" @click="$refs.file.click()" /> <div v-for="image in item.images" :key="image" class="m-2"> - <img :src="image" class="w-2/5 inline" alt="Bilde av gjenstanden" /> - <!-- @click="removeImage(image)" --> + <form-image-display :image="image" @remove="removeImage(image)" /> </div> </div> <!-- Save item button --> <div class="float-right"> - <Button :text="'Lagre'" @click="saveClicked" id="saveButton" /> + <colored-button :text="'Lagre'" @click="saveClicked" id="saveButton" /> </div> </div> </template> @@ -217,13 +215,11 @@ <script> import useVuelidate from "@vuelidate/core"; import { parseUserFromToken } from "@/utils/token-utils"; -import { - postNewItem, - getMyGroups, - postNewImageCommunity, - PostImagesArrayToListing, -} from "@/utils/apiutil"; -import Button from "@/components/BaseComponents/ColoredButton"; +import ListingService from "@/services/listing.service"; +import CommunityService from "@/services/community.service"; +import ImageService from "@/services/image.service"; +import ColoredButton from "@/components/BaseComponents/ColoredButton"; +import FormImageDisplay from "@/components/BaseComponents/FormImageDisplay.vue"; import { required, @@ -237,7 +233,8 @@ export default { name: "AddNewItem", components: { - Button, + ColoredButton, + FormImageDisplay, }, setup() { @@ -309,7 +306,6 @@ export default { userId: -1, selectedGroupId: -1, selectedGroups: [], - imagesToSend: [], }, //Kategorier skal legges inn ved api/hente fra db, her må det endres etterhvert categories: [ @@ -354,9 +350,9 @@ export default { categoryNames: [this.item.select], communityIDs: this.item.selectedGroups, }; - await postNewItem(itemInfo); + await ListingService.postNewItem(itemInfo); - await PostImagesArrayToListing(this.item.imagesToSend); + await ImageService.PostImagesArrayToListing(this.item.images); this.$router.push("/"); } @@ -373,19 +369,14 @@ export default { let fileReader = new FileReader(); fileReader.onloadend = async function () { const res = fileReader.result; - const id = await postNewImageCommunity(res); + const id = await ImageService.postNewImage(res); const API_URL = process.env.VUE_APP_BASEURL; - that.item.imagesToSend.push(API_URL + "images/" + id); that.item.images.push(API_URL + "images/" + id); }; fileReader.readAsArrayBuffer(image); }, - getGroups: async function () { - this.groups = await getMyGroups(); - }, - onChangeGroup: function (e) { this.selectedGroupId = e.target.value; let alreadyInGroupList = false; @@ -416,8 +407,8 @@ export default { this.item.images = newImages; }, }, - beforeMount() { - this.getGroups(); + async beforeMount() { + this.groups = await CommunityService.getUserCommunities(); }, }; </script> diff --git a/src/services/image.service.js b/src/services/image.service.js new file mode 100644 index 0000000000000000000000000000000000000000..7ebc1fa786bdf0a79c9c193b662777a1bcabfc7f --- /dev/null +++ b/src/services/image.service.js @@ -0,0 +1,47 @@ +import { tokenHeader } from "@/utils/token-utils"; +import axios from "axios"; + +const API_URL = process.env.VUE_APP_BASEURL; + +class ImageService { + postNewImage(image) { + return axios + .post(API_URL + "images", image, { + headers: { ...tokenHeader(), "Content-Type": "image/png" }, + }) + .then((response) => { + return response.data; + }) + .catch((error) => { + console.error(error); + }); + } + + postImagesArrayToListing(images) { + return axios + .post(API_URL + "listing/pictures", images, { + headers: tokenHeader(), + }) + .then((response) => { + return response; + }) + .catch((error) => { + console.error(error.response); + }); + } + + putListingImages(listingID, images) { + return axios + .put(API_URL + "listing/" + listingID + "/pictures", images, { + headers: tokenHeader(), + }) + .then((response) => { + return response; + }) + .catch((error) => { + console.error(error.response); + }); + } +} + +export default new ImageService(); diff --git a/src/services/listing.service.js b/src/services/listing.service.js index d0bfb6ca24e2494ef85e524a3f9bd830a07bc57c..80d3fdc338fd080b740d3abd3fad885ee5fe691f 100644 --- a/src/services/listing.service.js +++ b/src/services/listing.service.js @@ -40,6 +40,19 @@ class ListingService { console.error(error); }); } + + postNewItem(itemInfo) { + return axios + .post(API_URL + "listing", itemInfo, { + headers: tokenHeader(), + }) + .then((response) => { + return response; + }) + .catch((error) => { + console.error(error.response); + }); + } } export default new ListingService();