| 
									
										
										
										
											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 --> | 
					
						
							|  |  |  |     <template v-if="$auth.user"> | 
					
						
							| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  |       <v-list-item two-line to="/user/profile" 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> | 
					
						
							| 
									
										
										
										
											2022-08-15 14:30:55 -08:00
										 |  |  |             <v-btn class="px-2 pa-0" text :to="`/user/${$auth.user.id}/favorites`" small> | 
					
						
							|  |  |  |               <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"> | 
					
						
							|  |  |  |           <!-- Multi Items --> | 
					
						
							|  |  |  |           <v-list-group | 
					
						
							|  |  |  |             v-if="nav.children && ($auth.loggedIn || !nav.restricted)" | 
					
						
							|  |  |  |             :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> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  |             <v-list-item v-for="child in nav.children" :key="child.title" exact :to="child.to"> | 
					
						
							| 
									
										
										
										
											2021-08-23 12:24:38 -08:00
										 |  |  |               <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-if="$auth.loggedIn || !nav.restricted" | 
					
						
							|  |  |  |             :key="nav.title + 'single-item'" | 
					
						
							|  |  |  |             v-model="secondarySelected" | 
					
						
							|  |  |  |             color="primary" | 
					
						
							|  |  |  |           > | 
					
						
							| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  |             <v-list-item exact link :to="nav.to"> | 
					
						
							| 
									
										
										
										
											2021-08-23 12:24:38 -08:00
										 |  |  |               <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> | 
					
						
							|  |  |  |         </template> | 
					
						
							|  |  |  |       </v-list> | 
					
						
							|  |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     <!-- Secondary Links --> | 
					
						
							|  |  |  |     <template v-if="secondaryLinks"> | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       <v-subheader v-if="secondaryHeader" :to="secondaryHeaderLink" class="pb-0"> | 
					
						
							|  |  |  |         {{ secondaryHeader }} | 
					
						
							|  |  |  |       </v-subheader> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |       <v-divider></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"> | 
					
						
							|  |  |  |           <!-- 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> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  |             <v-list-item v-for="child in nav.children" :key="child.title" exact :to="child.to"> | 
					
						
							| 
									
										
										
										
											2021-08-06 16:28:12 -08:00
										 |  |  |               <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> | 
					
						
							| 
									
										
										
										
											2021-08-23 12:24:38 -08:00
										 |  |  |             <v-divider class="mb-4"></v-divider> | 
					
						
							| 
									
										
										
										
											2021-08-06 16:28:12 -08:00
										 |  |  |           </v-list-group> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           <!-- Single Item --> | 
					
						
							|  |  |  |           <v-list-item-group v-else :key="nav.title + 'single-item'" v-model="secondarySelected" color="primary"> | 
					
						
							| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  |             <v-list-item exact link :to="nav.to"> | 
					
						
							| 
									
										
										
										
											2021-08-06 16:28:12 -08:00
										 |  |  |               <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> | 
					
						
							|  |  |  |         </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"> | 
					
						
							|  |  |  |             <v-list-item | 
					
						
							|  |  |  |               v-if="!nav.restricted || $auth.loggedIn" | 
					
						
							|  |  |  |               :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> | 
					
						
							|  |  |  |           </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"> | 
					
						
							| 
									
										
										
										
											2022-01-07 22:09:34 +01:00
										 |  |  | import { computed, defineComponent, reactive, toRefs } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											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
										 |  |  |       }, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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), | 
					
						
							|  |  |  |       drawer, | 
					
						
							| 
									
										
										
										
											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> |