From 23a2e8fe389e9ab9525bc1cc4bafe7e99e3e297e Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Thu, 16 Apr 2026 15:13:59 -0700 Subject: [PATCH] feat: remove and reorder meal types in weekly planner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MealPlanGrid: edit-mode toggle (visible when >1 meal type) reveals per-row ↑/↓ reorder and ✕ remove controls; label column expands to auto width via CSS class swap - mealPlan store: removeMealType() and reorderMealTypes() — both send the full updated array to the existing PATCH /meal-plans/{id} endpoint - MealPlanView: wires remove-meal-type and reorder-meal-types emits; shares mealTypeAdding loading flag to disable controls during save - Guard: remove disabled when only one type remains (always keep ≥1) --- frontend/src/components/MealPlanGrid.vue | 98 +++++++++++++++++++++--- frontend/src/components/MealPlanView.vue | 21 +++++ frontend/src/stores/mealPlan.ts | 17 +++- 3 files changed, 126 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/MealPlanGrid.vue b/frontend/src/components/MealPlanGrid.vue index 6fdf0e6..1bfcc94 100644 --- a/frontend/src/components/MealPlanGrid.vue +++ b/frontend/src/components/MealPlanGrid.vue @@ -14,7 +14,7 @@
-
+
-
{{ mealType }}
+
+ + +
- -
- +
@@ -60,22 +90,44 @@ import { ref } from 'vue' import { useMealPlanStore } from '../stores/mealPlan' -defineProps<{ +const props = defineProps<{ activeMealTypes: string[] canAddMealType: boolean + mealTypeChanging?: boolean }>() -defineEmits<{ +const emit = defineEmits<{ (e: 'slot-click', payload: { dayOfWeek: number; mealType: string }): void (e: 'add-meal-type'): void + (e: 'remove-meal-type', mealType: string): void + (e: 'reorder-meal-types', newOrder: string[]): void }>() const store = useMealPlanStore() const { getSlot } = store const collapsed = ref(false) +const editing = ref(false) const DAY_LABELS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] + +function onMoveUp(idx: number) { + if (idx === 0) return + const arr = [...props.activeMealTypes] + const tmp = arr[idx - 1]! + arr[idx - 1] = arr[idx]! + arr[idx] = tmp + emit('reorder-meal-types', arr) +} + +function onMoveDown(idx: number) { + if (idx === props.activeMealTypes.length - 1) return + const arr = [...props.activeMealTypes] + const tmp = arr[idx]! + arr[idx] = arr[idx + 1]! + arr[idx + 1] = tmp + emit('reorder-meal-types', arr) +} diff --git a/frontend/src/components/MealPlanView.vue b/frontend/src/components/MealPlanView.vue index c1d4c23..eff3be9 100644 --- a/frontend/src/components/MealPlanView.vue +++ b/frontend/src/components/MealPlanView.vue @@ -25,8 +25,11 @@ @@ -273,6 +276,24 @@ async function onPickMealType(mealType: string) { mealTypeAdding.value = false } } + +async function onRemoveMealType(mealType: string) { + mealTypeAdding.value = true + try { + await store.removeMealType(mealType) + } finally { + mealTypeAdding.value = false + } +} + +async function onReorderMealTypes(newOrder: string[]) { + mealTypeAdding.value = true + try { + await store.reorderMealTypes(newOrder) + } finally { + mealTypeAdding.value = false + } +}