From 6ff577ece1df04bc535a8935738f84756e147251 Mon Sep 17 00:00:00 2001 From: Tobias Zoghaib Date: Mon, 9 Sep 2024 14:33:29 +0200 Subject: [PATCH] Store products in a basket, display list of products in basket --- software/src/App.vue | 20 ++++--- software/src/data/models/productModel.ts | 1 + software/src/data/stores/basketStore.ts | 30 ++++++++++ software/src/pages/ProductsPage.vue | 6 -- software/src/pages/basketPage/basketItem.vue | 33 +++++++++++ software/src/pages/basketPage/index.vue | 35 +++++++++++ software/src/pages/productsPage/index.vue | 58 ++++++++++--------- .../src/pages/productsPage/productDetails.vue | 16 ++++- software/src/router/routes.ts | 2 + software/src/scripts/productScripts.ts | 5 ++ 10 files changed, 161 insertions(+), 45 deletions(-) create mode 100644 software/src/data/stores/basketStore.ts delete mode 100644 software/src/pages/ProductsPage.vue create mode 100644 software/src/pages/basketPage/basketItem.vue create mode 100644 software/src/pages/basketPage/index.vue create mode 100644 software/src/scripts/productScripts.ts diff --git a/software/src/App.vue b/software/src/App.vue index 1fac25f..7b10680 100644 --- a/software/src/App.vue +++ b/software/src/App.vue @@ -4,8 +4,10 @@ import axios from 'axios'; import { useTheme } from 'vuetify/lib/framework.mjs'; import { useUserStore } from './data/stores/userStore'; import vuetify from './plugins/vuetify'; +import { useBasketStore } from './data/stores/basketStore'; const userStore = useUserStore() +const basketStore = useBasketStore() const categories = ref([]) const theme = useTheme() const navRail = ref(vuetify.display.mobile) @@ -37,7 +39,13 @@ requestAllCategories()
- + + + @@ -61,14 +69,8 @@ requestAllCategories() - - - - - - - - + + diff --git a/software/src/data/models/productModel.ts b/software/src/data/models/productModel.ts index 7f266b9..96596c1 100644 --- a/software/src/data/models/productModel.ts +++ b/software/src/data/models/productModel.ts @@ -7,6 +7,7 @@ export class ProductModel { price: number = 0 discount: number = 0 rating: number = 1 + nrOfArticles: number = 2 imageUrl: string = "" createdAt: string = "" updatedAt: string = "" diff --git a/software/src/data/stores/basketStore.ts b/software/src/data/stores/basketStore.ts new file mode 100644 index 0000000..bd510c9 --- /dev/null +++ b/software/src/data/stores/basketStore.ts @@ -0,0 +1,30 @@ +import { defineStore } from "pinia"; +import { useLocalStorage } from "@vueuse/core"; +import { ProductModel } from "../models/productModel"; +import { calcProductPrice } from "@/scripts/productScripts"; + +export const useBasketStore = defineStore('basket', { + state: () => ({ + productsInBasket: useLocalStorage>("hackmycart/basketStore/productsInBasket", []) + }), + + getters: { + getTotalPrice() { + let result = 0 + + for (let product of this.productsInBasket) { + result += calcProductPrice(product) + } + + return result + } + }, + + actions: { + removeProductFromBasket(product: ProductModel) { + this.productsInBasket = this.productsInBasket.filter((p: ProductModel) => + p.id != product.id + ) + } + } +}) diff --git a/software/src/pages/ProductsPage.vue b/software/src/pages/ProductsPage.vue deleted file mode 100644 index ba1c9f8..0000000 --- a/software/src/pages/ProductsPage.vue +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/software/src/pages/basketPage/basketItem.vue b/software/src/pages/basketPage/basketItem.vue new file mode 100644 index 0000000..22ffb5c --- /dev/null +++ b/software/src/pages/basketPage/basketItem.vue @@ -0,0 +1,33 @@ + + + \ No newline at end of file diff --git a/software/src/pages/basketPage/index.vue b/software/src/pages/basketPage/index.vue new file mode 100644 index 0000000..d8e9072 --- /dev/null +++ b/software/src/pages/basketPage/index.vue @@ -0,0 +1,35 @@ + + + \ No newline at end of file diff --git a/software/src/pages/productsPage/index.vue b/software/src/pages/productsPage/index.vue index 794e2a9..fed26d2 100644 --- a/software/src/pages/productsPage/index.vue +++ b/software/src/pages/productsPage/index.vue @@ -114,34 +114,36 @@ watch(() => onlyDiscounts.value, () => { filterProducts() }) \ No newline at end of file diff --git a/software/src/pages/productsPage/productDetails.vue b/software/src/pages/productsPage/productDetails.vue index 0aec98c..9cd06f1 100644 --- a/software/src/pages/productsPage/productDetails.vue +++ b/software/src/pages/productsPage/productDetails.vue @@ -3,14 +3,21 @@ import { VNumberInput } from 'vuetify/labs/VNumberInput' import { ProductModel } from '@/data/models/productModel'; import { CategoryModel } from '@/data/models/categoryModel'; import { ref } from 'vue'; +import { useBasketStore } from '@/data/stores/basketStore'; const showDialog = defineModel("showDialog", { type: Boolean }) const nrOfArticles = ref(1) +const basketStore = useBasketStore() -defineProps({ +const props = defineProps({ product: ProductModel, productCategory: CategoryModel }) + +function addProductToBasket() { + basketStore.productsInBasket.push(props.product) + showDialog.value = false +}