Handle failed status in variant analysis view

This will show a message for the failure reason in the variant analysis
view when the variant analysis has failed. There don't seem to be
designs for these alerts, but we will need to do a full design review of
the view at some point anyway, so I don't think the exact text is
important.
This commit is contained in:
Koen Vlaswinkel
2022-11-08 13:22:53 +01:00
parent bbdad0afc4
commit 8e6cfa8551
3 changed files with 75 additions and 1 deletions

View File

@@ -5,6 +5,7 @@ import { ComponentMeta, ComponentStory } from '@storybook/react';
import { VariantAnalysis as VariantAnalysisComponent } from '../../view/variant-analysis/VariantAnalysis'; import { VariantAnalysis as VariantAnalysisComponent } from '../../view/variant-analysis/VariantAnalysis';
import { import {
VariantAnalysis as VariantAnalysisDomainModel, VariantAnalysis as VariantAnalysisDomainModel,
VariantAnalysisFailureReason,
VariantAnalysisRepoStatus, VariantAnalysisRepoStatus,
VariantAnalysisScannedRepositoryDownloadStatus, VariantAnalysisScannedRepositoryDownloadStatus,
VariantAnalysisScannedRepositoryResult, VariantAnalysisScannedRepositoryResult,
@@ -256,3 +257,23 @@ FullExampleWithoutSkipped.args = {
repoStates, repoStates,
repoResults, repoResults,
}; };
export const Failed = Template.bind({});
Failed.args = {
variantAnalysis: {
...variantAnalysis,
status: VariantAnalysisStatus.Failed,
failureReason: VariantAnalysisFailureReason.NoReposQueried,
completedAt: new Date(new Date(variantAnalysis.createdAt).getTime() + 100_000).toISOString(),
scannedRepos: [],
skippedRepos: {
...variantAnalysis.skippedRepos,
overLimitRepos: {
repositoryCount: 0,
repositories: [],
},
}
},
repoStates,
repoResults,
};

View File

@@ -0,0 +1,48 @@
import * as React from 'react';
import { VSCodeButton } from '@vscode/webview-ui-toolkit/react';
import { Alert } from '../common';
import { vscode } from '../vscode-api';
import { VariantAnalysisFailureReason } from '../../remote-queries/shared/variant-analysis';
type Props = {
failureReason: VariantAnalysisFailureReason;
showLogsButton: boolean;
};
const getTitle = (failureReason: VariantAnalysisFailureReason): string => {
switch (failureReason) {
case VariantAnalysisFailureReason.NoReposQueried:
return 'No repositories queried';
case VariantAnalysisFailureReason.InternalError:
return 'Internal error';
}
};
const getMessage = (failureReason: VariantAnalysisFailureReason): string => {
switch (failureReason) {
case VariantAnalysisFailureReason.NoReposQueried:
return 'No repositories were queried for this variant analysis. This may be because you do not have access to any of the requested repositories, or none of the requested repositories have CodeQL databases.';
case VariantAnalysisFailureReason.InternalError:
return 'An internal error occurred while running this variant analysis. Please try again later.';
}
};
const openLogs = () => {
vscode.postMessage({
t: 'openLogs',
});
};
export const FailureReasonAlert = ({
failureReason,
showLogsButton,
}: Props) => {
return (
<Alert
type="error"
title={getTitle(failureReason)}
message={getMessage(failureReason)}
actions={showLogsButton && <VSCodeButton appearance="secondary" onClick={openLogs}>View logs</VSCodeButton>}
/>
);
};

View File

@@ -6,13 +6,15 @@ import { formatDecimal } from '../../pure/number';
import { import {
VariantAnalysis, VariantAnalysis,
VariantAnalysisScannedRepositoryResult, VariantAnalysisScannedRepositoryResult,
VariantAnalysisScannedRepositoryState VariantAnalysisScannedRepositoryState,
VariantAnalysisStatus
} from '../../remote-queries/shared/variant-analysis'; } from '../../remote-queries/shared/variant-analysis';
import { VariantAnalysisAnalyzedRepos } from './VariantAnalysisAnalyzedRepos'; import { VariantAnalysisAnalyzedRepos } from './VariantAnalysisAnalyzedRepos';
import { Alert } from '../common'; import { Alert } from '../common';
import { VariantAnalysisSkippedRepositoriesTab } from './VariantAnalysisSkippedRepositoriesTab'; import { VariantAnalysisSkippedRepositoriesTab } from './VariantAnalysisSkippedRepositoriesTab';
import { defaultFilterSortState, RepositoriesFilterSortState } from './filterSort'; import { defaultFilterSortState, RepositoriesFilterSortState } from './filterSort';
import { RepositoriesSearchSortRow } from './RepositoriesSearchSortRow'; import { RepositoriesSearchSortRow } from './RepositoriesSearchSortRow';
import { FailureReasonAlert } from './FailureReasonAlert';
export type VariantAnalysisOutcomePanelProps = { export type VariantAnalysisOutcomePanelProps = {
variantAnalysis: VariantAnalysis; variantAnalysis: VariantAnalysis;
@@ -54,6 +56,9 @@ export const VariantAnalysisOutcomePanels = ({
const warnings = ( const warnings = (
<WarningsContainer> <WarningsContainer>
{variantAnalysis.status === VariantAnalysisStatus.Failed && variantAnalysis.failureReason && (
<FailureReasonAlert failureReason={variantAnalysis.failureReason} showLogsButton={!!variantAnalysis.actionsWorkflowRunId} />
)}
{overLimitRepositoryCount > 0 && ( {overLimitRepositoryCount > 0 && (
<Alert <Alert
type="warning" type="warning"