From 73cf67663d53733bdce41f5fe021e819327237e3 Mon Sep 17 00:00:00 2001 From: Katarzyna Szlejter <katarzsz@stud.ntnu.no> Date: Fri, 5 May 2023 13:35:09 +0200 Subject: [PATCH] Generate weekmenu --- src/components/Navbar.vue | 2 +- src/components/RecipeCard.vue | 48 ++++++++++++-------- src/router/index.js | 8 ++-- src/stores/weekmenuStore.js | 29 ++++++++++++ src/util/API.js | 30 +++++++++++-- src/views/PlannerView.vue | 29 ------------ src/views/WeekMenuView.vue | 84 +++++++++++++++++++++++++++++++++++ 7 files changed, 175 insertions(+), 55 deletions(-) create mode 100644 src/stores/weekmenuStore.js delete mode 100644 src/views/PlannerView.vue create mode 100644 src/views/WeekMenuView.vue diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue index b0e13c3..85fab9a 100644 --- a/src/components/Navbar.vue +++ b/src/components/Navbar.vue @@ -13,7 +13,7 @@ </RouterLink> </li> <li> - <RouterLink to="/planner" aria-label="link to week menu"> + <RouterLink to="/weekmenu" aria-label="link to week menu"> <Icon icon="ic:baseline-calendar-month" :color="iconColor" :style="{ fontSize: iconSize }"/> </RouterLink> </li> diff --git a/src/components/RecipeCard.vue b/src/components/RecipeCard.vue index 1d6cdc9..1e50a1b 100644 --- a/src/components/RecipeCard.vue +++ b/src/components/RecipeCard.vue @@ -1,24 +1,32 @@ <script> import { Icon } from '@iconify/vue'; +import router from "@/router"; export default { props: ['recipe'], components: { Icon + }, + methods: { + redirectToRecipe() { + router.push("/recipe/"+this.recipe.recipe.id); + } } } </script> <template> - <div class="recipe_card"> - <div class="recipe_details"> + <h3 class="recipe-day">{{recipe.day}}</h3> + + <div class="recipe-card" @click="redirectToRecipe"> + <div class="recipe-details"> <div class="title"> - <h2>{{ recipe.title }}</h2> - <p>{{ recipe.description }}</p> + <h2>{{ recipe.recipe.title }}</h2> +<!-- <p>{{ recipe.recipe.description }}</p>--> </div> <div class="time"> <Icon icon="mdi:timer" :style="{ fontSize: '2rem' }" /> - {{ recipe.time }} + {{ recipe.recipe.time }} </div> </div> </div> @@ -26,23 +34,27 @@ export default { <style scoped lang="scss"> @import "../style.scss"; - -.recipe_card { +.recipe-day { + /* + text-align: center; + */ + margin-bottom: 5px; +} +.recipe-card { align-content: center; - + cursor: pointer; height: 5rem; max-width: 30rem; gap: .5rem; - margin-inline: .4rem; - + //margin-inline: .4rem; border: 1px solid black; border-radius: 1rem; overflow: hidden; - + margin-bottom: 20px; box-shadow: 2px 2px $green; - transition: all ease 150ms; + &:hover { box-shadow: 4px 4px $green; } @@ -53,27 +65,27 @@ export default { } } -.recipe_details { +.recipe-details { margin-top: .4em; margin-inline: 1em; - + align-items: center; display: flex; flex-direction: row; justify-content: space-between; .title { + font-size: 12px; + max-width: 260px; p { overflow: hidden; white-space: nowrap; text-overflow: "..."; - max-width: 20em; } } - .time { - width: 4em; - + font-size: 14px; + width: 5em; display: flex; flex-direction: column; justify-content: center; diff --git a/src/router/index.js b/src/router/index.js index 8d1e93c..cafcdb0 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -6,7 +6,7 @@ import LoginView from '../views/LoginView.vue' import SelectProfileView from '../views/SelectProfileView.vue' import ProfileCreationView from '../views/ProfileCreationView.vue' import RegisterAccountView from '../views/RegisterAccountView.vue' -import PlannerView from '../views/PlannerView.vue' +import WeekMenu from '../views/WeekMenuView.vue' import PinCodeView from "@/views/PinCodeView.vue"; import FridgeView from "@/views/FridgeView.vue"; import RecipeView from "@/views/RecipeView.vue"; @@ -52,9 +52,9 @@ const router = createRouter({ component: FridgeView }, { - path: '/planner', - name: 'planner', - component: PlannerView + path: '/weekmenu', + name: 'weekmenu', + component: WeekMenu }, { path: '/recipe/:id', diff --git a/src/stores/weekmenuStore.js b/src/stores/weekmenuStore.js new file mode 100644 index 0000000..ec2db23 --- /dev/null +++ b/src/stores/weekmenuStore.js @@ -0,0 +1,29 @@ +import { defineStore } from "pinia"; + +export const useWeekMenuStore = defineStore("weekmenu", { + state: () => { + return { + items: [] + }; + }, + persist: { + storage: localStorage + }, + getters: { + getItems() { + return this.items; + }, + getItem(state){ + return(id) => state.items.filter(item => + item.id === id) + } + }, + actions: { + reset() { + this.$reset(); + }, + addWeekmenu(item){ + this.items.push(item); + } + } +}); \ No newline at end of file diff --git a/src/util/API.js b/src/util/API.js index bfa4263..20b02ff 100644 --- a/src/util/API.js +++ b/src/util/API.js @@ -498,10 +498,34 @@ export const API = { }, + getWeekMenu: () => { + const authStore = useAuthStore(); + return axios.get(`${import.meta.env.VITE_BACKEND_URL}/weekmenu`, { + headers: { Authorization: `Bearer ${authStore.token}` }, + }) + .then((response) => { + console.log(response.data); + return response.data; + }) + .catch(() => { + throw new Error("Weekmenu not found"); + }); + }, - - - + generateWeekMenu: (numberOfPeople) => { + const authStore = useAuthStore(); + return axios.put(`${import.meta.env.VITE_BACKEND_URL}/weekmenu/${numberOfPeople}`, "", { + headers: { + Authorization: `Bearer ${authStore.token}`, + } + }) + .then((response) => { + return response.data; + }) + .catch(() => { + throw new Error(); + }) +} } \ No newline at end of file diff --git a/src/views/PlannerView.vue b/src/views/PlannerView.vue deleted file mode 100644 index 459ebb9..0000000 --- a/src/views/PlannerView.vue +++ /dev/null @@ -1,29 +0,0 @@ -<script> -import RecipeCard from '../components/RecipeCard.vue'; -export default { - components: { RecipeCard } -} -</script> - -<template> - <div class="planner_container"> - <h1>Denne uken</h1> - <div class="recipe_list"> - <RecipeCard :recipe="{ id: 1, title: 'Kjøttkaker', description: 'Skikkelig gode kjøttkaker', time: '15 min' }" /> - <RecipeCard :recipe="{ id: 1, title: 'Kjøttkaker', description: 'Skikkelig gode kjøttkaker med veldig veldig lang beskrivelse', time: '15 min' }" /> - - </div> - </div> -</template> - -<style> -h1 { - padding-left: 0.5em; -} - -.recipe_list { - display: flex; - flex-direction: column; - gap: 1rem; -} -</style> \ No newline at end of file diff --git a/src/views/WeekMenuView.vue b/src/views/WeekMenuView.vue new file mode 100644 index 0000000..34b7e87 --- /dev/null +++ b/src/views/WeekMenuView.vue @@ -0,0 +1,84 @@ +<script> +import {API} from "@/util/API"; +import RecipeCard from '../components/RecipeCard.vue'; + +export default { + components: { RecipeCard }, + data() { + return { + weekMenu: {}, + numberOfPeople: 1 + } + }, + methods: { + adjustNumberOfPeople(event) { + this.numberOfPeople = event.target.value; + }, + generateWeekMenu() { + API.generateWeekMenu(this.numberOfPeople).then((menu) => { + this.weekMenu = menu; + this.recipes = menu.dayMenus; + }) + }, + loadWeekMenu() { + API.getWeekMenu() + .then((weekmenu) => { + this.weekMenu = weekmenu; + this.recipes = this.weekMenu.dayMenus; + }) + } + }, + mounted() { + this.loadWeekMenu() + } +} +</script> + +<template> + <div class="weekmenu-container"> + <h1>Ukemeny</h1> + <div class="generate-weekmenu"> + <label for="number-of-people">Antall personer:</label> + <input id="number-of-people" type="number" min="1" max="20" value="1" @change="event => adjustNumberOfPeople(event)"> + <button type="button" @click="generateWeekMenu">Generer ukemeny</button> + </div> + + <div class="weekmenu-recipes"> + <RecipeCard v-for="recipe in this.weekMenu.dayMenus" :recipe=recipe></RecipeCard> + </div> + </div> +</template> + +<style scoped lang="scss"> + + .generate-weekmenu { + padding: 20px 0; + label { + margin-right: 10px; + } + #number-of-people { + width: 55px; + height: 30px; + margin-right: 5px; + } + button { + height: 35px; + border-radius: 0; + cursor: pointer; + color: black; + border: 1px solid black; + padding: .5rem 1rem; + border: 2px base.$green solid; + background-color: base.$light-green; + } + } + .weekmenu-container { + padding: 0 10px 60px; + } + .weekmenu-recipes { + display: flex; + flex-direction: column; + } + + +</style> \ No newline at end of file -- GitLab