123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- /*
- * SonarQube
- * Copyright (C) 2009-2021 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
- import * as React from 'react';
- import { connect } from 'react-redux';
- import { getGlobalSettingValue, Store } from '../../../store/rootReducer';
- import { BranchLike } from '../../../types/branch-like';
- import { ComponentQualifier, isApplication, isPortfolioLike } from '../../../types/component';
- import {
- Facet,
- ReferencedComponent,
- ReferencedLanguage,
- ReferencedRule
- } from '../../../types/issues';
- import { Query } from '../utils';
- import AssigneeFacet from './AssigneeFacet';
- import AuthorFacet from './AuthorFacet';
- import CreationDateFacet from './CreationDateFacet';
- import DirectoryFacet from './DirectoryFacet';
- import FileFacet from './FileFacet';
- import LanguageFacet from './LanguageFacet';
- import ProjectFacet from './ProjectFacet';
- import ResolutionFacet from './ResolutionFacet';
- import RuleFacet from './RuleFacet';
- import ScopeFacet from './ScopeFacet';
- import SeverityFacet from './SeverityFacet';
- import StandardFacet from './StandardFacet';
- import StatusFacet from './StatusFacet';
- import TagFacet from './TagFacet';
- import TypeFacet from './TypeFacet';
-
- export interface Props {
- branchLike?: BranchLike;
- component: T.Component | undefined;
- createdAfterIncludesTime: boolean;
- facets: T.Dict<Facet | undefined>;
- loadSearchResultCount: (property: string, changes: Partial<Query>) => Promise<Facet>;
- loadingFacets: T.Dict<boolean>;
- myIssues: boolean;
- onFacetToggle: (property: string) => void;
- onFilterChange: (changes: Partial<Query>) => void;
- openFacets: T.Dict<boolean>;
- query: Query;
- referencedComponentsById: T.Dict<ReferencedComponent>;
- referencedComponentsByKey: T.Dict<ReferencedComponent>;
- referencedLanguages: T.Dict<ReferencedLanguage>;
- referencedRules: T.Dict<ReferencedRule>;
- referencedUsers: T.Dict<T.UserBase>;
- disableDeveloperAggregatedInfo: boolean;
- }
-
- export class Sidebar extends React.PureComponent<Props> {
- renderComponentFacets() {
- const { component, facets, loadingFacets, openFacets, query, branchLike } = this.props;
- const hasFileOrDirectory =
- !isApplication(component?.qualifier) && !isPortfolioLike(component?.qualifier);
- if (!component || !hasFileOrDirectory) {
- return null;
- }
- const commonProps = {
- componentKey: component.key,
- loadSearchResultCount: this.props.loadSearchResultCount,
- onChange: this.props.onFilterChange,
- onToggle: this.props.onFacetToggle,
- query
- };
- return (
- <>
- {component.qualifier !== ComponentQualifier.Directory && (
- <DirectoryFacet
- branchLike={branchLike}
- directories={query.directories}
- fetching={loadingFacets.directories === true}
- open={!!openFacets.directories}
- stats={facets.directories}
- {...commonProps}
- />
- )}
- <FileFacet
- branchLike={branchLike}
- fetching={loadingFacets.files === true}
- files={query.files}
- open={!!openFacets.files}
- stats={facets.files}
- {...commonProps}
- />
- </>
- );
- }
-
- render() {
- const { component, createdAfterIncludesTime, facets, openFacets, query } = this.props;
-
- const displayProjectsFacet =
- !component || !['TRK', 'BRC', 'DIR', 'DEV_PRJ'].includes(component.qualifier);
- const displayAuthorFacet = !component || component.qualifier !== 'DEV';
-
- return (
- <>
- <TypeFacet
- fetching={this.props.loadingFacets.types === true}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.types}
- stats={facets.types}
- types={query.types}
- />
- <SeverityFacet
- fetching={this.props.loadingFacets.severities === true}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.severities}
- severities={query.severities}
- stats={facets.severities}
- />
- <ScopeFacet
- fetching={this.props.loadingFacets.scopes === true}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.scopes}
- stats={facets.scopes}
- scopes={query.scopes}
- />
- <ResolutionFacet
- fetching={this.props.loadingFacets.resolutions === true}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.resolutions}
- resolutions={query.resolutions}
- resolved={query.resolved}
- stats={facets.resolutions}
- />
- <StatusFacet
- fetching={this.props.loadingFacets.statuses === true}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.statuses}
- stats={facets.statuses}
- statuses={query.statuses}
- />
- <StandardFacet
- cwe={query.cwe}
- cweOpen={!!openFacets.cwe}
- cweStats={facets.cwe}
- fetchingCwe={this.props.loadingFacets.cwe === true}
- fetchingOwaspTop10={this.props.loadingFacets.owaspTop10 === true}
- fetchingSansTop25={this.props.loadingFacets.sansTop25 === true}
- fetchingSonarSourceSecurity={this.props.loadingFacets.sonarsourceSecurity === true}
- loadSearchResultCount={this.props.loadSearchResultCount}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.standards}
- owaspTop10={query.owaspTop10}
- owaspTop10Open={!!openFacets.owaspTop10}
- owaspTop10Stats={facets.owaspTop10}
- query={query}
- sansTop25={query.sansTop25}
- sansTop25Open={!!openFacets.sansTop25}
- sansTop25Stats={facets.sansTop25}
- sonarsourceSecurity={query.sonarsourceSecurity}
- sonarsourceSecurityOpen={!!openFacets.sonarsourceSecurity}
- sonarsourceSecurityStats={facets.sonarsourceSecurity}
- />
- <CreationDateFacet
- component={component}
- createdAfter={query.createdAfter}
- createdAfterIncludesTime={createdAfterIncludesTime}
- createdAt={query.createdAt}
- createdBefore={query.createdBefore}
- createdInLast={query.createdInLast}
- fetching={this.props.loadingFacets.createdAt === true}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.createdAt}
- sinceLeakPeriod={query.sinceLeakPeriod}
- stats={facets.createdAt}
- />
- <LanguageFacet
- fetching={this.props.loadingFacets.languages === true}
- languages={query.languages}
- loadSearchResultCount={this.props.loadSearchResultCount}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.languages}
- query={query}
- referencedLanguages={this.props.referencedLanguages}
- stats={facets.languages}
- />
- <RuleFacet
- fetching={this.props.loadingFacets.rules === true}
- languages={query.languages}
- loadSearchResultCount={this.props.loadSearchResultCount}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.rules}
- query={query}
- referencedRules={this.props.referencedRules}
- rules={query.rules}
- stats={facets.rules}
- />
- <TagFacet
- component={component}
- fetching={this.props.loadingFacets.tags === true}
- loadSearchResultCount={this.props.loadSearchResultCount}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.tags}
- query={query}
- stats={facets.tags}
- tags={query.tags}
- />
- {displayProjectsFacet && (
- <ProjectFacet
- component={component}
- fetching={this.props.loadingFacets.projects === true}
- loadSearchResultCount={this.props.loadSearchResultCount}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.projects}
- projects={query.projects}
- query={query}
- referencedComponents={this.props.referencedComponentsByKey}
- stats={facets.projects}
- />
- )}
- {this.renderComponentFacets()}
- {!this.props.myIssues && !this.props.disableDeveloperAggregatedInfo && (
- <AssigneeFacet
- assigned={query.assigned}
- assignees={query.assignees}
- fetching={this.props.loadingFacets.assignees === true}
- loadSearchResultCount={this.props.loadSearchResultCount}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.assignees}
- query={query}
- referencedUsers={this.props.referencedUsers}
- stats={facets.assignees}
- />
- )}
- {displayAuthorFacet && !this.props.disableDeveloperAggregatedInfo && (
- <AuthorFacet
- author={query.author}
- component={component}
- fetching={this.props.loadingFacets.author === true}
- loadSearchResultCount={this.props.loadSearchResultCount}
- onChange={this.props.onFilterChange}
- onToggle={this.props.onFacetToggle}
- open={!!openFacets.author}
- query={query}
- stats={facets.author}
- />
- )}
- </>
- );
- }
- }
-
- export const mapStateToProps = (state: Store) => {
- const disableDeveloperAggregatedInfo = getGlobalSettingValue(
- state,
- 'sonar.developerAggregatedInfo.disabled'
- );
- return {
- disableDeveloperAggregatedInfo: disableDeveloperAggregatedInfo?.value === true.toString()
- };
- };
-
- export default connect(mapStateToProps)(Sidebar);
|