@futo-org/backups-orchestrator-ui 0.1.72 → 0.4.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 +7 -3
- package/dist/components/backends/BackendItem.svelte.d.ts +2 -1
- package/dist/components/backends/BackendsList.svelte +7 -6
- package/dist/components/backends/{CreateLocalBackend.svelte → dialogs/CreateLocalBackendModal.svelte} +2 -2
- package/dist/components/backends/dialogs/CreateLocalBackendModal.svelte.d.ts +7 -0
- package/dist/components/backends/{OAuthDeviceFlow.svelte → dialogs/OAuthDeviceFlowModal.svelte} +4 -4
- package/dist/components/backends/dialogs/OAuthDeviceFlowModal.svelte.d.ts +9 -0
- package/dist/components/backends/dialogs/SelectBackendModal.svelte +127 -0
- package/dist/components/backends/dialogs/SelectBackendModal.svelte.d.ts +11 -0
- package/dist/components/backups/BackupItem.svelte +13 -5
- package/dist/components/backups/dialogs/ImportRepositoryModal.svelte +16 -20
- package/dist/components/backups/dialogs/ReconfigureRepositoryBackendModal.svelte +40 -0
- package/dist/components/backups/dialogs/ReconfigureRepositoryBackendModal.svelte.d.ts +8 -0
- package/dist/components/backups/dialogs/RestoreSnapshotModal.svelte +1 -2
- package/dist/components/backups/dialogs/SelectRepositoryModal.svelte +101 -0
- package/dist/components/backups/dialogs/SelectRepositoryModal.svelte.d.ts +12 -0
- package/dist/components/backups/snapshots-list/RepositorySnapshotsListItem.svelte +2 -1
- package/dist/components/dashboard/DashboardTotalStored.svelte +12 -6
- package/dist/components/integrations/immich/ImmichConfigureBackup.svelte +2 -1
- package/dist/components/integrations/immich/ImmichManageBackupOverview.svelte +5 -1
- package/dist/components/integrations/immich/ImmichOnboardingRestoreFlow.svelte +44 -34
- package/dist/components/integrations/immich/ImmichOnboardingSetupFlow.svelte +72 -54
- package/dist/components/onboarding/OnboardingBootstrapError.svelte +49 -0
- package/dist/components/onboarding/OnboardingBootstrapError.svelte.d.ts +7 -0
- package/dist/components/onboarding/OnboardingGate.svelte +20 -17
- package/dist/components/onboarding/SampleOnboarding.svelte +22 -6
- package/dist/components/onboarding/restore-point-flow/RestorePointFlow.svelte +13 -68
- package/dist/components/onboarding/stages/OnboardingStageTelemetry.svelte +60 -0
- package/dist/components/onboarding/stages/OnboardingStageTelemetry.svelte.d.ts +7 -0
- package/dist/components/schedules/dialogs/ConfigureScheduleModal.svelte +5 -2
- package/dist/components/schedules/dialogs/CreateScheduleModal.svelte +5 -2
- package/dist/components/ui/StackListItem.svelte +4 -1
- package/dist/components/ui/StackListItem.svelte.d.ts +1 -0
- package/dist/fetch-client.d.ts +22 -1
- package/dist/fetch-client.js +23 -2
- package/dist/services/backend.service.d.ts +8 -2
- package/dist/services/backend.service.js +33 -5
- package/dist/services/integrations.service.js +0 -4
- package/dist/services/onboarding.service.d.ts +2 -0
- package/dist/services/onboarding.service.js +9 -1
- package/dist/services/repository.service.d.ts +11 -4
- package/dist/services/repository.service.js +16 -24
- package/dist/services/schedule.service.js +0 -2
- package/package.json +6 -4
- package/dist/components/backends/CreateLocalBackend.svelte.d.ts +0 -7
- package/dist/components/backends/OAuthDeviceFlow.svelte.d.ts +0 -9
package/dist/fetch-client.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export type BackendType = "yucca" | "local" | "s3";
|
|
|
17
17
|
export type BackendDto = {
|
|
18
18
|
id: string;
|
|
19
19
|
"type": BackendType;
|
|
20
|
+
description: string;
|
|
20
21
|
isOnline: boolean;
|
|
21
22
|
error?: string;
|
|
22
23
|
};
|
|
@@ -81,7 +82,12 @@ export type ConfigureImmichIntegrationRequestDto = {
|
|
|
81
82
|
libraries: "all" | string[];
|
|
82
83
|
retentionPolicy?: (RetentionPolicyDto) | null;
|
|
83
84
|
};
|
|
85
|
+
export type BootstrapStatus = "not-ready" | "ready" | "error";
|
|
86
|
+
export type TelemetryLevel = "full" | "none";
|
|
84
87
|
export type OnboardingStatusResponseDto = {
|
|
88
|
+
status: BootstrapStatus;
|
|
89
|
+
error?: string;
|
|
90
|
+
hasTelemetry: TelemetryLevel;
|
|
85
91
|
hasOnboardedKey: boolean;
|
|
86
92
|
hasBackend: boolean;
|
|
87
93
|
hasBackup: boolean;
|
|
@@ -105,6 +111,11 @@ export type RepositoryMetricsDto = {
|
|
|
105
111
|
lastBackupDuration?: number;
|
|
106
112
|
sizeBytes: number;
|
|
107
113
|
};
|
|
114
|
+
export type RepositoryMeterDto = {
|
|
115
|
+
sizeBytes: number;
|
|
116
|
+
objectCount: number;
|
|
117
|
+
lastUpdated?: string;
|
|
118
|
+
};
|
|
108
119
|
export type RepositoryBackendDto = {
|
|
109
120
|
id: string;
|
|
110
121
|
"type": BackendType;
|
|
@@ -123,6 +134,7 @@ export type LocalRepositoryDto = {
|
|
|
123
134
|
worm: boolean;
|
|
124
135
|
name: string;
|
|
125
136
|
metrics: RepositoryMetricsDto;
|
|
137
|
+
meter?: RepositoryMeterDto;
|
|
126
138
|
backends?: RepositoryBackendsDto;
|
|
127
139
|
configuration?: RepositoryConfigurationDto;
|
|
128
140
|
};
|
|
@@ -151,6 +163,7 @@ export type InspectedLocalRepositoryDto = {
|
|
|
151
163
|
worm: boolean;
|
|
152
164
|
name: string;
|
|
153
165
|
metrics: RepositoryMetricsDto;
|
|
166
|
+
meter?: RepositoryMeterDto;
|
|
154
167
|
backends?: RepositoryBackendsDto;
|
|
155
168
|
configuration?: RepositoryConfigurationDto;
|
|
156
169
|
snapshots: SnapshotDto[];
|
|
@@ -172,6 +185,9 @@ export type LogResponseDto = {
|
|
|
172
185
|
export type RepositoryCheckImportResponseDto = {
|
|
173
186
|
readable: boolean;
|
|
174
187
|
};
|
|
188
|
+
export type RepositoryPrimaryBackendReconfigureRequestDto = {
|
|
189
|
+
backendId: string;
|
|
190
|
+
};
|
|
175
191
|
export type RunStatus = "incomplete" | "complete" | "failed";
|
|
176
192
|
export type RunType = "schedule" | "restore" | "backup" | "forget";
|
|
177
193
|
export type RunDto = {
|
|
@@ -258,11 +274,15 @@ export declare function currentRecoveryKey(opts?: Oazapfts.RequestOpts): Promise
|
|
|
258
274
|
export declare function importRecoveryKey(importRecoveryKeyRequest: ImportRecoveryKeyRequest, opts?: Oazapfts.RequestOpts): Promise<never>;
|
|
259
275
|
export declare function confirmRecoveryKey(opts?: Oazapfts.RequestOpts): Promise<never>;
|
|
260
276
|
export declare function skipOnboardingExtraConfig(opts?: Oazapfts.RequestOpts): Promise<never>;
|
|
277
|
+
export declare function enableTelemetry(opts?: Oazapfts.RequestOpts): Promise<never>;
|
|
278
|
+
export declare function reportError(opts?: Oazapfts.RequestOpts): Promise<never>;
|
|
261
279
|
export declare function createRepository(repositoryCreateRequestDto: RepositoryCreateRequestDto, { backend }?: {
|
|
262
280
|
backend?: string;
|
|
263
281
|
}, opts?: Oazapfts.RequestOpts): Promise<RepositoryCreateResponseDto>;
|
|
264
282
|
export declare function getRepositories(opts?: Oazapfts.RequestOpts): Promise<RepositoryListResponseDto>;
|
|
265
|
-
export declare function inspectRepositories(
|
|
283
|
+
export declare function inspectRepositories({ backend }?: {
|
|
284
|
+
backend?: string;
|
|
285
|
+
}, opts?: Oazapfts.RequestOpts): Promise<RepositoryInspectResponseDto>;
|
|
266
286
|
export declare function updateRepository(id: string, repositoryUpdateRequestDto: RepositoryUpdateRequestDto, { backend }?: {
|
|
267
287
|
backend?: string;
|
|
268
288
|
}, opts?: Oazapfts.RequestOpts): Promise<RepositoryUpdateResponseDto>;
|
|
@@ -270,6 +290,7 @@ export declare function deleteRepository(id: string, opts?: Oazapfts.RequestOpts
|
|
|
270
290
|
export declare function createBackup(id: string, opts?: Oazapfts.RequestOpts): Promise<LogResponseDto>;
|
|
271
291
|
export declare function checkImportRepository(id: string, backend: string, opts?: Oazapfts.RequestOpts): Promise<RepositoryCheckImportResponseDto>;
|
|
272
292
|
export declare function importRepository(id: string, backend: string, opts?: Oazapfts.RequestOpts): Promise<RepositoryCreateResponseDto>;
|
|
293
|
+
export declare function reconfigureRepositoryPrimaryBackend(id: string, repositoryPrimaryBackendReconfigureRequestDto: RepositoryPrimaryBackendReconfigureRequestDto, opts?: Oazapfts.RequestOpts): Promise<RepositoryCreateResponseDto>;
|
|
273
294
|
export declare function getRunHistory(id: string, opts?: Oazapfts.RequestOpts): Promise<RunHistoryResponseDto>;
|
|
274
295
|
export declare function getSnapshots(id: string, opts?: Oazapfts.RequestOpts): Promise<ListSnapshotsResponseDto>;
|
|
275
296
|
export declare function pruneRepository(id: string, opts?: Oazapfts.RequestOpts): Promise<LogResponseDto>;
|
package/dist/fetch-client.js
CHANGED
|
@@ -85,6 +85,18 @@ export function skipOnboardingExtraConfig(opts) {
|
|
|
85
85
|
method: "POST"
|
|
86
86
|
}));
|
|
87
87
|
}
|
|
88
|
+
export function enableTelemetry(opts) {
|
|
89
|
+
return oazapfts.ok(oazapfts.fetchText("/api/yucca/onboarding/telemetry", {
|
|
90
|
+
...opts,
|
|
91
|
+
method: "POST"
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
export function reportError(opts) {
|
|
95
|
+
return oazapfts.ok(oazapfts.fetchText("/api/yucca/onboarding/report-error", {
|
|
96
|
+
...opts,
|
|
97
|
+
method: "POST"
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
88
100
|
export function createRepository(repositoryCreateRequestDto, { backend } = {}, opts) {
|
|
89
101
|
return oazapfts.ok(oazapfts.fetchJson(`/api/yucca/repository${QS.query(QS.explode({
|
|
90
102
|
backend
|
|
@@ -99,8 +111,10 @@ export function getRepositories(opts) {
|
|
|
99
111
|
...opts
|
|
100
112
|
}));
|
|
101
113
|
}
|
|
102
|
-
export function inspectRepositories(opts) {
|
|
103
|
-
return oazapfts.ok(oazapfts.fetchJson(
|
|
114
|
+
export function inspectRepositories({ backend } = {}, opts) {
|
|
115
|
+
return oazapfts.ok(oazapfts.fetchJson(`/api/yucca/repository/inspect${QS.query(QS.explode({
|
|
116
|
+
backend
|
|
117
|
+
}))}`, {
|
|
104
118
|
...opts
|
|
105
119
|
}));
|
|
106
120
|
}
|
|
@@ -140,6 +154,13 @@ export function importRepository(id, backend, opts) {
|
|
|
140
154
|
method: "POST"
|
|
141
155
|
}));
|
|
142
156
|
}
|
|
157
|
+
export function reconfigureRepositoryPrimaryBackend(id, repositoryPrimaryBackendReconfigureRequestDto, opts) {
|
|
158
|
+
return oazapfts.ok(oazapfts.fetchJson(`/api/yucca/repository/${encodeURIComponent(id)}/backend`, oazapfts.json({
|
|
159
|
+
...opts,
|
|
160
|
+
method: "PUT",
|
|
161
|
+
body: repositoryPrimaryBackendReconfigureRequestDto
|
|
162
|
+
})));
|
|
163
|
+
}
|
|
143
164
|
export function getRunHistory(id, opts) {
|
|
144
165
|
return oazapfts.ok(oazapfts.fetchJson(`/api/yucca/repository/${encodeURIComponent(id)}/runs`, {
|
|
145
166
|
...opts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SocketEvent } from '../events';
|
|
2
|
-
import { type BackendDto, type CreateLocalBackendRequestDto } from '../fetch-client';
|
|
2
|
+
import { type BackendDto, type CreateLocalBackendRequestDto, type LocalRepositoryDto, type RepositoryBackendDto } from '../fetch-client';
|
|
3
3
|
import { type ActionItem } from '@immich/ui';
|
|
4
4
|
export declare const backendKeys: {
|
|
5
5
|
all: readonly ["backends"];
|
|
@@ -13,6 +13,12 @@ export declare const useBackendEventHandler: () => {
|
|
|
13
13
|
export declare const handleYuccaLogin: (onCreate?: (backendId: string) => void) => Promise<void>;
|
|
14
14
|
export declare const handleSetupLocalStorage: (onCreate?: (backendId: string) => void) => void;
|
|
15
15
|
export declare const useCreateLocalBackend: () => import("@tanstack/svelte-query").CreateMutationResult<import("../fetch-client").BackendResponseDto, Error, CreateLocalBackendRequestDto, unknown>;
|
|
16
|
-
export declare const
|
|
16
|
+
export declare const handleReconfigureRepositoryBackend: (repository: LocalRepositoryDto) => Promise<void>;
|
|
17
|
+
export declare const handleRemoveRepositoryBackend: (_backend: BackendDto, _repositoryBackend: RepositoryBackendDto) => void;
|
|
18
|
+
export declare const getBackendActions: (repository: LocalRepositoryDto | undefined, backend: BackendDto, repositoryBackend?: RepositoryBackendDto & {
|
|
19
|
+
primary?: boolean;
|
|
20
|
+
}) => {
|
|
17
21
|
LoginAgain: ActionItem;
|
|
22
|
+
Reconfigure: ActionItem;
|
|
23
|
+
Remove: ActionItem;
|
|
18
24
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import CreateLocalBackend from '../components/backends/
|
|
2
|
-
import OAuthDeviceFlow from '../components/backends/
|
|
1
|
+
import CreateLocalBackend from '../components/backends/dialogs/CreateLocalBackendModal.svelte';
|
|
2
|
+
import OAuthDeviceFlow from '../components/backends/dialogs/OAuthDeviceFlowModal.svelte';
|
|
3
|
+
import ReconfigureRepositoryBackendModal from '../components/backups/dialogs/ReconfigureRepositoryBackendModal.svelte';
|
|
3
4
|
import { SocketEvent } from '../events';
|
|
4
5
|
import { createLocalBackend, getBackends, oidcDeviceFlow, } from '../fetch-client';
|
|
5
6
|
import { queryClient } from '../query-client';
|
|
@@ -47,15 +48,42 @@ export const handleSetupLocalStorage = (onCreate) => {
|
|
|
47
48
|
};
|
|
48
49
|
export const useCreateLocalBackend = () => createMutation(() => ({
|
|
49
50
|
mutationFn: (dto) => createLocalBackend(dto),
|
|
50
|
-
onSuccess: () => void queryClient.invalidateQueries({ queryKey: backendKeys.all }),
|
|
51
51
|
onError: (error) => handleError(error, 'Failed to create local backend'),
|
|
52
52
|
}), () => queryClient);
|
|
53
|
-
export const
|
|
53
|
+
export const handleReconfigureRepositoryBackend = async (repository) => {
|
|
54
|
+
await modalManager.show(ReconfigureRepositoryBackendModal, {
|
|
55
|
+
repository,
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
export const handleRemoveRepositoryBackend = (_backend, _repositoryBackend) => {
|
|
59
|
+
alert('TODO: implement me when multi-repository-backend support is added');
|
|
60
|
+
};
|
|
61
|
+
export const getBackendActions = (repository, backend, repositoryBackend) => {
|
|
54
62
|
const LoginAgain = {
|
|
55
63
|
icon: mdiLogin,
|
|
56
64
|
title: 'Login again',
|
|
57
65
|
onAction: () => void handleYuccaLogin(),
|
|
58
66
|
$if: () => backend.type === 'yucca' && !backend.isOnline,
|
|
59
67
|
};
|
|
60
|
-
|
|
68
|
+
const Reconfigure = {
|
|
69
|
+
icon: mdiLogin,
|
|
70
|
+
title: 'Reconfigure',
|
|
71
|
+
onAction: () => void handleReconfigureRepositoryBackend(repository),
|
|
72
|
+
$if: () => repositoryBackend
|
|
73
|
+
? backend.isOnline &&
|
|
74
|
+
!repositoryBackend.online &&
|
|
75
|
+
repositoryBackend.primary === true
|
|
76
|
+
: false,
|
|
77
|
+
};
|
|
78
|
+
const Remove = {
|
|
79
|
+
icon: mdiLogin,
|
|
80
|
+
title: 'Remove',
|
|
81
|
+
onAction: () => void handleRemoveRepositoryBackend(backend, repositoryBackend),
|
|
82
|
+
$if: () => repositoryBackend
|
|
83
|
+
? backend.isOnline &&
|
|
84
|
+
!repositoryBackend.online &&
|
|
85
|
+
repositoryBackend.primary === false
|
|
86
|
+
: false,
|
|
87
|
+
};
|
|
88
|
+
return { LoginAgain, Reconfigure, Remove };
|
|
61
89
|
};
|
|
@@ -17,7 +17,6 @@ export const useIntegrationEventHandler = () => ({
|
|
|
17
17
|
});
|
|
18
18
|
export const useConfigureImmichIntegration = () => createMutation(() => ({
|
|
19
19
|
mutationFn: (dto) => configureImmichIntegration(dto),
|
|
20
|
-
onSuccess: () => void queryClient.invalidateQueries({ queryKey: integrationsKeys.all }),
|
|
21
20
|
onError: (error) => handleError(error, 'Failed to save backup settings'),
|
|
22
21
|
}), () => queryClient);
|
|
23
22
|
export const useConfigureImmichDefaults = () => createMutation(() => ({
|
|
@@ -35,8 +34,5 @@ export const useConfigureImmichDefaults = () => createMutation(() => ({
|
|
|
35
34
|
libraries: 'all',
|
|
36
35
|
});
|
|
37
36
|
},
|
|
38
|
-
onSuccess: () => {
|
|
39
|
-
void queryClient.invalidateQueries({ queryKey: integrationsKeys.all });
|
|
40
|
-
},
|
|
41
37
|
onError: (error) => handleError(error, 'Failed to create backup'),
|
|
42
38
|
}), () => queryClient);
|
|
@@ -9,3 +9,5 @@ export declare const handleCurrentRecoveryKey: () => Promise<sdk.CurrentRecovery
|
|
|
9
9
|
export declare const handleConfirmRecoveryKey: () => Promise<void>;
|
|
10
10
|
export declare const handleImportRecoveryKey: (dto: ImportRecoveryKeyRequest) => Promise<void>;
|
|
11
11
|
export declare const handleSkipOnboardingExtraConfig: () => Promise<void>;
|
|
12
|
+
export declare const useEnableTelemetry: () => import("@tanstack/svelte-query").CreateMutationResult<never, Error, void, unknown>;
|
|
13
|
+
export declare const useReportError: () => import("@tanstack/svelte-query").CreateMutationResult<never, Error, void, unknown>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { sdk } from '..';
|
|
2
2
|
import { queryClient } from '../query-client';
|
|
3
3
|
import { handleError } from '../utils/handle-error';
|
|
4
|
-
import { createQuery } from '@tanstack/svelte-query';
|
|
4
|
+
import { createMutation, createQuery } from '@tanstack/svelte-query';
|
|
5
5
|
export const recoveryKeyKeys = {
|
|
6
6
|
all: ['recovery-key'],
|
|
7
7
|
};
|
|
@@ -54,3 +54,11 @@ export const handleSkipOnboardingExtraConfig = async () => {
|
|
|
54
54
|
throw error;
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
|
+
export const useEnableTelemetry = () => createMutation(() => ({
|
|
58
|
+
mutationFn: () => sdk.enableTelemetry(),
|
|
59
|
+
onError: (error) => handleError(error, 'Failed to save preferences'),
|
|
60
|
+
}), () => queryClient);
|
|
61
|
+
export const useReportError = () => createMutation(() => ({
|
|
62
|
+
mutationFn: () => sdk.reportError(),
|
|
63
|
+
onError: (error) => handleError(error, 'Failed to report error'),
|
|
64
|
+
}), () => queryClient);
|
|
@@ -4,10 +4,11 @@ import { type InspectedLocalRepositoryDto, type LocalRepositoryDto, type Reposit
|
|
|
4
4
|
import { type ActionItem } from '@immich/ui';
|
|
5
5
|
export declare const repositoryKeys: {
|
|
6
6
|
all: readonly ["repositories"];
|
|
7
|
-
|
|
7
|
+
inspect: (backendId?: string) => readonly ["repositories", "inspect", string | undefined];
|
|
8
|
+
checkImport: (id: string, backendId: string) => readonly ["repositories", string, "check-import", string];
|
|
8
9
|
};
|
|
9
10
|
export declare const useRepositories: (initialData?: LocalRepositoryDto[]) => import("@tanstack/svelte-query").CreateQueryResult<sdk.LocalRepositoryDto[], Error>;
|
|
10
|
-
export declare const useInspectRepositories: (initialData?: InspectedLocalRepositoryDto[]) => import("@tanstack/svelte-query").CreateQueryResult<sdk.InspectedLocalRepositoryDto[], Error>;
|
|
11
|
+
export declare const useInspectRepositories: (backendId?: string, initialData?: InspectedLocalRepositoryDto[]) => import("@tanstack/svelte-query").CreateQueryResult<sdk.InspectedLocalRepositoryDto[], Error>;
|
|
11
12
|
export declare const useRepositoryEventHandler: () => {
|
|
12
13
|
onRepositoryCreate(event: SocketEvent<{
|
|
13
14
|
repository: LocalRepositoryDto;
|
|
@@ -16,9 +17,11 @@ export declare const useRepositoryEventHandler: () => {
|
|
|
16
17
|
repositoryId: string;
|
|
17
18
|
repository: Partial<LocalRepositoryDto>;
|
|
18
19
|
}>): void;
|
|
19
|
-
onRepositoryDelete(
|
|
20
|
+
onRepositoryDelete(event: SocketEvent<{
|
|
21
|
+
repositoryId: string;
|
|
22
|
+
}>): void;
|
|
20
23
|
};
|
|
21
|
-
export declare const
|
|
24
|
+
export declare const useCheckImportRepository: (id: string, backendId: string) => import("@tanstack/svelte-query").CreateQueryResult<sdk.RepositoryCheckImportResponseDto, Error>;
|
|
22
25
|
export declare const useCreateRepository: () => import("@tanstack/svelte-query").CreateMutationResult<sdk.RepositoryCreateResponseDto, Error, sdk.RepositoryCreateRequestDto, unknown>;
|
|
23
26
|
export declare const useImportRepository: () => import("@tanstack/svelte-query").CreateMutationResult<sdk.RepositoryCreateResponseDto, Error, {
|
|
24
27
|
id: string;
|
|
@@ -29,6 +32,10 @@ export declare const useUpdateRepository: () => import("@tanstack/svelte-query")
|
|
|
29
32
|
dto: RepositoryUpdateRequestDto;
|
|
30
33
|
local?: boolean;
|
|
31
34
|
}, unknown>;
|
|
35
|
+
export declare const useReconfigureRepositoryPrimaryBackend: () => import("@tanstack/svelte-query").CreateMutationResult<sdk.RepositoryCreateResponseDto, Error, {
|
|
36
|
+
id: string;
|
|
37
|
+
backendId: string;
|
|
38
|
+
}, unknown>;
|
|
32
39
|
export declare const useRemoveRepository: () => import("@tanstack/svelte-query").CreateMutationResult<never, Error, {
|
|
33
40
|
id: string;
|
|
34
41
|
local?: boolean;
|
|
@@ -6,7 +6,7 @@ import MetricsHistoryModal from '../components/backups/metrics-history/MetricsHi
|
|
|
6
6
|
import RunHistoryModal from '../components/backups/run-history/RunHistoryModal.svelte';
|
|
7
7
|
import SnapshotsListModal from '../components/backups/snapshots-list/SnapshotsListModal.svelte';
|
|
8
8
|
import { SocketEvent } from '../events';
|
|
9
|
-
import { deleteRepository, inspectRepositories, updateRepository, } from '../fetch-client';
|
|
9
|
+
import { deleteRepository, inspectRepositories, reconfigureRepositoryPrimaryBackend, updateRepository, } from '../fetch-client';
|
|
10
10
|
import { getProvider } from '../providers';
|
|
11
11
|
import { queryClient } from '../query-client';
|
|
12
12
|
import { handleError } from '../utils/handle-error';
|
|
@@ -15,7 +15,8 @@ import { mdiCog, mdiFormatListBulletedType, mdiHistory, mdiImport, mdiListStatus
|
|
|
15
15
|
import { createMutation, createQuery } from '@tanstack/svelte-query';
|
|
16
16
|
export const repositoryKeys = {
|
|
17
17
|
all: ['repositories'],
|
|
18
|
-
|
|
18
|
+
inspect: (backendId) => ['repositories', 'inspect', backendId],
|
|
19
|
+
checkImport: (id, backendId) => ['repositories', id, 'check-import', backendId],
|
|
19
20
|
};
|
|
20
21
|
export const useRepositories = (initialData) => createQuery(() => ({
|
|
21
22
|
queryKey: repositoryKeys.all,
|
|
@@ -24,9 +25,9 @@ export const useRepositories = (initialData) => createQuery(() => ({
|
|
|
24
25
|
.then(({ repositories }) => repositories),
|
|
25
26
|
initialData,
|
|
26
27
|
}), () => queryClient);
|
|
27
|
-
export const useInspectRepositories = (initialData) => createQuery(() => ({
|
|
28
|
-
queryKey: repositoryKeys.
|
|
29
|
-
queryFn: () => inspectRepositories().then(({ repositories }) => repositories),
|
|
28
|
+
export const useInspectRepositories = (backendId, initialData) => createQuery(() => ({
|
|
29
|
+
queryKey: repositoryKeys.inspect(backendId),
|
|
30
|
+
queryFn: () => inspectRepositories({ backend: backendId }).then(({ repositories }) => repositories),
|
|
30
31
|
initialData,
|
|
31
32
|
}), () => queryClient);
|
|
32
33
|
export const useRepositoryEventHandler = () => {
|
|
@@ -50,42 +51,33 @@ export const useRepositoryEventHandler = () => {
|
|
|
50
51
|
: void 0;
|
|
51
52
|
});
|
|
52
53
|
},
|
|
53
|
-
onRepositoryDelete() {
|
|
54
|
-
queryClient
|
|
55
|
-
.invalidateQueries({
|
|
56
|
-
queryKey: repositoryKeys.all,
|
|
57
|
-
})
|
|
58
|
-
.catch(() => void 0);
|
|
54
|
+
onRepositoryDelete(event) {
|
|
55
|
+
queryClient.setQueryData(repositoryKeys.all, (data) => data?.filter((entry) => entry.id !== event.data.repositoryId));
|
|
59
56
|
},
|
|
60
57
|
};
|
|
61
58
|
};
|
|
62
|
-
export const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
catch (error) {
|
|
67
|
-
handleError(error, 'Failed to check repository');
|
|
68
|
-
throw error;
|
|
69
|
-
}
|
|
70
|
-
};
|
|
59
|
+
export const useCheckImportRepository = (id, backendId) => createQuery(() => ({
|
|
60
|
+
queryKey: repositoryKeys.checkImport(id, backendId),
|
|
61
|
+
queryFn: () => sdk.checkImportRepository(id, backendId),
|
|
62
|
+
}), () => queryClient);
|
|
71
63
|
export const useCreateRepository = () => createMutation(() => ({
|
|
72
64
|
mutationFn: (dto) => sdk.createRepository(dto),
|
|
73
|
-
onSuccess: () => void queryClient.invalidateQueries({ queryKey: repositoryKeys.all }),
|
|
74
65
|
onError: (error) => handleError(error, 'Failed to create repository'),
|
|
75
66
|
}), () => queryClient);
|
|
76
67
|
export const useImportRepository = () => createMutation(() => ({
|
|
77
68
|
mutationFn: ({ id, backendId }) => sdk.importRepository(id, backendId),
|
|
78
|
-
onSuccess: () => void queryClient.invalidateQueries({ queryKey: repositoryKeys.all }),
|
|
79
69
|
onError: (error) => handleError(error, 'Failed to import repository'),
|
|
80
70
|
}), () => queryClient);
|
|
81
71
|
export const useUpdateRepository = () => createMutation(() => ({
|
|
82
72
|
mutationFn: ({ id, dto, local = false, }) => (local ? sdk.updateRepository(id, dto) : updateRepository(id, dto)),
|
|
83
|
-
onSuccess: () => void queryClient.invalidateQueries({ queryKey: repositoryKeys.all }),
|
|
84
73
|
onError: (error) => handleError(error, 'Failed to update repository'),
|
|
85
74
|
}), () => queryClient);
|
|
75
|
+
export const useReconfigureRepositoryPrimaryBackend = () => createMutation(() => ({
|
|
76
|
+
mutationFn: ({ id, backendId }) => reconfigureRepositoryPrimaryBackend(id, { backendId }),
|
|
77
|
+
onError: (error) => handleError(error, 'Failed to reconfigure backend'),
|
|
78
|
+
}), () => queryClient);
|
|
86
79
|
export const useRemoveRepository = () => createMutation(() => ({
|
|
87
80
|
mutationFn: ({ id, local = false }) => local ? sdk.deleteRepository(id) : deleteRepository(id),
|
|
88
|
-
onSuccess: () => void queryClient.invalidateQueries({ queryKey: repositoryKeys.all }),
|
|
89
81
|
onError: (error) => handleError(error, 'Failed to delete repository'),
|
|
90
82
|
}), () => queryClient);
|
|
91
83
|
export const handleCreateBackup = async (id) => {
|
|
@@ -50,12 +50,10 @@ export const handleGetSchedules = async () => {
|
|
|
50
50
|
};
|
|
51
51
|
export const useCreateSchedule = () => createMutation(() => ({
|
|
52
52
|
mutationFn: (dto) => sdk.createSchedule(dto),
|
|
53
|
-
onSuccess: () => void queryClient.invalidateQueries({ queryKey: scheduleKeys.all }),
|
|
54
53
|
onError: (error) => handleError(error, 'Failed to create schedule'),
|
|
55
54
|
}), () => queryClient);
|
|
56
55
|
export const useUpdateSchedule = () => createMutation(() => ({
|
|
57
56
|
mutationFn: ({ id, dto, }) => sdk.updateSchedule(id, dto),
|
|
58
|
-
onSuccess: () => void queryClient.invalidateQueries({ queryKey: scheduleKeys.all }),
|
|
59
57
|
onError: (error) => handleError(error, 'Failed to update schedule'),
|
|
60
58
|
}), () => queryClient);
|
|
61
59
|
export const handlePauseSchedule = async (id, name) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futo-org/backups-orchestrator-ui",
|
|
3
|
-
"
|
|
3
|
+
"repository": "https://github.com/immich-app/yucca",
|
|
4
|
+
"description": "Backups orchestrator (UI library)",
|
|
5
|
+
"version": "0.4.0",
|
|
4
6
|
"license": "Source First License 1.1",
|
|
5
7
|
"files": [
|
|
6
8
|
"dist",
|
|
@@ -27,7 +29,7 @@
|
|
|
27
29
|
"svelte": "^5.0.0"
|
|
28
30
|
},
|
|
29
31
|
"devDependencies": {
|
|
30
|
-
"@playwright/test": "
|
|
32
|
+
"@playwright/test": "1.59.1",
|
|
31
33
|
"@sveltejs/adapter-auto": "^7.0.0",
|
|
32
34
|
"@sveltejs/kit": "^2.50.1",
|
|
33
35
|
"@sveltejs/package": "^2.5.7",
|
|
@@ -38,7 +40,7 @@
|
|
|
38
40
|
"@types/luxon": "^3.7.1",
|
|
39
41
|
"@vitest/browser-playwright": "^4.0.18",
|
|
40
42
|
"oazapfts": "^7.0.1",
|
|
41
|
-
"playwright": "
|
|
43
|
+
"playwright": "1.59.1",
|
|
42
44
|
"prettier-plugin-tailwindcss": "^0.7.2",
|
|
43
45
|
"publint": "^0.3.17",
|
|
44
46
|
"svelte": "^5.48.2",
|
|
@@ -62,7 +64,7 @@
|
|
|
62
64
|
"lodash.debounce": "^4.0.8",
|
|
63
65
|
"luxon": "^3.7.2",
|
|
64
66
|
"socket.io-client": "^4.8.3",
|
|
65
|
-
"@futo-org/backups-api-client": "^0.
|
|
67
|
+
"@futo-org/backups-api-client": "^0.4.0"
|
|
66
68
|
},
|
|
67
69
|
"scripts": {
|
|
68
70
|
"dev": "vite dev --port 5174",
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
type Props = {
|
|
2
|
-
userCode: string;
|
|
3
|
-
verificationUri: string;
|
|
4
|
-
onCreate?: (backendId: string) => void;
|
|
5
|
-
onClose: () => void;
|
|
6
|
-
};
|
|
7
|
-
declare const OAuthDeviceFlow: import("svelte").Component<Props, {}, "">;
|
|
8
|
-
type OAuthDeviceFlow = ReturnType<typeof OAuthDeviceFlow>;
|
|
9
|
-
export default OAuthDeviceFlow;
|