| 
									
										
										
										
											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> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-30 20:37:02 +02:00
										 |  |  | <script setup lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 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-07-30 20:37:02 +02:00
										 |  |  | interface Props { | 
					
						
							|  |  |  |   data: IngredientFood | IngredientUnit; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-30 20:37:02 +02:00
										 |  |  | const props = defineProps<Props>(); | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-30 20:37:02 +02:00
										 |  |  | const emit = defineEmits<{ | 
					
						
							|  |  |  |   submit: [aliases: GenericAlias[]]; | 
					
						
							|  |  |  |   cancel: []; | 
					
						
							|  |  |  | }>(); | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-30 20:37:02 +02:00
										 |  |  | // V-Model Support
 | 
					
						
							|  |  |  | const dialog = defineModel<boolean>({ default: false }); | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-30 20:37:02 +02:00
										 |  |  | function createAlias() { | 
					
						
							|  |  |  |   aliases.value.push({ | 
					
						
							|  |  |  |     name: "", | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-30 20:37:02 +02:00
										 |  |  | function deleteAlias(index: number) { | 
					
						
							|  |  |  |   aliases.value.splice(index, 1); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-30 20:37:02 +02:00
										 |  |  | const aliases = ref<GenericAlias[]>(props.data.aliases || []); | 
					
						
							|  |  |  | function initAliases() { | 
					
						
							|  |  |  |   aliases.value = [...props.data.aliases || []]; | 
					
						
							|  |  |  |   if (!aliases.value.length) { | 
					
						
							|  |  |  |     createAlias(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | initAliases(); | 
					
						
							|  |  |  | whenever( | 
					
						
							|  |  |  |   () => dialog.value, | 
					
						
							|  |  |  |   () => { | 
					
						
							|  |  |  |     initAliases(); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | ); | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-30 20:37:02 +02: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; | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-30 20:37:02 +02:00
										 |  |  |     keepAliases.push(alias); | 
					
						
							|  |  |  |     seenAliasNames.push(alias.name); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   aliases.value = keepAliases; | 
					
						
							|  |  |  |   emit("submit", keepAliases); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-11-14 09:39:07 -06:00
										 |  |  | </script> |