Skip to content

Commit 0f7cf2d

Browse files
committed
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.
1 parent 72f253e commit 0f7cf2d

3 files changed

Lines changed: 47 additions & 8 deletions

File tree

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysis.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ export function VariantAnalysis({
145145
<VariantAnalysisHeader
146146
variantAnalysis={variantAnalysis}
147147
repositoryStates={repoStates}
148+
filterSortState={filterSortState}
149+
selectedRepositoryIds={selectedRepositoryIds}
148150
onOpenQueryFileClick={openQueryFile}
149151
onViewQueryTextClick={openQueryText}
150152
onStopQueryClick={stopQuery}

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisActions.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export type VariantAnalysisActionsProps = {
1212
showResultActions?: boolean;
1313
onCopyRepositoryListClick: () => void;
1414
onExportResultsClick: () => void;
15+
copyRepositoryListDisabled?: boolean;
1516
exportResultsDisabled?: boolean;
1617
};
1718

@@ -32,13 +33,18 @@ export const VariantAnalysisActions = ({
3233
showResultActions,
3334
onCopyRepositoryListClick,
3435
onExportResultsClick,
36+
copyRepositoryListDisabled,
3537
exportResultsDisabled,
3638
}: VariantAnalysisActionsProps) => {
3739
return (
3840
<Container>
3941
{showResultActions && (
4042
<>
41-
<Button appearance="secondary" onClick={onCopyRepositoryListClick}>
43+
<Button
44+
appearance="secondary"
45+
onClick={onCopyRepositoryListClick}
46+
disabled={copyRepositoryListDisabled}
47+
>
4248
Copy repository list
4349
</Button>
4450
<Button

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisHeader.tsx

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,17 @@ import { VariantAnalysisActions } from "./VariantAnalysisActions";
1414
import { VariantAnalysisStats } from "./VariantAnalysisStats";
1515
import { parseDate } from "../../pure/date";
1616
import { basename } from "../common/path";
17+
import {
18+
defaultFilterSortState,
19+
filterAndSortRepositoriesWithResults,
20+
RepositoriesFilterSortState,
21+
} from "../../pure/variant-analysis-filter-sort";
1722

1823
export type VariantAnalysisHeaderProps = {
1924
variantAnalysis: VariantAnalysis;
2025
repositoryStates?: VariantAnalysisScannedRepositoryState[];
26+
filterSortState?: RepositoriesFilterSortState;
27+
selectedRepositoryIds?: number[];
2128

2229
onOpenQueryFileClick: () => void;
2330
onViewQueryTextClick: () => void;
@@ -44,6 +51,8 @@ const Row = styled.div`
4451
export const VariantAnalysisHeader = ({
4552
variantAnalysis,
4653
repositoryStates,
54+
filterSortState,
55+
selectedRepositoryIds,
4756
onOpenQueryFileClick,
4857
onViewQueryTextClick,
4958
onStopQueryClick,
@@ -66,15 +75,36 @@ export const VariantAnalysisHeader = ({
6675
const hasSkippedRepos = useMemo(() => {
6776
return getSkippedRepoCount(variantAnalysis.skippedRepos) > 0;
6877
}, [variantAnalysis.skippedRepos]);
78+
const filteredRepositories = useMemo(() => {
79+
return filterAndSortRepositoriesWithResults(variantAnalysis.scannedRepos, {
80+
...defaultFilterSortState,
81+
...filterSortState,
82+
repositoryIds: selectedRepositoryIds,
83+
});
84+
}, [filterSortState, selectedRepositoryIds, variantAnalysis.scannedRepos]);
6985
const hasDownloadedRepos = useMemo(() => {
70-
return (
71-
repositoryStates?.some(
72-
(repo) =>
73-
repo.downloadStatus ===
74-
VariantAnalysisScannedRepositoryDownloadStatus.Succeeded,
75-
) ?? false
86+
const repositoryStatesById = new Map<
87+
number,
88+
VariantAnalysisScannedRepositoryState
89+
>();
90+
if (repositoryStates) {
91+
for (const repositoryState of repositoryStates) {
92+
repositoryStatesById.set(repositoryState.repositoryId, repositoryState);
93+
}
94+
}
95+
96+
return filteredRepositories?.some((repo) => {
97+
return (
98+
repositoryStatesById.get(repo.repository.id)?.downloadStatus ===
99+
VariantAnalysisScannedRepositoryDownloadStatus.Succeeded
100+
);
101+
});
102+
}, [repositoryStates, filteredRepositories]);
103+
const hasReposWithResults = useMemo(() => {
104+
return filteredRepositories?.some(
105+
(repo) => repo.resultCount && repo.resultCount > 0,
76106
);
77-
}, [repositoryStates]);
107+
}, [filteredRepositories]);
78108

79109
return (
80110
<Container>
@@ -93,6 +123,7 @@ export const VariantAnalysisHeader = ({
93123
onExportResultsClick={onExportResultsClick}
94124
stopQueryDisabled={!variantAnalysis.actionsWorkflowRunId}
95125
exportResultsDisabled={!hasDownloadedRepos}
126+
copyRepositoryListDisabled={!hasReposWithResults}
96127
/>
97128
</Row>
98129
<VariantAnalysisStats

0 commit comments

Comments
 (0)