| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <div class="text-center"> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |     <BaseDialog | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |       ref="confirmDelete" | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |       :title="$t('recipe.delete-recipe')" | 
					
						
							|  |  |  |       color="error" | 
					
						
							| 
									
										
										
										
											2021-06-16 18:55:32 -08:00
										 |  |  |       :icon="$globals.icons.alertCircle" | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |       @confirm="deleteRecipe()" | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |     > | 
					
						
							|  |  |  |       <v-card-text> | 
					
						
							|  |  |  |         {{ $t("recipe.delete-confirmation") }} | 
					
						
							|  |  |  |       </v-card-text> | 
					
						
							|  |  |  |     </BaseDialog> | 
					
						
							| 
									
										
										
										
											2021-06-10 18:32:03 -08:00
										 |  |  |     <v-menu | 
					
						
							|  |  |  |       offset-y | 
					
						
							|  |  |  |       left | 
					
						
							|  |  |  |       :bottom="!menuTop" | 
					
						
							|  |  |  |       :nudge-bottom="!menuTop ? '5' : '0'" | 
					
						
							|  |  |  |       :top="menuTop" | 
					
						
							|  |  |  |       :nudge-top="menuTop ? '5' : '0'" | 
					
						
							|  |  |  |       allow-overflow | 
					
						
							| 
									
										
										
										
											2021-06-12 22:23:23 -08:00
										 |  |  |       close-delay="125" | 
					
						
							|  |  |  |       open-on-hover | 
					
						
							| 
									
										
										
										
											2021-06-21 16:25:37 -07:00
										 |  |  |       content-class="d-print-none" | 
					
						
							| 
									
										
										
										
											2021-06-10 18:32:03 -08:00
										 |  |  |     > | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |       <template #activator="{ on, attrs }"> | 
					
						
							| 
									
										
										
										
											2021-06-12 22:23:23 -08:00
										 |  |  |         <v-btn :fab="fab" :small="fab" :color="color" :icon="!fab" dark v-bind="attrs" v-on="on" @click.prevent> | 
					
						
							| 
									
										
										
										
											2021-06-16 18:55:32 -08:00
										 |  |  |           <v-icon>{{ effMenuIcon }}</v-icon> | 
					
						
							| 
									
										
										
										
											2021-06-12 22:23:23 -08:00
										 |  |  |         </v-btn> | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |       </template> | 
					
						
							|  |  |  |       <v-list dense> | 
					
						
							| 
									
										
										
										
											2021-06-21 16:25:37 -07:00
										 |  |  |         <v-list-item v-for="(item, index) in displayedMenu" :key="index" @click="menuAction(item.action)"> | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |           <v-list-item-icon> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |             <v-icon :color="item.color" v-text="item.icon"></v-icon> | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |           </v-list-item-icon> | 
					
						
							|  |  |  |           <v-list-item-title>{{ item.title }}</v-list-item-title> | 
					
						
							|  |  |  |         </v-list-item> | 
					
						
							|  |  |  |       </v-list> | 
					
						
							|  |  |  |     </v-menu> | 
					
						
							|  |  |  |   </div> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <script> | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  | import { defineComponent, ref } from "@nuxtjs/composition-api"; | 
					
						
							|  |  |  | import { useApiSingleton } from "~/composables/use-api"; | 
					
						
							|  |  |  | export default defineComponent({ | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |   props: { | 
					
						
							| 
									
										
										
										
											2021-06-10 18:32:03 -08:00
										 |  |  |     menuTop: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-06-21 16:25:37 -07:00
										 |  |  |     showPrint: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: false, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-06-10 18:32:03 -08:00
										 |  |  |     fab: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: false, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     color: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: "primary", | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |     slug: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |       required: true, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     menuIcon: { | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |       type: String, | 
					
						
							| 
									
										
										
										
											2021-06-16 18:55:32 -08:00
										 |  |  |       default: null, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-06-07 20:54:34 +02:00
										 |  |  |     name: { | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |       required: true, | 
					
						
							| 
									
										
										
										
											2021-06-07 20:54:34 +02:00
										 |  |  |       type: String, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-06-10 18:32:03 -08:00
										 |  |  |     cardMenu: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |   setup() { | 
					
						
							|  |  |  |     const api = useApiSingleton(); | 
					
						
							|  |  |  |     const confirmDelete = ref(null); | 
					
						
							|  |  |  |     return { api, confirmDelete }; | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   data() { | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       loading: true, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |   computed: { | 
					
						
							| 
									
										
										
										
											2021-06-16 18:55:32 -08:00
										 |  |  |     effMenuIcon() { | 
					
						
							|  |  |  |       return this.menuIcon ? this.menuIcon : this.$globals.icons.dotsVertical; | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |     loggedIn() { | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |       return this.$auth.loggedIn; | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     baseURL() { | 
					
						
							|  |  |  |       return window.location.origin; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     recipeURL() { | 
					
						
							|  |  |  |       return `${this.baseURL}/recipe/${this.slug}`; | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-06-21 16:25:37 -07:00
										 |  |  |     printerMenu() { | 
					
						
							|  |  |  |       return { | 
					
						
							|  |  |  |         title: this.$t("general.print"), | 
					
						
							|  |  |  |         icon: this.$globals.icons.printer, | 
					
						
							|  |  |  |         color: "accent", | 
					
						
							|  |  |  |         action: "print", | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |     defaultMenu() { | 
					
						
							|  |  |  |       return [ | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-07 20:54:34 +02:00
										 |  |  |           title: this.$t("general.share"), | 
					
						
							| 
									
										
										
										
											2021-06-16 18:55:32 -08:00
										 |  |  |           icon: this.$globals.icons.shareVariant, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |           color: "accent", | 
					
						
							|  |  |  |           action: "share", | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2021-06-21 16:25:37 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           title: this.$t("general.download"), | 
					
						
							|  |  |  |           icon: this.$globals.icons.download, | 
					
						
							|  |  |  |           color: "accent", | 
					
						
							|  |  |  |           action: "download", | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |       ]; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     userMenu() { | 
					
						
							|  |  |  |       return [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           title: this.$t("general.delete"), | 
					
						
							| 
									
										
										
										
											2021-05-23 12:38:55 -08:00
										 |  |  |           icon: this.$globals.icons.delete, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |           color: "error", | 
					
						
							|  |  |  |           action: "delete", | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           title: this.$t("general.edit"), | 
					
						
							| 
									
										
										
										
											2021-05-23 12:38:55 -08:00
										 |  |  |           icon: this.$globals.icons.edit, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |           color: "accent", | 
					
						
							|  |  |  |           action: "edit", | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-06-21 16:25:37 -07:00
										 |  |  |     displayedMenu() { | 
					
						
							|  |  |  |       let menu = this.defaultMenu; | 
					
						
							|  |  |  |       if (this.loggedIn && this.cardMenu) { | 
					
						
							|  |  |  |         menu = [...this.userMenu, ...menu]; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (this.showPrint) { | 
					
						
							|  |  |  |         menu = [this.printerMenu, ...menu]; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       return menu; | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-06-07 20:54:34 +02:00
										 |  |  |     recipeText() { | 
					
						
							|  |  |  |       return this.$t("recipe.share-recipe-message", [this.name]); | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |   }, | 
					
						
							|  |  |  |   methods: { | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |     menuAction(action) { | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |       this.loading = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       switch (action) { | 
					
						
							|  |  |  |         case "delete": | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |           this.confirmDelete.open(); | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |           break; | 
					
						
							|  |  |  |         case "share": | 
					
						
							| 
									
										
										
										
											2021-06-07 15:04:30 -08:00
										 |  |  |           if (navigator.share) { | 
					
						
							|  |  |  |             navigator | 
					
						
							|  |  |  |               .share({ | 
					
						
							|  |  |  |                 title: this.name, | 
					
						
							|  |  |  |                 text: this.recipeText, | 
					
						
							|  |  |  |                 url: this.recipeURL, | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               .then(() => console.log("Successful share")) | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |               .catch((error) => { | 
					
						
							| 
									
										
										
										
											2021-06-07 15:04:30 -08:00
										 |  |  |                 console.log("WebShareAPI not supported", error); | 
					
						
							|  |  |  |                 this.updateClipboard(); | 
					
						
							|  |  |  |               }); | 
					
						
							|  |  |  |           } else this.updateClipboard(); | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |           break; | 
					
						
							|  |  |  |         case "edit": | 
					
						
							|  |  |  |           this.$router.push(`/recipe/${this.slug}` + "?edit=true"); | 
					
						
							|  |  |  |           break; | 
					
						
							| 
									
										
										
										
											2021-05-14 21:10:03 -08:00
										 |  |  |         case "print": | 
					
						
							|  |  |  |           this.$router.push(`/recipe/${this.slug}` + "?print=true"); | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |           break; | 
					
						
							| 
									
										
										
										
											2021-06-21 16:25:37 -07:00
										 |  |  |         case "download": | 
					
						
							|  |  |  |           window.open(`/api/recipes/${this.slug}/zip`); | 
					
						
							|  |  |  |           break; | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |         default: | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       this.loading = false; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     async deleteRecipe() { | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |       console.log("Delete Called"); | 
					
						
							|  |  |  |       await this.api.recipes.deleteOne(this.slug); | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     updateClipboard() { | 
					
						
							|  |  |  |       const copyText = this.recipeURL; | 
					
						
							|  |  |  |       navigator.clipboard.writeText(copyText).then( | 
					
						
							| 
									
										
										
										
											2021-06-07 15:04:30 -08:00
										 |  |  |         () => { | 
					
						
							|  |  |  |           console.log("Copied to Clipboard", copyText); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         () => console.log("Copied Failed", copyText) | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  | </script> |