From c442ff559900250ac7109796ea4ddec107464cf2 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 27 Sep 2022 12:26:33 +0100 Subject: [PATCH 1/6] Implement skipped repositories tabs --- .../remote-queries/shared/variant-analysis.ts | 11 +- .../VariantAnalysisSkippedRepositoriesTab.tsx | 102 +++++++++++++++++ .../VariantAnalysisSkippedRepositoryRow.tsx | 45 ++++++++ .../view/variant-analysis/VariantAnalysis.tsx | 14 ++- .../VariantAnalysisNoCodeqlDbRepos.tsx | 5 - .../VariantAnalysisNotFoundRepos.tsx | 5 - .../VariantAnalysisOutcomePanels.tsx | 31 +++-- .../VariantAnalysisSkippedRepositoriesTab.tsx | 71 ++++++++++++ .../VariantAnalysisSkippedRepositoryRow.tsx | 48 ++++++++ ...antAnalysisSkippedRepositoriesTab.spec.tsx | 107 ++++++++++++++++++ ...riantAnalysisSkippedRepositoryRow.spec.tsx | 53 +++++++++ 11 files changed, 462 insertions(+), 30 deletions(-) create mode 100644 extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx create mode 100644 extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx delete mode 100644 extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisNoCodeqlDbRepos.tsx delete mode 100644 extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisNotFoundRepos.tsx create mode 100644 extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx create mode 100644 extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx create mode 100644 extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoriesTab.spec.tsx create mode 100644 extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoryRow.spec.tsx diff --git a/extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts b/extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts index f7c170dcdbe..01bf0376458 100644 --- a/extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts +++ b/extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts @@ -72,10 +72,13 @@ export interface VariantAnalysisSkippedRepositories { export interface VariantAnalysisSkippedRepositoryGroup { repositoryCount: number, - repositories: Array<{ - id?: number, - fullName: string - }> + repositories: Array, +} + +export interface VariantAnalysisSkippedRepository { + id?: number, + fullName: string, + private?: boolean, } /** diff --git a/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx b/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx new file mode 100644 index 00000000000..d1d9616d37e --- /dev/null +++ b/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx @@ -0,0 +1,102 @@ +import React from 'react'; + +import { ComponentMeta, ComponentStory } from '@storybook/react'; + +import { VariantAnalysisContainer } from '../../view/variant-analysis/VariantAnalysisContainer'; +import { VariantAnalysisSkippedRepositoriesTab } from '../../view/variant-analysis/VariantAnalysisSkippedRepositoriesTab'; + +export default { + title: 'Variant Analysis/Variant Analysis Skipped Repositories Tab', + component: VariantAnalysisSkippedRepositoriesTab, + decorators: [ + (Story) => ( + + + + ) + ], +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const NoAccessNoOmissions = Template.bind({}); +NoAccessNoOmissions.args = { + reason: 'no_access', + skippedRepositoryGroup: { + repositoryCount: 2, + repositories: [ + { + fullName: 'octodemo/hello-globe', + }, + { + fullName: 'octodemo/hello-planet', + }, + ], + }, +}; + +export const NoAccessWithOmissions = Template.bind({}); +NoAccessWithOmissions.args = { + reason: 'no_access', + skippedRepositoryGroup: { + repositoryCount: 12345, + repositories: [ + { + fullName: 'octodemo/hello-globe', + }, + { + fullName: 'octodemo/hello-planet', + }, + { + fullName: 'octodemo/hello-universe', + }, + ], + }, +}; + +export const NoDatabaseNoOmissions = Template.bind({}); +NoDatabaseNoOmissions.args = { + reason: 'no_database', + skippedRepositoryGroup: { + repositoryCount: 2, + repositories: [ + { + id: 1, + fullName: 'octodemo/hello-globe', + private: false, + }, + { + id: 2, + fullName: 'octodemo/hello-planet', + private: true, + }, + ], + }, +}; + +export const NoDatabaseWithOmissions = Template.bind({}); +NoDatabaseWithOmissions.args = { + reason: 'no_database', + skippedRepositoryGroup: { + repositoryCount: 12345, + repositories: [ + { + id: 1, + fullName: 'octodemo/hello-globe', + private: false, + }, + { + id: 2, + fullName: 'octodemo/hello-planet', + private: true, + }, + { + id: 3, + fullName: 'octodemo/hello-universe', + private: false, + }, + ], + }, +}; diff --git a/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx b/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx new file mode 100644 index 00000000000..7f33d53cdad --- /dev/null +++ b/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx @@ -0,0 +1,45 @@ +import React from 'react'; + +import { ComponentMeta, ComponentStory } from '@storybook/react'; + +import { VariantAnalysisContainer } from '../../view/variant-analysis/VariantAnalysisContainer'; +import { VariantAnalysisSkippedRepositoryRow } from '../../view/variant-analysis/VariantAnalysisSkippedRepositoryRow'; + +export default { + title: 'Variant Analysis/Variant Analysis Skipped Repository', + component: VariantAnalysisSkippedRepositoryRow, + decorators: [ + (Story) => ( + + + + ) + ], +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const OnlyFullName = Template.bind({}); +OnlyFullName.args = { + repository: { + fullName: 'octodemo/hello-globe', + } +}; + +export const Public = Template.bind({}); +Public.args = { + repository: { + fullName: 'octodemo/hello-globe', + private: false, + } +}; + +export const Private = Template.bind({}); +Private.args = { + repository: { + fullName: 'octodemo/hello-globe', + private: true, + } +}; diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysis.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysis.tsx index 4bcf9026536..f24a7943797 100644 --- a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysis.tsx +++ b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysis.tsx @@ -106,7 +106,7 @@ const variantAnalysis: VariantAnalysisDomainModel = { ], skippedRepos: { notFoundRepos: { - repositoryCount: 2, + repositoryCount: 9999, repositories: [ { fullName: 'octodemo/hello-globe' @@ -121,19 +121,23 @@ const variantAnalysis: VariantAnalysisDomainModel = { repositories: [ { id: 100, - fullName: 'octodemo/no-db-1' + fullName: 'octodemo/no-db-1', + private: false, }, { id: 101, - fullName: 'octodemo/no-db-2' + fullName: 'octodemo/no-db-2', + private: true, }, { id: 102, - fullName: 'octodemo/no-db-3' + fullName: 'octodemo/no-db-3', + private: true, }, { id: 103, - fullName: 'octodemo/no-db-4' + fullName: 'octodemo/no-db-4', + private: false, } ] }, diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisNoCodeqlDbRepos.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisNoCodeqlDbRepos.tsx deleted file mode 100644 index b21ee09588b..00000000000 --- a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisNoCodeqlDbRepos.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import * as React from 'react'; - -export const VariantAnalysisNoCodeqlDbRepos = () => { - return
This is the no database found view
; -}; diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisNotFoundRepos.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisNotFoundRepos.tsx deleted file mode 100644 index a35d7a09e6a..00000000000 --- a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisNotFoundRepos.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import * as React from 'react'; - -export const VariantAnalysisNotFoundRepos = () => { - return
This is the no access view
; -}; diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisOutcomePanels.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisOutcomePanels.tsx index 296586a1fd2..46dde72f6ae 100644 --- a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisOutcomePanels.tsx +++ b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisOutcomePanels.tsx @@ -4,9 +4,8 @@ import { VSCodeBadge, VSCodePanels, VSCodePanelTab, VSCodePanelView } from '@vsc import { formatDecimal } from '../../pure/number'; import { VariantAnalysis } from '../../remote-queries/shared/variant-analysis'; import { VariantAnalysisAnalyzedRepos } from './VariantAnalysisAnalyzedRepos'; -import { VariantAnalysisNotFoundRepos } from './VariantAnalysisNotFoundRepos'; -import { VariantAnalysisNoCodeqlDbRepos } from './VariantAnalysisNoCodeqlDbRepos'; import { Alert } from '../common'; +import { VariantAnalysisSkippedRepositoriesTab } from './VariantAnalysisSkippedRepositoriesTab'; export type VariantAnalysisOutcomePanelProps = { variantAnalysis: VariantAnalysis; @@ -35,8 +34,8 @@ const WarningsContainer = styled.div` export const VariantAnalysisOutcomePanels = ({ variantAnalysis }: VariantAnalysisOutcomePanelProps) => { - const noCodeqlDbRepositoryCount = variantAnalysis.skippedRepos?.noCodeqlDbRepos?.repositoryCount ?? 0; - const notFoundRepositoryCount = variantAnalysis.skippedRepos?.notFoundRepos?.repositoryCount ?? 0; + const noCodeqlDbRepos = variantAnalysis.skippedRepos?.noCodeqlDbRepos; + const notFoundRepos = variantAnalysis.skippedRepos?.notFoundRepos; const overLimitRepositoryCount = variantAnalysis.skippedRepos?.overLimitRepos?.repositoryCount ?? 0; const accessMismatchRepositoryCount = variantAnalysis.skippedRepos?.accessMismatchRepos?.repositoryCount ?? 0; @@ -59,7 +58,7 @@ export const VariantAnalysisOutcomePanels = ({ ); - if (noCodeqlDbRepositoryCount === 0 && notFoundRepositoryCount === 0) { + if (!noCodeqlDbRepos?.repositoryCount && !notFoundRepos?.repositoryCount) { return ( <> {warnings} @@ -76,21 +75,31 @@ export const VariantAnalysisOutcomePanels = ({ Analyzed {formatDecimal(variantAnalysis.scannedRepos?.length ?? 0)} - {notFoundRepositoryCount > 0 && ( + {notFoundRepos?.repositoryCount && ( No access - {formatDecimal(notFoundRepositoryCount)} + {formatDecimal(notFoundRepos.repositoryCount)} )} - {noCodeqlDbRepositoryCount > 0 && ( + {noCodeqlDbRepos?.repositoryCount && ( No database - {formatDecimal(noCodeqlDbRepositoryCount)} + {formatDecimal(noCodeqlDbRepos.repositoryCount)} )} - {notFoundRepositoryCount > 0 && } - {noCodeqlDbRepositoryCount > 0 && } + {notFoundRepos?.repositoryCount && + + + } + {noCodeqlDbRepos?.repositoryCount && + + + } ); diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx new file mode 100644 index 00000000000..05ab5eb2d6d --- /dev/null +++ b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx @@ -0,0 +1,71 @@ +import * as React from 'react'; +import styled from 'styled-components'; +import { VariantAnalysisSkippedRepositoryGroup } from '../../remote-queries/shared/variant-analysis'; +import { Alert } from '../common'; +import { VariantAnalysisSkippedRepositoryRow } from './VariantAnalysisSkippedRepositoryRow'; + +export type SkippedRepositoriesReason = 'no_access' | 'no_database'; + +export type VariantAnalysisSkippedRepositoriesTabProps = { + reason: SkippedRepositoriesReason, + skippedRepositoryGroup: VariantAnalysisSkippedRepositoryGroup, +}; + +function getSkipReasonAlertTitle(reason: SkippedRepositoriesReason): string { + switch (reason) { + case 'no_access': + return 'No access'; + case 'no_database': + return 'No database'; + } +} + +function getSkipReasonAlertMessage( + reason: SkippedRepositoriesReason, + repos: VariantAnalysisSkippedRepositoryGroup +): string { + const repositoriesOmittedText = repos.repositoryCount > repos.repositories.length + ? ` (Only the first ${repos.repositories.length} ${repos.repositories.length > 1 ? 'repositories are' : 'repository is'} shown.)` + : ''; + switch (reason) { + case 'no_access': + return `The following repositories could not be scanned because you do not have read access.${repositoriesOmittedText}`; + case 'no_database': + return `The following repositories could not be scanned because they do not have an available CodeQL database.${repositoriesOmittedText}`; + } +} + +function getSkipReasonAlert( + reason: SkippedRepositoriesReason, + repos: VariantAnalysisSkippedRepositoryGroup +) { + return ( + + ); +} + +const Container = styled.div` + display: flex; + flex-direction: column; + gap: 0.5em; + width: 100%; +`; + +export const VariantAnalysisSkippedRepositoriesTab = ({ + reason, + skippedRepositoryGroup, +}: VariantAnalysisSkippedRepositoriesTabProps) => { + return ( + + {getSkipReasonAlert(reason, skippedRepositoryGroup)} + {skippedRepositoryGroup.repositories.map((repo) => + + )} + + ); +}; diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx new file mode 100644 index 00000000000..0acebed2b75 --- /dev/null +++ b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx @@ -0,0 +1,48 @@ +import { VSCodeBadge, VSCodeCheckbox } from '@vscode/webview-ui-toolkit/react'; +import * as React from 'react'; +import styled from 'styled-components'; +import { WarningIcon } from '../common'; +import { VariantAnalysisSkippedRepository as SkippedRepo } from '../../remote-queries/shared/variant-analysis'; + +export type VariantAnalysisSkippedRepositoryRowProps = { + repository: SkippedRepo, +}; + +const Row = styled.div` + display: flex; + flex-direction: row; + gap: 0.5em; + align-items: center; +`; + +const ChevronIcon = styled.span` + color: var(--vscode-descriptionForeground); +`; + +const PrivacyText = styled.span` + font-size: small; + color: var(--vscode-descriptionForeground); +`; + +function getPrivacyElement(isPrivate: boolean | undefined) { + if (isPrivate === undefined) { + return undefined; + } + const text = isPrivate ? 'private' : 'public'; + return {text}; +} + +export const VariantAnalysisSkippedRepositoryRow = ({ + repository, +}: VariantAnalysisSkippedRepositoryRowProps) => { + return ( + + + + - + {repository.fullName} + {getPrivacyElement(repository.private)} + + + ); +}; diff --git a/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoriesTab.spec.tsx b/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoriesTab.spec.tsx new file mode 100644 index 00000000000..9531c5a58a0 --- /dev/null +++ b/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoriesTab.spec.tsx @@ -0,0 +1,107 @@ +import * as React from 'react'; +import { render as reactRender, screen } from '@testing-library/react'; +import { VariantAnalysisSkippedRepositoriesTab, VariantAnalysisSkippedRepositoriesTabProps } from '../VariantAnalysisSkippedRepositoriesTab'; + +describe(VariantAnalysisSkippedRepositoriesTab.name, () => { + const render = (props: VariantAnalysisSkippedRepositoriesTabProps) => + reactRender(); + + it('renders warning title when reason is no_access', async () => { + render({ + reason: 'no_access', + skippedRepositoryGroup: { + repositoryCount: 1, + repositories: [], + } + }); + + expect(screen.getByText('Warning: No access')).toBeInTheDocument(); + }); + + it('renders warning title when reason is no_database', async () => { + render({ + reason: 'no_database', + skippedRepositoryGroup: { + repositoryCount: 1, + repositories: [], + } + }); + + expect(screen.getByText('Warning: No database')).toBeInTheDocument(); + }); + + it('renders warning message when no repositories are omitted', async () => { + render({ + reason: 'no_access', + skippedRepositoryGroup: { + repositoryCount: 1, + repositories: [ + { + fullName: 'octodemo/hello-world', + }, + ], + } + }); + + expect(screen.getByText('The following repositories could not be scanned because you do not have read access.')).toBeInTheDocument(); + }); + + it('renders warning message when there are repositories omitted and only one shown', async () => { + render({ + reason: 'no_access', + skippedRepositoryGroup: { + repositoryCount: 44, + repositories: [ + { + fullName: 'octodemo/hello-world', + }, + ], + } + }); + + expect(screen.getByText('The following repositories could not be scanned because you do not have read access. (Only the first 1 repository is shown.)')).toBeInTheDocument(); + }); + + it('renders warning message when there are repositories omitted and multiple shown', async () => { + render({ + reason: 'no_access', + skippedRepositoryGroup: { + repositoryCount: 44, + repositories: [ + { + fullName: 'octodemo/hello-world', + }, + { + fullName: 'octodemo/hello-galaxy', + }, + ], + } + }); + + expect(screen.getByText('The following repositories could not be scanned because you do not have read access. (Only the first 2 repositories are shown.)')).toBeInTheDocument(); + }); + + it('renders multiple skipped repository rows', async () => { + render({ + reason: 'no_database', + skippedRepositoryGroup: { + repositoryCount: 1, + repositories: [ + { + fullName: 'octodemo/hello-world', + }, + { + fullName: 'octodemo/hello-galaxy', + }, + { + fullName: 'octodemo/hello-universe', + }, + ], + } + }); + + expect(screen.getByText('octodemo/hello-world')).toBeInTheDocument(); + expect(screen.getByText('octodemo/hello-galaxy')).toBeInTheDocument(); + expect(screen.getByText('octodemo/hello-universe')).toBeInTheDocument(); + }); +}); diff --git a/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoryRow.spec.tsx b/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoryRow.spec.tsx new file mode 100644 index 00000000000..4e108fac884 --- /dev/null +++ b/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoryRow.spec.tsx @@ -0,0 +1,53 @@ +import * as React from 'react'; +import { render as reactRender, screen } from '@testing-library/react'; +import { VariantAnalysisSkippedRepositoryRow, VariantAnalysisSkippedRepositoryRowProps } from '../VariantAnalysisSkippedRepositoryRow'; + +describe(VariantAnalysisSkippedRepositoryRow.name, () => { + const render = (props: VariantAnalysisSkippedRepositoryRowProps) => + reactRender(); + + it('shows repository name', async () => { + render({ + repository: { + fullName: 'octodemo/hello-world', + } + }); + + expect(screen.getByText('octodemo/hello-world')).toBeInTheDocument(); + }); + + it('shows visibility when public', async () => { + render({ + repository: { + fullName: 'octodemo/hello-world', + private: false, + } + }); + + expect(screen.getByText('public')).toBeInTheDocument(); + expect(screen.queryByText('private')).not.toBeInTheDocument(); + }); + + it('shows visibility when private', async () => { + render({ + repository: { + fullName: 'octodemo/hello-world', + private: true, + } + }); + + expect(screen.queryByText('public')).not.toBeInTheDocument(); + expect(screen.getByText('private')).toBeInTheDocument(); + }); + + it('does not show visibility when unknown', async () => { + render({ + repository: { + fullName: 'octodemo/hello-world', + } + }); + + expect(screen.queryByText('public')).not.toBeInTheDocument(); + expect(screen.queryByText('private')).not.toBeInTheDocument(); + }); +}); From 4272cee01bd76ffa04937458604f75e52583562b Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 29 Sep 2022 12:31:53 +0100 Subject: [PATCH 2/6] Rename files to end .stories.tsx --- ...sTab.tsx => VariantAnalysisSkippedRepositoriesTab.stories.tsx} | 0 ...oryRow.tsx => VariantAnalysisSkippedRepositoryRow.stories.tsx} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename extensions/ql-vscode/src/stories/variant-analysis/{VariantAnalysisSkippedRepositoriesTab.tsx => VariantAnalysisSkippedRepositoriesTab.stories.tsx} (100%) rename extensions/ql-vscode/src/stories/variant-analysis/{VariantAnalysisSkippedRepositoryRow.tsx => VariantAnalysisSkippedRepositoryRow.stories.tsx} (100%) diff --git a/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx b/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.stories.tsx similarity index 100% rename from extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx rename to extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.stories.tsx diff --git a/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx b/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoryRow.stories.tsx similarity index 100% rename from extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx rename to extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoryRow.stories.tsx From 7ade7be0c49214c2a4611e2cb2f9f889b5420ad2 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 29 Sep 2022 12:40:40 +0100 Subject: [PATCH 3/6] Use simple array type --- .../ql-vscode/src/remote-queries/shared/variant-analysis.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts b/extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts index 01bf0376458..fa3e649abf9 100644 --- a/extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts +++ b/extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts @@ -72,7 +72,7 @@ export interface VariantAnalysisSkippedRepositories { export interface VariantAnalysisSkippedRepositoryGroup { repositoryCount: number, - repositories: Array, + repositories: VariantAnalysisSkippedRepository[], } export interface VariantAnalysisSkippedRepository { From 9629c99ccb2e9b6f07a7c172df9a5ebd2636a0ae Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 29 Sep 2022 12:47:18 +0100 Subject: [PATCH 4/6] Move alertTitle and alertMessage to props --- ...AnalysisSkippedRepositoriesTab.stories.tsx | 10 +++-- .../VariantAnalysisOutcomePanels.tsx | 6 ++- .../VariantAnalysisSkippedRepositoriesTab.tsx | 42 +++++-------------- ...antAnalysisSkippedRepositoriesTab.spec.tsx | 29 +++++-------- 4 files changed, 32 insertions(+), 55 deletions(-) diff --git a/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.stories.tsx b/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.stories.tsx index d1d9616d37e..7cbf93f4c3b 100644 --- a/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.stories.tsx +++ b/extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisSkippedRepositoriesTab.stories.tsx @@ -23,7 +23,8 @@ const Template: ComponentStory = ( export const NoAccessNoOmissions = Template.bind({}); NoAccessNoOmissions.args = { - reason: 'no_access', + alertTitle: 'No access', + alertMessage: 'The following repositories could not be scanned because you do not have read access.', skippedRepositoryGroup: { repositoryCount: 2, repositories: [ @@ -39,7 +40,7 @@ NoAccessNoOmissions.args = { export const NoAccessWithOmissions = Template.bind({}); NoAccessWithOmissions.args = { - reason: 'no_access', + ...NoAccessNoOmissions.args, skippedRepositoryGroup: { repositoryCount: 12345, repositories: [ @@ -58,7 +59,8 @@ NoAccessWithOmissions.args = { export const NoDatabaseNoOmissions = Template.bind({}); NoDatabaseNoOmissions.args = { - reason: 'no_database', + alertTitle: 'No database', + alertMessage: 'The following repositories could not be scanned because they do not have an available CodeQL database.', skippedRepositoryGroup: { repositoryCount: 2, repositories: [ @@ -78,7 +80,7 @@ NoDatabaseNoOmissions.args = { export const NoDatabaseWithOmissions = Template.bind({}); NoDatabaseWithOmissions.args = { - reason: 'no_database', + ...NoDatabaseNoOmissions.args, skippedRepositoryGroup: { repositoryCount: 12345, repositories: [ diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisOutcomePanels.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisOutcomePanels.tsx index 46dde72f6ae..782b76245b6 100644 --- a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisOutcomePanels.tsx +++ b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisOutcomePanels.tsx @@ -91,13 +91,15 @@ export const VariantAnalysisOutcomePanels = ({ {notFoundRepos?.repositoryCount && } {noCodeqlDbRepos?.repositoryCount && } diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx index 05ab5eb2d6d..f99adb38ec6 100644 --- a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx +++ b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx @@ -4,47 +4,26 @@ import { VariantAnalysisSkippedRepositoryGroup } from '../../remote-queries/shar import { Alert } from '../common'; import { VariantAnalysisSkippedRepositoryRow } from './VariantAnalysisSkippedRepositoryRow'; -export type SkippedRepositoriesReason = 'no_access' | 'no_database'; - export type VariantAnalysisSkippedRepositoriesTabProps = { - reason: SkippedRepositoriesReason, + alertTitle: string, + alertMessage: string, skippedRepositoryGroup: VariantAnalysisSkippedRepositoryGroup, }; -function getSkipReasonAlertTitle(reason: SkippedRepositoriesReason): string { - switch (reason) { - case 'no_access': - return 'No access'; - case 'no_database': - return 'No database'; - } -} - -function getSkipReasonAlertMessage( - reason: SkippedRepositoriesReason, +function getSkipReasonAlert( + title: string, + message: string, repos: VariantAnalysisSkippedRepositoryGroup -): string { +) { const repositoriesOmittedText = repos.repositoryCount > repos.repositories.length ? ` (Only the first ${repos.repositories.length} ${repos.repositories.length > 1 ? 'repositories are' : 'repository is'} shown.)` : ''; - switch (reason) { - case 'no_access': - return `The following repositories could not be scanned because you do not have read access.${repositoriesOmittedText}`; - case 'no_database': - return `The following repositories could not be scanned because they do not have an available CodeQL database.${repositoriesOmittedText}`; - } -} - -function getSkipReasonAlert( - reason: SkippedRepositoriesReason, - repos: VariantAnalysisSkippedRepositoryGroup -) { return ( ); } @@ -57,12 +36,13 @@ const Container = styled.div` `; export const VariantAnalysisSkippedRepositoriesTab = ({ - reason, + alertTitle, + alertMessage, skippedRepositoryGroup, }: VariantAnalysisSkippedRepositoriesTabProps) => { return ( - {getSkipReasonAlert(reason, skippedRepositoryGroup)} + {getSkipReasonAlert(alertTitle, alertMessage, skippedRepositoryGroup)} {skippedRepositoryGroup.repositories.map((repo) => )} diff --git a/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoriesTab.spec.tsx b/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoriesTab.spec.tsx index 9531c5a58a0..1782602eb5e 100644 --- a/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoriesTab.spec.tsx +++ b/extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisSkippedRepositoriesTab.spec.tsx @@ -6,9 +6,10 @@ describe(VariantAnalysisSkippedRepositoriesTab.name, () => { const render = (props: VariantAnalysisSkippedRepositoriesTabProps) => reactRender(); - it('renders warning title when reason is no_access', async () => { + it('renders warning title', async () => { render({ - reason: 'no_access', + alertTitle: 'No access', + alertMessage: 'The following repositories could not be scanned because you do not have read access.', skippedRepositoryGroup: { repositoryCount: 1, repositories: [], @@ -18,21 +19,10 @@ describe(VariantAnalysisSkippedRepositoriesTab.name, () => { expect(screen.getByText('Warning: No access')).toBeInTheDocument(); }); - it('renders warning title when reason is no_database', async () => { - render({ - reason: 'no_database', - skippedRepositoryGroup: { - repositoryCount: 1, - repositories: [], - } - }); - - expect(screen.getByText('Warning: No database')).toBeInTheDocument(); - }); - it('renders warning message when no repositories are omitted', async () => { render({ - reason: 'no_access', + alertTitle: 'No access', + alertMessage: 'The following repositories could not be scanned because you do not have read access.', skippedRepositoryGroup: { repositoryCount: 1, repositories: [ @@ -48,7 +38,8 @@ describe(VariantAnalysisSkippedRepositoriesTab.name, () => { it('renders warning message when there are repositories omitted and only one shown', async () => { render({ - reason: 'no_access', + alertTitle: 'No access', + alertMessage: 'The following repositories could not be scanned because you do not have read access.', skippedRepositoryGroup: { repositoryCount: 44, repositories: [ @@ -64,7 +55,8 @@ describe(VariantAnalysisSkippedRepositoriesTab.name, () => { it('renders warning message when there are repositories omitted and multiple shown', async () => { render({ - reason: 'no_access', + alertTitle: 'No access', + alertMessage: 'The following repositories could not be scanned because you do not have read access.', skippedRepositoryGroup: { repositoryCount: 44, repositories: [ @@ -83,7 +75,8 @@ describe(VariantAnalysisSkippedRepositoriesTab.name, () => { it('renders multiple skipped repository rows', async () => { render({ - reason: 'no_database', + alertTitle: 'No database', + alertMessage: 'The following repositories could not be scanned because they do not have an available CodeQL database.', skippedRepositoryGroup: { repositoryCount: 1, repositories: [ From baaa3d31c05da67682c6aa596e9bf9183f713550 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 29 Sep 2022 13:00:34 +0100 Subject: [PATCH 5/6] Update codicon styling --- .../VariantAnalysisSkippedRepositoryRow.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx index 0acebed2b75..deb8d9d06df 100644 --- a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx +++ b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoryRow.tsx @@ -1,7 +1,7 @@ import { VSCodeBadge, VSCodeCheckbox } from '@vscode/webview-ui-toolkit/react'; import * as React from 'react'; import styled from 'styled-components'; -import { WarningIcon } from '../common'; +import { Codicon, WarningIcon } from '../common'; import { VariantAnalysisSkippedRepository as SkippedRepo } from '../../remote-queries/shared/variant-analysis'; export type VariantAnalysisSkippedRepositoryRowProps = { @@ -15,8 +15,8 @@ const Row = styled.div` align-items: center; `; -const ChevronIcon = styled.span` - color: var(--vscode-descriptionForeground); +const ChevronIcon = styled(Codicon)` + color: var(--vscode-disabledForeground); `; const PrivacyText = styled.span` @@ -38,7 +38,7 @@ export const VariantAnalysisSkippedRepositoryRow = ({ return ( - + - {repository.fullName} {getPrivacyElement(repository.private)} From 529ceb133e7880c0720951491b1fb06ddeb65c8e Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 29 Sep 2022 13:02:22 +0100 Subject: [PATCH 6/6] Fix text when 1 repo is shown --- .../variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx | 2 +- .../__tests__/VariantAnalysisSkippedRepositoriesTab.spec.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx index f99adb38ec6..381cdbaef93 100644 --- a/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx +++ b/extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisSkippedRepositoriesTab.tsx @@ -16,7 +16,7 @@ function getSkipReasonAlert( repos: VariantAnalysisSkippedRepositoryGroup ) { const repositoriesOmittedText = repos.repositoryCount > repos.repositories.length - ? ` (Only the first ${repos.repositories.length} ${repos.repositories.length > 1 ? 'repositories are' : 'repository is'} shown.)` + ? ` (Only the first ${repos.repositories.length > 1 ? `${repos.repositories.length} repositories are` : 'repository is'} shown.)` : ''; return ( { } }); - expect(screen.getByText('The following repositories could not be scanned because you do not have read access. (Only the first 1 repository is shown.)')).toBeInTheDocument(); + expect(screen.getByText('The following repositories could not be scanned because you do not have read access. (Only the first repository is shown.)')).toBeInTheDocument(); }); it('renders warning message when there are repositories omitted and multiple shown', async () => {