| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <div :style="`width: ${width}; height: 100%;`"> | 
					
						
							|  |  |  |     <LanguageDialog v-model="langDialog" /> | 
					
						
							|  |  |  |     <v-card> | 
					
						
							|  |  |  |       <div> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         <v-toolbar | 
					
						
							|  |  |  |           width="100%" | 
					
						
							|  |  |  |           color="primary" | 
					
						
							|  |  |  |           class="d-flex justify-center" | 
					
						
							|  |  |  |           style="margin-bottom: 4rem" | 
					
						
							|  |  |  |           dark | 
					
						
							|  |  |  |         > | 
					
						
							| 
									
										
										
										
											2025-06-28 15:59:58 +02:00
										 |  |  |           <v-toolbar-title class="headline text-h4 text-center mx-0"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |             Mealie | 
					
						
							|  |  |  |           </v-toolbar-title> | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |         </v-toolbar> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <div class="icon-container"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |           <v-divider class="icon-divider" /> | 
					
						
							|  |  |  |           <v-avatar | 
					
						
							|  |  |  |             class="pa-2 icon-avatar" | 
					
						
							|  |  |  |             color="primary" | 
					
						
							|  |  |  |             size="75" | 
					
						
							|  |  |  |           > | 
					
						
							|  |  |  |             <svg | 
					
						
							|  |  |  |               class="icon-white" | 
					
						
							|  |  |  |               style="width: 75" | 
					
						
							|  |  |  |               viewBox="0 0 24 24" | 
					
						
							|  |  |  |             > | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |               <path | 
					
						
							|  |  |  |                 d="M8.1,13.34L3.91,9.16C2.35,7.59 2.35,5.06 3.91,3.5L10.93,10.5L8.1,13.34M13.41,13L20.29,19.88L18.88,21.29L12,14.41L5.12,21.29L3.71,19.88L13.36,10.22L13.16,10C12.38,9.23 12.38,7.97 13.16,7.19L17.5,2.82L18.43,3.74L15.19,7L16.15,7.94L19.39,4.69L20.31,5.61L17.06,8.85L18,9.81L21.26,6.56L22.18,7.5L17.81,11.84C17.03,12.62 15.77,12.62 15,11.84L14.78,11.64L13.41,13Z" | 
					
						
							|  |  |  |               /> | 
					
						
							|  |  |  |             </svg> | 
					
						
							|  |  |  |           </v-avatar> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |       <div class="d-flex justify-center grow items-center my-4"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         <slot :width="pageWidth" /> | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |       </div> | 
					
						
							|  |  |  |       <div class="mx-2 my-4"> | 
					
						
							|  |  |  |         <v-progress-linear | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |           v-if="wizardPage > 0" | 
					
						
							|  |  |  |           :value="Math.ceil((wizardPage / maxPageNumber) * 100)" | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |           striped | 
					
						
							|  |  |  |           height="10" | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |       <v-divider class="ma-2" /> | 
					
						
							|  |  |  |       <v-card-actions width="100%"> | 
					
						
							|  |  |  |         <v-btn | 
					
						
							|  |  |  |           v-if="prevButtonShow" | 
					
						
							|  |  |  |           :disabled="!prevButtonEnable" | 
					
						
							|  |  |  |           :color="prevButtonColor" | 
					
						
							|  |  |  |           @click="decrementPage" | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |           <v-icon v-if="prevButtonIconRef"> | 
					
						
							|  |  |  |             {{ prevButtonIconRef }} | 
					
						
							|  |  |  |           </v-icon> | 
					
						
							|  |  |  |           {{ prevButtonTextRef }} | 
					
						
							|  |  |  |         </v-btn> | 
					
						
							|  |  |  |         <v-spacer /> | 
					
						
							|  |  |  |         <v-btn | 
					
						
							|  |  |  |           v-if="nextButtonShow" | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |           variant="elevated" | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |           :disabled="!nextButtonEnable" | 
					
						
							|  |  |  |           :color="nextButtonColorRef" | 
					
						
							|  |  |  |           @click="incrementPage" | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |           <div v-if="isSubmitting"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |             <v-progress-circular | 
					
						
							|  |  |  |               indeterminate | 
					
						
							|  |  |  |               color="white" | 
					
						
							|  |  |  |               size="24" | 
					
						
							|  |  |  |             /> | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |           </div> | 
					
						
							|  |  |  |           <div v-else> | 
					
						
							|  |  |  |             <v-icon v-if="nextButtonIconRef && !nextButtonIconAfter"> | 
					
						
							|  |  |  |               {{ nextButtonIconRef }} | 
					
						
							|  |  |  |             </v-icon> | 
					
						
							|  |  |  |             {{ nextButtonTextRef }} | 
					
						
							|  |  |  |             <v-icon v-if="nextButtonIconRef && nextButtonIconAfter"> | 
					
						
							|  |  |  |               {{ nextButtonIconRef }} | 
					
						
							|  |  |  |             </v-icon> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         </v-btn> | 
					
						
							|  |  |  |       </v-card-actions> | 
					
						
							|  |  |  |       <v-card-actions class="justify-center flex-column py-8"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         <BaseButton | 
					
						
							|  |  |  |           large | 
					
						
							|  |  |  |           color="primary" | 
					
						
							|  |  |  |           @click="langDialog = true" | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |           <template #icon> | 
					
						
							|  |  |  |             {{ $globals.icons.translate }} | 
					
						
							|  |  |  |           </template> | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |           {{ $t("language-dialog.choose-language") }} | 
					
						
							|  |  |  |         </BaseButton> | 
					
						
							|  |  |  |       </v-card-actions> | 
					
						
							|  |  |  |     </v-card> | 
					
						
							|  |  |  |   </div> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | export default defineNuxtComponent({ | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |   props: { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     modelValue: { | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |       type: Number, | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     minPageNumber: { | 
					
						
							|  |  |  |       type: Number, | 
					
						
							|  |  |  |       default: 0, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     maxPageNumber: { | 
					
						
							|  |  |  |       type: Number, | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     width: { | 
					
						
							|  |  |  |       type: [String, Number], | 
					
						
							|  |  |  |       default: "1200px", | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     pageWidth: { | 
					
						
							|  |  |  |       type: [String, Number], | 
					
						
							|  |  |  |       default: "600px", | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     prevButtonText: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: undefined, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     prevButtonIcon: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     prevButtonColor: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: "grey-darken-3", | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     prevButtonShow: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     prevButtonEnable: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     nextButtonText: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: undefined, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     nextButtonIcon: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     nextButtonIconAfter: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     nextButtonColor: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: undefined, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     nextButtonShow: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     nextButtonEnable: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     nextButtonIsSubmit: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: false, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     title: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     icon: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: null, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     isSubmitting: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: false, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   emits: ["update:modelValue", "submit"], | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |   setup(props, context) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     const i18n = useI18n(); | 
					
						
							|  |  |  |     const { $globals } = useNuxtApp(); | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |     const ready = ref(false); | 
					
						
							|  |  |  |     const langDialog = ref(false); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     const wizardPage = computed({ | 
					
						
							|  |  |  |       get: () => props.modelValue, | 
					
						
							|  |  |  |       set: value => context.emit("update:modelValue", value), | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const prevButtonTextRef = computed(() => props.prevButtonText || i18n.t("general.back")); | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |     const prevButtonIconRef = computed(() => props.prevButtonIcon || $globals.icons.back); | 
					
						
							|  |  |  |     const nextButtonTextRef = computed( | 
					
						
							|  |  |  |       () => props.nextButtonText || ( | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         props.nextButtonIsSubmit ? i18n.t("general.submit") : i18n.t("general.next") | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |     const nextButtonIconRef = computed( | 
					
						
							|  |  |  |       () => props.nextButtonIcon || ( | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         props.nextButtonIsSubmit ? $globals.icons.createAlt : $globals.icons.forward | 
					
						
							|  |  |  |       ), | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |     ); | 
					
						
							|  |  |  |     const nextButtonColorRef = computed( | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       () => props.nextButtonColor || (props.nextButtonIsSubmit ? "success" : "info"), | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function goToPage(page: number) { | 
					
						
							|  |  |  |       if (page < props.minPageNumber) { | 
					
						
							|  |  |  |         goToPage(props.minPageNumber); | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       } | 
					
						
							|  |  |  |       else if (page > props.maxPageNumber) { | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |         goToPage(props.maxPageNumber); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       wizardPage.value = page; | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function decrementPage() { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       goToPage(wizardPage.value - 1); | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function incrementPage() { | 
					
						
							|  |  |  |       if (props.nextButtonIsSubmit) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         context.emit("submit", wizardPage.value); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       else { | 
					
						
							|  |  |  |         goToPage(wizardPage.value + 1); | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ready.value = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       wizardPage, | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  |       ready, | 
					
						
							|  |  |  |       langDialog, | 
					
						
							|  |  |  |       prevButtonTextRef, | 
					
						
							|  |  |  |       prevButtonIconRef, | 
					
						
							|  |  |  |       nextButtonTextRef, | 
					
						
							|  |  |  |       nextButtonIconRef, | 
					
						
							|  |  |  |       nextButtonColorRef, | 
					
						
							|  |  |  |       decrementPage, | 
					
						
							|  |  |  |       incrementPage, | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2024-03-11 08:28:54 -05:00
										 |  |  | }); | 
					
						
							|  |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <style lang="css" scoped> | 
					
						
							|  |  |  | .icon-primary { | 
					
						
							|  |  |  |   fill: var(--v-primary-base); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .icon-white { | 
					
						
							|  |  |  |   fill: white; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .icon-container { | 
					
						
							|  |  |  |   display: flex; | 
					
						
							|  |  |  |   flex-direction: column; | 
					
						
							|  |  |  |   align-items: center; | 
					
						
							|  |  |  |   width: 100%; | 
					
						
							|  |  |  |   position: relative; | 
					
						
							|  |  |  |   margin-top: 2.5rem; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .icon-divider { | 
					
						
							|  |  |  |   width: 100%; | 
					
						
							|  |  |  |   margin-bottom: -2.5rem; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .icon-avatar { | 
					
						
							|  |  |  |   border-color: rgba(0, 0, 0, 0.12); | 
					
						
							|  |  |  |   border: 2px; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .bg-off-white { | 
					
						
							|  |  |  |   background: #f5f8fa; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .preferred-width { | 
					
						
							|  |  |  |   width: 840px; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | </style> |