From 63ac21bce27f8169dc7158861f898b587cd4251b Mon Sep 17 00:00:00 2001
From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
Date: Tue, 21 Nov 2023 15:31:05 +0100
Subject: [PATCH] feat: Add Categories, Tags and Tools to Manage Data Page
(#2737)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* add categories
* add tags
* 🧹
* 🧹 l18n
* add tools
* remove broken on Hand for tools
* fix for tools onHand not updating from frontend
* tools: re-add "on Hand"
* remove itemized icon from create button
* change combine icon
* add divider to BaseOverflowButton
* divide and conquer
---------
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
---
.../Domain/Recipe/RecipeOrganizerDialog.vue | 4 +-
.../Domain/Recipe/RecipeOrganizerPage.vue | 5 +-
.../components/global/BaseOverflowButton.vue | 38 ++--
frontend/lang/messages/en-US.json | 17 +-
frontend/pages/group/data.vue | 20 ++
frontend/pages/group/data/categories.vue | 174 ++++++++++++++++
frontend/pages/group/data/foods.vue | 2 +-
frontend/pages/group/data/labels.vue | 5 +-
frontend/pages/group/data/tags.vue | 175 ++++++++++++++++
frontend/pages/group/data/tools.vue | 187 ++++++++++++++++++
frontend/pages/group/data/units.vue | 2 +-
11 files changed, 605 insertions(+), 24 deletions(-)
create mode 100644 frontend/pages/group/data/categories.vue
create mode 100644 frontend/pages/group/data/tags.vue
create mode 100644 frontend/pages/group/data/tools.vue
diff --git a/frontend/components/Domain/Recipe/RecipeOrganizerDialog.vue b/frontend/components/Domain/Recipe/RecipeOrganizerDialog.vue
index e4c90090b31a..378cda2b061b 100644
--- a/frontend/components/Domain/Recipe/RecipeOrganizerDialog.vue
+++ b/frontend/components/Domain/Recipe/RecipeOrganizerDialog.vue
@@ -131,8 +131,8 @@ export default defineComponent({
async function select() {
if (store) {
- // @ts-ignore - only property really required is the name
- await store.actions.createOne({ name: state.name });
+ // @ts-expect-error the same state is used for different organizer types, which have different requirements
+ await store.actions.createOne({ ...state });
}
const newItem = store.items.value.find((item) => item.name === state.name);
diff --git a/frontend/components/Domain/Recipe/RecipeOrganizerPage.vue b/frontend/components/Domain/Recipe/RecipeOrganizerPage.vue
index 2f832470b312..9d8c035fd9d9 100644
--- a/frontend/components/Domain/Recipe/RecipeOrganizerPage.vue
+++ b/frontend/components/Domain/Recipe/RecipeOrganizerPage.vue
@@ -16,6 +16,7 @@
+
@@ -75,7 +76,7 @@ import Fuse from "fuse.js";
import { defineComponent, computed, ref, reactive, useContext, useRoute } from "@nuxtjs/composition-api";
import { useContextPresets } from "~/composables/use-context-presents";
import RecipeOrganizerDialog from "~/components/Domain/Recipe/RecipeOrganizerDialog.vue";
-import { RecipeOrganizer } from "~/lib/api/types/non-generated";
+import { Organizer, RecipeOrganizer } from "~/lib/api/types/non-generated";
import { useRouteQuery } from "~/composables/use-router";
import { deepCopy } from "~/composables/use-utils";
@@ -83,6 +84,7 @@ interface GenericItem {
id: string;
name: string;
slug: string;
+ onHand: boolean;
}
export default defineComponent({
@@ -217,6 +219,7 @@ export default defineComponent({
updateTarget,
deleteOne,
deleteTarget,
+ Organizer,
presets,
itemsSorted,
searchString,
diff --git a/frontend/components/global/BaseOverflowButton.vue b/frontend/components/global/BaseOverflowButton.vue
index d8f1820ba024..6c9aef686a02 100644
--- a/frontend/components/global/BaseOverflowButton.vue
+++ b/frontend/components/global/BaseOverflowButton.vue
@@ -14,33 +14,42 @@
-
-
- {{ item.icon }}
-
- {{ item.text }}
-
+
+
+
+ {{ item.icon }}
+
+ {{ item.text }}
+
+
+
-
+
+
{{ item.icon }}
{{ item.text }}
-
+
+
+
-
-
- {{ item.icon }}
-
- {{ item.text }}
-
+
+
+
+ {{ item.icon }}
+
+ {{ item.text }}
+
+
+
@@ -64,6 +73,7 @@ export interface MenuItem {
to?: string;
value?: string;
event?: string;
+ divider?: boolean;
}
export default defineComponent({
diff --git a/frontend/lang/messages/en-US.json b/frontend/lang/messages/en-US.json
index e53f977c35a8..c42c09c00cf9 100644
--- a/frontend/lang/messages/en-US.json
+++ b/frontend/lang/messages/en-US.json
@@ -953,7 +953,22 @@
"select-data": "Select Data",
"select-language": "Select Language",
"columns": "Columns",
- "combine": "Combine"
+ "combine": "Combine",
+ "categories": {
+ "edit-category": "Edit Category",
+ "new-category": "New Category",
+ "category-data": "Category Data"
+ },
+ "tags": {
+ "new-tag": "New Tag",
+ "edit-tag": "Edit Tag",
+ "tag-data": "Tag Data"
+ },
+ "tools": {
+ "new-tool": "New Tool",
+ "edit-tool": "Edit Tool",
+ "tool-data": "Tool Data"
+ }
},
"user-registration": {
"user-registration": "User Registration",
diff --git a/frontend/pages/group/data.vue b/frontend/pages/group/data.vue
index 70349df329ef..1e40c55a7dc4 100644
--- a/frontend/pages/group/data.vue
+++ b/frontend/pages/group/data.vue
@@ -44,6 +44,9 @@ export default defineComponent({
foods: i18n.tc("general.foods"),
units: i18n.tc("general.units"),
labels: i18n.tc("data-pages.labels.labels"),
+ categories: i18n.tc("category.categories"),
+ tags: i18n.tc("tag.tags"),
+ tools: i18n.tc("tool.tools"),
};
const route = useRoute();
@@ -53,6 +56,7 @@ export default defineComponent({
text: i18n.t("general.recipes"),
value: "new",
to: "/group/data/recipes",
+ divider: true,
},
{
text: i18n.t("general.foods"),
@@ -68,7 +72,23 @@ export default defineComponent({
text: i18n.t("data-pages.labels.labels"),
value: "new",
to: "/group/data/labels",
+ divider: true,
},
+ {
+ text: i18n.t("category.categories"),
+ value: "new",
+ to: "/group/data/categories",
+ },
+ {
+ text: i18n.t("tag.tags"),
+ value: "new",
+ to: "/group/data/tags",
+ },
+ {
+ text: i18n.t("tool.tools"),
+ value: "new",
+ to: "/group/data/tools",
+ }
]);
const buttonText = computed(() => {
diff --git a/frontend/pages/group/data/categories.vue b/frontend/pages/group/data/categories.vue
new file mode 100644
index 000000000000..856178ba8ed3
--- /dev/null
+++ b/frontend/pages/group/data/categories.vue
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t("general.confirm-delete-generic") }}
+
+
+
+
+
+
+
+ {{ $t("general.create") }}
+
+
+
+
+
+
diff --git a/frontend/pages/group/data/foods.vue b/frontend/pages/group/data/foods.vue
index d722f77e203c..642f5e48248c 100644
--- a/frontend/pages/group/data/foods.vue
+++ b/frontend/pages/group/data/foods.vue
@@ -168,7 +168,7 @@
- {{ $globals.icons.foods }}
+ {{ $globals.icons.externalLink }}
{{ $t('data-pages.combine') }}
diff --git a/frontend/pages/group/data/labels.vue b/frontend/pages/group/data/labels.vue
index c748d448be09..cc10fb1f6fe1 100644
--- a/frontend/pages/group/data/labels.vue
+++ b/frontend/pages/group/data/labels.vue
@@ -90,10 +90,7 @@
@edit-one="editEventHandler"
>
-
- {{ $globals.icons.tags }}
- {{ $t("general.create") }}
-
+ {{ $t("general.create") }}
diff --git a/frontend/pages/group/data/tags.vue b/frontend/pages/group/data/tags.vue
new file mode 100644
index 000000000000..b188d2bef314
--- /dev/null
+++ b/frontend/pages/group/data/tags.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t("general.confirm-delete-generic") }}
+
+
+
+
+
+
+
+ {{ $t("general.create") }}
+
+
+
+
+
+
diff --git a/frontend/pages/group/data/tools.vue b/frontend/pages/group/data/tools.vue
new file mode 100644
index 000000000000..c8ee33df1319
--- /dev/null
+++ b/frontend/pages/group/data/tools.vue
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t("general.confirm-delete-generic") }}
+
+
+
+
+
+
+
+ {{ $t("general.create") }}
+
+
+
+ {{ item.onHand ? $globals.icons.check : $globals.icons.close }}
+
+
+
+
+
+
+
diff --git a/frontend/pages/group/data/units.vue b/frontend/pages/group/data/units.vue
index 919ba6431455..8e93e22a090d 100644
--- a/frontend/pages/group/data/units.vue
+++ b/frontend/pages/group/data/units.vue
@@ -180,7 +180,7 @@
- {{ $globals.icons.units }}
+ {{ $globals.icons.externalLink }}
{{ $t('data-pages.combine') }}