munch-ease-frontend/src/components/meals/MealPlanPage.vue

147 lines
2.9 KiB
Vue
Raw Normal View History

2024-01-13 02:00:15 +00:00
<template>
2025-10-18 02:08:22 +00:00
<div>
2025-10-18 03:16:34 +00:00
<ul
v-if="meals.length"
class="meals-list"
>
<li
v-for="meal in meals"
:key="meal.id"
>
2025-10-18 02:08:22 +00:00
<meal-card :meal="meal" />
2025-10-18 03:16:34 +00:00
<button
class="toggle-actions"
@click="selectedMeal = meal == selectedMeal ? null : meal"
>
2025-10-18 02:08:22 +00:00
<img
:src="
meal == selectedMeal
? require('@/assets/chevron-down.svg')
: require('@/assets/chevron-up.svg')
"
2025-10-18 03:16:34 +00:00
>
2025-10-18 02:08:22 +00:00
</button>
2025-10-18 03:16:34 +00:00
<ul
v-if="selectedMeal == meal"
class="actions"
>
2025-10-18 02:08:22 +00:00
<li>
2025-10-18 03:16:34 +00:00
<router-link
class="nav-link"
:to="`/meals/${selectedMeal.id}`"
active-class="active"
2025-10-18 02:08:22 +00:00
>
2025-10-18 03:16:34 +00:00
Edit Meal
</router-link>
2025-10-18 02:08:22 +00:00
</li>
<li><a @click="markConsumed">Mark Consumed</a></li>
2025-10-18 03:16:34 +00:00
<li>
<a
class="button"
@click="deleteSelectedMeal"
>Remove</a>
</li>
2024-01-13 02:00:15 +00:00
</ul>
2025-10-18 02:08:22 +00:00
</li>
</ul>
<div v-if="!meals.length">
<em>No meals planned</em>
2024-01-13 02:00:15 +00:00
</div>
2025-10-18 02:08:22 +00:00
<action-item
title="Plan Meal"
:image="require('@/assets/plan-meal.svg')"
2025-10-18 03:16:34 +00:00
@click="() => $router.push('/meals/add')"
2025-10-18 02:08:22 +00:00
/>
</div>
2024-01-13 02:00:15 +00:00
</template>
2025-10-18 03:16:34 +00:00
<script setup>
import { ref, onBeforeMount } from 'vue'
import ActionItem from '@/components/ActionItem.vue'
import MealCard from '@/components/meals/MealCard.vue'
import { getUpcomingMeals, markMealConsumed, deleteMeal } from '@/composables/useMeals'
const from = new Date()
from.setTime(0)
const to = new Date()
to.setDate(to.getDate() + 7)
const meals = ref([])
const selectedMeal = ref(null)
onBeforeMount(async () => {
meals.value = await getUpcomingMeals(from, to)
})
async function deleteSelectedMeal() {
if (!selectedMeal.value) return
await deleteMeal(selectedMeal.value.id)
meals.value = meals.value.filter((m) => m.id !== selectedMeal.value.id)
selectedMeal.value = null
}
async function markConsumed() {
if (!selectedMeal.value) return
await markMealConsumed(selectedMeal.value.id)
meals.value = meals.value.filter((m) => m.id !== selectedMeal.value.id)
}
</script>
2024-01-13 02:00:15 +00:00
<style scoped>
li {
2025-10-18 02:08:22 +00:00
list-style-type: none;
2024-01-13 02:00:15 +00:00
}
2024-05-04 01:52:31 +00:00
ul.meals-list {
2025-10-18 02:08:22 +00:00
padding: 0;
2024-05-04 01:52:31 +00:00
}
2024-05-02 12:07:55 +00:00
.toggle-actions {
2025-10-18 02:08:22 +00:00
cursor: pointer;
background-color: #fff;
border: none;
border-bottom: solid 1px #ccc;
padding: 0 2em;
margin: 0;
2024-05-02 12:07:55 +00:00
}
.toggle-actions img {
2025-10-18 02:08:22 +00:00
width: 2em;
height: 2em;
2024-05-02 12:07:55 +00:00
}
.meals-list > li {
2025-10-18 02:08:22 +00:00
margin-bottom: 1em;
padding: 0;
border: 1px solid #ccc;
border-radius: 5px;
padding: 10px;
2024-05-02 12:07:55 +00:00
}
ul.actions {
2025-10-18 02:08:22 +00:00
margin: 0;
padding: 0;
2024-01-13 02:00:15 +00:00
}
.actions li {
2025-10-18 02:08:22 +00:00
display: block;
border: 1px solid #ccc;
2024-01-13 02:00:15 +00:00
}
.actions li:hover {
2025-10-18 02:08:22 +00:00
background-color: #ccc;
2024-01-13 02:00:15 +00:00
}
.actions li a {
2025-10-18 02:08:22 +00:00
display: block;
text-decoration: none;
color: #000;
width: 100%;
cursor: pointer;
padding-top: 2ex;
padding-bottom: 2ex;
2024-01-13 02:00:15 +00:00
}
</style>