diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1f26196a0..9a665fe1a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5585,10 +5585,17 @@ "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=" }, "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "requires": { + "fastest-levenshtein": "^1.0.7" + } + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==" }, "faye-websocket": { "version": "0.11.3", @@ -8334,6 +8341,14 @@ "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "word-wrap": "~1.2.3" + }, + "dependencies": { + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + } } }, "ora": { diff --git a/frontend/package.json b/frontend/package.json index 35b4ca173..1b2d0f597 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,6 +13,7 @@ "@smartweb/vue-flash-message": "^0.6.10", "axios": "^0.21.1", "core-js": "^3.8.2", + "fast-levenshtein": "^3.0.0", "fuse.js": "^6.4.6", "qs": "^6.9.6", "v-jsoneditor": "^1.4.2", diff --git a/frontend/src/api/mealplan.js b/frontend/src/api/mealplan.js index 27c389b1d..0271f51de 100644 --- a/frontend/src/api/mealplan.js +++ b/frontend/src/api/mealplan.js @@ -8,9 +8,10 @@ const mealPlanURLs = { all: `${prefix}all`, create: `${prefix}create`, thisWeek: `${prefix}this-week`, - update: (planID) => `${prefix}${planID}`, - delete: (planID) => `${prefix}${planID}`, + update: planID => `${prefix}${planID}`, + delete: planID => `${prefix}${planID}`, today: `${prefix}today`, + shopping: planID => `${prefix}${planID}/shopping-list`, }; export default { @@ -43,4 +44,9 @@ export default { let response = await apiReq.put(mealPlanURLs.update(id), body); return response; }, + + async shoppingList(id) { + let response = await apiReq.get(mealPlanURLs.shopping(id)); + return response.data; + }, }; diff --git a/frontend/src/components/MealPlan/ShoppingListDialog.vue b/frontend/src/components/MealPlan/ShoppingListDialog.vue new file mode 100644 index 000000000..392d8dcf7 --- /dev/null +++ b/frontend/src/components/MealPlan/ShoppingListDialog.vue @@ -0,0 +1,112 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/src/components/UI/CategorySidebar.vue b/frontend/src/components/UI/CategorySidebar.vue index 3d6294cf7..7b71458d4 100644 --- a/frontend/src/components/UI/CategorySidebar.vue +++ b/frontend/src/components/UI/CategorySidebar.vue @@ -1,20 +1,42 @@ diff --git a/mealie/routes/meal_routes.py b/mealie/routes/meal_routes.py index 9df739e25..69a716d83 100644 --- a/mealie/routes/meal_routes.py +++ b/mealie/routes/meal_routes.py @@ -1,5 +1,6 @@ from typing import List +from db.database import db from db.db_setup import generate_session from fastapi import APIRouter, Depends, HTTPException from services.meal_services import MealPlan @@ -16,6 +17,21 @@ def get_all_meals(session: Session = Depends(generate_session)): return MealPlan.get_all(session) +@router.get("/{id}/shopping-list") +def get_shopping_list(id: str, session: Session = Depends(generate_session)): + + #! Refactor into Single Database Call + mealplan = db.meals.get(session, id) + slugs = [x.get("slug") for x in mealplan.get("meals")] + recipes = [db.recipes.get(session, x) for x in slugs] + ingredients = [ + {"name": x.get("name"), "recipeIngredient": x.get("recipeIngredient")} + for x in recipes + ] + + return ingredients + + @router.post("/create") def set_meal_plan(data: MealPlan, session: Session = Depends(generate_session)): """ Creates a meal plan database entry """