| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <div> | 
					
						
							| 
									
										
										
										
											2022-04-09 19:08:48 -08:00
										 |  |  |     <!-- Merge Dialog --> | 
					
						
							|  |  |  |     <BaseDialog v-model="mergeDialog" :icon="$globals.icons.foods" title="Combine Food" @confirm="mergeFoods"> | 
					
						
							|  |  |  |       <v-card-text> | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  |         <div> | 
					
						
							|  |  |  |           {{ $t("data-pages.foods.merge-dialog-text") }} | 
					
						
							|  |  |  |         </div> | 
					
						
							| 
									
										
										
										
											2022-04-09 19:08:48 -08:00
										 |  |  |         <v-autocomplete v-model="fromFood" return-object :items="foods" item-text="name" label="Source Food" /> | 
					
						
							|  |  |  |         <v-autocomplete v-model="toFood" return-object :items="foods" item-text="name" label="Target Food" /> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <template v-if="canMerge && fromFood && toFood"> | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  |           <div class="text-center"> | 
					
						
							|  |  |  |             {{ $t("data-pages.foods.merge-food-example", { food1: fromFood.name, food2: toFood.name }) }} | 
					
						
							|  |  |  |           </div> | 
					
						
							| 
									
										
										
										
											2022-04-09 19:08:48 -08:00
										 |  |  |         </template> | 
					
						
							|  |  |  |       </v-card-text> | 
					
						
							|  |  |  |     </BaseDialog> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  |     <!-- Seed Dialog--> | 
					
						
							|  |  |  |     <BaseDialog | 
					
						
							|  |  |  |       v-model="seedDialog" | 
					
						
							|  |  |  |       :icon="$globals.icons.foods" | 
					
						
							|  |  |  |       :title="$tc('data-pages.seed-data')" | 
					
						
							|  |  |  |       @confirm="seedDatabase" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <v-card-text> | 
					
						
							|  |  |  |         <div class="pb-2"> | 
					
						
							|  |  |  |           {{ $t("data-pages.foods.seed-dialog-text") }} | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |         <v-autocomplete | 
					
						
							|  |  |  |           v-model="locale" | 
					
						
							|  |  |  |           :items="locales" | 
					
						
							|  |  |  |           item-text="name" | 
					
						
							|  |  |  |           label="Select Language" | 
					
						
							|  |  |  |           class="my-3" | 
					
						
							|  |  |  |           hide-details | 
					
						
							|  |  |  |           outlined | 
					
						
							|  |  |  |           offset | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |           <template #item="{ item }"> | 
					
						
							|  |  |  |             <v-list-item-content> | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |               <v-list-item-title> {{ item.name }} </v-list-item-title> | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  |               <v-list-item-subtitle> | 
					
						
							|  |  |  |                 {{ item.progress }}% {{ $tc("language-dialog.translated") }} | 
					
						
							|  |  |  |               </v-list-item-subtitle> | 
					
						
							|  |  |  |             </v-list-item-content> | 
					
						
							|  |  |  |           </template> | 
					
						
							|  |  |  |         </v-autocomplete> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |         <v-alert v-if="foods && foods.length > 0" type="error" class="mb-0 text-body-2"> | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  |           {{ $t("data-pages.foods.seed-dialog-warning") }} | 
					
						
							|  |  |  |         </v-alert> | 
					
						
							|  |  |  |       </v-card-text> | 
					
						
							|  |  |  |     </BaseDialog> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |     <!-- Edit Dialog --> | 
					
						
							|  |  |  |     <BaseDialog | 
					
						
							|  |  |  |       v-model="editDialog" | 
					
						
							|  |  |  |       :icon="$globals.icons.foods" | 
					
						
							|  |  |  |       title="Edit Food" | 
					
						
							|  |  |  |       :submit-text="$tc('general.save')" | 
					
						
							|  |  |  |       @submit="editSaveFood" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <v-card-text v-if="editTarget"> | 
					
						
							|  |  |  |         <v-form ref="domCreateFoodForm"> | 
					
						
							|  |  |  |           <v-text-field v-model="editTarget.name" label="Name" :rules="[validators.required]"></v-text-field> | 
					
						
							|  |  |  |           <v-text-field v-model="editTarget.description" label="Description"></v-text-field> | 
					
						
							|  |  |  |           <v-autocomplete | 
					
						
							|  |  |  |             v-model="editTarget.labelId" | 
					
						
							|  |  |  |             clearable | 
					
						
							|  |  |  |             :items="allLabels" | 
					
						
							|  |  |  |             item-value="id" | 
					
						
							|  |  |  |             item-text="name" | 
					
						
							|  |  |  |             label="Food Label" | 
					
						
							|  |  |  |           > | 
					
						
							|  |  |  |           </v-autocomplete> | 
					
						
							|  |  |  |         </v-form> </v-card-text | 
					
						
							|  |  |  |     ></BaseDialog> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <!-- Delete Dialog --> | 
					
						
							|  |  |  |     <BaseDialog | 
					
						
							|  |  |  |       v-model="deleteDialog" | 
					
						
							| 
									
										
										
										
											2022-03-19 11:31:17 -08:00
										 |  |  |       :title="$tc('general.confirm')" | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |       :icon="$globals.icons.alertCircle" | 
					
						
							|  |  |  |       color="error" | 
					
						
							|  |  |  |       @confirm="deleteFood" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <v-card-text> | 
					
						
							|  |  |  |         {{ $t("general.confirm-delete-generic") }} | 
					
						
							|  |  |  |       </v-card-text> | 
					
						
							|  |  |  |     </BaseDialog> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <!-- Recipe Data Table --> | 
					
						
							|  |  |  |     <BaseCardSectionTitle :icon="$globals.icons.foods" section title="Food Data"> </BaseCardSectionTitle> | 
					
						
							|  |  |  |     <CrudTable | 
					
						
							|  |  |  |       :table-config="tableConfig" | 
					
						
							|  |  |  |       :headers.sync="tableHeaders" | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |       :data="foods || []" | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |       :bulk-actions="[]" | 
					
						
							|  |  |  |       @delete-one="deleteEventHandler" | 
					
						
							|  |  |  |       @edit-one="editEventHandler" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <template #button-row> | 
					
						
							| 
									
										
										
										
											2022-04-09 19:08:48 -08:00
										 |  |  |         <BaseButton @click="mergeDialog = true"> | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |           <template #icon> {{ $globals.icons.foods }} </template> | 
					
						
							|  |  |  |           Combine | 
					
						
							|  |  |  |         </BaseButton> | 
					
						
							|  |  |  |       </template> | 
					
						
							|  |  |  |       <template #item.label="{ item }"> | 
					
						
							|  |  |  |         <MultiPurposeLabel v-if="item.label" :label="item.label"> | 
					
						
							|  |  |  |           {{ item.label.name }} | 
					
						
							|  |  |  |         </MultiPurposeLabel> | 
					
						
							|  |  |  |       </template> | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  |       <template #button-bottom> | 
					
						
							|  |  |  |         <BaseButton @click="seedDialog = true"> | 
					
						
							|  |  |  |           <template #icon> {{ $globals.icons.database }} </template> | 
					
						
							|  |  |  |           Seed | 
					
						
							|  |  |  |         </BaseButton> | 
					
						
							|  |  |  |       </template> | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |     </CrudTable> | 
					
						
							|  |  |  |   </div> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <script lang="ts"> | 
					
						
							|  |  |  | import { defineComponent, onMounted, ref } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											2022-04-09 19:08:48 -08:00
										 |  |  | import { computed } from "vue-demi"; | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  | import type { LocaleObject } from "@nuxtjs/i18n"; | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  | import { validators } from "~/composables/use-validators"; | 
					
						
							|  |  |  | import { useUserApi } from "~/composables/api"; | 
					
						
							|  |  |  | import { IngredientFood } from "~/types/api-types/recipe"; | 
					
						
							|  |  |  | import MultiPurposeLabel from "~/components/Domain/ShoppingList/MultiPurposeLabel.vue"; | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  | import { useLocales } from "~/composables/use-locales"; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | import { useFoodStore, useLabelStore } from "~/composables/store"; | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default defineComponent({ | 
					
						
							|  |  |  |   components: { MultiPurposeLabel }, | 
					
						
							|  |  |  |   setup() { | 
					
						
							|  |  |  |     const userApi = useUserApi(); | 
					
						
							|  |  |  |     const tableConfig = { | 
					
						
							|  |  |  |       hideColumns: true, | 
					
						
							|  |  |  |       canExport: true, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     const tableHeaders = [ | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         text: "Id", | 
					
						
							|  |  |  |         value: "id", | 
					
						
							|  |  |  |         show: false, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         text: "Name", | 
					
						
							|  |  |  |         value: "name", | 
					
						
							|  |  |  |         show: true, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         text: "Description", | 
					
						
							|  |  |  |         value: "description", | 
					
						
							|  |  |  |         show: true, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         text: "Label", | 
					
						
							|  |  |  |         value: "label", | 
					
						
							|  |  |  |         show: true, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ]; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const foodStore = useFoodStore(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // ===============================================================
 | 
					
						
							|  |  |  |     // Food Editor
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |     const editDialog = ref(false); | 
					
						
							|  |  |  |     const editTarget = ref<IngredientFood | null>(null); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |     function editEventHandler(item: IngredientFood) { | 
					
						
							|  |  |  |       editTarget.value = item; | 
					
						
							|  |  |  |       editDialog.value = true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |     async function editSaveFood() { | 
					
						
							|  |  |  |       if (!editTarget.value) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |       await foodStore.actions.updateOne(editTarget.value); | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |       editDialog.value = false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // ===============================================================
 | 
					
						
							|  |  |  |     // Food Delete
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |     const deleteDialog = ref(false); | 
					
						
							|  |  |  |     const deleteTarget = ref<IngredientFood | null>(null); | 
					
						
							|  |  |  |     function deleteEventHandler(item: IngredientFood) { | 
					
						
							|  |  |  |       deleteTarget.value = item; | 
					
						
							|  |  |  |       deleteDialog.value = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     async function deleteFood() { | 
					
						
							|  |  |  |       if (!deleteTarget.value) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |       await foodStore.actions.deleteOne(deleteTarget.value.id); | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |       deleteDialog.value = false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-09 19:08:48 -08:00
										 |  |  |     // ============================================================
 | 
					
						
							|  |  |  |     // Merge Foods
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const mergeDialog = ref(false); | 
					
						
							|  |  |  |     const fromFood = ref<IngredientFood | null>(null); | 
					
						
							|  |  |  |     const toFood = ref<IngredientFood | null>(null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const canMerge = computed(() => { | 
					
						
							|  |  |  |       return fromFood.value && toFood.value && fromFood.value.id !== toFood.value.id; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function mergeFoods() { | 
					
						
							|  |  |  |       if (!canMerge.value || !fromFood.value || !toFood.value) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const { data } = await userApi.foods.merge(fromFood.value.id, toFood.value.id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (data) { | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |         foodStore.actions.refresh(); | 
					
						
							| 
									
										
										
										
											2022-04-09 19:08:48 -08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |     // ============================================================
 | 
					
						
							|  |  |  |     // Labels
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |     const { labels: allLabels } = useLabelStore(); | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  |     // ============================================================
 | 
					
						
							|  |  |  |     // Seed
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const seedDialog = ref(false); | 
					
						
							|  |  |  |     const locale = ref(""); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const { locales: LOCALES, locale: currentLocale, i18n } = useLocales(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     onMounted(() => { | 
					
						
							|  |  |  |       locale.value = currentLocale.value; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const locales = LOCALES.filter((locale) => | 
					
						
							|  |  |  |       (i18n.locales as LocaleObject[]).map((i18nLocale) => i18nLocale.code).includes(locale.value) | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function seedDatabase() { | 
					
						
							|  |  |  |       const { data } = await userApi.seeders.foods({ locale: locale.value }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (data) { | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |         foodStore.actions.refresh(); | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |     return { | 
					
						
							|  |  |  |       tableConfig, | 
					
						
							|  |  |  |       tableHeaders, | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |       foods: foodStore.foods, | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |       allLabels, | 
					
						
							|  |  |  |       validators, | 
					
						
							|  |  |  |       // Edit
 | 
					
						
							|  |  |  |       editDialog, | 
					
						
							|  |  |  |       editEventHandler, | 
					
						
							|  |  |  |       editSaveFood, | 
					
						
							|  |  |  |       editTarget, | 
					
						
							|  |  |  |       // Delete
 | 
					
						
							|  |  |  |       deleteEventHandler, | 
					
						
							|  |  |  |       deleteDialog, | 
					
						
							|  |  |  |       deleteFood, | 
					
						
							| 
									
										
										
										
											2022-04-09 19:08:48 -08:00
										 |  |  |       // Merge
 | 
					
						
							|  |  |  |       canMerge, | 
					
						
							|  |  |  |       mergeFoods, | 
					
						
							|  |  |  |       mergeDialog, | 
					
						
							|  |  |  |       fromFood, | 
					
						
							|  |  |  |       toFood, | 
					
						
							| 
									
										
										
										
											2022-05-01 12:45:50 -08:00
										 |  |  |       // Seed Data
 | 
					
						
							|  |  |  |       locale, | 
					
						
							|  |  |  |       locales, | 
					
						
							|  |  |  |       seedDialog, | 
					
						
							|  |  |  |       seedDatabase, | 
					
						
							| 
									
										
										
										
											2022-03-17 10:30:10 -08:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | </script> |