| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <div> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     <BaseDialog v-model="dialog" :title="$t('data-pages.manage-aliases')" :icon="$globals.icons.edit"
 | 
					
						
							|  |  |  |       :submit-icon="$globals.icons.check" :submit-text="$t('general.confirm')" can-submit @submit="saveAliases" | 
					
						
							|  |  |  |       @cancel="$emit('cancel')"> | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |       <v-card-text> | 
					
						
							|  |  |  |         <v-container> | 
					
						
							|  |  |  |           <v-row v-for="alias, i in aliases" :key="i"> | 
					
						
							|  |  |  |             <v-col cols="10"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |               <v-text-field v-model="alias.name" :label="$t('general.name')" :rules="[validators.required]" /> | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |             </v-col> | 
					
						
							|  |  |  |             <v-col cols="2"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |               <BaseButtonGroup :buttons="[ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                   icon: $globals.icons.delete, | 
					
						
							|  |  |  |                   text: $t('general.delete'), | 
					
						
							|  |  |  |                   event: 'delete', | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |               ]" @delete="deleteAlias(i)" /> | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |             </v-col> | 
					
						
							|  |  |  |           </v-row> | 
					
						
							|  |  |  |         </v-container> | 
					
						
							|  |  |  |       </v-card-text> | 
					
						
							|  |  |  |       <template #custom-card-action> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         <BaseButton edit @click="createAlias"> | 
					
						
							|  |  |  |           {{ $t('data-pages.create-alias') }} | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |           <template #icon> | 
					
						
							|  |  |  |             {{ $globals.icons.create }} | 
					
						
							|  |  |  |           </template> | 
					
						
							|  |  |  |         </BaseButton> | 
					
						
							|  |  |  |       </template> | 
					
						
							|  |  |  |     </BaseDialog> | 
					
						
							|  |  |  |   </div> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <script lang="ts"> | 
					
						
							|  |  |  | import { whenever } from "@vueuse/core"; | 
					
						
							|  |  |  | import { validators } from "~/composables/use-validators"; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import type { IngredientFood, IngredientUnit } from "~/lib/api/types/recipe"; | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | export interface GenericAlias { | 
					
						
							|  |  |  |   name: string; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | export default defineNuxtComponent({ | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |   props: { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     modelValue: { | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: false, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     data: { | 
					
						
							|  |  |  |       type: Object as () => IngredientFood | IngredientUnit, | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   emits: ["submit", "update:modelValue", "cancel"], | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |   setup(props, context) { | 
					
						
							|  |  |  |     // V-Model Support
 | 
					
						
							|  |  |  |     const dialog = computed({ | 
					
						
							|  |  |  |       get: () => { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         return props.modelValue; | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |       }, | 
					
						
							|  |  |  |       set: (val) => { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         context.emit("update:modelValue", val); | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |       }, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function createAlias() { | 
					
						
							|  |  |  |       aliases.value.push({ | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         name: "", | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function deleteAlias(index: number) { | 
					
						
							|  |  |  |       aliases.value.splice(index, 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const aliases = ref<GenericAlias[]>(props.data.aliases || []); | 
					
						
							|  |  |  |     function initAliases() { | 
					
						
							|  |  |  |       aliases.value = [...props.data.aliases || []]; | 
					
						
							|  |  |  |       if (!aliases.value.length) { | 
					
						
							|  |  |  |         createAlias(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     initAliases(); | 
					
						
							|  |  |  |     whenever( | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       () => props.modelValue, | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |       () => { | 
					
						
							|  |  |  |         initAliases(); | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function saveAliases() { | 
					
						
							|  |  |  |       const seenAliasNames: string[] = []; | 
					
						
							|  |  |  |       const keepAliases: GenericAlias[] = []; | 
					
						
							|  |  |  |       aliases.value.forEach((alias) => { | 
					
						
							|  |  |  |         if ( | 
					
						
							|  |  |  |           !alias.name | 
					
						
							|  |  |  |           || alias.name === props.data.name | 
					
						
							|  |  |  |           || alias.name === props.data.pluralName | 
					
						
							|  |  |  |           || alias.name === props.data.abbreviation | 
					
						
							|  |  |  |           || alias.name === props.data.pluralAbbreviation | 
					
						
							|  |  |  |           || seenAliasNames.includes(alias.name) | 
					
						
							|  |  |  |         ) { | 
					
						
							|  |  |  |           return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         keepAliases.push(alias); | 
					
						
							|  |  |  |         seenAliasNames.push(alias.name); | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |       aliases.value = keepAliases; | 
					
						
							|  |  |  |       context.emit("submit", keepAliases); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       aliases, | 
					
						
							|  |  |  |       createAlias, | 
					
						
							|  |  |  |       dialog, | 
					
						
							|  |  |  |       deleteAlias, | 
					
						
							|  |  |  |       saveAliases, | 
					
						
							|  |  |  |       validators, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |   }, | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | </script> |