Take into account filters for action buttons

This will disable the export and copy buttons when no results would be
exported by executing the command. In contrast to the "normal" filtering
in the view, this will also take into account the checkboxes since those
are also used in the extension host.
This commit is contained in:
Koen Vlaswinkel
2022-12-01 11:19:43 +01:00
parent 72f253e39f
commit 0f7cf2d935
3 changed files with 47 additions and 8 deletions

View File

@@ -145,6 +145,8 @@ export function VariantAnalysis({
<VariantAnalysisHeader
variantAnalysis={variantAnalysis}
repositoryStates={repoStates}
filterSortState={filterSortState}
selectedRepositoryIds={selectedRepositoryIds}
onOpenQueryFileClick={openQueryFile}
onViewQueryTextClick={openQueryText}
onStopQueryClick={stopQuery}

View File

@@ -12,6 +12,7 @@ export type VariantAnalysisActionsProps = {
showResultActions?: boolean;
onCopyRepositoryListClick: () => void;
onExportResultsClick: () => void;
copyRepositoryListDisabled?: boolean;
exportResultsDisabled?: boolean;
};
@@ -32,13 +33,18 @@ export const VariantAnalysisActions = ({
showResultActions,
onCopyRepositoryListClick,
onExportResultsClick,
copyRepositoryListDisabled,
exportResultsDisabled,
}: VariantAnalysisActionsProps) => {
return (
<Container>
{showResultActions && (
<>
<Button appearance="secondary" onClick={onCopyRepositoryListClick}>
<Button
appearance="secondary"
onClick={onCopyRepositoryListClick}
disabled={copyRepositoryListDisabled}
>
Copy repository list
</Button>
<Button

View File

@@ -14,10 +14,17 @@ import { VariantAnalysisActions } from "./VariantAnalysisActions";
import { VariantAnalysisStats } from "./VariantAnalysisStats";
import { parseDate } from "../../pure/date";
import { basename } from "../common/path";
import {
defaultFilterSortState,
filterAndSortRepositoriesWithResults,
RepositoriesFilterSortState,
} from "../../pure/variant-analysis-filter-sort";
export type VariantAnalysisHeaderProps = {
variantAnalysis: VariantAnalysis;
repositoryStates?: VariantAnalysisScannedRepositoryState[];
filterSortState?: RepositoriesFilterSortState;
selectedRepositoryIds?: number[];
onOpenQueryFileClick: () => void;
onViewQueryTextClick: () => void;
@@ -44,6 +51,8 @@ const Row = styled.div`
export const VariantAnalysisHeader = ({
variantAnalysis,
repositoryStates,
filterSortState,
selectedRepositoryIds,
onOpenQueryFileClick,
onViewQueryTextClick,
onStopQueryClick,
@@ -66,15 +75,36 @@ export const VariantAnalysisHeader = ({
const hasSkippedRepos = useMemo(() => {
return getSkippedRepoCount(variantAnalysis.skippedRepos) > 0;
}, [variantAnalysis.skippedRepos]);
const filteredRepositories = useMemo(() => {
return filterAndSortRepositoriesWithResults(variantAnalysis.scannedRepos, {
...defaultFilterSortState,
...filterSortState,
repositoryIds: selectedRepositoryIds,
});
}, [filterSortState, selectedRepositoryIds, variantAnalysis.scannedRepos]);
const hasDownloadedRepos = useMemo(() => {
return (
repositoryStates?.some(
(repo) =>
repo.downloadStatus ===
VariantAnalysisScannedRepositoryDownloadStatus.Succeeded,
) ?? false
const repositoryStatesById = new Map<
number,
VariantAnalysisScannedRepositoryState
>();
if (repositoryStates) {
for (const repositoryState of repositoryStates) {
repositoryStatesById.set(repositoryState.repositoryId, repositoryState);
}
}
return filteredRepositories?.some((repo) => {
return (
repositoryStatesById.get(repo.repository.id)?.downloadStatus ===
VariantAnalysisScannedRepositoryDownloadStatus.Succeeded
);
});
}, [repositoryStates, filteredRepositories]);
const hasReposWithResults = useMemo(() => {
return filteredRepositories?.some(
(repo) => repo.resultCount && repo.resultCount > 0,
);
}, [repositoryStates]);
}, [filteredRepositories]);
return (
<Container>
@@ -93,6 +123,7 @@ export const VariantAnalysisHeader = ({
onExportResultsClick={onExportResultsClick}
stopQueryDisabled={!variantAnalysis.actionsWorkflowRunId}
exportResultsDisabled={!hasDownloadedRepos}
copyRepositoryListDisabled={!hasReposWithResults}
/>
</Row>
<VariantAnalysisStats