| 
									
										
										
										
											2021-07-31 14:45:28 -08:00
										 |  |  | <template> | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  |   <v-navigation-drawer v-model="drawer" class="d-flex flex-column d-print-none" clipped app width="240px"> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |     <!-- User Profile --> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |     <template v-if="loggedIn"> | 
					
						
							|  |  |  |       <v-list-item two-line :to="userProfileLink" exact> | 
					
						
							| 
									
										
										
										
											2021-12-18 19:04:36 -09:00
										 |  |  |         <UserAvatar list :user-id="$auth.user.id" /> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         <v-list-item-content> | 
					
						
							| 
									
										
										
										
											2022-08-15 14:30:55 -08:00
										 |  |  |           <v-list-item-title class="pr-2"> {{ $auth.user.fullName }}</v-list-item-title> | 
					
						
							| 
									
										
										
										
											2022-06-13 09:33:46 -08:00
										 |  |  |           <v-list-item-subtitle> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |             <v-btn v-if="isOwnGroup" class="px-2 pa-0" text :to="userFavoritesLink" small> | 
					
						
							| 
									
										
										
										
											2022-08-15 14:30:55 -08:00
										 |  |  |               <v-icon left small> | 
					
						
							|  |  |  |                 {{ $globals.icons.heart }} | 
					
						
							|  |  |  |               </v-icon> | 
					
						
							| 
									
										
										
										
											2022-08-15 23:55:51 +02:00
										 |  |  |               {{ $t("user.favorite-recipes") }} | 
					
						
							| 
									
										
										
										
											2022-08-15 14:30:55 -08:00
										 |  |  |             </v-btn> | 
					
						
							| 
									
										
										
										
											2022-06-13 09:33:46 -08:00
										 |  |  |           </v-list-item-subtitle> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |         </v-list-item-content> | 
					
						
							|  |  |  |       </v-list-item> | 
					
						
							|  |  |  |       <v-divider></v-divider> | 
					
						
							|  |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2021-08-06 16:28:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-02 11:37:04 -08:00
										 |  |  |     <slot></slot> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |     <!-- Primary Links --> | 
					
						
							| 
									
										
										
										
											2021-08-23 12:24:38 -08:00
										 |  |  |     <template v-if="topLink"> | 
					
						
							|  |  |  |       <v-list nav dense> | 
					
						
							|  |  |  |         <template v-for="nav in topLink"> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           <div v-if="!nav.restricted || isOwnGroup" :key="nav.title"> | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |             <!-- Multi Items --> | 
					
						
							|  |  |  |             <v-list-group | 
					
						
							|  |  |  |               v-if="nav.children" | 
					
						
							|  |  |  |               :key="nav.title + 'multi-item'" | 
					
						
							|  |  |  |               v-model="dropDowns[nav.title]" | 
					
						
							|  |  |  |               color="primary" | 
					
						
							|  |  |  |               :prepend-icon="nav.icon" | 
					
						
							|  |  |  |             > | 
					
						
							|  |  |  |               <template #activator> | 
					
						
							|  |  |  |                 <v-list-item-title>{{ nav.title }}</v-list-item-title> | 
					
						
							|  |  |  |               </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               <v-list-item v-for="child in nav.children" :key="child.title" exact :to="child.to"> | 
					
						
							|  |  |  |                 <v-list-item-icon> | 
					
						
							|  |  |  |                   <v-icon>{{ child.icon }}</v-icon> | 
					
						
							|  |  |  |                 </v-list-item-icon> | 
					
						
							|  |  |  |                 <v-list-item-title>{{ child.title }}</v-list-item-title> | 
					
						
							|  |  |  |               </v-list-item> | 
					
						
							|  |  |  |               <v-divider class="mb-4"></v-divider> | 
					
						
							|  |  |  |             </v-list-group> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             <!-- Single Item --> | 
					
						
							|  |  |  |             <v-list-item-group | 
					
						
							|  |  |  |               v-else | 
					
						
							|  |  |  |               :key="nav.title + 'single-item'" | 
					
						
							|  |  |  |               v-model="secondarySelected" | 
					
						
							|  |  |  |               color="primary" | 
					
						
							|  |  |  |             > | 
					
						
							|  |  |  |               <v-list-item exact link :to="nav.to"> | 
					
						
							|  |  |  |                 <v-list-item-icon> | 
					
						
							|  |  |  |                   <v-icon>{{ nav.icon }}</v-icon> | 
					
						
							|  |  |  |                 </v-list-item-icon> | 
					
						
							|  |  |  |                 <v-list-item-title>{{ nav.title }}</v-list-item-title> | 
					
						
							|  |  |  |               </v-list-item> | 
					
						
							|  |  |  |             </v-list-item-group> | 
					
						
							|  |  |  |           </div> | 
					
						
							| 
									
										
										
										
											2021-08-23 12:24:38 -08:00
										 |  |  |         </template> | 
					
						
							|  |  |  |       </v-list> | 
					
						
							|  |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     <!-- Secondary Links --> | 
					
						
							|  |  |  |     <template v-if="secondaryLinks"> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       <router-link v-if="secondaryHeader && secondaryHeaderLink" :to="secondaryHeaderLink" style="text-decoration: none;"> | 
					
						
							|  |  |  |         <v-subheader :to="secondaryHeaderLink" class="pb-0"> | 
					
						
							|  |  |  |           {{ secondaryHeader }} | 
					
						
							|  |  |  |         </v-subheader> | 
					
						
							|  |  |  |       </router-link> | 
					
						
							|  |  |  |       <div v-else-if="secondaryHeader"> | 
					
						
							|  |  |  |         <v-subheader :to="secondaryHeaderLink" class="pb-0"> | 
					
						
							|  |  |  |           {{ secondaryHeader }} | 
					
						
							|  |  |  |         </v-subheader> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |       <v-divider v-if="secondaryHeader"></v-divider> | 
					
						
							| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  |       <v-list nav dense exact> | 
					
						
							| 
									
										
										
										
											2021-08-06 16:28:12 -08:00
										 |  |  |         <template v-for="nav in secondaryLinks"> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |           <div v-if="!nav.restricted || isOwnGroup" :key="nav.title"> | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |             <!-- Multi Items --> | 
					
						
							|  |  |  |             <v-list-group | 
					
						
							|  |  |  |               v-if="nav.children" | 
					
						
							|  |  |  |               :key="nav.title + 'multi-item'" | 
					
						
							|  |  |  |               v-model="dropDowns[nav.title]" | 
					
						
							|  |  |  |               color="primary" | 
					
						
							|  |  |  |               :prepend-icon="nav.icon" | 
					
						
							|  |  |  |             > | 
					
						
							|  |  |  |               <template #activator> | 
					
						
							|  |  |  |                 <v-list-item-title>{{ nav.title }}</v-list-item-title> | 
					
						
							|  |  |  |               </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               <v-list-item v-for="child in nav.children" :key="child.title" exact :to="child.to"> | 
					
						
							|  |  |  |                 <v-list-item-icon> | 
					
						
							|  |  |  |                   <v-icon>{{ child.icon }}</v-icon> | 
					
						
							|  |  |  |                 </v-list-item-icon> | 
					
						
							|  |  |  |                 <v-list-item-title>{{ child.title }}</v-list-item-title> | 
					
						
							|  |  |  |               </v-list-item> | 
					
						
							|  |  |  |               <v-divider class="mb-4"></v-divider> | 
					
						
							|  |  |  |             </v-list-group> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             <!-- Single Item --> | 
					
						
							|  |  |  |             <v-list-item-group v-else :key="nav.title + 'single-item'" v-model="secondarySelected" color="primary"> | 
					
						
							|  |  |  |               <v-list-item exact link :to="nav.to"> | 
					
						
							|  |  |  |                 <v-list-item-icon> | 
					
						
							|  |  |  |                   <v-icon>{{ nav.icon }}</v-icon> | 
					
						
							|  |  |  |                 </v-list-item-icon> | 
					
						
							|  |  |  |                 <v-list-item-title>{{ nav.title }}</v-list-item-title> | 
					
						
							|  |  |  |               </v-list-item> | 
					
						
							|  |  |  |             </v-list-item-group> | 
					
						
							|  |  |  |           </div> | 
					
						
							| 
									
										
										
										
											2021-08-06 16:28:12 -08:00
										 |  |  |         </template> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |       </v-list> | 
					
						
							|  |  |  |     </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <!-- Bottom Navigation Links --> | 
					
						
							| 
									
										
										
										
											2021-10-30 15:46:44 -08:00
										 |  |  |     <template v-if="bottomLinks" #append> | 
					
						
							|  |  |  |       <v-list nav dense> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |         <v-list-item-group v-model="bottomSelected" color="primary"> | 
					
						
							| 
									
										
										
										
											2021-09-02 11:24:17 -08:00
										 |  |  |           <template v-for="nav in bottomLinks"> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |             <div v-if="!nav.restricted || isOwnGroup" :key="nav.title"> | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |               <v-list-item | 
					
						
							|  |  |  |                 :key="nav.title" | 
					
						
							|  |  |  |                 exact | 
					
						
							|  |  |  |                 link | 
					
						
							|  |  |  |                 :to="nav.to || null" | 
					
						
							|  |  |  |                 :href="nav.href || null" | 
					
						
							|  |  |  |                 :target="nav.href ? '_blank' : null" | 
					
						
							|  |  |  |               > | 
					
						
							|  |  |  |                 <v-list-item-icon> | 
					
						
							|  |  |  |                   <v-icon>{{ nav.icon }}</v-icon> | 
					
						
							|  |  |  |                 </v-list-item-icon> | 
					
						
							|  |  |  |                 <v-list-item-title>{{ nav.title }}</v-list-item-title> | 
					
						
							|  |  |  |               </v-list-item> | 
					
						
							|  |  |  |             </div> | 
					
						
							| 
									
										
										
										
											2021-09-02 11:24:17 -08:00
										 |  |  |           </template> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |         </v-list-item-group> | 
					
						
							| 
									
										
										
										
											2021-10-04 20:16:37 -08:00
										 |  |  |         <slot name="bottom"></slot> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |       </v-list> | 
					
						
							|  |  |  |     </template> | 
					
						
							|  |  |  |   </v-navigation-drawer> | 
					
						
							| 
									
										
										
										
											2021-07-31 14:45:28 -08:00
										 |  |  | </template> | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-31 14:45:28 -08:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | import { computed, defineComponent, reactive, toRefs, useContext } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  | import { useLoggedInState } from "~/composables/use-logged-in-state"; | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | import { SidebarLinks } from "~/types/application-types"; | 
					
						
							| 
									
										
										
										
											2021-12-18 19:04:36 -09:00
										 |  |  | import UserAvatar from "~/components/Domain/User/UserAvatar.vue"; | 
					
						
							| 
									
										
										
										
											2021-07-31 14:45:28 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default defineComponent({ | 
					
						
							| 
									
										
										
										
											2021-12-18 19:04:36 -09:00
										 |  |  |   components: { | 
					
						
							|  |  |  |     UserAvatar, | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   props: { | 
					
						
							|  |  |  |     value: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     user: { | 
					
						
							|  |  |  |       type: Object, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     topLink: { | 
					
						
							|  |  |  |       type: Array as () => SidebarLinks, | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     secondaryLinks: { | 
					
						
							|  |  |  |       type: Array as () => SidebarLinks, | 
					
						
							|  |  |  |       required: false, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     bottomLinks: { | 
					
						
							|  |  |  |       type: Array as () => SidebarLinks, | 
					
						
							|  |  |  |       required: false, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-08-06 16:28:12 -08:00
										 |  |  |     secondaryHeader: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |     secondaryHeaderLink: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  |   setup(props, context) { | 
					
						
							| 
									
										
										
										
											2023-02-11 21:26:10 -09:00
										 |  |  |     // V-Model Support
 | 
					
						
							|  |  |  |     const drawer = computed({ | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  |       get: () => { | 
					
						
							|  |  |  |         return props.value; | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       set: (val) => { | 
					
						
							| 
									
										
										
										
											2023-02-11 21:26:10 -09:00
										 |  |  |         if (window.innerWidth < 760 && state.hasOpenedBefore === false) { | 
					
						
							|  |  |  |           state.hasOpenedBefore = true; | 
					
						
							|  |  |  |           val = false; | 
					
						
							|  |  |  |           context.emit("input", val); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           context.emit("input", val); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  |       }, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |     const { $auth } = useContext(); | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |     const { loggedIn, isOwnGroup } = useLoggedInState(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const userFavoritesLink = computed(() => $auth.user ? `/user/${$auth.user.id}/favorites` : undefined); | 
					
						
							|  |  |  |     const userProfileLink = computed(() => $auth.user ? "/user/profile" : undefined); | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  |     const state = reactive({ | 
					
						
							| 
									
										
										
										
											2021-08-06 16:28:12 -08:00
										 |  |  |       dropDowns: {}, | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  |       topSelected: null as string[] | null, | 
					
						
							|  |  |  |       secondarySelected: null as string[] | null, | 
					
						
							|  |  |  |       bottomSelected: null as string[] | null, | 
					
						
							| 
									
										
										
										
											2022-11-11 01:41:16 +01:00
										 |  |  |       hasOpenedBefore: false as boolean, | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       ...toRefs(state), | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       userFavoritesLink, | 
					
						
							|  |  |  |       userProfileLink, | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  |       drawer, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |       loggedIn, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       isOwnGroup, | 
					
						
							| 
									
										
										
										
											2022-01-09 21:04:24 -09:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   }, | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-07-31 14:45:28 -08:00
										 |  |  | </script> | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | <style> | 
					
						
							|  |  |  | @media print { | 
					
						
							|  |  |  |   .no-print { | 
					
						
							|  |  |  |     display: none; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-06-13 09:33:46 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | .favorites-link { | 
					
						
							|  |  |  |   text-decoration: none; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .favorites-link:hover { | 
					
						
							|  |  |  |   text-decoration: underline; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | </style> |