From f9b71f4b4c4638fc9b539fd839f329b1e4590999 Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Fri, 23 Feb 2024 18:00:58 +0000
Subject: [PATCH 07/15] translated owner string
---
frontend/pages/shopping-lists/_id.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/pages/shopping-lists/_id.vue b/frontend/pages/shopping-lists/_id.vue
index b8fb46b606..d862588548 100644
--- a/frontend/pages/shopping-lists/_id.vue
+++ b/frontend/pages/shopping-lists/_id.vue
@@ -81,7 +81,7 @@
:items="allUsers"
item-text="fullName"
item-value="id"
- :label="'Owner'"
+ :label="$t('general.owner')"
:prepend-icon="$globals.icons.user"
/>
From ac3514f4c6e8fa79db550d1f0efee5bdea717bff Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Fri, 23 Feb 2024 18:09:23 +0000
Subject: [PATCH 08/15] fixed broken migrations
---
..._b04a08da2108_added_shopping_list_label_settings.py | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/alembic/versions/2023-02-21-22.03.19_b04a08da2108_added_shopping_list_label_settings.py b/alembic/versions/2023-02-21-22.03.19_b04a08da2108_added_shopping_list_label_settings.py
index a230433292..fdc7046ca3 100644
--- a/alembic/versions/2023-02-21-22.03.19_b04a08da2108_added_shopping_list_label_settings.py
+++ b/alembic/versions/2023-02-21-22.03.19_b04a08da2108_added_shopping_list_label_settings.py
@@ -9,7 +9,7 @@
from uuid import uuid4
import sqlalchemy as sa
-from sqlalchemy.orm.session import Session
+from sqlalchemy import orm
import mealie.db.migration_types
from alembic import op
@@ -23,8 +23,10 @@
depends_on = None
-def populate_shopping_lists_multi_purpose_labels(shopping_lists_multi_purpose_labels_table: sa.Table, session: Session):
- shopping_lists = session.query(ShoppingList).all()
+def populate_shopping_lists_multi_purpose_labels(
+ shopping_lists_multi_purpose_labels_table: sa.Table, session: orm.Session
+):
+ shopping_lists = session.query(ShoppingList).options(orm.load_only(ShoppingList.id, ShoppingList.group_id)).all()
shopping_lists_labels_data: list[dict] = []
for shopping_list in shopping_lists:
@@ -60,7 +62,7 @@ def upgrade():
)
# ### end Alembic commands ###
- session = Session(bind=op.get_bind())
+ session = orm.Session(bind=op.get_bind())
populate_shopping_lists_multi_purpose_labels(shopping_lists_multi_purpose_labels_table, session)
From 4a1371417751ca1a4769c924ea7afbe428118200 Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Fri, 23 Feb 2024 18:09:35 +0000
Subject: [PATCH 09/15] updated tests to include userId
---
.../user_group_tests/test_group_shopping_lists.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tests/integration_tests/user_group_tests/test_group_shopping_lists.py b/tests/integration_tests/user_group_tests/test_group_shopping_lists.py
index b3cdd434cf..dd64810890 100644
--- a/tests/integration_tests/user_group_tests/test_group_shopping_lists.py
+++ b/tests/integration_tests/user_group_tests/test_group_shopping_lists.py
@@ -34,6 +34,7 @@ def test_shopping_lists_create_one(api_client: TestClient, unique_user: TestUser
assert response_list["name"] == payload["name"]
assert response_list["groupId"] == str(unique_user.group_id)
+ assert response_list["userId"] == str(unique_user.user_id)
def test_shopping_lists_get_one(api_client: TestClient, unique_user: TestUser, shopping_lists: list[ShoppingListOut]):
@@ -47,6 +48,7 @@ def test_shopping_lists_get_one(api_client: TestClient, unique_user: TestUser, s
assert response_list["id"] == str(shopping_list.id)
assert response_list["name"] == shopping_list.name
assert response_list["groupId"] == str(shopping_list.group_id)
+ assert response_list["userId"] == str(shopping_list.user_id)
def test_shopping_lists_update_one(
@@ -58,6 +60,7 @@ def test_shopping_lists_update_one(
"name": random_string(10),
"id": str(sample_list.id),
"groupId": str(sample_list.group_id),
+ "userId": str(sample_list.user_id),
"listItems": [],
}
@@ -71,6 +74,7 @@ def test_shopping_lists_update_one(
assert response_list["id"] == str(sample_list.id)
assert response_list["name"] == payload["name"]
assert response_list["groupId"] == str(sample_list.group_id)
+ assert response_list["userId"] == str(sample_list.user_id)
def test_shopping_lists_delete_one(
From 0abe8b1921821a913ced0e9af0bf300a8e13d2de Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Fri, 23 Feb 2024 18:12:06 +0000
Subject: [PATCH 10/15] fixed missing group_id filter
---
...4-02-23-16.15.07_2298bb460ffd_added_user_to_shopping_list.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/alembic/versions/2024-02-23-16.15.07_2298bb460ffd_added_user_to_shopping_list.py b/alembic/versions/2024-02-23-16.15.07_2298bb460ffd_added_user_to_shopping_list.py
index 024497e921..88570eff81 100644
--- a/alembic/versions/2024-02-23-16.15.07_2298bb460ffd_added_user_to_shopping_list.py
+++ b/alembic/versions/2024-02-23-16.15.07_2298bb460ffd_added_user_to_shopping_list.py
@@ -41,7 +41,7 @@ def find_user_id_for_group(group_id: UUID):
except orm.exc.NoResultFound:
# fallback to any user
user_id = session.execute(
- sa.text("SELECT id FROM users LIMIT 1").bindparams(group_id=group_id)
+ sa.text("SELECT id FROM users WHERE group_id=:group_id LIMIT 1").bindparams(group_id=group_id)
).scalar_one()
return user_id
From 44cd2fef1c984ba657b2214fa693a2eb04af7dd6 Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Fri, 23 Feb 2024 18:58:47 +0000
Subject: [PATCH 11/15] fixed trailing quote
---
frontend/pages/shopping-lists/index.vue | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frontend/pages/shopping-lists/index.vue b/frontend/pages/shopping-lists/index.vue
index 6f20dca742..54e555ab81 100644
--- a/frontend/pages/shopping-lists/index.vue
+++ b/frontend/pages/shopping-lists/index.vue
@@ -27,8 +27,8 @@
v-if="showAll || ($auth.user && $auth.user.id == list.userId)"
:key="list.id"
class="my-2 left-border"
- :to="`/shopping-lists/${list.id}`
- ">
+ :to="`/shopping-lists/${list.id}`"
+ >
{{ $globals.icons.cartCheck }}
From 478a4e5d7311f4063806f46a2d2b03e6711af446 Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Fri, 23 Feb 2024 19:11:28 +0000
Subject: [PATCH 12/15] fixed showAll centering and added to recipe dialog
---
.../Recipe/RecipeDialogAddToShoppingList.vue | 14 ++++++++++++++
frontend/pages/shopping-lists/index.vue | 2 +-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
index 1992ca3797..00749c62ec 100644
--- a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
+++ b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
@@ -4,6 +4,7 @@
+
+
+ {{ $t("general.cancel") }}
+
+
+
+
+
([]);
diff --git a/frontend/pages/shopping-lists/index.vue b/frontend/pages/shopping-lists/index.vue
index 54e555ab81..613d8d84c2 100644
--- a/frontend/pages/shopping-lists/index.vue
+++ b/frontend/pages/shopping-lists/index.vue
@@ -17,7 +17,7 @@
-
+
From ae8ea16dab294ed5469211ef5854631cb4a9f7d7 Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Fri, 23 Feb 2024 19:17:08 +0000
Subject: [PATCH 13/15] lint
---
.../components/Domain/Recipe/RecipeDialogAddToShoppingList.vue | 2 +-
frontend/pages/shopping-lists/_id.vue | 3 ++-
frontend/pages/shopping-lists/index.vue | 2 +-
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
index 00749c62ec..193f13928e 100644
--- a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
+++ b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
@@ -24,7 +24,7 @@
{{ $t("general.cancel") }}
-
+
diff --git a/frontend/pages/shopping-lists/_id.vue b/frontend/pages/shopping-lists/_id.vue
index d862588548..7dd12c9929 100644
--- a/frontend/pages/shopping-lists/_id.vue
+++ b/frontend/pages/shopping-lists/_id.vue
@@ -77,7 +77,8 @@
>
-
-
+
From aa4527e5f7bf3098f437cba5ea6c304d07143788 Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Fri, 23 Feb 2024 19:22:39 +0000
Subject: [PATCH 14/15] replace v-for/v-if with computed ref
---
.../Recipe/RecipeDialogAddToShoppingList.vue | 10 +++++++---
frontend/pages/shopping-lists/index.vue | 15 +++++++++++----
2 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
index 193f13928e..d7a57ce8fe 100644
--- a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
+++ b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
@@ -3,8 +3,7 @@
{
+ return props.shoppingLists.filter((list) => state.showAll || list.userId === $auth.user?.id);
+ });
+
const recipeIngredientSections = ref([]);
const selectedShoppingList = ref(null);
@@ -348,6 +351,7 @@ export default defineComponent({
return {
dialog,
+ shoppingListChoices,
...toRefs(state),
addRecipesToList,
bulkCheckIngredients,
diff --git a/frontend/pages/shopping-lists/index.vue b/frontend/pages/shopping-lists/index.vue
index 3945e7ad40..19ac10db8a 100644
--- a/frontend/pages/shopping-lists/index.vue
+++ b/frontend/pages/shopping-lists/index.vue
@@ -1,5 +1,5 @@
-
+
@@ -23,8 +23,7 @@
{
+ if (!shoppingLists.value) {
+ return [];
+ }
+
+ return shoppingLists.value.filter((list) => state.showAll || list.userId === $auth.user?.id);
+ });
+
async function fetchShoppingLists() {
const { data } = await userApi.shopping.lists.getAll(1, -1, { orderBy: "name", orderDirection: "asc" });
@@ -111,7 +118,7 @@ export default defineComponent({
return {
...toRefs(state),
groupSlug,
- shoppingLists,
+ shoppingListChoices,
createOne,
deleteOne,
openDelete,
From 29368d9cc48619f643e3961d34067eea7ce01d93 Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Wed, 6 Mar 2024 15:11:43 +0000
Subject: [PATCH 15/15] move showAll to user preferences
---
.../Domain/Recipe/RecipeDialogAddToShoppingList.vue | 8 +++++---
frontend/composables/use-users/preferences.ts | 2 ++
frontend/pages/shopping-lists/index.vue | 8 +++++---
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
index d7a57ce8fe..9209b079cc 100644
--- a/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
+++ b/frontend/components/Domain/Recipe/RecipeDialogAddToShoppingList.vue
@@ -23,7 +23,7 @@
{{ $t("general.cancel") }}
-
+
@@ -132,6 +132,7 @@ import { toRefs } from "@vueuse/core";
import RecipeIngredientListItem from "./RecipeIngredientListItem.vue";
import { useUserApi } from "~/composables/api";
import { alert } from "~/composables/use-toast";
+import { useShoppingListPreferences } from "~/composables/use-users/preferences";
import { ShoppingListSummary } from "~/lib/api/types/group";
import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe";
@@ -178,6 +179,7 @@ export default defineComponent({
setup(props, context) {
const { $auth, i18n } = useContext();
const api = useUserApi();
+ const preferences = useShoppingListPreferences();
// v-model support
const dialog = computed({
@@ -193,11 +195,10 @@ export default defineComponent({
const state = reactive({
shoppingListDialog: true,
shoppingListIngredientDialog: false,
- showAll: false,
});
const shoppingListChoices = computed(() => {
- return props.shoppingLists.filter((list) => state.showAll || list.userId === $auth.user?.id);
+ return props.shoppingLists.filter((list) => preferences.value.viewAllLists || list.userId === $auth.user?.id);
});
const recipeIngredientSections = ref([]);
@@ -351,6 +352,7 @@ export default defineComponent({
return {
dialog,
+ preferences,
shoppingListChoices,
...toRefs(state),
addRecipesToList,
diff --git a/frontend/composables/use-users/preferences.ts b/frontend/composables/use-users/preferences.ts
index c93c5dcb4c..a6933576fd 100644
--- a/frontend/composables/use-users/preferences.ts
+++ b/frontend/composables/use-users/preferences.ts
@@ -22,6 +22,7 @@ export interface UserRecipePreferences {
}
export interface UserShoppingListPreferences {
+ viewAllLists: boolean;
viewByLabel: boolean;
}
@@ -70,6 +71,7 @@ export function useShoppingListPreferences(): Ref {
const fromStorage = useLocalStorage(
"shopping-list-preferences",
{
+ viewAllLists: false,
viewByLabel: false,
},
{ mergeDefaults: true }
diff --git a/frontend/pages/shopping-lists/index.vue b/frontend/pages/shopping-lists/index.vue
index 19ac10db8a..bde98330a5 100644
--- a/frontend/pages/shopping-lists/index.vue
+++ b/frontend/pages/shopping-lists/index.vue
@@ -17,7 +17,7 @@
-
+
@@ -51,6 +51,7 @@
import { computed, defineComponent, useAsync, useContext, reactive, toRefs, useRoute } from "@nuxtjs/composition-api";
import { useUserApi } from "~/composables/api";
import { useAsyncKey } from "~/composables/use-utils";
+import { useShoppingListPreferences } from "~/composables/use-users/preferences";
export default defineComponent({
middleware: "auth",
@@ -59,13 +60,13 @@ export default defineComponent({
const userApi = useUserApi();
const route = useRoute();
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
+ const preferences = useShoppingListPreferences();
const state = reactive({
createName: "",
createDialog: false,
deleteDialog: false,
deleteTarget: "",
- showAll: false,
});
const shoppingLists = useAsync(async () => {
@@ -77,7 +78,7 @@ export default defineComponent({
return [];
}
- return shoppingLists.value.filter((list) => state.showAll || list.userId === $auth.user?.id);
+ return shoppingLists.value.filter((list) => preferences.value.viewAllLists || list.userId === $auth.user?.id);
});
async function fetchShoppingLists() {
@@ -118,6 +119,7 @@ export default defineComponent({
return {
...toRefs(state),
groupSlug,
+ preferences,
shoppingListChoices,
createOne,
deleteOne,