| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | <template> | 
					
						
							|  |  |  |     <v-app dark> | 
					
						
							|  |  |  |       <TheSnackbar /> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <AppSidebar | 
					
						
							|  |  |  |         v-model="sidebar" | 
					
						
							|  |  |  |         absolute | 
					
						
							|  |  |  |         :top-link="topLinks" | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |         :secondary-header="cookbookLinks.length ? $tc('sidebar.cookbooks') : undefined" | 
					
						
							|  |  |  |         :secondary-header-link="isOwnGroup && cookbookLinks.length ? `/g/${groupSlug}/cookbooks` : undefined" | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |         :secondary-links="cookbookLinks || []" | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |         :bottom-links="isAdmin ? bottomLinks : []" | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |       > | 
					
						
							|  |  |  |         <v-menu offset-y nudge-bottom="5" close-delay="50" nudge-right="15"> | 
					
						
							|  |  |  |           <template #activator="{ on, attrs }"> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |             <v-btn v-if="isOwnGroup" rounded large class="ml-2 mt-3" v-bind="attrs" v-on="on"> | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |               <v-icon left large color="primary"> | 
					
						
							|  |  |  |                 {{ $globals.icons.createAlt }} | 
					
						
							|  |  |  |               </v-icon> | 
					
						
							|  |  |  |               {{ $t("general.create") }} | 
					
						
							|  |  |  |             </v-btn> | 
					
						
							|  |  |  |           </template> | 
					
						
							|  |  |  |           <v-list dense class="my-0 py-0"> | 
					
						
							|  |  |  |             <template v-for="(item, index) in createLinks"> | 
					
						
							|  |  |  |               <v-divider v-if="item.insertDivider" :key="index" class="mx-2"></v-divider> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |               <v-list-item v-if="!item.restricted || isOwnGroup" :key="item.title" :to="item.to" exact> | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |                 <v-list-item-avatar> | 
					
						
							|  |  |  |                   <v-icon> | 
					
						
							|  |  |  |                     {{ item.icon }} | 
					
						
							|  |  |  |                   </v-icon> | 
					
						
							|  |  |  |                 </v-list-item-avatar> | 
					
						
							|  |  |  |                 <v-list-item-content> | 
					
						
							|  |  |  |                   <v-list-item-title> | 
					
						
							|  |  |  |                     {{ item.title }} | 
					
						
							|  |  |  |                   </v-list-item-title> | 
					
						
							|  |  |  |                   <v-list-item-subtitle v-if="item.subtitle"> | 
					
						
							|  |  |  |                     {{ item.subtitle }} | 
					
						
							|  |  |  |                   </v-list-item-subtitle> | 
					
						
							|  |  |  |                 </v-list-item-content> | 
					
						
							|  |  |  |               </v-list-item> | 
					
						
							|  |  |  |             </template> | 
					
						
							|  |  |  |           </v-list> | 
					
						
							|  |  |  |         </v-menu> | 
					
						
							|  |  |  |         <template #bottom> | 
					
						
							|  |  |  |           <v-list-item @click.stop="languageDialog = true"> | 
					
						
							|  |  |  |             <v-list-item-icon> | 
					
						
							|  |  |  |               <v-icon>{{ $globals.icons.translate }}</v-icon> | 
					
						
							|  |  |  |             </v-list-item-icon> | 
					
						
							|  |  |  |             <v-list-item-content> | 
					
						
							|  |  |  |               <v-list-item-title>{{ $t("sidebar.language") }}</v-list-item-title> | 
					
						
							|  |  |  |               <LanguageDialog v-model="languageDialog" /> | 
					
						
							|  |  |  |             </v-list-item-content> | 
					
						
							|  |  |  |           </v-list-item> | 
					
						
							|  |  |  |           <v-list-item @click="toggleDark"> | 
					
						
							|  |  |  |             <v-list-item-icon> | 
					
						
							|  |  |  |               <v-icon> | 
					
						
							|  |  |  |                 {{ $vuetify.theme.dark ? $globals.icons.weatherSunny : $globals.icons.weatherNight }} | 
					
						
							|  |  |  |               </v-icon> | 
					
						
							|  |  |  |             </v-list-item-icon> | 
					
						
							|  |  |  |             <v-list-item-title> | 
					
						
							|  |  |  |               {{ $vuetify.theme.dark ? $t("settings.theme.light-mode") : $t("settings.theme.dark-mode") }} | 
					
						
							|  |  |  |             </v-list-item-title> | 
					
						
							|  |  |  |           </v-list-item> | 
					
						
							|  |  |  |         </template> | 
					
						
							|  |  |  |       </AppSidebar> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       <AppHeader> | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |         <v-btn icon @click.stop="sidebar = !sidebar"> | 
					
						
							|  |  |  |           <v-icon> {{ $globals.icons.menu }}</v-icon> | 
					
						
							|  |  |  |         </v-btn> | 
					
						
							|  |  |  |       </AppHeader> | 
					
						
							|  |  |  |       <v-main> | 
					
						
							|  |  |  |         <v-scroll-x-transition> | 
					
						
							|  |  |  |           <Nuxt /> | 
					
						
							|  |  |  |         </v-scroll-x-transition> | 
					
						
							|  |  |  |       </v-main> | 
					
						
							|  |  |  |     </v-app> | 
					
						
							|  |  |  |   </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   <script lang="ts"> | 
					
						
							|  |  |  |   import { computed, defineComponent, onMounted, ref, useContext, useRoute } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |   import { useLoggedInState } from "~/composables/use-logged-in-state"; | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |   import AppHeader from "@/components/Layout/LayoutParts/AppHeader.vue"; | 
					
						
							|  |  |  |   import AppSidebar from "@/components/Layout/LayoutParts/AppSidebar.vue"; | 
					
						
							|  |  |  |   import { SidebarLinks } from "~/types/application-types"; | 
					
						
							|  |  |  |   import LanguageDialog from "~/components/global/LanguageDialog.vue"; | 
					
						
							|  |  |  |   import TheSnackbar from "@/components/Layout/LayoutParts/TheSnackbar.vue"; | 
					
						
							|  |  |  |   import { useCookbooks, usePublicCookbooks } from "~/composables/use-group-cookbooks"; | 
					
						
							|  |  |  |   import { useToggleDarkMode } from "~/composables/use-utils"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   export default defineComponent({ | 
					
						
							|  |  |  |     components: { AppHeader, AppSidebar, LanguageDialog, TheSnackbar }, | 
					
						
							|  |  |  |     setup() { | 
					
						
							|  |  |  |       const { $globals, $auth, $vuetify, i18n } = useContext(); | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       const { isOwnGroup } = useLoggedInState(); | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const isAdmin = computed(() => $auth.user?.admin); | 
					
						
							|  |  |  |       const route = useRoute(); | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || ""); | 
					
						
							|  |  |  |       const { cookbooks } = isOwnGroup.value ? useCookbooks() : usePublicCookbooks(groupSlug.value || ""); | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const toggleDark = useToggleDarkMode(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const languageDialog = ref<boolean>(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const sidebar = ref<boolean | null>(null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       onMounted(() => { | 
					
						
							|  |  |  |         sidebar.value = !$vuetify.breakpoint.md; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const cookbookLinks = computed(() => { | 
					
						
							|  |  |  |         if (!cookbooks.value) return []; | 
					
						
							|  |  |  |         return cookbooks.value.map((cookbook) => { | 
					
						
							|  |  |  |           return { | 
					
						
							|  |  |  |             icon: $globals.icons.pages, | 
					
						
							|  |  |  |             title: cookbook.name, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |             to: `/g/${groupSlug.value}/cookbooks/${cookbook.slug as string}`, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           }; | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       interface Link { | 
					
						
							|  |  |  |         insertDivider: boolean; | 
					
						
							|  |  |  |         icon: string; | 
					
						
							|  |  |  |         title: string; | 
					
						
							|  |  |  |         subtitle: string | null; | 
					
						
							|  |  |  |         to: string; | 
					
						
							|  |  |  |         restricted: boolean; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       const createLinks = computed<Link[]>(() => [ | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |         { | 
					
						
							|  |  |  |           insertDivider: false, | 
					
						
							|  |  |  |           icon: $globals.icons.link, | 
					
						
							|  |  |  |           title: i18n.tc("general.import"), | 
					
						
							|  |  |  |           subtitle: i18n.tc("new-recipe.import-by-url"), | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           to: `/g/${groupSlug.value}/r/create/url`, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           insertDivider: true, | 
					
						
							|  |  |  |           icon: $globals.icons.edit, | 
					
						
							|  |  |  |           title: i18n.tc("general.create"), | 
					
						
							|  |  |  |           subtitle: i18n.tc("new-recipe.create-manually"), | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           to: `/g/${groupSlug.value}/r/create/new`, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           insertDivider: true, | 
					
						
							|  |  |  |           icon: $globals.icons.pages, | 
					
						
							|  |  |  |           title: i18n.tc("sidebar.cookbook"), | 
					
						
							|  |  |  |           subtitle: i18n.tc("sidebar.create-cookbook"), | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           to: `/g/${groupSlug.value}/cookbooks`, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       ]); | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       const bottomLinks = computed<SidebarLinks>(() => [ | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |         { | 
					
						
							|  |  |  |           icon: $globals.icons.cog, | 
					
						
							|  |  |  |           title: i18n.tc("general.settings"), | 
					
						
							|  |  |  |           to: "/admin/site-settings", | 
					
						
							|  |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       ]); | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       const topLinks = computed<SidebarLinks>(() => [ | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |         { | 
					
						
							|  |  |  |           icon: $globals.icons.search, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           to: `/g/${groupSlug.value}`, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           title: i18n.tc("sidebar.search"), | 
					
						
							|  |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           icon: $globals.icons.calendarMultiselect, | 
					
						
							|  |  |  |           title: i18n.tc("meal-plan.meal-planner"), | 
					
						
							| 
									
										
										
										
											2023-10-07 14:21:46 -05:00
										 |  |  |           to: "/group/mealplan/planner/view", | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           icon: $globals.icons.formatListCheck, | 
					
						
							|  |  |  |           title: i18n.tc("shopping-list.shopping-lists"), | 
					
						
							|  |  |  |           to: "/shopping-lists", | 
					
						
							|  |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           icon: $globals.icons.timelineText, | 
					
						
							|  |  |  |           title: i18n.tc("recipe.timeline"), | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           to: `/g/${groupSlug.value}/recipes/timeline`, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2023-10-25 17:08:58 +02:00
										 |  |  |           icon: $globals.icons.categories, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           to: `/g/${groupSlug.value}/recipes/categories`, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           title: i18n.tc("sidebar.categories"), | 
					
						
							|  |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           icon: $globals.icons.tags, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           to: `/g/${groupSlug.value}/recipes/tags`, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           title: i18n.tc("sidebar.tags"), | 
					
						
							|  |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           icon: $globals.icons.potSteam, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           to: `/g/${groupSlug.value}/recipes/tools`, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |           title: i18n.tc("tool.tools"), | 
					
						
							|  |  |  |           restricted: true, | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return { | 
					
						
							|  |  |  |         groupSlug, | 
					
						
							|  |  |  |         cookbookLinks, | 
					
						
							|  |  |  |         createLinks, | 
					
						
							|  |  |  |         bottomLinks, | 
					
						
							|  |  |  |         topLinks, | 
					
						
							|  |  |  |         isAdmin, | 
					
						
							|  |  |  |         isOwnGroup, | 
					
						
							|  |  |  |         languageDialog, | 
					
						
							|  |  |  |         toggleDark, | 
					
						
							|  |  |  |         sidebar, | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |     }, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   </script> |