| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <v-container class="elevation-3"> | 
					
						
							|  |  |  |     <v-row no-gutters> | 
					
						
							|  |  |  |       <v-col cols="12"> | 
					
						
							|  |  |  |         <RecipeCardMobile | 
					
						
							|  |  |  |           :name="recipe.name" | 
					
						
							|  |  |  |           :description="recipe.description" | 
					
						
							|  |  |  |           :slug="recipe.slug" | 
					
						
							|  |  |  |           :rating="recipe.rating" | 
					
						
							|  |  |  |           :image="recipe.image" | 
					
						
							|  |  |  |           :recipe-id="recipe.id" | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       </v-col> | 
					
						
							|  |  |  |       <div v-for="(organizer, idx) in missingOrganizers" :key="idx"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         <v-col v-if="organizer.show" cols="12"> | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  |           <div class="d-flex flex-row flex-wrap align-center pt-2"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |             <v-icon class="ma-0 pa-0"> | 
					
						
							|  |  |  |               {{ organizer.icon }} | 
					
						
							|  |  |  |             </v-icon> | 
					
						
							|  |  |  |             <v-card-text class="mr-0 my-0 pl-1 py-0" style="width: min-content"> | 
					
						
							|  |  |  |               {{ $t("recipe-finder.missing") }}: | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  |             </v-card-text> | 
					
						
							|  |  |  |             <v-chip | 
					
						
							|  |  |  |               v-for="item in organizer.items" | 
					
						
							|  |  |  |               :key="item.item.id" | 
					
						
							|  |  |  |               label | 
					
						
							|  |  |  |               color="secondary custom-transparent" | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |               class="mr-2 my-1 pl-1" | 
					
						
							|  |  |  |               variant="flat" | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  |             > | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |               <v-checkbox dark :ripple="false" hide-details @click="handleCheckbox(item)"> | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  |                 <template #label> | 
					
						
							|  |  |  |                   {{ organizer.getLabel(item.item) }} | 
					
						
							|  |  |  |                 </template> | 
					
						
							|  |  |  |               </v-checkbox> | 
					
						
							|  |  |  |             </v-chip> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         </v-col> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </v-row> | 
					
						
							|  |  |  |   </v-container> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <script lang="ts"> | 
					
						
							|  |  |  | import RecipeCardMobile from "./RecipeCardMobile.vue"; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import type { IngredientFood, RecipeSummary, RecipeTool } from "~/lib/api/types/recipe"; | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | interface Organizer { | 
					
						
							|  |  |  |   type: "food" | "tool"; | 
					
						
							|  |  |  |   item: IngredientFood | RecipeTool; | 
					
						
							|  |  |  |   selected: boolean; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | export default defineNuxtComponent({ | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  |   components: { RecipeCardMobile }, | 
					
						
							|  |  |  |   props: { | 
					
						
							|  |  |  |     recipe: { | 
					
						
							|  |  |  |       type: Object as () => RecipeSummary, | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     missingFoods: { | 
					
						
							|  |  |  |       type: Array as () => IngredientFood[] | null, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     missingTools: { | 
					
						
							|  |  |  |       type: Array as () => RecipeTool[] | null, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     disableCheckbox: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: false, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   setup(props, context) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     const { $globals } = useNuxtApp(); | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  |     const missingOrganizers = computed(() => [ | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         type: "food", | 
					
						
							|  |  |  |         show: props.missingFoods?.length, | 
					
						
							|  |  |  |         icon: $globals.icons.foods, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         items: props.missingFoods | 
					
						
							|  |  |  |           ? props.missingFoods.map((food) => { | 
					
						
							|  |  |  |               return reactive({ type: "food", item: food, selected: false } as Organizer); | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |           : [], | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  |         getLabel: (item: IngredientFood) => item.pluralName || item.name, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         type: "tool", | 
					
						
							|  |  |  |         show: props.missingTools?.length, | 
					
						
							|  |  |  |         icon: $globals.icons.tools, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         items: props.missingTools | 
					
						
							|  |  |  |           ? props.missingTools.map((tool) => { | 
					
						
							|  |  |  |               return reactive({ type: "tool", item: tool, selected: false } as Organizer); | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |           : [], | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  |         getLabel: (item: RecipeTool) => item.name, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       }, | 
					
						
							|  |  |  |     ]); | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function handleCheckbox(organizer: Organizer) { | 
					
						
							|  |  |  |       if (props.disableCheckbox) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       organizer.selected = !organizer.selected; | 
					
						
							|  |  |  |       if (organizer.selected) { | 
					
						
							|  |  |  |         context.emit(`add-${organizer.type}`, organizer.item); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       else { | 
					
						
							|  |  |  |         context.emit(`remove-${organizer.type}`, organizer.item); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       missingOrganizers, | 
					
						
							|  |  |  |       handleCheckbox, | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2024-12-03 07:27:41 -06:00
										 |  |  | }); | 
					
						
							|  |  |  | </script> |