diff --git a/frontend/src/components/Recipe/RecipeViewer/Ingredients.vue b/frontend/src/components/Recipe/RecipeViewer/Ingredients.vue index 036a3516a..1a29c14f5 100644 --- a/frontend/src/components/Recipe/RecipeViewer/Ingredients.vue +++ b/frontend/src/components/Recipe/RecipeViewer/Ingredients.vue @@ -12,6 +12,7 @@ v-model="ingredient.checked" class="pt-0 my-auto py-auto" color="secondary" + :readonly="true" > diff --git a/frontend/src/components/UI/CategorySidebar.vue b/frontend/src/components/UI/CategorySidebar.vue index 58373847b..9103417db 100644 --- a/frontend/src/components/UI/CategorySidebar.vue +++ b/frontend/src/components/UI/CategorySidebar.vue @@ -54,22 +54,11 @@ export default { { icon: "mdi-magnify", to: "/search", - title: "search", + title: this.$t('search.search'), }, ], }; }, - computed: { - allCategories() { - return this.$store.getters.getCategories; - }, - }, - watch: { - allCategories() { - this.buildSidebar(); - }, - showSidebar() {}, - }, mounted() { this.buildSidebar(); this.mobile = this.viewScale(); @@ -81,14 +70,27 @@ export default { this.links = []; this.links.push(...this.baseLinks); const pages = await api.siteSettings.getPages(); - pages.sort((a, b) => a.position - b.position); - pages.forEach(async element => { - this.links.push({ - title: element.name, - to: `/pages/${element.slug}`, - icon: "mdi-tag", + if(pages.length > 0) { + pages.sort((a, b) => a.position - b.position); + pages.forEach(async element => { + this.links.push({ + title: element.name, + to: `/pages/${element.slug}`, + icon: "mdi-tag", + }); }); - }); + } + else { + const categories = await api.categories.getAll(); + categories.forEach(async element => { + this.links.push({ + title: element.name, + to: `/recipes/category/${element.slug}`, + icon: "mdi-tag", + }); + }); + } + }, viewScale() { switch (this.$vuetify.breakpoint.name) { diff --git a/frontend/src/locales/messages/de.json b/frontend/src/locales/messages/de.json index ab3219cd8..9cf70f5b1 100644 --- a/frontend/src/locales/messages/de.json +++ b/frontend/src/locales/messages/de.json @@ -93,7 +93,7 @@ "groups": "Gruppen", "could-not-validate-credentials": "Anmeldeinformationen konnten nicht validiert werden", "login": "Anmeldung", - "groups-can-only-be-set-by-administrators": "Groups can only be set by administrators", + "groups-can-only-be-set-by-administrators": "Gruppen können nur durch einen Administrator gesetzt werden", "upload-photo": "Foto hochladen", "reset-password": "Passwort zurücksetzen", "current-password": "Aktuelles Passwort", diff --git a/frontend/src/locales/messages/en.json b/frontend/src/locales/messages/en.json index 1fcacaaea..4bf311d2a 100644 --- a/frontend/src/locales/messages/en.json +++ b/frontend/src/locales/messages/en.json @@ -48,7 +48,8 @@ "apply": "Apply", "current-parenthesis": "(Current)", "users": "Users", - "groups": "Groups" + "groups": "Groups", + "about": "About" }, "page": { "home-page": "Home Page", @@ -153,7 +154,8 @@ "include": "Include", "exclude": "Exclude", "and": "And", - "or": "Or" + "or": "Or", + "search": "Search" }, "settings": { "general-settings": "General Settings", diff --git a/frontend/src/locales/messages/fr.json b/frontend/src/locales/messages/fr.json index f8fbe02ab..bfeba824c 100644 --- a/frontend/src/locales/messages/fr.json +++ b/frontend/src/locales/messages/fr.json @@ -48,7 +48,8 @@ "apply": "Appliquer", "current-parenthesis": "(Actuel)", "groups": "Groupes", - "users": "Utilisateurs" + "users": "Utilisateurs", + "about": "À propos" }, "page": { "home-page": "Accueil", @@ -153,7 +154,8 @@ "include": "Inclure", "max-results": "Résultats max", "or": "Ou", - "tag-filter": "Filtre par tags" + "tag-filter": "Filtre par tags", + "search": "Rechercher" }, "settings": { "general-settings": "Paramètres généraux", diff --git a/frontend/src/main.js b/frontend/src/main.js index 45c9381a9..c4917605e 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -18,6 +18,20 @@ const router = new VueRouter({ mode: process.env.NODE_ENV === "production" ? "history" : "hash", }); +const DEFAULT_TITLE = 'Mealie'; +const TITLE_SEPARATOR = '🍴'; +const TITLE_SUFFIX = " " + TITLE_SEPARATOR + " " + DEFAULT_TITLE; +router.afterEach( (to) => { + Vue.nextTick( async () => { + if(typeof to.meta.title === 'function' ) { + const title = await to.meta.title(to); + document.title = title + TITLE_SUFFIX; + } else { + document.title = to.meta.title ? to.meta.title + TITLE_SUFFIX : DEFAULT_TITLE; + } + }); +}); + const vueApp = new Vue({ vuetify, store, diff --git a/frontend/src/routes/admin.js b/frontend/src/routes/admin.js index e52927db2..cb990f26a 100644 --- a/frontend/src/routes/admin.js +++ b/frontend/src/routes/admin.js @@ -8,6 +8,7 @@ import ManageUsers from "@/pages/Admin/ManageUsers"; import Settings from "@/pages/Admin/Settings"; import About from "@/pages/Admin/About"; import { store } from "../store"; +import i18n from '@/i18n.js'; export default { path: "/admin", @@ -25,35 +26,59 @@ export default { { path: "profile", component: Profile, + meta: { + title: i18n.t('settings.profile'), + }, }, { path: "backups", component: Backup, + meta: { + title: i18n.t('settings.backup-and-exports'), + }, }, { path: "themes", component: Theme, + meta: { + title: i18n.t('general.themes'), + }, }, { path: "meal-planner", component: MealPlanner, + meta: { + title: i18n.t('meal-plan.meal-planner'), + }, }, { path: "migrations", component: Migration, + meta: { + title: i18n.t('settings.migrations'), + }, }, { path: "manage-users", component: ManageUsers, + meta: { + title: i18n.t('settings.manage-users'), + }, }, { path: "settings", component: Settings, + meta: { + title: i18n.t('settings.site-settings'), + }, }, { path: "about", component: About, + meta: { + title: i18n.t('general.about'), + }, }, ], }; diff --git a/frontend/src/routes/index.js b/frontend/src/routes/index.js index af58a187d..f17df9907 100644 --- a/frontend/src/routes/index.js +++ b/frontend/src/routes/index.js @@ -15,6 +15,7 @@ import ThisWeek from "@/pages/MealPlan/ThisWeek"; import { api } from "@/api"; import Admin from "./admin"; import { store } from "../store"; +import i18n from '@/i18n.js'; export const routes = [ { path: "/", name: "home", component: HomePage }, @@ -31,15 +32,43 @@ export const routes = [ { path: "/sign-up", redirect: "/" }, { path: "/sign-up/:token", component: SignUpPage }, { path: "/debug", component: Debug }, - { path: "/search", component: SearchPage }, + { + path: "/search", + component: SearchPage, + meta: { + title: i18n.t('search.search'), + }, + }, { path: "/recipes/all", component: AllRecipes }, { path: "/pages/:customPage", component: CustomPage }, { path: "/recipes/tag/:tag", component: TagPage }, { path: "/recipes/category/:category", component: CategoryPage }, - { path: "/recipe/:recipe", component: ViewRecipe }, + { + path: "/recipe/:recipe", + component: ViewRecipe, + meta: { + title: async route => { + const recipe = await api.recipes.requestDetails(route.params.recipe); + return recipe.name; + }, + } + }, { path: "/new/", component: NewRecipe }, - { path: "/meal-plan/planner", component: Planner }, - { path: "/meal-plan/this-week", component: ThisWeek }, + { + path: "/meal-plan/planner", + component: Planner, + meta: { + title: i18n.t('meal-plan.meal-planner'), + } + }, + { + path: "/meal-plan/this-week", + component: ThisWeek, + meta: { + title: i18n.t('meal-plan.dinner-this-week'), + } + + }, Admin, { path: "/meal-plan/today",