| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <v-data-table | 
					
						
							|  |  |  |     v-model="selected" | 
					
						
							|  |  |  |     item-key="id" | 
					
						
							|  |  |  |     show-select | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     :sort-by="[{ key: 'dateAdded', order: 'desc' }]" | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |     :headers="headers" | 
					
						
							|  |  |  |     :items="recipes" | 
					
						
							|  |  |  |     :items-per-page="15" | 
					
						
							|  |  |  |     class="elevation-0" | 
					
						
							| 
									
										
										
										
											2021-12-04 14:18:46 -09:00
										 |  |  |     :loading="loading" | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |   > | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     <template #[`item.name`]="{ item }"> | 
					
						
							|  |  |  |       <a | 
					
						
							|  |  |  |         :href="`/g/${groupSlug}/r/${item.slug}`" | 
					
						
							|  |  |  |         style="color: inherit; text-decoration: inherit; " | 
					
						
							|  |  |  |         @click="$emit('click')" | 
					
						
							|  |  |  |       >{{ item.name }}</a> | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     <template #[`item.tags`]="{ item }"> | 
					
						
							|  |  |  |       <RecipeChip | 
					
						
							|  |  |  |         small | 
					
						
							|  |  |  |         :items="item.tags!" | 
					
						
							|  |  |  |         :is-category="false" | 
					
						
							|  |  |  |         url-prefix="tags" | 
					
						
							|  |  |  |         @item-selected="filterItems" | 
					
						
							|  |  |  |       /> | 
					
						
							| 
									
										
										
										
											2023-03-21 14:47:26 -05:00
										 |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     <template #[`item.recipeCategory`]="{ item }"> | 
					
						
							|  |  |  |       <RecipeChip | 
					
						
							|  |  |  |         small | 
					
						
							|  |  |  |         :items="item.recipeCategory!" | 
					
						
							|  |  |  |         @item-selected="filterItems" | 
					
						
							|  |  |  |       /> | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     <template #[`item.tools`]="{ item }"> | 
					
						
							|  |  |  |       <RecipeChip | 
					
						
							|  |  |  |         small | 
					
						
							|  |  |  |         :items="item.tools" | 
					
						
							|  |  |  |         url-prefix="tools" | 
					
						
							|  |  |  |         @item-selected="filterItems" | 
					
						
							|  |  |  |       /> | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     <template #[`item.userId`]="{ item }"> | 
					
						
							|  |  |  |       <div class="d-flex align-center"> | 
					
						
							|  |  |  |         <UserAvatar | 
					
						
							|  |  |  |           :user-id="item.userId!" | 
					
						
							|  |  |  |           :tooltip="false" | 
					
						
							|  |  |  |           size="40" | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |         <div class="pl-2"> | 
					
						
							|  |  |  |           <span class="text-left"> | 
					
						
							|  |  |  |             {{ getMember(item.userId!) }} | 
					
						
							|  |  |  |           </span> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       </div> | 
					
						
							| 
									
										
										
										
											2021-12-04 14:18:46 -09:00
										 |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     <template #[`item.dateAdded`]="{ item }"> | 
					
						
							|  |  |  |       {{ formatDate(item.dateAdded!) }} | 
					
						
							| 
									
										
										
										
											2024-09-22 09:59:20 -05:00
										 |  |  |     </template> | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |   </v-data-table> | 
					
						
							|  |  |  | </template> | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-03-21 14:47:26 -05:00
										 |  |  | import UserAvatar from "../User/UserAvatar.vue"; | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  | import RecipeChip from "./RecipeChips.vue"; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import type { Recipe, RecipeCategory, RecipeTool } from "~/lib/api/types/recipe"; | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  | import { useUserApi } from "~/composables/api"; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import type { UserSummary } from "~/lib/api/types/user"; | 
					
						
							|  |  |  | import type { RecipeTag } from "~/lib/api/types/household"; | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | const INPUT_EVENT = "update:modelValue"; | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | interface ShowHeaders { | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |   id: boolean; | 
					
						
							|  |  |  |   owner: boolean; | 
					
						
							|  |  |  |   tags: boolean; | 
					
						
							|  |  |  |   categories: boolean; | 
					
						
							|  |  |  |   tools: boolean; | 
					
						
							| 
									
										
										
										
											2024-11-20 08:46:27 -06:00
										 |  |  |   recipeServings: boolean; | 
					
						
							|  |  |  |   recipeYieldQuantity: boolean; | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |   recipeYield: boolean; | 
					
						
							|  |  |  |   dateAdded: boolean; | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | export default defineNuxtComponent({ | 
					
						
							| 
									
										
										
										
											2023-03-21 14:47:26 -05:00
										 |  |  |   components: { RecipeChip, UserAvatar }, | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |   props: { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     modelValue: { | 
					
						
							|  |  |  |       type: Array as PropType<Recipe[]>, | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       required: false, | 
					
						
							|  |  |  |       default: () => [], | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-12-04 14:18:46 -09:00
										 |  |  |     loading: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       required: false, | 
					
						
							|  |  |  |       default: false, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |     recipes: { | 
					
						
							|  |  |  |       type: Array as () => Recipe[], | 
					
						
							|  |  |  |       default: () => [], | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     showHeaders: { | 
					
						
							|  |  |  |       type: Object as () => ShowHeaders, | 
					
						
							|  |  |  |       required: false, | 
					
						
							|  |  |  |       default: () => { | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |           id: true, | 
					
						
							|  |  |  |           owner: false, | 
					
						
							|  |  |  |           tags: true, | 
					
						
							|  |  |  |           categories: true, | 
					
						
							| 
									
										
										
										
											2024-11-20 08:46:27 -06:00
										 |  |  |           recipeServings: true, | 
					
						
							|  |  |  |           recipeYieldQuantity: true, | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |           recipeYield: true, | 
					
						
							|  |  |  |           dateAdded: true, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   emits: ["click"], | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |   setup(props, context) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     const i18n = useI18n(); | 
					
						
							|  |  |  |     const $auth = useMealieAuth(); | 
					
						
							|  |  |  |     const groupSlug = $auth.user.value?.groupSlug; | 
					
						
							| 
									
										
										
										
											2025-01-14 09:18:16 -08:00
										 |  |  |     const router = useRouter(); | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     const selected = computed({ | 
					
						
							|  |  |  |       get: () => props.modelValue, | 
					
						
							|  |  |  |       set: value => context.emit(INPUT_EVENT, value), | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const headers = computed(() => { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       const hdrs: Array<{ title: string; value: string; align?: string; sortable?: boolean }> = []; | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |       if (props.showHeaders.id) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         hdrs.push({ title: i18n.t("general.id"), value: "id" }); | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |       if (props.showHeaders.owner) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         hdrs.push({ title: i18n.t("general.owner"), value: "userId", align: "center", sortable: true }); | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       hdrs.push({ title: i18n.t("general.name"), value: "name", sortable: true }); | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |       if (props.showHeaders.categories) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         hdrs.push({ title: i18n.t("recipe.categories"), value: "recipeCategory", sortable: true }); | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |       if (props.showHeaders.tags) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         hdrs.push({ title: i18n.t("tag.tags"), value: "tags", sortable: true }); | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |       if (props.showHeaders.tools) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         hdrs.push({ title: i18n.t("tool.tools"), value: "tools", sortable: true }); | 
					
						
							| 
									
										
										
										
											2021-12-04 14:18:46 -09:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2024-11-20 08:46:27 -06:00
										 |  |  |       if (props.showHeaders.recipeServings) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         hdrs.push({ title: i18n.t("recipe.servings"), value: "recipeServings", sortable: true }); | 
					
						
							| 
									
										
										
										
											2024-11-20 08:46:27 -06:00
										 |  |  |       } | 
					
						
							|  |  |  |       if (props.showHeaders.recipeYieldQuantity) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         hdrs.push({ title: i18n.t("recipe.yield"), value: "recipeYieldQuantity", sortable: true }); | 
					
						
							| 
									
										
										
										
											2024-11-20 08:46:27 -06:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |       if (props.showHeaders.recipeYield) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         hdrs.push({ title: i18n.t("recipe.yield-text"), value: "recipeYield", sortable: true }); | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |       if (props.showHeaders.dateAdded) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         hdrs.push({ title: i18n.t("general.date-added"), value: "dateAdded", sortable: true }); | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2021-12-04 14:18:46 -09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       return hdrs; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-22 09:59:20 -05:00
										 |  |  |     function formatDate(date: string) { | 
					
						
							|  |  |  |       try { | 
					
						
							|  |  |  |         return i18n.d(Date.parse(date), "medium"); | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       } | 
					
						
							|  |  |  |       catch { | 
					
						
							| 
									
										
										
										
											2024-09-22 09:59:20 -05:00
										 |  |  |         return ""; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |     // ============
 | 
					
						
							|  |  |  |     // Group Members
 | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  |     const api = useUserApi(); | 
					
						
							| 
									
										
										
										
											2024-08-22 10:14:32 -05:00
										 |  |  |     const members = ref<UserSummary[]>([]); | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     async function refreshMembers() { | 
					
						
							|  |  |  |       const { data } = await api.groups.fetchMembers(); | 
					
						
							|  |  |  |       if (data) { | 
					
						
							| 
									
										
										
										
											2024-10-11 19:36:26 -05:00
										 |  |  |         members.value = data.items; | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-14 09:18:16 -08:00
										 |  |  |     function filterItems(item: RecipeTag | RecipeCategory | RecipeTool, itemType: string) { | 
					
						
							|  |  |  |       if (!groupSlug || !item.id) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       router.push(`/g/${groupSlug}?${itemType}=${item.id}`); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |     onMounted(() => { | 
					
						
							|  |  |  |       refreshMembers(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |     function getMember(id: string) { | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       if (members.value[0]) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         return members.value.find(m => m.id === id)?.fullName; | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-10 07:12:45 +02:00
										 |  |  |       return i18n.t("general.none"); | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-22 10:14:32 -05:00
										 |  |  |     return { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       selected, | 
					
						
							| 
									
										
										
										
											2024-08-22 10:14:32 -05:00
										 |  |  |       groupSlug, | 
					
						
							|  |  |  |       headers, | 
					
						
							| 
									
										
										
										
											2024-09-22 09:59:20 -05:00
										 |  |  |       formatDate, | 
					
						
							| 
									
										
										
										
											2024-08-22 10:14:32 -05:00
										 |  |  |       members, | 
					
						
							|  |  |  |       getMember, | 
					
						
							| 
									
										
										
										
											2025-01-14 09:18:16 -08:00
										 |  |  |       filterItems, | 
					
						
							| 
									
										
										
										
											2024-08-22 10:14:32 -05:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-10-18 19:41:41 -08:00
										 |  |  |   }, | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | </script> |