From 9650ba9b003e02b5bcf8692c0bff69bd5e7cd884 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 12 Mar 2023 12:59:28 -0800 Subject: [PATCH] refator: reuse search page component (#2240) * wip: fix recipe card section * refactor basic search to share composable * fix dialog results * use search for cat/tag/tool pages * update organizer to support name edits * fix composable typing --- .../Domain/Recipe/RecipeCardSection.vue | 4 +- .../Domain/Recipe/RecipeDialogSearch.vue | 44 ++--- .../Domain/Recipe/RecipeOrganizerPage.vue | 178 ++++++++++-------- .../composables/recipes/use-recipe-search.ts | 64 +++++++ frontend/composables/use-context-presents.ts | 8 +- .../pages/group/mealplan/planner/edit.vue | 48 +---- frontend/pages/index.vue | 4 +- frontend/pages/recipes/categories/_slug.vue | 127 ------------- frontend/pages/recipes/categories/index.vue | 1 + frontend/pages/recipes/tags/_slug.vue | 127 ------------- frontend/pages/recipes/tags/index.vue | 5 +- frontend/pages/recipes/tools/_slug.vue | 127 ------------- frontend/pages/recipes/tools/index.vue | 3 +- mealie/repos/repository_generic.py | 3 +- 14 files changed, 205 insertions(+), 538 deletions(-) create mode 100644 frontend/composables/recipes/use-recipe-search.ts delete mode 100644 frontend/pages/recipes/categories/_slug.vue delete mode 100644 frontend/pages/recipes/tags/_slug.vue delete mode 100644 frontend/pages/recipes/tools/_slug.vue diff --git a/frontend/components/Domain/Recipe/RecipeCardSection.vue b/frontend/components/Domain/Recipe/RecipeCardSection.vue index f1edb8abfcc2..d3e3c49e4c99 100644 --- a/frontend/components/Domain/Recipe/RecipeCardSection.vue +++ b/frontend/components/Domain/Recipe/RecipeCardSection.vue @@ -61,7 +61,7 @@ v-if="!$vuetify.breakpoint.xsOnly" :items="[ { - title: $t('general.toggle-view'), + title: $tc('general.toggle-view'), icon: $globals.icons.eye, event: 'toggle-dense-view', }, @@ -81,7 +81,6 @@ :image="recipe.image" :tags="recipe.tags" :recipe-id="recipe.id" - @delete="$emit('delete', recipe.slug)" /> @@ -105,7 +104,6 @@ :image="recipe.image" :tags="recipe.tags" :recipe-id="recipe.id" - @delete="$emit('delete', recipe.slug)" /> diff --git a/frontend/components/Domain/Recipe/RecipeDialogSearch.vue b/frontend/components/Domain/Recipe/RecipeDialogSearch.vue index 2e73994a52fe..47cecf039c0f 100644 --- a/frontend/components/Domain/Recipe/RecipeDialogSearch.vue +++ b/frontend/components/Domain/Recipe/RecipeDialogSearch.vue @@ -5,7 +5,7 @@ import { defineComponent, toRefs, reactive, ref, watch, useRoute } from "@nuxtjs/composition-api"; -import { watchDebounced } from "@vueuse/shared"; import RecipeCardMobile from "./RecipeCardMobile.vue"; import { RecipeSummary } from "~/lib/api/types/recipe"; import { useUserApi } from "~/composables/api"; +import { useRecipeSearch } from "~/composables/recipes/use-recipe-search"; const SELECTED_EVENT = "selected"; export default defineComponent({ components: { @@ -69,7 +69,6 @@ export default defineComponent({ const state = reactive({ loading: false, selectedIndex: -1, - searchResults: [] as RecipeSummary[], }); // =========================================================================== @@ -79,9 +78,9 @@ export default defineComponent({ // Reset or Grab Recipes on Change watch(dialog, (val) => { if (!val) { - search.value = ""; + search.query.value = ""; state.selectedIndex = -1; - state.searchResults = []; + search.data.value = []; } }); @@ -142,30 +141,8 @@ export default defineComponent({ // =========================================================================== // Basic Search const api = useUserApi(); - const search = ref(""); + const search = useRecipeSearch(api); - watchDebounced( - search, - async (val) => { - console.log(val); - if (val) { - state.loading = true; - const { data, error } = await api.recipes.search({ search: val, page: 1, perPage: 10 }); - - if (error || !data) { - console.error(error); - state.searchResults = []; - } else { - state.searchResults = data.items; - } - - state.loading = false; - } - }, - { debounce: 500, maxWait: 1000 } - ); - - // =========================================================================== // Select Handler function handleSelect(recipe: RecipeSummary) { @@ -173,7 +150,14 @@ export default defineComponent({ context.emit(SELECTED_EVENT, recipe); } - return { ...toRefs(state), dialog, open, close, handleSelect, search }; + return { + ...toRefs(state), + dialog, + open, + close, + handleSelect, + search, + }; }, }); diff --git a/frontend/components/Domain/Recipe/RecipeOrganizerPage.vue b/frontend/components/Domain/Recipe/RecipeOrganizerPage.vue index 20e1e167690a..636ce68112b7 100644 --- a/frontend/components/Domain/Recipe/RecipeOrganizerPage.vue +++ b/frontend/components/Domain/Recipe/RecipeOrganizerPage.vue @@ -1,10 +1,10 @@ diff --git a/frontend/pages/recipes/categories/_slug.vue b/frontend/pages/recipes/categories/_slug.vue deleted file mode 100644 index 9f2314353cdc..000000000000 --- a/frontend/pages/recipes/categories/_slug.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - diff --git a/frontend/pages/recipes/categories/index.vue b/frontend/pages/recipes/categories/index.vue index 47fe799dfe31..63f012bbc42e 100644 --- a/frontend/pages/recipes/categories/index.vue +++ b/frontend/pages/recipes/categories/index.vue @@ -6,6 +6,7 @@ :icon="$globals.icons.tags" item-type="categories" @delete="actions.deleteOne" + @update="actions.updateOne" > diff --git a/frontend/pages/recipes/tags/_slug.vue b/frontend/pages/recipes/tags/_slug.vue deleted file mode 100644 index a989f961e269..000000000000 --- a/frontend/pages/recipes/tags/_slug.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - diff --git a/frontend/pages/recipes/tags/index.vue b/frontend/pages/recipes/tags/index.vue index 4afa2870eb5c..f8d1f21857fd 100644 --- a/frontend/pages/recipes/tags/index.vue +++ b/frontend/pages/recipes/tags/index.vue @@ -6,8 +6,9 @@ :icon="$globals.icons.tags" item-type="tags" @delete="actions.deleteOne" + @update="actions.updateOne" > - + @@ -32,7 +33,7 @@ export default defineComponent({ head() { return { title: this.$tc("tag.tags"), - } + }; }, }); diff --git a/frontend/pages/recipes/tools/_slug.vue b/frontend/pages/recipes/tools/_slug.vue deleted file mode 100644 index dd6a907d1b30..000000000000 --- a/frontend/pages/recipes/tools/_slug.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - diff --git a/frontend/pages/recipes/tools/index.vue b/frontend/pages/recipes/tools/index.vue index 3bcad935f5ca..9f086448d4fe 100644 --- a/frontend/pages/recipes/tools/index.vue +++ b/frontend/pages/recipes/tools/index.vue @@ -6,8 +6,9 @@ :items="tools" item-type="tools" @delete="actions.deleteOne" + @update="actions.updateOne" > - + diff --git a/mealie/repos/repository_generic.py b/mealie/repos/repository_generic.py index 910366ad3bf8..7daf7bee7233 100644 --- a/mealie/repos/repository_generic.py +++ b/mealie/repos/repository_generic.py @@ -342,6 +342,8 @@ class RepositoryGeneric(Generic[Schema, Model]): count_query = select(func.count()).select_from(query) count = self.session.scalar(count_query) + if not count: + count = 0 # interpret -1 as "get_all" if pagination.per_page == -1: @@ -349,7 +351,6 @@ class RepositoryGeneric(Generic[Schema, Model]): try: total_pages = ceil(count / pagination.per_page) - except ZeroDivisionError: total_pages = 0