feat: ui fixes & backup link on onboarding screen (#7743)

This commit is contained in:
Arsène Reymond
2026-07-17 20:41:35 +02:00
committed by GitHub
parent 7092497cd2
commit 4eae486908
16 changed files with 67 additions and 75 deletions

View File

@@ -89,7 +89,7 @@
</v-expansion-panels> </v-expansion-panels>
</v-form> </v-form>
</v-card-text> </v-card-text>
<AppLoader v-else waiting-text="" /> <AppLoader v-else />
</BaseDialog> </BaseDialog>
</template> </template>

View File

@@ -158,6 +158,7 @@
<AppLoader <AppLoader
v-if="loading" v-if="loading"
:loading="loading" :loading="loading"
:waiting-text="$t('general.loading-recipes')"
/> />
</v-fade-transition> </v-fade-transition>
<AppScrollToTop /> <AppScrollToTop />

View File

@@ -22,7 +22,7 @@
rows="4" rows="4"
/> />
<div v-if="childRecipes?.length"> <div v-if="childRecipes?.length">
<v-card-text class="pt-6 pb-0"> <v-card-text class="pt-6 pb-0 text-title-medium">
{{ $t('recipe.include-linked-recipes') }} {{ $t('recipe.include-linked-recipes') }}
</v-card-text> </v-card-text>
<v-list> <v-list>
@@ -45,14 +45,13 @@
</v-list> </v-list>
</div> </div>
<v-container> <v-container>
<v-row> <v-row class="mt-4">
<v-col cols="6"> <v-col cols="5">
<v-menu <v-menu
v-model="datePickerMenu" v-model="datePickerMenu"
:close-on-content-click="false" :close-on-content-click="false"
transition="scale-transition" transition="scale-transition"
offset-y offset-y
max-width="290px"
> >
<template #activator="{ props: activatorProps }"> <template #activator="{ props: activatorProps }">
<v-text-field <v-text-field
@@ -60,6 +59,8 @@
:prepend-icon="$globals.icons.calendar" :prepend-icon="$globals.icons.calendar"
v-bind="activatorProps" v-bind="activatorProps"
readonly readonly
density="compact"
min-width="160"
/> />
</template> </template>
<v-date-picker <v-date-picker
@@ -72,7 +73,7 @@
</v-menu> </v-menu>
</v-col> </v-col>
<v-spacer /> <v-spacer />
<v-col cols="auto" align-self="center"> <v-col cols="auto">
<AppButtonUpload <AppButtonUpload
v-if="!newTimelineEventImage" v-if="!newTimelineEventImage"
class="ml-auto" class="ml-auto"
@@ -93,7 +94,7 @@
</v-col> </v-col>
</v-row> </v-row>
<v-row v-if="newTimelineEventImage && newTimelineEventImagePreviewUrl"> <v-row v-if="newTimelineEventImage && newTimelineEventImagePreviewUrl">
<v-col cols="12" align-self="center"> <v-col cols="12">
<ImageCropper <ImageCropper
:img="newTimelineEventImagePreviewUrl" :img="newTimelineEventImagePreviewUrl"
cropper-height="20vh" cropper-height="20vh"
@@ -115,16 +116,17 @@
<v-btn <v-btn
rounded rounded
variant="outlined" variant="outlined"
size="x-large" size="large"
v-bind="tooltipProps" v-bind="tooltipProps"
class="font-weight-400"
style="border-color: rgb(var(--v-theme-primary));" style="border-color: rgb(var(--v-theme-primary));"
@click="madeThisDialog = true" @click="madeThisDialog = true"
> >
<v-icon start size="large" color="primary"> <v-icon start size="large" color="primary">
{{ $globals.icons.calendar }} {{ $globals.icons.calendar }}
</v-icon> </v-icon>
<span class="text-body-1 opacity-80"> <span class="opacity-80">
<b>{{ $t("general.last-made") }}</b> <strong>{{ $t("general.last-made") }}</strong>
<br> <br>
{{ lastMade ? $d(new Date(lastMade)) : $t("general.never") }} {{ lastMade ? $d(new Date(lastMade)) : $t("general.never") }}
</span> </span>

View File

@@ -6,11 +6,11 @@
:recipe="recipe" :recipe="recipe"
/> />
<v-card <v-card
:width="landscape ? '100%' : '50%'" :width="landscape || !recipe.image ? '100%' : '50%'"
flat flat
class="d-flex flex-column justify-center align-center" class="d-flex flex-column justify-center align-center"
> >
<v-card-text class="w-100"> <v-card-text>
<div class="d-flex flex-column align-center"> <div class="d-flex flex-column align-center">
<v-card-title class="text-h5 font-weight-regular pa-0 text-wrap text-center opacity-80"> <v-card-title class="text-h5 font-weight-regular pa-0 text-wrap text-center opacity-80">
{{ recipe.name }} {{ recipe.name }}
@@ -67,7 +67,7 @@
</v-card-text> </v-card-text>
</v-card> </v-card>
<RecipePageInfoCardImage <RecipePageInfoCardImage
v-if="!landscape" v-if="!landscape && recipe.image"
:recipe="recipe" :recipe="recipe"
max-width="50%" max-width="50%"
class="my-auto" class="my-auto"

View File

@@ -54,7 +54,7 @@
<!-- Recipe Tools Edit --> <!-- Recipe Tools Edit -->
<v-card <v-card
v-if="isEditForm" v-if="isEditForm"
class="mt-2" class="mt-4"
> >
<v-card-title class="py-2"> <v-card-title class="py-2">
{{ $t('tool.required-tools') }} {{ $t('tool.required-tools') }}
@@ -64,7 +64,6 @@
<RecipeOrganizerSelector <RecipeOrganizerSelector
v-model="recipe.tools" v-model="recipe.tools"
selector-type="tools" selector-type="tools"
v-bind="$attrs"
/> />
</v-card-text> </v-card-text>
</v-card> </v-card>

View File

@@ -8,7 +8,7 @@
> >
<v-container fluid class="pa-2 ma-0" style="background-color: rgb(var(--v-theme-background));"> <v-container fluid class="pa-2 ma-0" style="background-color: rgb(var(--v-theme-background));">
<div v-if="state.loading.parser" class="my-6"> <div v-if="state.loading.parser" class="my-6">
<AppLoader waiting-text="" class="my-6" /> <AppLoader class="my-6" />
</div> </div>
<div v-else> <div v-else>
<BaseCardSectionTitle :title="$t('recipe.parser.ingredient-parser')"> <BaseCardSectionTitle :title="$t('recipe.parser.ingredient-parser')">

View File

@@ -44,7 +44,7 @@
> >
<v-icon <v-icon
:size="small ? 'small' : 'large'" :size="small ? 'small' : 'large'"
left start
color="primary" color="primary"
> >
{{ $globals.icons.knife }} {{ $globals.icons.knife }}
@@ -64,7 +64,7 @@
> >
<v-icon <v-icon
:size="small ? 'small' : 'large'" :size="small ? 'small' : 'large'"
left start
color="primary" color="primary"
> >
{{ $globals.icons.potSteam }} {{ $globals.icons.potSteam }}

View File

@@ -18,13 +18,11 @@
bordered bordered
> >
<v-btn <v-btn
class="rounded-circle" variant="text"
size="small"
color="info"
v-bind="activatorProps" v-bind="activatorProps"
icon :prepend-icon="$globals.icons.filter"
> >
<v-icon> {{ $globals.icons.filter }} </v-icon> {{ $t("general.filter") }}
</v-btn> </v-btn>
</v-badge> </v-badge>
</template> </template>
@@ -39,28 +37,24 @@
<v-list-item <v-list-item
v-for="option, idx in eventTypeFilterState" v-for="option, idx in eventTypeFilterState"
:key="idx" :key="idx"
:active="option.checked"
:color="option.checked ? 'primary' : undefined"
@click="toggleEventTypeOption(option.value)"
> >
<v-checkbox <template #prepend>
:model-value="option.checked" <v-icon>
color="primary" {{ option.icon }}
readonly </v-icon>
hide-details </template>
@click="toggleEventTypeOption(option.value)" <v-list-item-title>
> {{ option.label }}
<template #label> </v-list-item-title>
<v-icon start>
{{ option.icon }}
</v-icon>
{{ option.label }}
</template>
</v-checkbox>
</v-list-item> </v-list-item>
</v-list> </v-list>
</v-card> </v-card>
</v-menu> </v-menu>
</v-col> </v-col>
</v-row> </v-row>
<v-divider class="mx-2" />
<div <div
v-if="timelineEvents.length" v-if="timelineEvents.length"
id="timeline-container" id="timeline-container"
@@ -213,7 +207,10 @@ async function deleteTimelineEvent(index: number) {
} }
async function getRecipes(recipeIds: string[]): Promise<Recipe[]> { async function getRecipes(recipeIds: string[]): Promise<Recipe[]> {
const qf = "id IN [" + recipeIds.map(id => `"${id}"`).join(", ") + "]"; let qf = "";
if (recipeIds.length) {
qf = "id IN [" + recipeIds.map(id => `"${id}"`).join(", ") + "]";
}
const { data } = await api.recipes.getAll(1, -1, { queryFilter: qf }); const { data } = await api.recipes.getAll(1, -1, { queryFilter: qf });
return data?.items || []; return data?.items || [];
} }

View File

@@ -31,7 +31,6 @@
<RecipeTimeline <RecipeTimeline
v-model="showTimeline" v-model="showTimeline"
:query-filter="timelineAttrs.queryFilter" :query-filter="timelineAttrs.queryFilter"
max-height="60vh"
/> />
</BaseDialog> </BaseDialog>
</template> </template>

View File

@@ -9,7 +9,7 @@
style="font-size: larger;" style="font-size: larger;"
> >
<v-icon <v-icon
size="x-large" size="large"
start start
color="primary" color="primary"
> >

View File

@@ -25,7 +25,7 @@ function onScroll() {
} }
function scrollToTop() { function scrollToTop() {
document.documentElement.scrollTop = 0; window.scrollTo({ top: 0, behavior: "smooth" });
} }
onMounted(() => { onMounted(() => {

View File

@@ -3,34 +3,21 @@
class="mx-auto my-3 justify-center" class="mx-auto my-3 justify-center"
style="display: flex;" style="display: flex;"
> >
<div style="display: inline;"> <div class="text-center">
<v-progress-circular <v-progress-circular
:width="size.width" :width="size.width"
:size="size.size" :size="size.size"
color="primary-lighten-2" color="primary-lighten-2"
indeterminate indeterminate
> >
<div class="text-center"> <v-icon
<v-icon :size="size.icon"
:size="size.icon" color="primary-lighten-2"
color="primary-lighten-2" >
> {{ $globals.icons.primary }}
{{ $globals.icons.primary }} </v-icon>
</v-icon>
<div
v-if="large"
class="text-small"
>
<slot>
{{ (small || tiny) ? "" : waitingText }}
</slot>
</div>
</div>
</v-progress-circular> </v-progress-circular>
<div <div :class="large ? 'text-title-large mt-5' : 'text-body-large mt-3'">
v-if="!large"
class="text-small"
>
<slot> <slot>
{{ (small || tiny) ? "" : waitingTextCalculated }} {{ (small || tiny) ? "" : waitingTextCalculated }}
</slot> </slot>
@@ -97,5 +84,5 @@ const size = computed(() => {
}); });
const i18n = useI18n(); const i18n = useI18n();
const waitingTextCalculated = props.waitingText == null ? i18n.t("general.loading-recipes") : props.waitingText; const waitingTextCalculated = props.waitingText == null ? i18n.t("general.loading") : props.waitingText;
</script> </script>

View File

@@ -1399,10 +1399,10 @@
"setup": { "setup": {
"first-time-setup": "First Time Setup", "first-time-setup": "First Time Setup",
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started", "welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
"previous-mealie-instance": "Did you have a previous Mealie instance?",
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage", "already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
"common-settings-for-new-sites": "Here are some common settings for new sites", "common-settings-for-new-sites": "Here are some common settings for new sites",
"setup-complete": "Setup Complete!", "setup-complete": "Setup Complete!",
"ai-providers-description": "Optionally configure AI providers for your group. AI providers enable features like creating recipes from images, importing recipes from videos, and enhanced ingredient parsing. You can always configure this later from your group settings.", "ai-providers-description": "Optionally configure AI providers for your group. AI providers enable features like creating recipes from images, importing recipes from videos, and enhanced ingredient parsing. You can always configure this later from your group settings.",
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",

View File

@@ -81,9 +81,22 @@
<v-stepper-window-item :value="Pages.LANDING"> <v-stepper-window-item :value="Pages.LANDING">
<v-container class="mb-12"> <v-container class="mb-12">
<AppLogo /> <AppLogo />
<v-card-title class="text-h4 justify-center text-center text-break text-pre-wrap"> <v-card-title class="text-headline-medium my-5 justify-center text-center text-break text-pre-wrap">
{{ $t('admin.setup.welcome-to-mealie-get-started') }} {{ $t('admin.setup.welcome-to-mealie-get-started') }}
</v-card-title> </v-card-title>
<p class="text-body-1 text-center">
{{ $t('admin.setup.previous-mealie-instance') }}
</p>
<v-btn
to="backups"
rounded
variant="outlined"
color="primary"
class="text-subtitle-2 d-flex mx-auto my-3"
style="width: fit-content;"
>
{{ $t('settings.backup.restore-backup') }}
</v-btn>
<v-btn <v-btn
:to="groupSlug ? `/g/${groupSlug}` : '/login'" :to="groupSlug ? `/g/${groupSlug}` : '/login'"
rounded rounded

View File

@@ -248,9 +248,7 @@
</template> </template>
</template> </template>
<template v-else> <template v-else>
<div class="mb-3 text-center"> <AppLoader />
<AppLoader :waiting-text="$t('general.loading')" />
</div>
</template> </template>
</v-card> </v-card>
</section> </section>

View File

@@ -372,9 +372,7 @@
cols="12" cols="12"
class="d-flex justify-center" class="d-flex justify-center"
> >
<div class="text-center"> <AppLoader :waiting-text="$t('general.loading-recipes')" />
<AppLoader waiting-text="" />
</div>
</v-col> </v-col>
</v-row> </v-row>
</v-container> </v-container>
@@ -402,9 +400,7 @@
cols="12" cols="12"
class="d-flex justify-center" class="d-flex justify-center"
> >
<div class="text-center"> <AppLoader :waiting-text="$t('general.loading-recipes')" />
<AppLoader waiting-text="" />
</div>
</v-col> </v-col>
</v-row> </v-row>
</v-container> </v-container>