Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -34,37 +34,66 @@ export const Starting = Template.bind({});
Starting.args = {
variantAnalysisStatus: VariantAnalysisStatus.InProgress,
totalRepositoryCount: 10,
completedRepositoryCount: 0,
successfulRepositoryCount: 0,
skippedRepositoryCount: 0,
};

export const Started = Template.bind({});
Started.args = {
...Starting.args,
resultCount: 99_999,
completedRepositoryCount: 2,
successfulRepositoryCount: 2,
};

export const StartedWithWarnings = Template.bind({});
StartedWithWarnings.args = {
export const StartedWithSkippedRepositories = Template.bind({});
StartedWithSkippedRepositories.args = {
...Starting.args,
hasWarnings: true,
skippedRepositoryCount: 3,
};

export const StartedWithFailedAnalyses = Template.bind({});
StartedWithFailedAnalyses.args = {
...Starting.args,
completedRepositoryCount: 5,
successfulRepositoryCount: 3,
};

export const Succeeded = Template.bind({});
Succeeded.args = {
...Started.args,
totalRepositoryCount: 1000,
completedRepositoryCount: 1000,
successfulRepositoryCount: 1000,
variantAnalysisStatus: VariantAnalysisStatus.Succeeded,
createdAt: new Date(1661262726000),
completedAt: new Date(1661263446000),
};

export const SucceededWithWarnings = Template.bind({});
SucceededWithWarnings.args = {
export const SucceededWithSkippedRepositories = Template.bind({});
SucceededWithSkippedRepositories.args = {
...Succeeded.args,
totalRepositoryCount: 10,
completedRepositoryCount: 2,
hasWarnings: true,
completedRepositoryCount: 10,
successfulRepositoryCount: 10,
skippedRepositoryCount: 6,
};

export const SucceededWithFailedAnalyses = Template.bind({});
SucceededWithFailedAnalyses.args = {
...Succeeded.args,
totalRepositoryCount: 10,
completedRepositoryCount: 10,
successfulRepositoryCount: 7,
};

export const SucceededWithFailedAnalysesAndSkippedRepositories = Template.bind(
{},
);
SucceededWithFailedAnalysesAndSkippedRepositories.args = {
...SucceededWithFailedAnalyses.args,
skippedRepositoryCount: 6,
};

export const Failed = Template.bind({});
Expand All @@ -77,6 +106,7 @@ Failed.args = {

export const Stopped = Template.bind({});
Stopped.args = {
...SucceededWithWarnings.args,
...Started.args,
variantAnalysisStatus: VariantAnalysisStatus.Canceled,
completedRepositoryCount: 10,
};
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,16 @@ export function hasRepoScanCompleted(
return isCompletedAnalysisRepoStatus(repo.analysisStatus);
}

/**
* @param repo
* @returns whether the repo scan completed successfully
*/
export function isRepoScanSuccessful(
repo: VariantAnalysisScannedRepository,
): boolean {
return repo.analysisStatus === VariantAnalysisRepoStatus.Succeeded;
}

/**
* @param repo
* @returns whether the repo scan has an artifact that can be downloaded
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
getSkippedRepoCount,
getTotalResultCount,
hasRepoScanCompleted,
isRepoScanSuccessful,
VariantAnalysis,
VariantAnalysisScannedRepositoryDownloadStatus,
VariantAnalysisScannedRepositoryState,
Expand Down Expand Up @@ -69,11 +70,17 @@ export const VariantAnalysisHeader = ({
?.length ?? 0
);
}, [variantAnalysis.scannedRepos]);
const successfulRepositoryCount = useMemo(() => {
return (
variantAnalysis.scannedRepos?.filter((repo) => isRepoScanSuccessful(repo))
?.length ?? 0
);
}, [variantAnalysis.scannedRepos]);
const resultCount = useMemo(() => {
return getTotalResultCount(variantAnalysis.scannedRepos);
}, [variantAnalysis.scannedRepos]);
const hasSkippedRepos = useMemo(() => {
return getSkippedRepoCount(variantAnalysis.skippedRepos) > 0;
const skippedRepositoryCount = useMemo(() => {
return getSkippedRepoCount(variantAnalysis.skippedRepos);
}, [variantAnalysis.skippedRepos]);
const filteredRepositories = useMemo(() => {
return filterAndSortRepositoriesWithResults(variantAnalysis.scannedRepos, {
Expand Down Expand Up @@ -130,8 +137,9 @@ export const VariantAnalysisHeader = ({
variantAnalysisStatus={variantAnalysis.status}
totalRepositoryCount={totalScannedRepositoryCount}
completedRepositoryCount={completedRepositoryCount}
successfulRepositoryCount={successfulRepositoryCount}
skippedRepositoryCount={skippedRepositoryCount}
resultCount={resultCount}
hasWarnings={hasSkippedRepos}
createdAt={parseDate(variantAnalysis.createdAt)}
completedAt={parseDate(variantAnalysis.completedAt)}
onViewLogsClick={onViewLogsClick}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,43 +12,78 @@ type Props = {
variantAnalysisStatus: VariantAnalysisStatus;

totalRepositoryCount: number;
completedRepositoryCount?: number | undefined;

showWarning?: boolean;
completedRepositoryCount: number;
successfulRepositoryCount: number;
skippedRepositoryCount: number;
};

function getIcon(
variantAnalysisStatus: VariantAnalysisStatus,
completedRepositoryCount: number,
successfulRepositoryCount: number,
skippedRepositoryCount: number,
) {
if (successfulRepositoryCount < completedRepositoryCount) {
if (variantAnalysisStatus === VariantAnalysisStatus.Canceled) {
return (
<>
<HorizontalSpace size={2} />
<ErrorIcon label="Some analyses were stopped" />
</>
);
} else {
return (
<>
<HorizontalSpace size={2} />
<ErrorIcon label="Some analyses failed" />
</>
);
}
} else if (skippedRepositoryCount > 0) {
return (
<>
<HorizontalSpace size={2} />
<WarningIcon label="Some repositories were skipped" />
</>
);
} else if (variantAnalysisStatus === VariantAnalysisStatus.Succeeded) {
return (
<>
<HorizontalSpace size={2} />
<SuccessIcon label="Completed" />
</>
);
} else {
return undefined;
}
}

export const VariantAnalysisRepositoriesStats = ({
variantAnalysisStatus,
totalRepositoryCount,
completedRepositoryCount = 0,
showWarning,
completedRepositoryCount,
successfulRepositoryCount,
skippedRepositoryCount,
}: Props) => {
if (variantAnalysisStatus === VariantAnalysisStatus.Failed) {
return (
<>
0<HorizontalSpace size={2} />
<ErrorIcon />
<ErrorIcon label="Variant analysis failed" />
</>
);
}

return (
<>
{formatDecimal(completedRepositoryCount)}/
{formatDecimal(successfulRepositoryCount)}/
{formatDecimal(totalRepositoryCount)}
{showWarning && (
<>
<HorizontalSpace size={2} />
<WarningIcon />
</>
{getIcon(
variantAnalysisStatus,
completedRepositoryCount,
successfulRepositoryCount,
skippedRepositoryCount,
)}
{!showWarning &&
variantAnalysisStatus === VariantAnalysisStatus.Succeeded && (
<>
<HorizontalSpace size={2} />
<SuccessIcon label="Completed" />
</>
)}
</>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ export type VariantAnalysisStatsProps = {
variantAnalysisStatus: VariantAnalysisStatus;

totalRepositoryCount: number;
completedRepositoryCount?: number | undefined;

hasWarnings?: boolean;
completedRepositoryCount: number;
successfulRepositoryCount: number;
skippedRepositoryCount: number;

resultCount?: number | undefined;
createdAt: Date;
Expand All @@ -32,8 +32,9 @@ const Row = styled.div`
export const VariantAnalysisStats = ({
variantAnalysisStatus,
totalRepositoryCount,
completedRepositoryCount = 0,
hasWarnings,
completedRepositoryCount,
successfulRepositoryCount,
skippedRepositoryCount,
resultCount,
createdAt,
completedAt,
Expand All @@ -54,13 +55,17 @@ export const VariantAnalysisStats = ({

if (
variantAnalysisStatus === VariantAnalysisStatus.Succeeded &&
hasWarnings
successfulRepositoryCount < completedRepositoryCount
) {
return "Succeeded warnings";
return "Some analyses failed";
}

return "Succeeded";
}, [variantAnalysisStatus, hasWarnings]);
}, [
variantAnalysisStatus,
successfulRepositoryCount,
completedRepositoryCount,
]);

const duration = useMemo(() => {
if (!completedAt) {
Expand All @@ -80,7 +85,8 @@ export const VariantAnalysisStats = ({
variantAnalysisStatus={variantAnalysisStatus}
totalRepositoryCount={totalRepositoryCount}
completedRepositoryCount={completedRepositoryCount}
showWarning={hasWarnings}
successfulRepositoryCount={successfulRepositoryCount}
skippedRepositoryCount={skippedRepositoryCount}
/>
</StatItem>
<StatItem title="Duration">
Expand Down
Loading