Handle missing trackers in backup validation result

This commit is contained in:
schroda
2024-05-01 16:56:18 +02:00
parent 4f92a0130e
commit 86ec83a2ef
6 changed files with 97 additions and 38 deletions

View File

@@ -826,7 +826,8 @@
"dialog": {
"content": {
"label": {
"missing_sources": "The following sources are not installed:"
"missing_sources": "The following sources are not installed:",
"missing_trackers": "The following trackers are not logged in:"
}
},
"title": "Backup validation"

View File

@@ -1020,15 +1020,20 @@ export type UpdateTrackPayloadFieldPolicy = {
clientMutationId?: FieldPolicy<any> | FieldReadFunction<any>,
trackRecord?: FieldPolicy<any> | FieldReadFunction<any>
};
export type ValidateBackupResultKeySpecifier = ('missingSources' | ValidateBackupResultKeySpecifier)[];
export type ValidateBackupResultKeySpecifier = ('missingSources' | 'missingTrackers' | ValidateBackupResultKeySpecifier)[];
export type ValidateBackupResultFieldPolicy = {
missingSources?: FieldPolicy<any> | FieldReadFunction<any>
missingSources?: FieldPolicy<any> | FieldReadFunction<any>,
missingTrackers?: FieldPolicy<any> | FieldReadFunction<any>
};
export type ValidateBackupSourceKeySpecifier = ('id' | 'name' | ValidateBackupSourceKeySpecifier)[];
export type ValidateBackupSourceFieldPolicy = {
id?: FieldPolicy<any> | FieldReadFunction<any>,
name?: FieldPolicy<any> | FieldReadFunction<any>
};
export type ValidateBackupTrackerKeySpecifier = ('name' | ValidateBackupTrackerKeySpecifier)[];
export type ValidateBackupTrackerFieldPolicy = {
name?: FieldPolicy<any> | FieldReadFunction<any>
};
export type WebUIUpdateCheckKeySpecifier = ('channel' | 'tag' | 'updateAvailable' | WebUIUpdateCheckKeySpecifier)[];
export type WebUIUpdateCheckFieldPolicy = {
channel?: FieldPolicy<any> | FieldReadFunction<any>,
@@ -1552,6 +1557,10 @@ export type StrictTypedTypePolicies = {
keyFields?: false | ValidateBackupSourceKeySpecifier | (() => undefined | ValidateBackupSourceKeySpecifier),
fields?: ValidateBackupSourceFieldPolicy,
},
ValidateBackupTracker?: Omit<TypePolicy, "fields" | "keyFields"> & {
keyFields?: false | ValidateBackupTrackerKeySpecifier | (() => undefined | ValidateBackupTrackerKeySpecifier),
fields?: ValidateBackupTrackerFieldPolicy,
},
WebUIUpdateCheck?: Omit<TypePolicy, "fields" | "keyFields"> & {
keyFields?: false | WebUIUpdateCheckKeySpecifier | (() => undefined | WebUIUpdateCheckKeySpecifier),
fields?: WebUIUpdateCheckFieldPolicy,

View File

@@ -2523,6 +2523,7 @@ export type ValidateBackupInput = {
export type ValidateBackupResult = {
__typename?: 'ValidateBackupResult';
missingSources: Array<ValidateBackupSource>;
missingTrackers: Array<ValidateBackupTracker>;
};
export type ValidateBackupSource = {
@@ -2531,6 +2532,11 @@ export type ValidateBackupSource = {
name: Scalars['String']['output'];
};
export type ValidateBackupTracker = {
__typename?: 'ValidateBackupTracker';
name: Scalars['String']['output'];
};
export enum WebUiChannel {
Bundled = 'BUNDLED',
Preview = 'PREVIEW',
@@ -3052,7 +3058,7 @@ export type ValidateBackupQueryVariables = Exact<{
}>;
export type ValidateBackupQuery = { __typename?: 'Query', validateBackup: { __typename?: 'ValidateBackupResult', missingSources: Array<{ __typename?: 'ValidateBackupSource', id: string, name: string }> } };
export type ValidateBackupQuery = { __typename?: 'Query', validateBackup: { __typename?: 'ValidateBackupResult', missingSources: Array<{ __typename?: 'ValidateBackupSource', id: string, name: string }>, missingTrackers: Array<{ __typename?: 'ValidateBackupTracker', name: string }> } };
export type GetRestoreStatusQueryVariables = Exact<{
id: Scalars['String']['input'];

View File

@@ -15,6 +15,9 @@ export const VALIDATE_BACKUP = gql`
id
name
}
missingTrackers {
name
}
}
}
`;

View File

@@ -22,6 +22,7 @@ import DialogActions from '@mui/material/DialogActions';
import Button from '@mui/material/Button';
import ListItem from '@mui/material/ListItem';
import { Link } from 'react-router-dom';
import Stack from '@mui/material/Stack';
import { requestManager } from '@/lib/requests/RequestManager.ts';
import { makeToast } from '@/components/util/Toast';
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext';
@@ -84,7 +85,7 @@ export function Backup() {
const [currentBackupFile, setCurrentBackupFile] = useState<File | null>(null);
const [isInvalidBackupDialogOpen, setIsInvalidBackupDialogOpen] = useState(false);
const [missingSources, setMissingSources] = useState<ValidateBackupQuery['validateBackup']['missingSources']>([]);
const [validationResult, setValidationResult] = useState<ValidateBackupQuery['validateBackup']>();
const [, setTriggerReRender] = useState(0);
@@ -142,8 +143,8 @@ export function Backup() {
data: { validateBackup: validateBackupData },
} = await requestManager.validateBackupFile(file, { fetchPolicy: 'network-only' }).response;
if (validateBackupData.missingSources.length) {
setMissingSources([...validateBackupData.missingSources]);
if (validateBackupData.missingSources.length || validateBackupData.missingTrackers.length) {
setValidationResult(validateBackupData);
setIsInvalidBackupDialogOpen(true);
return false;
}
@@ -316,38 +317,77 @@ export function Backup() {
<Dialog open={isInvalidBackupDialogOpen}>
<DialogTitle>{t('settings.backup.action.validate.dialog.title')}</DialogTitle>
<DialogContent dividers>
<List
sx={{ listStyleType: 'initial', listStylePosition: 'inside' }}
subheader={t('settings.backup.action.validate.dialog.content.label.missing_sources')}
>
{missingSources.map(({ id, name }) => (
<ListItem sx={{ display: 'list-item' }} key={id}>
{`${name} (${id})`}
</ListItem>
))}
</List>
{!!validationResult?.missingSources.length && (
<List
sx={{ listStyleType: 'initial', listStylePosition: 'inside' }}
subheader={t('settings.backup.action.validate.dialog.content.label.missing_sources')}
>
{validationResult?.missingSources.map(({ id, name }) => (
<ListItem sx={{ display: 'list-item' }} key={id}>
{`${name} (${id})`}
</ListItem>
))}
</List>
)}
{!!validationResult?.missingTrackers.length && (
<List
sx={{ listStyleType: 'initial', listStylePosition: 'inside' }}
subheader={t('settings.backup.action.validate.dialog.content.label.missing_trackers')}
>
{validationResult?.missingTrackers.map(({ name }) => (
<ListItem sx={{ display: 'list-item' }} key={name}>
{`${name}`}
</ListItem>
))}
</List>
)}
</DialogContent>
<DialogActions>
<Button onClick={closeInvalidBackupDialog}>{t('global.button.cancel')}</Button>
<Button
onClick={closeInvalidBackupDialog}
component={Link}
to="/extensions"
autoFocus={!!missingSources.length}
variant={missingSources.length ? 'contained' : 'text'}
>
{t('extension.action.label.install')}
</Button>
<Button
onClick={() => {
closeInvalidBackupDialog();
restoreBackup(currentBackupFile!);
}}
autoFocus={!missingSources.length}
variant={!missingSources.length ? 'contained' : 'text'}
>
{t('global.button.restore')}
</Button>
<Stack sx={{ width: '100%' }} direction="row" justifyContent="space-between">
{!!validationResult?.missingSources.length && (
<Button
onClick={closeInvalidBackupDialog}
component={Link}
to="/extensions"
autoFocus={!!validationResult?.missingSources.length}
variant={validationResult?.missingSources.length ? 'contained' : 'text'}
>
{t('extension.action.label.install')}
</Button>
)}
{!!validationResult?.missingTrackers.length && (
<Button
onClick={closeInvalidBackupDialog}
component={Link}
to="/settings/trackingSettings"
autoFocus={!!validationResult?.missingTrackers.length}
variant={validationResult?.missingTrackers.length ? 'contained' : 'text'}
>
{t('global.button.log_in')}
</Button>
)}
<Stack direction="row">
<Button onClick={closeInvalidBackupDialog}>{t('global.button.cancel')}</Button>
<Button
onClick={() => {
closeInvalidBackupDialog();
restoreBackup(currentBackupFile!);
}}
autoFocus={
!validationResult?.missingSources.length &&
!validationResult?.missingTrackers.length
}
variant={
!validationResult?.missingSources.length &&
!validationResult?.missingTrackers.length
? 'contained'
: 'text'
}
>
{t('global.button.restore')}
</Button>
</Stack>
</Stack>
</DialogActions>
</Dialog>
</>

View File

@@ -1,7 +1,7 @@
[
{
"uiVersion": "PREVIEW",
"serverVersion": "r1514"
"serverVersion": "r1520"
},
{
"tag": "v1.0.0",