Skip to content

Commit 07ed060

Browse files
authored
feat: 3-2-1 backup onboarding card (#20374)
* feat: 3-2-1 backup onboarding card * chore: format i18n * fix: lint * Update onboarding-backup.svelte * fix: e2e onboarding test
1 parent 2f5d543 commit 07ed060

File tree

4 files changed

+79
-1
lines changed

4 files changed

+79
-1
lines changed

e2e/src/web/specs/auth.e2e-spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ test.describe('Registration', () => {
3737
await page.getByRole('button', { name: 'Server Privacy' }).click();
3838
await page.getByRole('button', { name: 'User Privacy' }).click();
3939
await page.getByRole('button', { name: 'Storage Template' }).click();
40+
await page.getByRole('button', { name: 'Backups' }).click();
4041
await page.getByRole('button', { name: 'Done' }).click();
4142

4243
// success

i18n/en.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@
4444
"backup_database": "Create Database Dump",
4545
"backup_database_enable_description": "Enable database dumps",
4646
"backup_keep_last_amount": "Amount of previous dumps to keep",
47+
"backup_onboarding_1_description": "offsite copy in the cloud or at another physical location.",
48+
"backup_onboarding_2_description": "local copies on different devices. This includes the main files and a backup of those files locally.",
49+
"backup_onboarding_3_description": "total copies of your data, including the original files. This includes 1 offsite copy and 2 local copies.",
50+
"backup_onboarding_description": "A <backblaze-link>3-2-1 backup strategy</backblaze-link> is recommended to protect your data. You should keep copies of your uploaded photos/videos as well as the Immich database for a comprehensive backup solution.",
51+
"backup_onboarding_footer": "For more information about backing up Immich, please refer to the <link>documentation</link>.",
52+
"backup_onboarding_parts_title": "A 3-2-1 backup includes:",
53+
"backup_onboarding_title": "Backups",
4754
"backup_settings": "Database Dump Settings",
4855
"backup_settings_description": "Manage database dump settings.",
4956
"cleared_jobs": "Cleared jobs for: {job}",
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<script lang="ts">
2+
import Icon from '$lib/components/elements/icon.svelte';
3+
import FormatBoldMessage from '$lib/components/i18n/format-bold-message.svelte';
4+
import FormatMessage from '$lib/components/i18n/format-message.svelte';
5+
import { Heading, HStack, Stack } from '@immich/ui';
6+
import { mdiAlert } from '@mdi/js';
7+
</script>
8+
9+
<div class="flex flex-col">
10+
<Stack gap={2}>
11+
<HStack gap={4}>
12+
<Icon path={mdiAlert} size="96" class="text-warning" />
13+
<p class="mb-2">
14+
<FormatMessage key="admin.backup_onboarding_description">
15+
{#snippet children({ message })}
16+
<a
17+
href="https://www.backblaze.com/blog/the-3-2-1-backup-strategy/"
18+
class="underline"
19+
target="_blank"
20+
rel="noreferrer"
21+
>
22+
{message}
23+
</a>
24+
{/snippet}
25+
</FormatMessage>
26+
</p>
27+
</HStack>
28+
29+
<p class="text-lg font-semibold">
30+
<FormatBoldMessage key="admin.backup_onboarding_parts_title"></FormatBoldMessage>
31+
</p>
32+
33+
<Stack class="bg-gray-100 dark:bg-gray-800 rounded-xl p-4" gap={4}>
34+
<HStack gap={6}>
35+
<Heading tag="h1" size="title" color="primary">3</Heading>
36+
<FormatMessage key="admin.backup_onboarding_3_description" />
37+
</HStack>
38+
<HStack gap={6}>
39+
<Heading tag="h1" size="title" color="primary">2</Heading>
40+
<FormatMessage key="admin.backup_onboarding_2_description" />
41+
</HStack>
42+
<HStack gap={6} class="ml-2">
43+
<Heading tag="h1" size="title" color="primary">1</Heading>
44+
<FormatMessage key="admin.backup_onboarding_1_description" />
45+
</HStack>
46+
</Stack>
47+
<p>
48+
<FormatMessage key="admin.backup_onboarding_footer">
49+
{#snippet children({ message })}
50+
<a
51+
href="https://immich.app/docs/administration/backup-and-restore/"
52+
class="underline"
53+
target="_blank"
54+
rel="noreferrer"
55+
>
56+
{message}
57+
</a>
58+
{/snippet}
59+
</FormatMessage>
60+
</p>
61+
</Stack>
62+
</div>

web/src/routes/auth/onboarding/+page.svelte

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
import OnboardingStorageTemplate from '$lib/components/onboarding-page/onboarding-storage-template.svelte';
99
import OnboardingTheme from '$lib/components/onboarding-page/onboarding-theme.svelte';
1010
import OnboardingUserPrivacy from '$lib/components/onboarding-page/onboarding-user-privacy.svelte';
11+
import OnboardingBackup from '$lib/components/onboarding-page/onboarding-backup.svelte';
1112
import { AppRoute, QueryParameter } from '$lib/constants';
1213
import { OnboardingRole } from '$lib/models/onboarding-role';
1314
import { retrieveServerConfig, retrieveSystemConfig, serverConfig } from '$lib/stores/server-config.store';
1415
import { user } from '$lib/stores/user.store';
1516
import { setUserOnboarding, updateAdminOnboarding } from '@immich/sdk';
16-
import { mdiHarddisk, mdiIncognito, mdiThemeLightDark, mdiTranslate } from '@mdi/js';
17+
import { mdiCloudUpload, mdiHarddisk, mdiIncognito, mdiThemeLightDark, mdiTranslate } from '@mdi/js';
1718
import { onMount } from 'svelte';
1819
import { t } from 'svelte-i18n';
1920
@@ -68,6 +69,13 @@
6869
title: $t('admin.storage_template_settings'),
6970
icon: mdiHarddisk,
7071
},
72+
{
73+
name: 'backup',
74+
component: OnboardingBackup,
75+
role: OnboardingRole.SERVER,
76+
title: $t('admin.backup_onboarding_title'),
77+
icon: mdiCloudUpload,
78+
},
7179
]);
7280
7381
let index = $state(0);

0 commit comments

Comments
 (0)