You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PageSidebar.tsx 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2022 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. import { flatMap } from 'lodash';
  21. import * as React from 'react';
  22. import { translate } from '../../../helpers/l10n';
  23. import { RawQuery } from '../../../types/types';
  24. import CoverageFilter from '../filters/CoverageFilter';
  25. import DuplicationsFilter from '../filters/DuplicationsFilter';
  26. import LanguagesFilter from '../filters/LanguagesFilter';
  27. import MaintainabilityFilter from '../filters/MaintainabilityFilter';
  28. import NewCoverageFilter from '../filters/NewCoverageFilter';
  29. import NewDuplicationsFilter from '../filters/NewDuplicationsFilter';
  30. import NewLinesFilter from '../filters/NewLinesFilter';
  31. import NewMaintainabilityFilter from '../filters/NewMaintainabilityFilter';
  32. import NewReliabilityFilter from '../filters/NewReliabilityFilter';
  33. import NewSecurityFilter from '../filters/NewSecurityFilter';
  34. import QualifierFilter from '../filters/QualifierFilter';
  35. import QualityGateFilter from '../filters/QualityGateFilter';
  36. import ReliabilityFilter from '../filters/ReliabilityFilter';
  37. import SecurityFilter from '../filters/SecurityFilter';
  38. import SecurityReviewFilter from '../filters/SecurityReviewFilter';
  39. import SizeFilter from '../filters/SizeFilter';
  40. import TagsFilter from '../filters/TagsFilter';
  41. import { hasFilterParams } from '../query';
  42. import { Facets } from '../types';
  43. import ClearAll from './ClearAll';
  44. import FavoriteFilterContainer from './FavoriteFilterContainer';
  45. export interface PageSidebarProps {
  46. applicationsEnabled: boolean;
  47. facets?: Facets;
  48. onClearAll: () => void;
  49. onQueryChange: (change: RawQuery) => void;
  50. query: RawQuery;
  51. view: string;
  52. }
  53. export default function PageSidebar(props: PageSidebarProps) {
  54. const { applicationsEnabled, facets, onQueryChange, query, view } = props;
  55. const isFiltered = hasFilterParams(query);
  56. const isLeakView = view === 'leak';
  57. const maxFacetValue = getMaxFacetValue(facets);
  58. const facetProps = { onQueryChange, maxFacetValue };
  59. let linkQuery: RawQuery | undefined = undefined;
  60. if (view !== 'overall') {
  61. linkQuery = { view };
  62. }
  63. return (
  64. <div>
  65. <FavoriteFilterContainer query={linkQuery} />
  66. <div className="projects-facets-header clearfix">
  67. {isFiltered && <ClearAll onClearAll={props.onClearAll} />}
  68. <h2 className="h3">{translate('filters')}</h2>
  69. </div>
  70. <QualityGateFilter {...facetProps} facet={getFacet(facets, 'gate')} value={query.gate} />
  71. {!isLeakView && (
  72. <>
  73. <ReliabilityFilter
  74. {...facetProps}
  75. facet={getFacet(facets, 'reliability')}
  76. value={query.reliability}
  77. />
  78. <SecurityFilter
  79. {...facetProps}
  80. facet={getFacet(facets, 'security')}
  81. value={query.security}
  82. />
  83. <SecurityReviewFilter
  84. {...facetProps}
  85. facet={getFacet(facets, 'security_review')}
  86. value={query.security_review_rating}
  87. />
  88. <MaintainabilityFilter
  89. {...facetProps}
  90. facet={getFacet(facets, 'maintainability')}
  91. value={query.maintainability}
  92. />
  93. <CoverageFilter
  94. {...facetProps}
  95. facet={getFacet(facets, 'coverage')}
  96. value={query.coverage}
  97. />
  98. <DuplicationsFilter
  99. {...facetProps}
  100. facet={getFacet(facets, 'duplications')}
  101. value={query.duplications}
  102. />
  103. <SizeFilter {...facetProps} facet={getFacet(facets, 'size')} value={query.size} />
  104. </>
  105. )}
  106. {isLeakView && (
  107. <>
  108. <NewReliabilityFilter
  109. {...facetProps}
  110. facet={getFacet(facets, 'new_reliability')}
  111. value={query.new_reliability}
  112. />
  113. <NewSecurityFilter
  114. {...facetProps}
  115. facet={getFacet(facets, 'new_security')}
  116. value={query.new_security}
  117. />
  118. <SecurityReviewFilter
  119. {...facetProps}
  120. className="leak-facet-box"
  121. facet={getFacet(facets, 'new_security_review')}
  122. property="new_security_review"
  123. value={query.new_security_review_rating}
  124. />
  125. <NewMaintainabilityFilter
  126. {...facetProps}
  127. facet={getFacet(facets, 'new_maintainability')}
  128. value={query.new_maintainability}
  129. />
  130. <NewCoverageFilter
  131. {...facetProps}
  132. facet={getFacet(facets, 'new_coverage')}
  133. value={query.new_coverage}
  134. />
  135. <NewDuplicationsFilter
  136. {...facetProps}
  137. facet={getFacet(facets, 'new_duplications')}
  138. value={query.new_duplications}
  139. />
  140. <NewLinesFilter
  141. {...facetProps}
  142. facet={getFacet(facets, 'new_lines')}
  143. value={query.new_lines}
  144. />
  145. </>
  146. )}
  147. <LanguagesFilter
  148. {...facetProps}
  149. facet={getFacet(facets, 'languages')}
  150. query={query}
  151. value={query.languages}
  152. />
  153. {applicationsEnabled && (
  154. <QualifierFilter
  155. {...facetProps}
  156. facet={getFacet(facets, 'qualifier')}
  157. value={query.qualifier}
  158. />
  159. )}
  160. <TagsFilter
  161. {...facetProps}
  162. facet={getFacet(facets, 'tags')}
  163. query={query}
  164. value={query.tags}
  165. />
  166. </div>
  167. );
  168. }
  169. function getFacet(facets: Facets | undefined, name: string) {
  170. return facets && facets[name];
  171. }
  172. function getMaxFacetValue(facets?: Facets) {
  173. return facets && Math.max(...flatMap(Object.values(facets), facet => Object.values(facet)));
  174. }