Handle missing trackers in backup validation result
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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'];
|
||||
|
||||
@@ -15,6 +15,9 @@ export const VALIDATE_BACKUP = gql`
|
||||
id
|
||||
name
|
||||
}
|
||||
missingTrackers {
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[
|
||||
{
|
||||
"uiVersion": "PREVIEW",
|
||||
"serverVersion": "r1514"
|
||||
"serverVersion": "r1520"
|
||||
},
|
||||
{
|
||||
"tag": "v1.0.0",
|
||||
|
||||
Reference in New Issue
Block a user