mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-07-19 14:10:15 -04:00
feat: ui fixes & backup link on onboarding screen (#7743)
This commit is contained in:
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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 />
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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')">
|
||||||
|
|||||||
@@ -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 }}
|
||||||
|
|||||||
@@ -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 || [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ function onScroll() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function scrollToTop() {
|
function scrollToTop() {
|
||||||
document.documentElement.scrollTop = 0;
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user