@futo-org/backups-orchestrator-ui 0.27.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/backends/BackendItem.svelte +28 -24
- package/dist/components/backends/BackendsList.svelte +33 -34
- package/dist/components/backends/BackendsList.svelte.d.ts +1 -0
- package/dist/components/backends/dialogs/SelectBackendModal.svelte +44 -55
- package/dist/components/backups/BackupItem.svelte +33 -26
- package/dist/components/backups/BackupStatus.svelte +200 -0
- package/dist/components/backups/BackupStatus.svelte.d.ts +19 -0
- package/dist/components/backups/BackupsList.svelte +17 -11
- package/dist/components/backups/dialogs/RestoreSnapshotModal.svelte +2 -2
- package/dist/components/backups/dialogs/SelectRepositoryModal.svelte +26 -36
- package/dist/components/backups/dialogs/ViewStatusModal.svelte +175 -0
- package/dist/components/backups/dialogs/ViewStatusModal.svelte.d.ts +8 -0
- package/dist/components/backups/run-history/RepositoryRunHistory.svelte +23 -12
- package/dist/components/backups/run-history/RepositoryRunHistory.svelte.d.ts +2 -0
- package/dist/components/backups/run-history/RepositoryRunHistoryItem.svelte +46 -20
- package/dist/components/backups/run-history/RepositoryRunHistoryPage.svelte +136 -0
- package/dist/components/backups/run-history/RepositoryRunHistoryPage.svelte.d.ts +8 -0
- package/dist/components/backups/run-history/RunHistoryModal.svelte +2 -2
- package/dist/components/backups/snapshots-list/RepositorySnapshotsList.svelte +22 -10
- package/dist/components/backups/snapshots-list/RepositorySnapshotsList.svelte.d.ts +2 -0
- package/dist/components/backups/snapshots-list/RepositorySnapshotsListItem.svelte +23 -21
- package/dist/components/backups/snapshots-list/RepositorySnapshotsPage.svelte +115 -0
- package/dist/components/backups/snapshots-list/RepositorySnapshotsPage.svelte.d.ts +9 -0
- package/dist/components/backups/snapshots-list/SnapshotsListModal.svelte +2 -2
- package/dist/components/dashboard/Dashboard.svelte +14 -7
- package/dist/components/dashboard/Dashboard.svelte.d.ts +1 -1
- package/dist/components/dashboard/DashboardAvgBackupTime.svelte +1 -1
- package/dist/components/dashboard/DashboardBackupHealth.svelte +5 -9
- package/dist/components/dashboard/DashboardBackupHealth.svelte.d.ts +1 -1
- package/dist/components/dashboard/DashboardCurrentUsage.svelte +1 -1
- package/dist/components/dashboard/DashboardDailyBackupTime.svelte +1 -1
- package/dist/components/dashboard/DashboardInstall.svelte +1 -1
- package/dist/components/dashboard/DashboardRecentBackups.svelte +47 -78
- package/dist/components/dashboard/DashboardTotalStored.svelte +1 -1
- package/dist/components/integrations/immich/ImmichBackupSettings.svelte +12 -0
- package/dist/components/integrations/immich/ImmichBackupSettings.svelte.d.ts +18 -0
- package/dist/components/integrations/immich/ImmichBackupsCard.svelte +109 -0
- package/dist/components/integrations/immich/ImmichBackupsCard.svelte.d.ts +13 -0
- package/dist/components/integrations/immich/ImmichBackupsNavButton.svelte +55 -0
- package/dist/components/integrations/immich/ImmichBackupsNavButton.svelte.d.ts +10 -0
- package/dist/components/integrations/immich/ImmichBackupsPage.svelte +16 -3
- package/dist/components/integrations/immich/ImmichBackupsPage.svelte.d.ts +8 -1
- package/dist/components/integrations/immich/ImmichBackupsSidebarItem.svelte +102 -0
- package/dist/components/integrations/immich/ImmichBackupsSidebarItem.svelte.d.ts +8 -0
- package/dist/components/integrations/immich/ImmichManageBackup.svelte +53 -14
- package/dist/components/integrations/immich/ImmichManageBackupOverview.svelte +45 -71
- package/dist/components/integrations/immich/ImmichOnboardingSetupFlow.svelte +123 -82
- package/dist/components/integrations/immich/ImmichOnboardingSetupFlow.svelte.d.ts +1 -1
- package/dist/components/integrations/immich/settings/ImmichSettingsBackupContents.svelte +313 -0
- package/dist/components/integrations/immich/settings/ImmichSettingsBackupContents.svelte.d.ts +3 -0
- package/dist/components/integrations/immich/settings/ImmichSettingsSchedule.svelte +218 -0
- package/dist/components/integrations/immich/settings/ImmichSettingsSchedule.svelte.d.ts +3 -0
- package/dist/components/integrations/immich/settings/ImmichSettingsStorage.svelte +207 -0
- package/dist/components/integrations/immich/settings/ImmichSettingsStorage.svelte.d.ts +3 -0
- package/dist/components/onboarding/RecoveryKeyDisplay.svelte +34 -20
- package/dist/components/onboarding/SampleOnboarding.svelte +57 -38
- package/dist/components/onboarding/stages/OnboardingStageBackupServices.svelte +10 -24
- package/dist/components/onboarding/steps/OnboardingStep1FinishSetup.svelte +44 -0
- package/dist/components/onboarding/steps/OnboardingStep1FinishSetup.svelte.d.ts +7 -0
- package/dist/components/onboarding/steps/OnboardingStep2ConnectAccount.svelte +50 -0
- package/dist/components/onboarding/steps/OnboardingStep2ConnectAccount.svelte.d.ts +7 -0
- package/dist/components/onboarding/steps/OnboardingStep3SaveRecoveryKey.svelte +45 -0
- package/dist/components/onboarding/steps/OnboardingStep3SaveRecoveryKey.svelte.d.ts +8 -0
- package/dist/components/onboarding/steps/OnboardingStep4FirstBackup.svelte +67 -0
- package/dist/components/onboarding/steps/OnboardingStep4FirstBackup.svelte.d.ts +9 -0
- package/dist/components/onboarding/steps/OnboardingStepLayout.svelte +58 -0
- package/dist/components/onboarding/steps/OnboardingStepLayout.svelte.d.ts +19 -0
- package/dist/components/onboarding/upsell/UpsellBackupFeaturesGrid.svelte +52 -0
- package/dist/components/onboarding/upsell/UpsellBackupFeaturesGrid.svelte.d.ts +18 -0
- package/dist/components/onboarding/upsell/UpsellExplainFutoBackups.svelte +33 -0
- package/dist/components/onboarding/upsell/UpsellExplainFutoBackups.svelte.d.ts +8 -0
- package/dist/components/onboarding/upsell/UpsellFrequentlyAskedQuestions.svelte +32 -0
- package/dist/components/onboarding/upsell/UpsellFrequentlyAskedQuestions.svelte.d.ts +11 -0
- package/dist/components/onboarding/upsell/UpsellFutoBackupsBadge.svelte +7 -0
- package/dist/components/onboarding/upsell/UpsellFutoBackupsBadge.svelte.d.ts +18 -0
- package/dist/components/onboarding/upsell/UpsellHowItWorks.svelte +46 -0
- package/dist/components/onboarding/upsell/UpsellHowItWorks.svelte.d.ts +6 -0
- package/dist/components/onboarding/upsell/UpsellModal.svelte +43 -0
- package/dist/components/onboarding/upsell/UpsellModal.svelte.d.ts +9 -0
- package/dist/components/onboarding/upsell/UpsellPage.svelte +40 -0
- package/dist/components/onboarding/upsell/UpsellPage.svelte.d.ts +14 -0
- package/dist/components/onboarding/upsell/UpsellProtectYourImmichLibrary.svelte +58 -0
- package/dist/components/onboarding/upsell/UpsellProtectYourImmichLibrary.svelte.d.ts +8 -0
- package/dist/components/schedules/RepositoryPicker.svelte +45 -38
- package/dist/components/schedules/ScheduleItem.svelte +32 -26
- package/dist/components/schedules/ScheduleList.svelte +16 -10
- package/dist/components/settings/GlobalSettings.svelte +8 -0
- package/dist/components/settings/GlobalSettings.svelte.d.ts +18 -0
- package/dist/components/settings/SettingsBackends.svelte +16 -0
- package/dist/components/settings/SettingsBackends.svelte.d.ts +18 -0
- package/dist/components/settings/SettingsBilling.svelte +69 -0
- package/dist/components/settings/SettingsBilling.svelte.d.ts +6 -0
- package/dist/components/settings/SettingsNotifications.svelte +47 -0
- package/dist/components/settings/SettingsNotifications.svelte.d.ts +6 -0
- package/dist/components/test/ImmichTestUi.svelte +143 -27
- package/dist/components/test/TestUi.svelte +4 -4
- package/dist/components/test/dashboard/ActiveJobs.svelte +2 -2
- package/dist/components/test/immich/MockImmichHideBackupsReminder.svelte +12 -0
- package/dist/components/test/immich/MockImmichHideBackupsReminder.svelte.d.ts +3 -0
- package/dist/components/test/immich/MockImmichPhotos.svelte +36 -0
- package/dist/components/test/immich/MockImmichPhotos.svelte.d.ts +18 -0
- package/dist/components/test/immich/MockImmichPurchaseInfo.svelte +29 -0
- package/dist/components/test/immich/MockImmichPurchaseInfo.svelte.d.ts +18 -0
- package/dist/components/test/immich/MockImmichServerStatus.svelte +9 -0
- package/dist/components/test/immich/MockImmichServerStatus.svelte.d.ts +18 -0
- package/dist/components/test/immich/MockImmichSidebar.svelte +20 -0
- package/dist/components/test/immich/MockImmichSidebar.svelte.d.ts +7 -0
- package/dist/components/test/immich/MockImmichStorageSpace.svelte +25 -0
- package/dist/components/test/immich/MockImmichStorageSpace.svelte.d.ts +7 -0
- package/dist/components/ui/Accordion.svelte +67 -0
- package/dist/components/ui/Accordion.svelte.d.ts +11 -0
- package/dist/components/ui/ListToolbar.svelte +60 -0
- package/dist/components/ui/ListToolbar.svelte.d.ts +16 -0
- package/dist/components/ui/PageLayout.svelte +21 -9
- package/dist/components/ui/PageLayout.svelte.d.ts +1 -0
- package/dist/components/ui/Pagination.svelte +80 -0
- package/dist/components/ui/Pagination.svelte.d.ts +8 -0
- package/dist/components/ui/PathListField.svelte +17 -14
- package/dist/components/ui/StackList.svelte +18 -18
- package/dist/components/ui/StackList.svelte.d.ts +6 -27
- package/dist/components/ui/StackListItem.svelte +47 -25
- package/dist/components/ui/StackListItem.svelte.d.ts +5 -2
- package/dist/components/ui/StackListOption.svelte +33 -0
- package/dist/components/ui/StackListOption.svelte.d.ts +11 -0
- package/dist/components/ui/StackListPlaceholder.svelte +12 -0
- package/dist/components/ui/StackListPlaceholder.svelte.d.ts +7 -0
- package/dist/components/ui/StepNumber.svelte +20 -0
- package/dist/components/ui/StepNumber.svelte.d.ts +7 -0
- package/dist/components/util/Suspense.svelte +7 -3
- package/dist/components/util/YuccaContext.svelte +1 -1
- package/dist/events.js +1 -1
- package/dist/fetch-client.d.ts +2 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +6 -1
- package/dist/services/backend.service.js +3 -0
- package/dist/services/immich.integration.service.d.ts +1 -1
- package/dist/services/immich.integration.service.js +2 -3
- package/dist/services/integrations.service.d.ts +1 -0
- package/dist/services/integrations.service.js +2 -1
- package/dist/services/log.service.svelte.d.ts +12 -0
- package/dist/services/log.service.svelte.js +15 -1
- package/dist/services/repository.service.js +9 -3
- package/dist/services/runHistory.service.d.ts +1 -1
- package/dist/services/runHistory.service.js +5 -4
- package/dist/utils/format.d.ts +1 -1
- package/dist/utils/format.js +2 -2
- package/package.json +3 -3
- package/dist/components/backups/dialogs/ViewLogModal.svelte +0 -208
- package/dist/components/backups/dialogs/ViewLogModal.svelte.d.ts +0 -7
- package/dist/components/integrations/immich/ImmichConfigureBackup.svelte +0 -403
- package/dist/components/integrations/immich/ImmichConfigureBackup.svelte.d.ts +0 -9
- package/dist/components/integrations/immich/ImmichConfirmDefaultBackup.svelte +0 -80
- package/dist/components/integrations/immich/ImmichConfirmDefaultBackup.svelte.d.ts +0 -8
- package/dist/components/onboarding/stages/OnboardingStageKeyConfirm.svelte +0 -56
- package/dist/components/onboarding/stages/OnboardingStageKeyConfirm.svelte.d.ts +0 -9
- package/dist/components/onboarding/stages/OnboardingStageKeyIntro.svelte +0 -50
- package/dist/components/onboarding/stages/OnboardingStageKeyIntro.svelte.d.ts +0 -7
- package/dist/components/onboarding/stages/OnboardingStageKeySave.svelte +0 -44
- package/dist/components/onboarding/stages/OnboardingStageKeySave.svelte.d.ts +0 -8
- package/dist/components/onboarding/stages/OnboardingStageWelcome.svelte +0 -56
- package/dist/components/onboarding/stages/OnboardingStageWelcome.svelte.d.ts +0 -9
- package/dist/components/util/TimedButton.svelte +0 -37
- package/dist/components/util/TimedButton.svelte.d.ts +0 -7
|
@@ -4,26 +4,42 @@
|
|
|
4
4
|
Button,
|
|
5
5
|
ContextMenuButton,
|
|
6
6
|
HStack,
|
|
7
|
+
IconButton,
|
|
7
8
|
type ActionItem,
|
|
8
9
|
} from "@immich/ui";
|
|
10
|
+
import { mdiArrowLeft } from "@mdi/js";
|
|
9
11
|
import type { Snippet } from "svelte";
|
|
10
12
|
|
|
11
13
|
type Props = {
|
|
12
14
|
title?: string;
|
|
13
15
|
actions?: ActionItem[];
|
|
16
|
+
onBack?: () => void;
|
|
14
17
|
children?: Snippet;
|
|
15
18
|
};
|
|
16
19
|
|
|
17
|
-
const { title, actions = [], children }: Props = $props();
|
|
20
|
+
const { title, actions = [], onBack, children }: Props = $props();
|
|
18
21
|
const { demoPadding } = options;
|
|
22
|
+
|
|
23
|
+
const hasHeader = $derived(Boolean(title) || actions.length > 0 || Boolean(onBack));
|
|
19
24
|
</script>
|
|
20
25
|
|
|
21
|
-
<main class="
|
|
22
|
-
{#if
|
|
26
|
+
<main class="flex h-full w-full flex-col">
|
|
27
|
+
{#if hasHeader}
|
|
23
28
|
<div
|
|
24
|
-
class="
|
|
29
|
+
class="flex h-16 shrink-0 place-items-center justify-between border-b p-2 text-dark"
|
|
25
30
|
>
|
|
26
31
|
<div class="flex gap-2 items-center">
|
|
32
|
+
{#if onBack}
|
|
33
|
+
<IconButton
|
|
34
|
+
icon={mdiArrowLeft}
|
|
35
|
+
aria-label="Back"
|
|
36
|
+
variant="ghost"
|
|
37
|
+
color="secondary"
|
|
38
|
+
shape="round"
|
|
39
|
+
onclick={onBack}
|
|
40
|
+
/>
|
|
41
|
+
{/if}
|
|
42
|
+
|
|
27
43
|
{#if title}
|
|
28
44
|
<div class="outline-none pe-8">{title}</div>
|
|
29
45
|
{/if}
|
|
@@ -57,11 +73,7 @@
|
|
|
57
73
|
</div>
|
|
58
74
|
{/if}
|
|
59
75
|
|
|
60
|
-
<div
|
|
61
|
-
class="absolute left-0 w-full overflow-y-auto {title || actions.length > 0
|
|
62
|
-
? 'top-16 h-[calc(100%-4rem)]'
|
|
63
|
-
: 'top-0 h-full'} {$demoPadding ? 'p-4' : ''}"
|
|
64
|
-
>
|
|
76
|
+
<div class="min-h-0 grow overflow-y-auto {$demoPadding ? 'p-4' : ''}">
|
|
65
77
|
{@render children?.()}
|
|
66
78
|
</div>
|
|
67
79
|
</main>
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Button, HStack, IconButton, Text } from "@immich/ui";
|
|
3
|
+
import { mdiChevronLeft, mdiChevronRight } from "@mdi/js";
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
page: number;
|
|
7
|
+
pageCount: number;
|
|
8
|
+
onChange: (page: number) => void;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const { page, pageCount, onChange }: Props = $props();
|
|
12
|
+
|
|
13
|
+
const boundaryCount = 2;
|
|
14
|
+
const siblingCount = 0;
|
|
15
|
+
|
|
16
|
+
const range = (from: number, to: number) =>
|
|
17
|
+
Array.from({ length: Math.max(to - from + 1, 0) }, (_, index) => from + index);
|
|
18
|
+
|
|
19
|
+
const pages = $derived.by(() => {
|
|
20
|
+
const shown = new Set([
|
|
21
|
+
...range(1, Math.min(boundaryCount, pageCount)),
|
|
22
|
+
...range(Math.max(pageCount - boundaryCount + 1, 1), pageCount),
|
|
23
|
+
...range(
|
|
24
|
+
Math.max(page - siblingCount, 1),
|
|
25
|
+
Math.min(page + siblingCount, pageCount),
|
|
26
|
+
),
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
const items: (number | "ellipsis")[] = [];
|
|
30
|
+
for (const candidate of range(1, pageCount)) {
|
|
31
|
+
if (shown.has(candidate)) {
|
|
32
|
+
items.push(candidate);
|
|
33
|
+
} else if (items.at(-1) !== "ellipsis") {
|
|
34
|
+
items.push("ellipsis");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return items;
|
|
39
|
+
});
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<HStack class="items-center justify-between">
|
|
43
|
+
<IconButton
|
|
44
|
+
icon={mdiChevronLeft}
|
|
45
|
+
aria-label="Previous page"
|
|
46
|
+
variant="ghost"
|
|
47
|
+
color="secondary"
|
|
48
|
+
disabled={page <= 1}
|
|
49
|
+
onclick={() => onChange(page - 1)}
|
|
50
|
+
/>
|
|
51
|
+
|
|
52
|
+
<HStack gap={1} class="items-center">
|
|
53
|
+
{#each pages as item, index (index)}
|
|
54
|
+
{#if item === "ellipsis"}
|
|
55
|
+
<Text class="w-8 text-center" color="muted">…</Text>
|
|
56
|
+
{:else}
|
|
57
|
+
<Button
|
|
58
|
+
size="small"
|
|
59
|
+
variant="ghost"
|
|
60
|
+
color="secondary"
|
|
61
|
+
class={item === page ? "bg-subtle" : undefined}
|
|
62
|
+
aria-label={`Page ${item}`}
|
|
63
|
+
aria-current={item === page ? "page" : undefined}
|
|
64
|
+
onclick={() => onChange(item)}
|
|
65
|
+
>
|
|
66
|
+
{item}
|
|
67
|
+
</Button>
|
|
68
|
+
{/if}
|
|
69
|
+
{/each}
|
|
70
|
+
</HStack>
|
|
71
|
+
|
|
72
|
+
<IconButton
|
|
73
|
+
icon={mdiChevronRight}
|
|
74
|
+
aria-label="Next page"
|
|
75
|
+
variant="ghost"
|
|
76
|
+
color="secondary"
|
|
77
|
+
disabled={page >= pageCount}
|
|
78
|
+
onclick={() => onChange(page + 1)}
|
|
79
|
+
/>
|
|
80
|
+
</HStack>
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import StackList from "./StackList.svelte";
|
|
3
|
+
import StackListItem from "./StackListItem.svelte";
|
|
3
4
|
import type { FilesystemListingResponseDto } from "../../fetch-client";
|
|
4
5
|
import {
|
|
5
6
|
Button,
|
|
6
|
-
HStack,
|
|
7
7
|
IconButton,
|
|
8
8
|
modalManager,
|
|
9
9
|
Text,
|
|
@@ -58,26 +58,29 @@
|
|
|
58
58
|
|
|
59
59
|
{#if paths.size > 0}
|
|
60
60
|
{#each [...paths] as path (path)}
|
|
61
|
-
<
|
|
61
|
+
<StackListItem>
|
|
62
62
|
<Text class="grow truncate" title={path}>{path}</Text>
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
63
|
+
|
|
64
|
+
{#snippet trailing()}
|
|
65
|
+
<IconButton
|
|
66
|
+
icon={mdiClose}
|
|
67
|
+
aria-label="Remove"
|
|
68
|
+
size="tiny"
|
|
69
|
+
variant="ghost"
|
|
70
|
+
onclick={() => paths.delete(path)}
|
|
71
|
+
/>
|
|
72
|
+
{/snippet}
|
|
73
|
+
</StackListItem>
|
|
71
74
|
{/each}
|
|
72
75
|
{:else if empty}
|
|
73
|
-
<
|
|
76
|
+
<StackListItem>
|
|
74
77
|
<Text color="secondary">{@render empty()}</Text>
|
|
75
|
-
</
|
|
78
|
+
</StackListItem>
|
|
76
79
|
{/if}
|
|
77
80
|
|
|
78
|
-
<
|
|
81
|
+
<StackListItem>
|
|
79
82
|
<Button size="small" variant="ghost" onclick={openPicker}>
|
|
80
83
|
{paths.size > 0 ? addLabel : manageLabel}
|
|
81
84
|
</Button>
|
|
82
|
-
</
|
|
85
|
+
</StackListItem>
|
|
83
86
|
</StackList>
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
import {
|
|
3
|
-
import { Alert, Heading, LoadingSpinner, Stack } from "@immich/ui";
|
|
4
|
-
import type { CreateQueryResult } from "@tanstack/svelte-query";
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Card, CardBody, Heading, HStack, Stack } from "@immich/ui";
|
|
5
3
|
import type { Snippet } from "svelte";
|
|
6
4
|
|
|
7
5
|
type Props = {
|
|
8
6
|
title?: Snippet;
|
|
9
|
-
|
|
10
|
-
children
|
|
7
|
+
action?: Snippet;
|
|
8
|
+
children?: Snippet;
|
|
11
9
|
};
|
|
12
10
|
|
|
13
|
-
const { title,
|
|
11
|
+
const { title, action, children }: Props = $props();
|
|
14
12
|
</script>
|
|
15
13
|
|
|
16
14
|
<Stack gap={2}>
|
|
17
|
-
{#if title}
|
|
18
|
-
<
|
|
19
|
-
|
|
15
|
+
{#if title || action}
|
|
16
|
+
<HStack class="items-center justify-between px-1">
|
|
17
|
+
{#if title}
|
|
18
|
+
<Heading size="tiny">{@render title()}</Heading>
|
|
19
|
+
{/if}
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
{:else if query?.isError}
|
|
24
|
-
<Alert color="danger">{getReadableErrorMessage(query.error)}</Alert>
|
|
25
|
-
{:else}
|
|
26
|
-
<Stack gap={0} class="divide-y rounded-2xl border overflow-hidden">
|
|
27
|
-
{@render children(query?.data as T)}
|
|
28
|
-
</Stack>
|
|
21
|
+
{@render action?.()}
|
|
22
|
+
</HStack>
|
|
29
23
|
{/if}
|
|
24
|
+
|
|
25
|
+
<Card class="border-primary-100 shadow-none">
|
|
26
|
+
<CardBody class="divide-y p-0">
|
|
27
|
+
{@render children?.()}
|
|
28
|
+
</CardBody>
|
|
29
|
+
</Card>
|
|
30
30
|
</Stack>
|
|
@@ -1,30 +1,9 @@
|
|
|
1
|
-
import type { CreateQueryResult } from "@tanstack/svelte-query";
|
|
2
1
|
import type { Snippet } from "svelte";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
children: Snippet<[T]>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
2
|
+
type Props = {
|
|
3
|
+
title?: Snippet;
|
|
4
|
+
action?: Snippet;
|
|
5
|
+
children?: Snippet;
|
|
13
6
|
};
|
|
14
|
-
declare
|
|
15
|
-
|
|
16
|
-
events(): ReturnType<typeof $$render<T>>['events'];
|
|
17
|
-
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
18
|
-
bindings(): "";
|
|
19
|
-
exports(): {};
|
|
20
|
-
}
|
|
21
|
-
interface $$IsomorphicComponent {
|
|
22
|
-
new <T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
23
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
24
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
25
|
-
<T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
|
-
}
|
|
28
|
-
declare const StackList: $$IsomorphicComponent;
|
|
29
|
-
type StackList<T> = InstanceType<typeof StackList<T>>;
|
|
7
|
+
declare const StackList: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type StackList = ReturnType<typeof StackList>;
|
|
30
9
|
export default StackList;
|
|
@@ -1,43 +1,69 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { hasActions } from "../../utils/actions";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
ContextMenuButton,
|
|
5
|
+
HStack,
|
|
6
|
+
Stack,
|
|
7
|
+
Text,
|
|
8
|
+
type ActionItem,
|
|
9
|
+
} from "@immich/ui";
|
|
4
10
|
import { mdiDotsVertical } from "@mdi/js";
|
|
5
11
|
import type { Snippet } from "svelte";
|
|
6
12
|
|
|
13
|
+
type Color = "primary" | "success" | "warning" | "danger";
|
|
14
|
+
|
|
7
15
|
type Props = {
|
|
8
16
|
class?: string;
|
|
17
|
+
title?: string;
|
|
18
|
+
color?: Color;
|
|
9
19
|
icon?: Snippet;
|
|
10
20
|
children: Snippet;
|
|
11
21
|
trailing?: Snippet;
|
|
22
|
+
footer?: Snippet;
|
|
23
|
+
footerColor?: Color;
|
|
12
24
|
actions?: ActionItem[];
|
|
13
|
-
disabled?: boolean;
|
|
14
|
-
onclick?: () => void;
|
|
15
25
|
};
|
|
16
26
|
|
|
17
27
|
const {
|
|
18
28
|
class: className,
|
|
29
|
+
title,
|
|
30
|
+
color = "primary",
|
|
19
31
|
icon,
|
|
20
32
|
children,
|
|
21
33
|
trailing,
|
|
34
|
+
footer,
|
|
35
|
+
footerColor = "primary",
|
|
22
36
|
actions = [],
|
|
23
|
-
disabled = false,
|
|
24
|
-
onclick,
|
|
25
37
|
}: Props = $props();
|
|
38
|
+
|
|
39
|
+
const tints: Record<Color, string> = {
|
|
40
|
+
primary: "bg-primary-50 text-primary",
|
|
41
|
+
success: "bg-success-50 text-success-700",
|
|
42
|
+
warning: "bg-warning-50 text-warning-800",
|
|
43
|
+
danger: "bg-danger-50 text-danger-700",
|
|
44
|
+
};
|
|
26
45
|
</script>
|
|
27
46
|
|
|
28
|
-
|
|
29
|
-
<HStack gap={4} class={`${className} items-center px-
|
|
47
|
+
<div>
|
|
48
|
+
<HStack gap={4} class={`${className} items-center px-5 py-4`}>
|
|
30
49
|
{#if icon}
|
|
31
50
|
<div
|
|
32
|
-
class=
|
|
51
|
+
class={`flex size-10 shrink-0 items-center justify-center rounded-lg text-xl ${tints[color]}`}
|
|
33
52
|
>
|
|
34
|
-
{@render icon
|
|
53
|
+
{@render icon()}
|
|
35
54
|
</div>
|
|
36
55
|
{/if}
|
|
37
56
|
|
|
38
|
-
|
|
39
|
-
{
|
|
40
|
-
|
|
57
|
+
{#if title}
|
|
58
|
+
<Stack gap={0} class="flex-1 min-w-0">
|
|
59
|
+
<Text class="truncate">{title}</Text>
|
|
60
|
+
<Text size="small" color="muted">{@render children()}</Text>
|
|
61
|
+
</Stack>
|
|
62
|
+
{:else}
|
|
63
|
+
<HStack gap={1} class="flex-1 items-baseline">
|
|
64
|
+
{@render children()}
|
|
65
|
+
</HStack>
|
|
66
|
+
{/if}
|
|
41
67
|
|
|
42
68
|
{@render trailing?.()}
|
|
43
69
|
|
|
@@ -51,17 +77,13 @@
|
|
|
51
77
|
/>
|
|
52
78
|
{/if}
|
|
53
79
|
</HStack>
|
|
54
|
-
{/snippet}
|
|
55
80
|
|
|
56
|
-
{#if
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
{:else}
|
|
66
|
-
{@render body()}
|
|
67
|
-
{/if}
|
|
81
|
+
{#if footer}
|
|
82
|
+
<HStack
|
|
83
|
+
gap={2}
|
|
84
|
+
class={`items-center border-t px-5 py-3 ${tints[footerColor]}`}
|
|
85
|
+
>
|
|
86
|
+
{@render footer()}
|
|
87
|
+
</HStack>
|
|
88
|
+
{/if}
|
|
89
|
+
</div>
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { type ActionItem } from "@immich/ui";
|
|
2
2
|
import type { Snippet } from "svelte";
|
|
3
|
+
type Color = "primary" | "success" | "warning" | "danger";
|
|
3
4
|
type Props = {
|
|
4
5
|
class?: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
color?: Color;
|
|
5
8
|
icon?: Snippet;
|
|
6
9
|
children: Snippet;
|
|
7
10
|
trailing?: Snippet;
|
|
11
|
+
footer?: Snippet;
|
|
12
|
+
footerColor?: Color;
|
|
8
13
|
actions?: ActionItem[];
|
|
9
|
-
disabled?: boolean;
|
|
10
|
-
onclick?: () => void;
|
|
11
14
|
};
|
|
12
15
|
declare const StackListItem: import("svelte").Component<Props, {}, "">;
|
|
13
16
|
type StackListItem = ReturnType<typeof StackListItem>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Icon } from "@immich/ui";
|
|
3
|
+
import { mdiChevronRight } from "@mdi/js";
|
|
4
|
+
import type { Snippet } from "svelte";
|
|
5
|
+
import StackListItem from "./StackListItem.svelte";
|
|
6
|
+
|
|
7
|
+
type Props = {
|
|
8
|
+
title: string;
|
|
9
|
+
icon?: Snippet;
|
|
10
|
+
children: Snippet;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
onclick: () => void;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const { title, icon, children, disabled = false, onclick }: Props = $props();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<button
|
|
19
|
+
type="button"
|
|
20
|
+
{disabled}
|
|
21
|
+
{onclick}
|
|
22
|
+
class="block w-full cursor-pointer text-left hover:bg-subtle focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-primary-500 disabled:cursor-not-allowed disabled:opacity-60"
|
|
23
|
+
>
|
|
24
|
+
<StackListItem {title} {icon}>
|
|
25
|
+
{@render children()}
|
|
26
|
+
|
|
27
|
+
{#snippet trailing()}
|
|
28
|
+
{#if !disabled}
|
|
29
|
+
<Icon icon={mdiChevronRight} />
|
|
30
|
+
{/if}
|
|
31
|
+
{/snippet}
|
|
32
|
+
</StackListItem>
|
|
33
|
+
</button>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
type Props = {
|
|
3
|
+
title: string;
|
|
4
|
+
icon?: Snippet;
|
|
5
|
+
children: Snippet;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
onclick: () => void;
|
|
8
|
+
};
|
|
9
|
+
declare const StackListOption: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type StackListOption = ReturnType<typeof StackListOption>;
|
|
11
|
+
export default StackListOption;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Text } from "@immich/ui";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
children: Snippet;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const { children }: Props = $props();
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<Text class="block text-center py-8" color="muted">{@render children()}</Text>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
type Props = {
|
|
3
|
+
children: Snippet;
|
|
4
|
+
};
|
|
5
|
+
declare const StackListPlaceholder: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type StackListPlaceholder = ReturnType<typeof StackListPlaceholder>;
|
|
7
|
+
export default StackListPlaceholder;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
type Props = {
|
|
3
|
+
step: number;
|
|
4
|
+
size?: "small" | "medium";
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const { step, size = "medium" }: Props = $props();
|
|
8
|
+
|
|
9
|
+
const sizes = {
|
|
10
|
+
small: "size-5 text-xs",
|
|
11
|
+
medium: "size-8 text-lg",
|
|
12
|
+
};
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<span
|
|
16
|
+
class={`bg-primary text-light flex shrink-0 items-center justify-center rounded-full tabular-nums ${sizes[size]}`}
|
|
17
|
+
aria-hidden="true"
|
|
18
|
+
>
|
|
19
|
+
{step}
|
|
20
|
+
</span>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts" generics="T extends object">
|
|
2
2
|
import { getReadableErrorMessage } from "../../utils/handle-error";
|
|
3
|
-
import { Alert, LoadingSpinner } from "@immich/ui";
|
|
3
|
+
import { Alert, HStack, LoadingSpinner } from "@immich/ui";
|
|
4
4
|
import type { CreateQueryResult } from "@tanstack/svelte-query";
|
|
5
5
|
import type { Snippet } from "svelte";
|
|
6
6
|
|
|
@@ -13,9 +13,13 @@
|
|
|
13
13
|
</script>
|
|
14
14
|
|
|
15
15
|
{#if query.isLoading}
|
|
16
|
-
<
|
|
16
|
+
<HStack class="justify-center p-8">
|
|
17
|
+
<LoadingSpinner />
|
|
18
|
+
</HStack>
|
|
17
19
|
{:else if query.isError}
|
|
18
|
-
<
|
|
20
|
+
<div class="p-4">
|
|
21
|
+
<Alert color="danger">{getReadableErrorMessage(query.error)}</Alert>
|
|
22
|
+
</div>
|
|
19
23
|
{:else if query.isSuccess}
|
|
20
24
|
{@render children(query.data)}
|
|
21
25
|
{/if}
|
package/dist/events.js
CHANGED
package/dist/fetch-client.d.ts
CHANGED
|
@@ -81,6 +81,7 @@ export type ConfigureImmichIntegrationRequestDto = {
|
|
|
81
81
|
backupConfiguration: boolean;
|
|
82
82
|
libraries: "all" | string[];
|
|
83
83
|
retentionPolicy?: (RetentionPolicyDto) | null;
|
|
84
|
+
paused?: boolean;
|
|
84
85
|
};
|
|
85
86
|
export type ImmichRollbackRequestDto = {
|
|
86
87
|
repositoryId: string;
|
|
@@ -185,6 +186,7 @@ export type RepositoryInspectResponseDto = {
|
|
|
185
186
|
};
|
|
186
187
|
export type RepositoryUpdateRequestDto = {
|
|
187
188
|
name?: string;
|
|
189
|
+
worm?: boolean;
|
|
188
190
|
paths?: string[];
|
|
189
191
|
retentionPolicy?: (RetentionPolicyDto) | null;
|
|
190
192
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
export { default as BackendsList } from './components/backends/BackendsList.svelte';
|
|
2
2
|
export { default as BackupsList } from './components/backups/BackupsList.svelte';
|
|
3
|
-
export { default as
|
|
3
|
+
export { default as ViewStatusModal } from './components/backups/dialogs/ViewStatusModal.svelte';
|
|
4
4
|
export { default as Dashboard } from './components/dashboard/Dashboard.svelte';
|
|
5
|
+
export { default as ImmichBackupsNavButton } from './components/integrations/immich/ImmichBackupsNavButton.svelte';
|
|
5
6
|
export { default as ImmichBackupsPage } from './components/integrations/immich/ImmichBackupsPage.svelte';
|
|
7
|
+
export { default as ImmichBackupsSidebarItem } from './components/integrations/immich/ImmichBackupsSidebarItem.svelte';
|
|
6
8
|
export { default as ImmichManageBackup } from './components/integrations/immich/ImmichManageBackup.svelte';
|
|
7
9
|
export { default as ImmichOnboardingRestoreFlow } from './components/integrations/immich/ImmichOnboardingRestoreFlow.svelte';
|
|
8
10
|
export { default as ImmichOnboardingSetupFlow } from './components/integrations/immich/ImmichOnboardingSetupFlow.svelte';
|
|
9
11
|
export { default as OnboardingGate } from './components/onboarding/OnboardingGate.svelte';
|
|
12
|
+
export { default as UpsellModal } from './components/onboarding/upsell/UpsellModal.svelte';
|
|
13
|
+
export { default as UpsellPage } from './components/onboarding/upsell/UpsellPage.svelte';
|
|
10
14
|
export { default as ScheduleList } from './components/schedules/ScheduleList.svelte';
|
|
15
|
+
export { default as GlobalSettings } from './components/settings/GlobalSettings.svelte';
|
|
11
16
|
export { default as VisualisationGauge } from './components/ui/VisualisationGauge.svelte';
|
|
12
17
|
export { default as VisualisationSegmentedBar } from './components/ui/VisualisationSegmentedBar.svelte';
|
|
13
18
|
export { default as OnEvents } from './components/util/OnEvents.svelte';
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
export { default as BackendsList } from './components/backends/BackendsList.svelte';
|
|
2
2
|
export { default as BackupsList } from './components/backups/BackupsList.svelte';
|
|
3
|
-
export { default as
|
|
3
|
+
export { default as ViewStatusModal } from './components/backups/dialogs/ViewStatusModal.svelte';
|
|
4
4
|
export { default as Dashboard } from './components/dashboard/Dashboard.svelte';
|
|
5
|
+
export { default as ImmichBackupsNavButton } from './components/integrations/immich/ImmichBackupsNavButton.svelte';
|
|
5
6
|
export { default as ImmichBackupsPage } from './components/integrations/immich/ImmichBackupsPage.svelte';
|
|
7
|
+
export { default as ImmichBackupsSidebarItem } from './components/integrations/immich/ImmichBackupsSidebarItem.svelte';
|
|
6
8
|
export { default as ImmichManageBackup } from './components/integrations/immich/ImmichManageBackup.svelte';
|
|
7
9
|
export { default as ImmichOnboardingRestoreFlow } from './components/integrations/immich/ImmichOnboardingRestoreFlow.svelte';
|
|
8
10
|
export { default as ImmichOnboardingSetupFlow } from './components/integrations/immich/ImmichOnboardingSetupFlow.svelte';
|
|
9
11
|
export { default as OnboardingGate } from './components/onboarding/OnboardingGate.svelte';
|
|
12
|
+
export { default as UpsellModal } from './components/onboarding/upsell/UpsellModal.svelte';
|
|
13
|
+
export { default as UpsellPage } from './components/onboarding/upsell/UpsellPage.svelte';
|
|
10
14
|
export { default as ScheduleList } from './components/schedules/ScheduleList.svelte';
|
|
15
|
+
export { default as GlobalSettings } from './components/settings/GlobalSettings.svelte';
|
|
11
16
|
export { default as VisualisationGauge } from './components/ui/VisualisationGauge.svelte';
|
|
12
17
|
export { default as VisualisationSegmentedBar } from './components/ui/VisualisationSegmentedBar.svelte';
|
|
13
18
|
export { default as OnEvents } from './components/util/OnEvents.svelte';
|
|
@@ -23,8 +23,11 @@ export const useDeviceFlow = (uid) => createQuery(() => ({
|
|
|
23
23
|
window.open(response.verificationUri, '_blank');
|
|
24
24
|
return response;
|
|
25
25
|
},
|
|
26
|
+
gcTime: Infinity,
|
|
27
|
+
retry: 0,
|
|
26
28
|
refetchOnReconnect: false,
|
|
27
29
|
refetchOnWindowFocus: false,
|
|
30
|
+
refetchOnMount: true,
|
|
28
31
|
}), () => queryClient);
|
|
29
32
|
export const useBackendEventHandler = () => {
|
|
30
33
|
return {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ActionItem } from '@immich/ui';
|
|
2
|
-
export declare const getBackupPageActions: (repositoryId
|
|
2
|
+
export declare const getBackupPageActions: (repositoryId: string | undefined, onConfigure: () => void) => {
|
|
3
3
|
Configure: ActionItem;
|
|
4
4
|
ViewRecoveryKey: ActionItem;
|
|
5
5
|
BackUpNow: ActionItem;
|