| 
									
										
										
										
											2021-07-31 14:45:28 -08:00
										 |  |  | <template> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   <v-app-bar | 
					
						
							|  |  |  |     clipped-left | 
					
						
							|  |  |  |     density="compact" | 
					
						
							|  |  |  |     app | 
					
						
							|  |  |  |     color="primary" | 
					
						
							|  |  |  |     dark | 
					
						
							|  |  |  |     class="d-print-none" | 
					
						
							|  |  |  |   > | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |     <slot /> | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |     <router-link :to="routerLink"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       <v-btn | 
					
						
							|  |  |  |         icon | 
					
						
							|  |  |  |         color="white" | 
					
						
							|  |  |  |       > | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |         <v-icon size="40"> {{ $globals.icons.primary }} </v-icon> | 
					
						
							|  |  |  |       </v-btn> | 
					
						
							|  |  |  |     </router-link> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     <div | 
					
						
							|  |  |  |       btn | 
					
						
							|  |  |  |       class="pl-2" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <v-toolbar-title | 
					
						
							|  |  |  |         style="cursor: pointer" | 
					
						
							|  |  |  |         @click="$router.push(routerLink)" | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         Mealie | 
					
						
							|  |  |  |       </v-toolbar-title> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2021-11-08 21:12:13 -09:00
										 |  |  |     <RecipeDialogSearch ref="domSearchDialog" /> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     <v-spacer /> | 
					
						
							| 
									
										
										
										
											2021-11-08 21:12:13 -09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |     <!-- Navigation Menu --> | 
					
						
							| 
									
										
										
										
											2021-09-02 11:24:17 -08:00
										 |  |  |     <template v-if="menu"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       <v-responsive | 
					
						
							|  |  |  |         v-if="!xs" | 
					
						
							|  |  |  |         max-width="250" | 
					
						
							|  |  |  |         @click="activateSearch" | 
					
						
							|  |  |  |       > | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |         <v-text-field | 
					
						
							|  |  |  |           readonly | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |           class="mt-1" | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |           rounded | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |           variant="solo-filled" | 
					
						
							|  |  |  |           density="compact" | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |           flat | 
					
						
							|  |  |  |           :prepend-inner-icon="$globals.icons.search" | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |           bg-color="primary-darken-1" | 
					
						
							| 
									
										
										
										
											2022-08-15 23:55:51 +02:00
										 |  |  |           :placeholder="$t('search.search-hint')" | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         /> | 
					
						
							|  |  |  |       </v-responsive> | 
					
						
							|  |  |  |       <v-btn | 
					
						
							|  |  |  |         v-else | 
					
						
							|  |  |  |         icon | 
					
						
							|  |  |  |         @click="activateSearch" | 
					
						
							|  |  |  |       > | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |         <v-icon> {{ $globals.icons.search }}</v-icon> | 
					
						
							|  |  |  |       </v-btn> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       <v-btn | 
					
						
							|  |  |  |         v-if="loggedIn" | 
					
						
							|  |  |  |         :variant="smAndUp ? 'text' : undefined" | 
					
						
							|  |  |  |         :icon="xs" | 
					
						
							|  |  |  |         @click="logout()" | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         <v-icon :start="smAndUp"> | 
					
						
							|  |  |  |           {{ $globals.icons.logout }} | 
					
						
							|  |  |  |         </v-icon> | 
					
						
							|  |  |  |         {{ smAndUp ? $t("user.logout") : "" }} | 
					
						
							| 
									
										
										
										
											2021-09-02 11:24:17 -08:00
										 |  |  |       </v-btn> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       <v-btn | 
					
						
							|  |  |  |         v-else | 
					
						
							|  |  |  |         variant="text" | 
					
						
							|  |  |  |         nuxt | 
					
						
							|  |  |  |         to="/login" | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         <v-icon start> | 
					
						
							|  |  |  |           {{ $globals.icons.user }} | 
					
						
							|  |  |  |         </v-icon> | 
					
						
							| 
									
										
										
										
											2021-09-02 11:24:17 -08:00
										 |  |  |         {{ $t("user.login") }} | 
					
						
							|  |  |  |       </v-btn> | 
					
						
							|  |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   </v-app-bar> | 
					
						
							| 
									
										
										
										
											2021-07-31 14:45:28 -08:00
										 |  |  | </template> | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-31 14:45:28 -08:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  | import { useLoggedInState } from "~/composables/use-logged-in-state"; | 
					
						
							| 
									
										
										
										
											2021-11-08 21:12:13 -09:00
										 |  |  | import RecipeDialogSearch from "~/components/Domain/Recipe/RecipeDialogSearch.vue"; | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | export default defineNuxtComponent({ | 
					
						
							| 
									
										
										
										
											2021-11-08 21:12:13 -09:00
										 |  |  |   components: { RecipeDialogSearch }, | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   props: { | 
					
						
							|  |  |  |     menu: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-11-08 21:12:13 -09:00
										 |  |  |   setup() { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     const $auth = useMealieAuth(); | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |     const { loggedIn } = useLoggedInState(); | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |     const route = useRoute(); | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     const groupSlug = computed(() => route.params.groupSlug as string || $auth.user.value?.groupSlug || ""); | 
					
						
							|  |  |  |     const { xs, smAndUp } = useDisplay(); | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |     const routerLink = computed(() => groupSlug.value ? `/g/${groupSlug.value}` : "/"); | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |     const domSearchDialog = ref<InstanceType<typeof RecipeDialogSearch> | null>(null); | 
					
						
							| 
									
										
										
										
											2021-11-08 21:12:13 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function activateSearch() { | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |       domSearchDialog.value?.open(); | 
					
						
							| 
									
										
										
										
											2021-11-08 21:12:13 -09:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |     function handleKeyEvent(e: KeyboardEvent) { | 
					
						
							|  |  |  |       const activeTag = document.activeElement?.tagName; | 
					
						
							|  |  |  |       if (e.key === "/" && activeTag !== "INPUT" && activeTag !== "TEXTAREA") { | 
					
						
							|  |  |  |         e.preventDefault(); | 
					
						
							|  |  |  |         activateSearch(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     onMounted(() => { | 
					
						
							|  |  |  |       document.addEventListener("keydown", handleKeyEvent); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     onBeforeUnmount(() => { | 
					
						
							|  |  |  |       document.removeEventListener("keydown", handleKeyEvent); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-05 16:12:11 -05:00
										 |  |  |     async function logout() { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       try { | 
					
						
							| 
									
										
										
										
											2025-10-05 20:43:38 -05:00
										 |  |  |         await $auth.signOut("/login?direct=1"); | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       } | 
					
						
							|  |  |  |       catch (e) { | 
					
						
							|  |  |  |         console.error(e); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2024-10-05 16:12:11 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-08 21:12:13 -09:00
										 |  |  |     return { | 
					
						
							|  |  |  |       activateSearch, | 
					
						
							|  |  |  |       domSearchDialog, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |       routerLink, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       loggedIn, | 
					
						
							| 
									
										
										
										
											2024-10-05 16:12:11 -05:00
										 |  |  |       logout, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       xs, smAndUp, | 
					
						
							| 
									
										
										
										
											2021-11-08 21:12:13 -09:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-07-31 14:45:28 -08:00
										 |  |  | </script> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | <style scoped> | 
					
						
							|  |  |  | .v-toolbar { | 
					
						
							|  |  |  |   z-index: 1010 !important; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | </style> |