| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <div class="text-center"> | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |     <!-- Recipe Share Dialog --> | 
					
						
							|  |  |  |     <RecipeDialogShare v-model="shareDialog" :recipe-id="recipeId" :name="name" /> | 
					
						
							| 
									
										
										
										
											2023-02-21 22:00:22 -06:00
										 |  |  |     <RecipeDialogPrintPreferences v-model="printPreferencesDialog" :recipe="recipeRef" /> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |     <BaseDialog | 
					
						
							| 
									
										
										
										
											2021-11-25 14:17:02 -09:00
										 |  |  |       v-model="recipeDeleteDialog" | 
					
						
							| 
									
										
										
										
											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> | 
					
						
							| 
									
										
										
										
											2022-12-01 06:57:26 +01:00
										 |  |  |     <BaseDialog | 
					
						
							|  |  |  |       v-model="recipeDuplicateDialog" | 
					
						
							|  |  |  |       :title="$t('recipe.duplicate')" | 
					
						
							|  |  |  |       color="primary" | 
					
						
							|  |  |  |       :icon="$globals.icons.duplicate" | 
					
						
							|  |  |  |       @confirm="duplicateRecipe()" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <v-card-text> | 
					
						
							|  |  |  |         <v-text-field | 
					
						
							|  |  |  |           v-model="recipeName" | 
					
						
							|  |  |  |           dense | 
					
						
							|  |  |  |           :label="$t('recipe.recipe-name')" | 
					
						
							|  |  |  |           autofocus | 
					
						
							|  |  |  |           @keyup.enter="duplicateRecipe()" | 
					
						
							|  |  |  |         ></v-text-field> | 
					
						
							|  |  |  |       </v-card-text> | 
					
						
							|  |  |  |     </BaseDialog> | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     <BaseDialog | 
					
						
							| 
									
										
										
										
											2021-11-25 14:17:02 -09:00
										 |  |  |       v-model="mealplannerDialog" | 
					
						
							| 
									
										
										
										
											2022-08-10 07:12:45 +02:00
										 |  |  |       :title="$t('recipe.add-recipe-to-mealplan')" | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       color="primary" | 
					
						
							|  |  |  |       :icon="$globals.icons.calendar" | 
					
						
							|  |  |  |       @confirm="addRecipeToPlan()" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <v-card-text> | 
					
						
							|  |  |  |         <v-menu | 
					
						
							|  |  |  |           v-model="pickerMenu" | 
					
						
							|  |  |  |           :close-on-content-click="false" | 
					
						
							|  |  |  |           transition="scale-transition" | 
					
						
							|  |  |  |           offset-y | 
					
						
							|  |  |  |           max-width="290px" | 
					
						
							|  |  |  |           min-width="auto" | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |           <template #activator="{ on, attrs }"> | 
					
						
							|  |  |  |             <v-text-field | 
					
						
							|  |  |  |               v-model="newMealdate" | 
					
						
							| 
									
										
										
										
											2022-08-10 07:12:45 +02:00
										 |  |  |               :label="$t('general.date')" | 
					
						
							|  |  |  |               :hint="$t('recipe.date-format-hint')" | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |               persistent-hint | 
					
						
							|  |  |  |               :prepend-icon="$globals.icons.calendar" | 
					
						
							|  |  |  |               v-bind="attrs" | 
					
						
							|  |  |  |               readonly | 
					
						
							|  |  |  |               v-on="on" | 
					
						
							|  |  |  |             ></v-text-field> | 
					
						
							|  |  |  |           </template> | 
					
						
							|  |  |  |           <v-date-picker v-model="newMealdate" no-title @input="pickerMenu = false"></v-date-picker> | 
					
						
							|  |  |  |         </v-menu> | 
					
						
							| 
									
										
										
										
											2022-08-10 07:12:45 +02:00
										 |  |  |         <v-select | 
					
						
							|  |  |  |           v-model="newMealType" | 
					
						
							|  |  |  |           :return-object="false" | 
					
						
							|  |  |  |           :items="planTypeOptions" | 
					
						
							|  |  |  |           :label="$t('recipe.entry-type')" | 
					
						
							|  |  |  |         ></v-select> | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       </v-card-text> | 
					
						
							|  |  |  |     </BaseDialog> | 
					
						
							| 
									
										
										
										
											2022-08-10 07:12:45 +02:00
										 |  |  |     <BaseDialog v-model="shoppingListDialog" :title="$t('recipe.add-to-list')" :icon="$globals.icons.cartCheck"> | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       <v-card-text> | 
					
						
							|  |  |  |         <v-card | 
					
						
							|  |  |  |           v-for="list in shoppingLists" | 
					
						
							|  |  |  |           :key="list.id" | 
					
						
							|  |  |  |           hover | 
					
						
							|  |  |  |           class="my-2 left-border" | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |           @click="openShoppingListIngredientDialog(list)" | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |         > | 
					
						
							|  |  |  |           <v-card-title class="py-2"> | 
					
						
							|  |  |  |             {{ list.name }} | 
					
						
							|  |  |  |           </v-card-title> | 
					
						
							|  |  |  |         </v-card> | 
					
						
							|  |  |  |       </v-card-text> | 
					
						
							|  |  |  |     </BaseDialog> | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |     <BaseDialog | 
					
						
							|  |  |  |       v-model="shoppingListIngredientDialog" | 
					
						
							|  |  |  |       :title="selectedShoppingList ? selectedShoppingList.name : $t('recipe.add-to-list')" | 
					
						
							|  |  |  |       :icon="$globals.icons.cartCheck" | 
					
						
							|  |  |  |       width="70%" | 
					
						
							|  |  |  |       :submit-text="$tc('recipe.add-to-list')" | 
					
						
							|  |  |  |       @submit="addRecipeToList()" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <v-card | 
					
						
							|  |  |  |         elevation="0" | 
					
						
							|  |  |  |         height="fit-content" | 
					
						
							|  |  |  |         max-height="60vh" | 
					
						
							|  |  |  |         width="100%" | 
					
						
							| 
									
										
										
										
											2023-03-21 14:51:52 -05:00
										 |  |  |         :class="$vuetify.breakpoint.smAndDown ? '' : 'ingredient-grid'" | 
					
						
							|  |  |  |         :style="$vuetify.breakpoint.smAndDown ? '' : { gridTemplateRows: `repeat(${Math.ceil(recipeIngredients.length / 2)}, min-content)` }" | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |         style="overflow-y: auto" | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         <v-list-item | 
					
						
							|  |  |  |           v-for="(ingredientData, i) in recipeIngredients" | 
					
						
							|  |  |  |           :key="'ingredient' + i" | 
					
						
							|  |  |  |           dense | 
					
						
							|  |  |  |           @click="recipeIngredients[i].checked = !recipeIngredients[i].checked" | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |           <v-checkbox | 
					
						
							|  |  |  |             hide-details | 
					
						
							|  |  |  |             :input-value="ingredientData.checked" | 
					
						
							|  |  |  |             class="pt-0 my-auto py-auto" | 
					
						
							|  |  |  |             color="secondary" | 
					
						
							|  |  |  |           /> | 
					
						
							|  |  |  |           <v-list-item-content :key="ingredientData.ingredient.quantity"> | 
					
						
							| 
									
										
										
										
											2023-08-21 17:32:09 +02:00
										 |  |  |             <RecipeIngredientListItem | 
					
						
							|  |  |  |               :ingredient="ingredientData.ingredient" | 
					
						
							|  |  |  |               :disable-amount="ingredientData.disableAmount" | 
					
						
							|  |  |  |               :scale="recipeScale" /> | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |           </v-list-item-content> | 
					
						
							|  |  |  |         </v-list-item> | 
					
						
							|  |  |  |       </v-card> | 
					
						
							|  |  |  |       <div class="d-flex justify-end mb-4 mt-2"> | 
					
						
							|  |  |  |         <BaseButtonGroup | 
					
						
							|  |  |  |           :buttons="[ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               icon: $globals.icons.checkboxBlankOutline, | 
					
						
							|  |  |  |               text: $tc('shopping-list.uncheck-all-items'), | 
					
						
							|  |  |  |               event: 'uncheck', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               icon: $globals.icons.checkboxOutline, | 
					
						
							|  |  |  |               text: $tc('shopping-list.check-all-items'), | 
					
						
							|  |  |  |               event: 'check', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           ]" | 
					
						
							|  |  |  |           @uncheck="bulkCheckIngredients(false)" | 
					
						
							|  |  |  |           @check="bulkCheckIngredients(true)" | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </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" | 
					
						
							| 
									
										
										
										
											2023-08-21 20:41:18 +02:00
										 |  |  |       :open-on-hover="$vuetify.breakpoint.mdAndUp" | 
					
						
							| 
									
										
										
										
											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-11-05 21:29:15 -08:00
										 |  |  |           <v-icon>{{ icon }}</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-11-05 21:29:15 -08:00
										 |  |  |         <v-list-item v-for="(item, index) in menuItems" :key="index" @click="contextMenuEventHandler(item.event)"> | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |           <v-list-item-icon> | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |             <v-icon :color="item.color"> {{ 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> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  | import { defineComponent, reactive, toRefs, useContext, useRouter, ref } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											2023-08-21 17:32:09 +02:00
										 |  |  | import RecipeIngredientListItem from "./RecipeIngredientListItem.vue"; | 
					
						
							| 
									
										
										
										
											2023-02-19 18:37:18 -06:00
										 |  |  | import RecipeDialogPrintPreferences from "./RecipeDialogPrintPreferences.vue"; | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  | import RecipeDialogShare from "./RecipeDialogShare.vue"; | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  | import { useUserApi } from "~/composables/api"; | 
					
						
							| 
									
										
										
										
											2021-11-04 18:15:23 -08:00
										 |  |  | import { alert } from "~/composables/use-toast"; | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  | import { usePlanTypeOptions } from "~/composables/use-group-mealplan"; | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  | import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe"; | 
					
						
							| 
									
										
										
										
											2022-10-22 11:51:07 -08:00
										 |  |  | import { ShoppingListSummary } from "~/lib/api/types/group"; | 
					
						
							|  |  |  | import { PlanEntryType } from "~/lib/api/types/meal-plan"; | 
					
						
							| 
									
										
										
										
											2022-05-08 17:43:03 -08:00
										 |  |  | import { useAxiosDownloader } from "~/composables/api/use-axios-download"; | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  | import { useCopy } from "~/composables/use-copy"; | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export interface ContextMenuIncludes { | 
					
						
							|  |  |  |   delete: boolean; | 
					
						
							|  |  |  |   edit: boolean; | 
					
						
							|  |  |  |   download: boolean; | 
					
						
							|  |  |  |   mealplanner: boolean; | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |   shoppingList: boolean; | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |   print: boolean; | 
					
						
							| 
									
										
										
										
											2023-02-19 18:37:18 -06:00
										 |  |  |   printPreferences: boolean; | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |   share: boolean; | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |   publicUrl: boolean; | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export interface ContextMenuItem { | 
					
						
							|  |  |  |   title: string; | 
					
						
							|  |  |  |   icon: string; | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |   color: string | undefined; | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |   event: string; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  | export default defineComponent({ | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |   components: { | 
					
						
							| 
									
										
										
										
											2023-02-19 18:37:18 -06:00
										 |  |  |     RecipeDialogPrintPreferences, | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |     RecipeDialogShare, | 
					
						
							| 
									
										
										
										
											2023-08-21 17:32:09 +02:00
										 |  |  |     RecipeIngredientListItem | 
					
						
							|  |  |  | }, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |   props: { | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     useItems: { | 
					
						
							|  |  |  |       type: Object as () => ContextMenuIncludes, | 
					
						
							|  |  |  |       default: () => ({ | 
					
						
							|  |  |  |         delete: true, | 
					
						
							|  |  |  |         edit: true, | 
					
						
							|  |  |  |         download: true, | 
					
						
							| 
									
										
										
										
											2022-12-01 06:57:26 +01:00
										 |  |  |         duplicate: false, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         mealplanner: true, | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |         shoppingList: true, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         print: true, | 
					
						
							| 
									
										
										
										
											2023-02-19 18:37:18 -06:00
										 |  |  |         printPreferences: true, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         share: true, | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |         publicUrl: false, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       }), | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     // Append items are added at the end of the useItems list
 | 
					
						
							|  |  |  |     appendItems: { | 
					
						
							|  |  |  |       type: Array as () => ContextMenuItem[], | 
					
						
							|  |  |  |       default: () => [], | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     // Append items are added at the beginning of the useItems list
 | 
					
						
							|  |  |  |     leadingItems: { | 
					
						
							|  |  |  |       type: Array as () => ContextMenuItem[], | 
					
						
							|  |  |  |       default: () => [], | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-06-10 18:32:03 -08:00
										 |  |  |     menuTop: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     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, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2023-02-19 18:37:18 -06:00
										 |  |  |     recipe: { | 
					
						
							|  |  |  |       type: Object as () => Recipe, | 
					
						
							|  |  |  |       default: undefined, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     recipeId: { | 
					
						
							|  |  |  |       required: true, | 
					
						
							| 
									
										
										
										
											2022-02-13 12:23:42 -09:00
										 |  |  |       type: String, | 
					
						
							| 
									
										
										
										
											2021-06-10 18:32:03 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-12-30 16:47:35 -06:00
										 |  |  |     recipeScale: { | 
					
						
							|  |  |  |       type: Number, | 
					
						
							|  |  |  |       default: 1, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Optional group ID prop that is only _required_ when the | 
					
						
							|  |  |  |      * public URL is requested. If the public URL button is pressed | 
					
						
							|  |  |  |      * and the groupId is not set, an error will be thrown. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     groupId: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: "", | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-05-01 20:46:02 -08:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |   setup(props, context) { | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  |     const api = useUserApi(); | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const state = reactive({ | 
					
						
							| 
									
										
										
										
											2023-02-19 18:37:18 -06:00
										 |  |  |       printPreferencesDialog: false, | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |       shareDialog: false, | 
					
						
							| 
									
										
										
										
											2021-11-25 14:17:02 -09:00
										 |  |  |       recipeDeleteDialog: false, | 
					
						
							|  |  |  |       mealplannerDialog: false, | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       shoppingListDialog: false, | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |       shoppingListIngredientDialog: false, | 
					
						
							| 
									
										
										
										
											2022-12-01 06:57:26 +01:00
										 |  |  |       recipeDuplicateDialog: false, | 
					
						
							|  |  |  |       recipeName: props.name, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       loading: false, | 
					
						
							|  |  |  |       menuItems: [] as ContextMenuItem[], | 
					
						
							|  |  |  |       newMealdate: "", | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |       newMealType: "dinner" as PlanEntryType, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       pickerMenu: false, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const { i18n, $globals } = useContext(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // ===========================================================================
 | 
					
						
							|  |  |  |     // Context Menu Setup
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const defaultItems: { [key: string]: ContextMenuItem } = { | 
					
						
							|  |  |  |       edit: { | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |         title: i18n.tc("general.edit"), | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         icon: $globals.icons.edit, | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |         color: undefined, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         event: "edit", | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       delete: { | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |         title: i18n.tc("general.delete"), | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         icon: $globals.icons.delete, | 
					
						
							|  |  |  |         color: "error", | 
					
						
							|  |  |  |         event: "delete", | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       download: { | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |         title: i18n.tc("general.download"), | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         icon: $globals.icons.download, | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |         color: undefined, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         event: "download", | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2022-12-01 06:57:26 +01:00
										 |  |  |       duplicate: { | 
					
						
							|  |  |  |         title: i18n.tc("general.duplicate"), | 
					
						
							|  |  |  |         icon: $globals.icons.duplicate, | 
					
						
							|  |  |  |         color: undefined, | 
					
						
							|  |  |  |         event: "duplicate", | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       mealplanner: { | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |         title: i18n.tc("recipe.add-to-plan"), | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         icon: $globals.icons.calendar, | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |         color: undefined, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         event: "mealplanner", | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       shoppingList: { | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |         title: i18n.tc("recipe.add-to-list"), | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |         icon: $globals.icons.cartCheck, | 
					
						
							|  |  |  |         color: undefined, | 
					
						
							|  |  |  |         event: "shoppingList", | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       print: { | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |         title: i18n.tc("general.print"), | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         icon: $globals.icons.printer, | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |         color: undefined, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         event: "print", | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2023-02-19 18:37:18 -06:00
										 |  |  |       printPreferences: { | 
					
						
							|  |  |  |         title: i18n.tc("general.print-preferences"), | 
					
						
							|  |  |  |         icon: $globals.icons.printerSettings, | 
					
						
							|  |  |  |         color: undefined, | 
					
						
							|  |  |  |         event: "printPreferences", | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       share: { | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |         title: i18n.tc("general.share"), | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         icon: $globals.icons.shareVariant, | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |         color: undefined, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         event: "share", | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |       publicUrl: { | 
					
						
							|  |  |  |         title: i18n.tc("recipe.public-link"), | 
					
						
							|  |  |  |         icon: $globals.icons.contentCopy, | 
					
						
							|  |  |  |         color: undefined, | 
					
						
							|  |  |  |         event: "publicUrl", | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Get Default Menu Items Specified in Props
 | 
					
						
							|  |  |  |     for (const [key, value] of Object.entries(props.useItems)) { | 
					
						
							|  |  |  |       if (value) { | 
					
						
							|  |  |  |         const item = defaultItems[key]; | 
					
						
							|  |  |  |         if (item) { | 
					
						
							|  |  |  |           state.menuItems.push(item); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-21 16:25:37 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Add leading and Apppending Items
 | 
					
						
							|  |  |  |     state.menuItems = [...state.menuItems, ...props.leadingItems, ...props.appendItems]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const icon = props.menuIcon || $globals.icons.dotsVertical; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // ===========================================================================
 | 
					
						
							|  |  |  |     // Context Menu Event Handler
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |     const shoppingLists = ref<ShoppingListSummary[]>(); | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |     const selectedShoppingList = ref<ShoppingListSummary>(); | 
					
						
							| 
									
										
										
										
											2023-02-21 22:00:22 -06:00
										 |  |  |     const recipeRef = ref<Recipe>(props.recipe); | 
					
						
							| 
									
										
										
										
											2023-08-21 17:32:09 +02:00
										 |  |  |     const recipeIngredients = ref<{ checked: boolean; ingredient: RecipeIngredient, disableAmount: boolean }[]>([]); | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     async function getShoppingLists() { | 
					
						
							|  |  |  |       const { data } = await api.shopping.lists.getAll(); | 
					
						
							|  |  |  |       if (data) { | 
					
						
							| 
									
										
										
										
											2022-06-25 14:39:38 -05:00
										 |  |  |         shoppingLists.value = data.items ?? []; | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |     async function refreshRecipe() { | 
					
						
							|  |  |  |       const { data } = await api.recipes.getOne(props.slug); | 
					
						
							|  |  |  |       if (data) { | 
					
						
							| 
									
										
										
										
											2023-02-21 22:00:22 -06:00
										 |  |  |         recipeRef.value = data; | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function openShoppingListIngredientDialog(list: ShoppingListSummary) { | 
					
						
							|  |  |  |       selectedShoppingList.value = list; | 
					
						
							| 
									
										
										
										
											2023-02-21 22:00:22 -06:00
										 |  |  |       if (!recipeRef.value) { | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |         await refreshRecipe(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-21 22:00:22 -06:00
										 |  |  |       if (recipeRef.value?.recipeIngredient) { | 
					
						
							|  |  |  |         recipeIngredients.value = recipeRef.value.recipeIngredient.map((ingredient) => { | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |           return { | 
					
						
							|  |  |  |             checked: true, | 
					
						
							|  |  |  |             ingredient, | 
					
						
							| 
									
										
										
										
											2023-08-21 17:32:09 +02:00
										 |  |  |             disableAmount: recipeRef.value.settings?.disableAmount || false | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |           }; | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       state.shoppingListDialog = false; | 
					
						
							|  |  |  |       state.shoppingListIngredientDialog = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function bulkCheckIngredients(value = true) { | 
					
						
							|  |  |  |       recipeIngredients.value.forEach((data) => { | 
					
						
							|  |  |  |         data.checked = value; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function addRecipeToList() { | 
					
						
							|  |  |  |       if (!selectedShoppingList.value) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const ingredients: RecipeIngredient[] = []; | 
					
						
							|  |  |  |       recipeIngredients.value.forEach((data) => { | 
					
						
							|  |  |  |         if (data.checked) { | 
					
						
							|  |  |  |           ingredients.push(data.ingredient); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (!ingredients.length) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const { data } = await api.shopping.lists.addRecipe( | 
					
						
							|  |  |  |         selectedShoppingList.value.id, | 
					
						
							|  |  |  |         props.recipeId, | 
					
						
							|  |  |  |         props.recipeScale, | 
					
						
							|  |  |  |         ingredients | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       if (data) { | 
					
						
							| 
									
										
										
										
											2022-08-10 07:12:45 +02:00
										 |  |  |         alert.success(i18n.t("recipe.recipe-added-to-list") as string); | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |         state.shoppingListDialog = false; | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |         state.shoppingListIngredientDialog = false; | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     const router = useRouter(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function deleteRecipe() { | 
					
						
							|  |  |  |       await api.recipes.deleteOne(props.slug); | 
					
						
							|  |  |  |       context.emit("delete", props.slug); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-08 17:43:03 -08:00
										 |  |  |     const download = useAxiosDownloader(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     async function handleDownloadEvent() { | 
					
						
							|  |  |  |       const { data } = await api.recipes.getZipToken(props.slug); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (data) { | 
					
						
							| 
									
										
										
										
											2022-05-08 17:43:03 -08:00
										 |  |  |         download(api.recipes.getZipRedirectUrl(props.slug, data.token), `${props.slug}.zip`); | 
					
						
							| 
									
										
										
										
											2021-06-21 16:25:37 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function addRecipeToPlan() { | 
					
						
							|  |  |  |       const { response } = await api.mealplans.createOne({ | 
					
						
							|  |  |  |         date: state.newMealdate, | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |         entryType: state.newMealType, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |         title: "", | 
					
						
							|  |  |  |         text: "", | 
					
						
							|  |  |  |         recipeId: props.recipeId, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (response?.status === 201) { | 
					
						
							| 
									
										
										
										
											2022-08-10 07:12:45 +02:00
										 |  |  |         alert.success(i18n.t("recipe.recipe-added-to-mealplan") as string); | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2022-08-10 07:12:45 +02:00
										 |  |  |         alert.error(i18n.t("recipe.failed-to-add-recipe-to-mealplan") as string); | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-01 06:57:26 +01:00
										 |  |  |     async function duplicateRecipe() { | 
					
						
							|  |  |  |       const { data } = await api.recipes.duplicateOne(props.slug, state.recipeName); | 
					
						
							|  |  |  |       if (data && data.slug) { | 
					
						
							|  |  |  |         router.push(`/recipe/${data.slug}`); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |     const { copyText } = useCopy(); | 
					
						
							| 
									
										
										
										
											2023-08-20 13:38:46 -05:00
										 |  |  |     const groupSlug = ref<string>(""); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function setGroupSlug() { | 
					
						
							|  |  |  |       if (!props.groupId) { | 
					
						
							|  |  |  |         groupSlug.value = props.groupId; | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const {data} = await api.groups.getOne(props.groupId); | 
					
						
							|  |  |  |       if (!data) { | 
					
						
							|  |  |  |         groupSlug.value = props.groupId; | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       groupSlug.value = data.slug; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     // Note: Print is handled as an event in the parent component
 | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |     const eventHandlers: { [key: string]: () => void | Promise<any> } = { | 
					
						
							| 
									
										
										
										
											2021-11-25 14:17:02 -09:00
										 |  |  |       delete: () => { | 
					
						
							|  |  |  |         state.recipeDeleteDialog = true; | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       edit: () => router.push(`/recipe/${props.slug}` + "?edit=true"), | 
					
						
							|  |  |  |       download: handleDownloadEvent, | 
					
						
							| 
									
										
										
										
											2022-12-01 06:57:26 +01:00
										 |  |  |       duplicate: () => { | 
					
						
							|  |  |  |         state.recipeDuplicateDialog = true; | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-11-25 14:17:02 -09:00
										 |  |  |       mealplanner: () => { | 
					
						
							|  |  |  |         state.mealplannerDialog = true; | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2023-02-21 22:00:22 -06:00
										 |  |  |       printPreferences: async () => { | 
					
						
							|  |  |  |         if (!recipeRef.value) { | 
					
						
							|  |  |  |           await refreshRecipe(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-02-19 18:37:18 -06:00
										 |  |  |         state.printPreferencesDialog = true; | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       shoppingList: () => { | 
					
						
							|  |  |  |         getShoppingLists(); | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |         state.shoppingListDialog = true; | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |         state.shoppingListIngredientDialog = false; | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |       share: () => { | 
					
						
							|  |  |  |         state.shareDialog = true; | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2023-08-20 13:38:46 -05:00
										 |  |  |       publicUrl: async () => { | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |         if (!props.groupId) { | 
					
						
							|  |  |  |           alert.error("Unknown group ID"); | 
					
						
							|  |  |  |           console.error("prop `groupId` is required when requesting a public URL"); | 
					
						
							|  |  |  |           return; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-08-20 13:38:46 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!groupSlug.value) { | 
					
						
							|  |  |  |           await setGroupSlug(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         copyText(`${window.location.origin}/explore/recipes/${groupSlug.value}/${props.slug}`); | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function contextMenuEventHandler(eventKey: string) { | 
					
						
							|  |  |  |       const handler = eventHandlers[eventKey]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (handler && typeof handler === "function") { | 
					
						
							|  |  |  |         handler(); | 
					
						
							|  |  |  |         state.loading = false; | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context.emit(eventKey); | 
					
						
							|  |  |  |       state.loading = false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  |     const planTypeOptions = usePlanTypeOptions(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     return { | 
					
						
							| 
									
										
										
										
											2022-08-28 20:08:33 -08:00
										 |  |  |       ...toRefs(state), | 
					
						
							| 
									
										
										
										
											2023-02-21 22:00:22 -06:00
										 |  |  |       recipeRef, | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       shoppingLists, | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |       selectedShoppingList, | 
					
						
							|  |  |  |       openShoppingListIngredientDialog, | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       addRecipeToList, | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |       bulkCheckIngredients, | 
					
						
							| 
									
										
										
										
											2022-12-01 06:57:26 +01:00
										 |  |  |       duplicateRecipe, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |       contextMenuEventHandler, | 
					
						
							|  |  |  |       deleteRecipe, | 
					
						
							|  |  |  |       addRecipeToPlan, | 
					
						
							|  |  |  |       icon, | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |       planTypeOptions, | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  |       recipeIngredients, | 
					
						
							| 
									
										
										
										
											2021-11-05 21:29:15 -08:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											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> | 
					
						
							| 
									
										
										
										
											2023-02-19 19:20:32 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | <style scoped lang="css"> | 
					
						
							|  |  |  | .ingredient-grid { | 
					
						
							|  |  |  |   display: grid; | 
					
						
							|  |  |  |   grid-auto-flow: column; | 
					
						
							|  |  |  |   grid-template-columns: 1fr 1fr; | 
					
						
							|  |  |  |   grid-gap: 0.5rem; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | </style> |