| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <v-container class="md-container"> | 
					
						
							|  |  |  |     <BasePageTitle divider> | 
					
						
							|  |  |  |       <template #header> | 
					
						
							|  |  |  |         <v-img max-height="100" max-width="100" :src="require('~/static/svgs/manage-cookbooks.svg')"></v-img> | 
					
						
							|  |  |  |       </template> | 
					
						
							| 
									
										
										
										
											2023-01-29 02:39:51 +01:00
										 |  |  |       <template #title> {{ $t('meal-plan.meal-plan-rules') }} </template> | 
					
						
							|  |  |  |       {{ $t('meal-plan.meal-plan-rules-description') }} | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |     </BasePageTitle> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <v-card> | 
					
						
							| 
									
										
										
										
											2023-01-29 02:39:51 +01:00
										 |  |  |       <v-card-title class="headline"> {{ $t('meal-plan.new-rule') }} </v-card-title> | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |       <v-divider class="mx-2"></v-divider> | 
					
						
							|  |  |  |       <v-card-text> | 
					
						
							| 
									
										
										
										
											2023-01-29 02:39:51 +01:00
										 |  |  |         {{ $t('meal-plan.new-rule-description') }} | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  |         <GroupMealPlanRuleForm | 
					
						
							|  |  |  |           class="mt-2" | 
					
						
							|  |  |  |           :day.sync="createData.day" | 
					
						
							|  |  |  |           :entry-type.sync="createData.entryType" | 
					
						
							|  |  |  |           :categories.sync="createData.categories" | 
					
						
							|  |  |  |           :tags.sync="createData.tags" | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       </v-card-text> | 
					
						
							|  |  |  |       <v-card-actions class="justify-end"> | 
					
						
							|  |  |  |         <BaseButton create @click="createRule" /> | 
					
						
							|  |  |  |       </v-card-actions> | 
					
						
							|  |  |  |     </v-card> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <section> | 
					
						
							| 
									
										
										
										
											2023-01-29 02:39:51 +01:00
										 |  |  |       <BaseCardSectionTitle class="mt-10" :title="$tc('meal-plan.recipe-rules')" /> | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |       <div> | 
					
						
							|  |  |  |         <div v-for="(rule, idx) in allRules" :key="rule.id"> | 
					
						
							| 
									
										
										
										
											2022-02-22 15:32:13 -09:00
										 |  |  |           <v-card class="my-2 left-border"> | 
					
						
							|  |  |  |             <v-card-title class="headline pb-1"> | 
					
						
							| 
									
										
										
										
											2023-01-29 02:39:51 +01:00
										 |  |  |               {{ rule.day === "unset" ? $t('meal-plan.applies-to-all-days') : $t('meal-plan.applies-on-days', [rule.day]) }} | 
					
						
							|  |  |  |               {{ rule.entryType === "unset" ? $t('meal-plan.for-all-meal-types') : $t('meal-plan.for-type-meal-types', [rule.entryType]) }} | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |               <span class="ml-auto"> | 
					
						
							|  |  |  |                 <BaseButtonGroup | 
					
						
							|  |  |  |                   :buttons="[ | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                       icon: $globals.icons.edit, | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |                       text: $tc('general.edit'), | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |                       event: 'edit', | 
					
						
							|  |  |  |                     }, | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                       icon: $globals.icons.delete, | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |                       text: $tc('general.delete'), | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |                       event: 'delete', | 
					
						
							|  |  |  |                     }, | 
					
						
							|  |  |  |                   ]" | 
					
						
							|  |  |  |                   @delete="deleteRule(rule.id)" | 
					
						
							|  |  |  |                   @edit="toggleEditState(rule.id)" | 
					
						
							|  |  |  |                 /> | 
					
						
							|  |  |  |               </span> | 
					
						
							|  |  |  |             </v-card-title> | 
					
						
							|  |  |  |             <v-card-text> | 
					
						
							|  |  |  |               <template v-if="!editState[rule.id]"> | 
					
						
							| 
									
										
										
										
											2022-02-22 15:32:13 -09:00
										 |  |  |                 <div v-if="rule.categories"> | 
					
						
							|  |  |  |                   <h4 class="py-1">{{ $t("category.categories") }}:</h4> | 
					
						
							| 
									
										
										
										
											2022-03-22 21:08:06 -08:00
										 |  |  |                   <RecipeChips :items="rule.categories" small /> | 
					
						
							| 
									
										
										
										
											2022-02-22 15:32:13 -09:00
										 |  |  |                 </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 <div v-if="rule.tags"> | 
					
						
							|  |  |  |                   <h4 class="py-1">{{ $t("tag.tags") }}:</h4> | 
					
						
							| 
									
										
										
										
											2022-03-22 21:08:06 -08:00
										 |  |  |                   <RecipeChips :items="rule.tags" url-prefix="tags" small /> | 
					
						
							| 
									
										
										
										
											2022-02-22 15:32:13 -09:00
										 |  |  |                 </div> | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |               </template> | 
					
						
							|  |  |  |               <template v-else> | 
					
						
							|  |  |  |                 <GroupMealPlanRuleForm | 
					
						
							|  |  |  |                   :day.sync="allRules[idx].day" | 
					
						
							|  |  |  |                   :entry-type.sync="allRules[idx].entryType" | 
					
						
							|  |  |  |                   :categories.sync="allRules[idx].categories" | 
					
						
							|  |  |  |                   :tags.sync="allRules[idx].tags" | 
					
						
							|  |  |  |                 /> | 
					
						
							|  |  |  |                 <div class="d-flex justify-end"> | 
					
						
							|  |  |  |                   <BaseButton update @click="updateRule(rule)" /> | 
					
						
							|  |  |  |                 </div> | 
					
						
							|  |  |  |               </template> | 
					
						
							|  |  |  |             </v-card-text> | 
					
						
							|  |  |  |           </v-card> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </section> | 
					
						
							|  |  |  |   </v-container> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-01-29 13:01:41 -09:00
										 |  |  | import { defineComponent, ref, useAsync } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  | import { useUserApi } from "~/composables/api"; | 
					
						
							| 
									
										
										
										
											2022-10-22 11:51:07 -08:00
										 |  |  | import { PlanRulesCreate, PlanRulesOut } from "~/lib/api/types/meal-plan"; | 
					
						
							| 
									
										
										
										
											2024-08-22 10:14:32 -05:00
										 |  |  | import GroupMealPlanRuleForm from "~/components/Domain/Household/GroupMealPlanRuleForm.vue"; | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  | import { useAsyncKey } from "~/composables/use-utils"; | 
					
						
							| 
									
										
										
										
											2022-02-22 15:32:13 -09:00
										 |  |  | import RecipeChips from "~/components/Domain/Recipe/RecipeChips.vue"; | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default defineComponent({ | 
					
						
							|  |  |  |   components: { | 
					
						
							|  |  |  |     GroupMealPlanRuleForm, | 
					
						
							| 
									
										
										
										
											2022-02-22 15:32:13 -09:00
										 |  |  |     RecipeChips, | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2024-02-02 15:36:10 +00:00
										 |  |  |   middleware: ["auth"], | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |   props: { | 
					
						
							|  |  |  |     value: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: false, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   setup() { | 
					
						
							|  |  |  |     const api = useUserApi(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // ======================================================
 | 
					
						
							|  |  |  |     // Manage All
 | 
					
						
							|  |  |  |     const editState = ref<{ [key: string]: boolean }>({}); | 
					
						
							|  |  |  |     const allRules = ref<PlanRulesOut[]>([]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function toggleEditState(id: string) { | 
					
						
							|  |  |  |       editState.value[id] = !editState.value[id]; | 
					
						
							|  |  |  |       editState.value = { ...editState.value }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function refreshAll() { | 
					
						
							|  |  |  |       const { data } = await api.mealplanRules.getAll(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (data) { | 
					
						
							| 
									
										
										
										
											2022-06-25 14:39:38 -05:00
										 |  |  |         allRules.value = data.items ?? []; | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     useAsync(async () => { | 
					
						
							|  |  |  |       await refreshAll(); | 
					
						
							|  |  |  |     }, useAsyncKey()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // ======================================================
 | 
					
						
							|  |  |  |     // Creating Rules
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const createData = ref<PlanRulesCreate>({ | 
					
						
							|  |  |  |       entryType: "unset", | 
					
						
							|  |  |  |       day: "unset", | 
					
						
							|  |  |  |       categories: [], | 
					
						
							|  |  |  |       tags: [], | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function createRule() { | 
					
						
							|  |  |  |       const { data } = await api.mealplanRules.createOne(createData.value); | 
					
						
							|  |  |  |       if (data) { | 
					
						
							|  |  |  |         refreshAll(); | 
					
						
							|  |  |  |         createData.value = { | 
					
						
							|  |  |  |           entryType: "unset", | 
					
						
							|  |  |  |           day: "unset", | 
					
						
							|  |  |  |           categories: [], | 
					
						
							|  |  |  |           tags: [], | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function deleteRule(ruleId: string) { | 
					
						
							|  |  |  |       const { data } = await api.mealplanRules.deleteOne(ruleId); | 
					
						
							|  |  |  |       if (data) { | 
					
						
							|  |  |  |         refreshAll(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function updateRule(rule: PlanRulesOut) { | 
					
						
							|  |  |  |       const { data } = await api.mealplanRules.updateOne(rule.id, rule); | 
					
						
							|  |  |  |       if (data) { | 
					
						
							|  |  |  |         refreshAll(); | 
					
						
							|  |  |  |         toggleEditState(rule.id); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       allRules, | 
					
						
							|  |  |  |       createData, | 
					
						
							|  |  |  |       createRule, | 
					
						
							|  |  |  |       deleteRule, | 
					
						
							|  |  |  |       editState, | 
					
						
							|  |  |  |       updateRule, | 
					
						
							|  |  |  |       toggleEditState, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2023-01-29 02:39:51 +01:00
										 |  |  |   head() { | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       title: this.$tc("meal-plan.meal-plan-settings"), | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2022-02-07 19:03:11 -09:00
										 |  |  |   }, | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | </script> |