Extract potentially reusable functions to shared file
This commit is contained in:
@@ -96,3 +96,41 @@ export interface VariantAnalysisSubmission {
|
||||
repositoryOwners?: string[],
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param repo
|
||||
* @returns whether the repo scan is in a completed state, i.e. it cannot normally change state anymore
|
||||
*/
|
||||
export function hasRepoScanCompleted(repo: VariantAnalysisScannedRepository): boolean {
|
||||
return [
|
||||
// All states that indicates the repository has been scanned and cannot
|
||||
// change status anymore.
|
||||
VariantAnalysisRepoStatus.Succeeded, VariantAnalysisRepoStatus.Failed,
|
||||
VariantAnalysisRepoStatus.Canceled, VariantAnalysisRepoStatus.TimedOut,
|
||||
].includes(repo.analysisStatus);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param repos
|
||||
* @returns the total number of results. Will be `undefined` when there are no repos with results.
|
||||
*/
|
||||
export function getTotalResultCount(repos: VariantAnalysisScannedRepository[] | undefined): number | undefined {
|
||||
const reposWithResultCounts = repos?.filter(repo => repo.resultCount !== undefined);
|
||||
if (reposWithResultCounts === undefined || reposWithResultCounts.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return reposWithResultCounts.reduce((acc, repo) => acc + (repo.resultCount ?? 0), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param skippedRepos
|
||||
* @returns the total number of skipped repositories.
|
||||
*/
|
||||
export function getSkippedRepoCount(skippedRepos: VariantAnalysisSkippedRepositories | undefined): number {
|
||||
if (!skippedRepos) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return Object.values(skippedRepos).reduce((acc, group) => acc + group.repositoryCount, 0);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
import * as React from 'react';
|
||||
import { useMemo } from 'react';
|
||||
import styled from 'styled-components';
|
||||
import { VariantAnalysis, VariantAnalysisRepoStatus } from '../../remote-queries/shared/variant-analysis';
|
||||
import {
|
||||
getSkippedRepoCount, getTotalResultCount,
|
||||
hasRepoScanCompleted,
|
||||
VariantAnalysis,
|
||||
} from '../../remote-queries/shared/variant-analysis';
|
||||
import { QueryDetails } from './QueryDetails';
|
||||
import { VariantAnalysisActions } from './VariantAnalysisActions';
|
||||
import { VariantAnalysisStats } from './VariantAnalysisStats';
|
||||
@@ -45,31 +49,17 @@ export const VariantAnalysisHeader = ({
|
||||
onExportResultsClick,
|
||||
onViewLogsClick,
|
||||
}: VariantAnalysisHeaderProps) => {
|
||||
const totalRepositoryCount = useMemo(() => {
|
||||
const totalScannedRepositoryCount = useMemo(() => {
|
||||
return variantAnalysis.scannedRepos?.length ?? 0;
|
||||
}, [variantAnalysis.scannedRepos]);
|
||||
const completedRepositoryCount = useMemo(() => {
|
||||
return variantAnalysis.scannedRepos?.filter(repo => [
|
||||
// All states that indicates the repository has been scanned and cannot
|
||||
// change status anymore.
|
||||
VariantAnalysisRepoStatus.Succeeded, VariantAnalysisRepoStatus.Failed,
|
||||
VariantAnalysisRepoStatus.Canceled, VariantAnalysisRepoStatus.TimedOut,
|
||||
].includes(repo.analysisStatus))?.length ?? 0;
|
||||
return variantAnalysis.scannedRepos?.filter(repo => hasRepoScanCompleted(repo))?.length ?? 0;
|
||||
}, [variantAnalysis.scannedRepos]);
|
||||
const resultCount = useMemo(() => {
|
||||
const reposWithResultCounts = variantAnalysis.scannedRepos?.filter(repo => repo.resultCount !== undefined);
|
||||
if (reposWithResultCounts === undefined || reposWithResultCounts.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return reposWithResultCounts.map(repo => repo.resultCount ?? 0).reduce((a, b) => a + b, 0);
|
||||
return getTotalResultCount(variantAnalysis.scannedRepos);
|
||||
}, [variantAnalysis.scannedRepos]);
|
||||
const hasSkippedRepos = useMemo(() => {
|
||||
if (!variantAnalysis.skippedRepos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return Object.values(variantAnalysis.skippedRepos).some(skippedRepos => skippedRepos.length > 0);
|
||||
return getSkippedRepoCount(variantAnalysis.skippedRepos) > 0;
|
||||
}, [variantAnalysis.skippedRepos]);
|
||||
|
||||
return (
|
||||
@@ -90,7 +80,7 @@ export const VariantAnalysisHeader = ({
|
||||
</Row>
|
||||
<VariantAnalysisStats
|
||||
variantAnalysisStatus={variantAnalysis.status}
|
||||
totalRepositoryCount={totalRepositoryCount}
|
||||
totalRepositoryCount={totalScannedRepositoryCount}
|
||||
completedRepositoryCount={completedRepositoryCount}
|
||||
resultCount={resultCount}
|
||||
hasWarnings={hasSkippedRepos}
|
||||
|
||||
Reference in New Issue
Block a user