From a0ea568244db7b77b165c7ecf7dca83620f8edbd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gr=C3=A9goire=20Aubert?= Date: Thu, 27 Jul 2017 12:18:59 +0200 Subject: [PATCH] Generalize facet components for both issues and measures --- .../component-measures/sidebar/DomainFacet.js | 12 +- .../component-measures/sidebar/FacetHeader.js | 86 ---------- ...emMeasureValue.js => FacetMeasureValue.js} | 2 +- .../component-measures/sidebar/Sidebar.js | 17 +- .../sidebar/__tests__/FacetHeader-test.js | 55 ------- ...alue-test.js => FacetMeasureValue-test.js} | 6 +- .../__snapshots__/DomainFacet-test.js.snap | 8 +- .../__snapshots__/FacetHeader-test.js.snap | 148 ------------------ .../__snapshots__/FacetItem-test.js.snap | 105 ------------- ...js.snap => FacetMeasureValue-test.js.snap} | 0 .../apps/issues/components/BulkChangeModal.js | 2 +- .../js/apps/issues/sidebar/AssigneeFacet.js | 17 +- .../js/apps/issues/sidebar/AuthorFacet.js | 14 +- .../apps/issues/sidebar/CreationDateFacet.js | 18 +-- .../js/apps/issues/sidebar/DirectoryFacet.js | 16 +- .../main/js/apps/issues/sidebar/FacetMode.js | 12 +- .../main/js/apps/issues/sidebar/FileFacet.js | 16 +- .../js/apps/issues/sidebar/LanguageFacet.js | 16 +- .../js/apps/issues/sidebar/ModuleFacet.js | 16 +- .../js/apps/issues/sidebar/ProjectFacet.js | 18 +-- .../js/apps/issues/sidebar/ResolutionFacet.js | 14 +- .../main/js/apps/issues/sidebar/RuleFacet.js | 16 +- .../js/apps/issues/sidebar/SeverityFacet.js | 14 +- .../js/apps/issues/sidebar/StatusFacet.js | 14 +- .../main/js/apps/issues/sidebar/TagFacet.js | 16 +- .../main/js/apps/issues/sidebar/TypeFacet.js | 14 +- .../__snapshots__/AssigneeFacet-test.js.snap | 43 ++--- .../issues/sidebar/components/FacetBox.js | 34 ---- .../issues/sidebar/components/FacetItem.js | 82 ---------- .../sidebar/components/FacetItemsList.js | 33 ---- .../components/__tests__/FacetItem-test.js | 68 -------- .../src/main/js/apps/issues/utils.js | 7 + .../controls}/SearchSelect.js | 2 +- .../controls}/__tests__/SearchSelect-test.js | 0 .../__snapshots__/SearchSelect-test.js.snap | 0 .../sidebar => components/facet}/FacetBox.js | 0 .../facet}/FacetFooter.js | 2 +- .../facet}/FacetHeader.js | 2 +- .../sidebar => components/facet}/FacetItem.js | 16 +- .../facet}/FacetItemsList.js | 0 .../facet}/__tests__/FacetBox-test.js | 2 +- .../facet}/__tests__/FacetFooter-test.js | 0 .../facet}/__tests__/FacetHeader-test.js | 2 +- .../facet}/__tests__/FacetItem-test.js | 8 +- .../facet}/__tests__/FacetItemsList-test.js | 0 .../__snapshots__/FacetBox-test.js.snap | 1 - .../__snapshots__/FacetFooter-test.js.snap | 0 .../__snapshots__/FacetHeader-test.js.snap | 0 .../__snapshots__/FacetItem-test.js.snap | 7 +- .../__snapshots__/FacetItemsList-test.js.snap | 0 50 files changed, 166 insertions(+), 815 deletions(-) delete mode 100644 server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetHeader.js rename server/sonar-web/src/main/js/apps/component-measures/sidebar/{FacetItemMeasureValue.js => FacetMeasureValue.js} (94%) delete mode 100644 server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetHeader-test.js rename server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/{FacetItemMeasureValue-test.js => FacetMeasureValue-test.js} (85%) delete mode 100644 server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetHeader-test.js.snap delete mode 100644 server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetItem-test.js.snap rename server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/{FacetItemMeasureValue-test.js.snap => FacetMeasureValue-test.js.snap} (100%) delete mode 100644 server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetBox.js delete mode 100644 server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetItem.js delete mode 100644 server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetItemsList.js delete mode 100644 server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetItem-test.js rename server/sonar-web/src/main/js/{apps/issues/components => components/controls}/SearchSelect.js (97%) rename server/sonar-web/src/main/js/{apps/issues/components => components/controls}/__tests__/SearchSelect-test.js (100%) rename server/sonar-web/src/main/js/{apps/issues/components => components/controls}/__tests__/__snapshots__/SearchSelect-test.js.snap (100%) rename server/sonar-web/src/main/js/{apps/component-measures/sidebar => components/facet}/FacetBox.js (100%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/FacetFooter.js (95%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/FacetHeader.js (98%) rename server/sonar-web/src/main/js/{apps/component-measures/sidebar => components/facet}/FacetItem.js (86%) rename server/sonar-web/src/main/js/{apps/component-measures/sidebar => components/facet}/FacetItemsList.js (100%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/__tests__/FacetBox-test.js (97%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/__tests__/FacetFooter-test.js (100%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/__tests__/FacetHeader-test.js (97%) rename server/sonar-web/src/main/js/{apps/component-measures/sidebar => components/facet}/__tests__/FacetItem-test.js (88%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/__tests__/FacetItemsList-test.js (100%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/__tests__/__snapshots__/FacetBox-test.js.snap (86%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/__tests__/__snapshots__/FacetFooter-test.js.snap (100%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/__tests__/__snapshots__/FacetHeader-test.js.snap (100%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/__tests__/__snapshots__/FacetItem-test.js.snap (91%) rename server/sonar-web/src/main/js/{apps/issues/sidebar/components => components/facet}/__tests__/__snapshots__/FacetItemsList-test.js.snap (100%) diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.js b/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.js index ac2083422d1..c7e8dd68b21 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.js +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.js @@ -19,11 +19,11 @@ */ // @flow import React from 'react'; -import FacetBox from './FacetBox'; -import FacetHeader from './FacetHeader'; -import FacetItem from './FacetItem'; -import FacetItemsList from './FacetItemsList'; -import FacetItemMeasureValue from './FacetItemMeasureValue'; +import FacetBox from '../../../components/facet/FacetBox'; +import FacetHeader from '../../../components/facet/FacetHeader'; +import FacetItem from '../../../components/facet/FacetItem'; +import FacetItemsList from '../../../components/facet/FacetItemsList'; +import FacetMeasureValue from './FacetMeasureValue'; import IssueTypeIcon from '../../../components/ui/IssueTypeIcon'; import Tooltip from '../../../components/controls/Tooltip'; import { filterMeasures, sortMeasures } from '../utils'; @@ -71,7 +71,7 @@ export default class DomainFacet extends React.PureComponent { } onClick={this.props.onChange} - stat={} + stat={} value={measure.metric.key} /> )} diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetHeader.js b/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetHeader.js deleted file mode 100644 index 2cc9d19f98b..00000000000 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetHeader.js +++ /dev/null @@ -1,86 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 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. - */ -// @flow -/* eslint-disable max-len */ -import React from 'react'; - -type Props = {| - name: string, - onClick?: () => void, - open: boolean, - values?: number -|}; - -export default class FacetHeader extends React.PureComponent { - props: Props; - - static defaultProps = { - open: true - }; - - handleClick = (event: Event & { currentTarget: HTMLElement }) => { - event.preventDefault(); - event.currentTarget.blur(); - if (this.props.onClick) { - this.props.onClick(); - } - }; - - renderCheckbox() { - return ( - - {this.props.open - ? - : } - - ); - } - - renderValueIndicator() { - if (this.props.open || !this.props.values) { - return null; - } - return ( - - {this.props.values} - - ); - } - - render() { - return ( -
- {this.props.onClick - ? - {this.renderCheckbox()} {this.props.name} {this.renderValueIndicator()} - - : - {this.props.name} - } -
- ); - } -} diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetItemMeasureValue.js b/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetMeasureValue.js similarity index 94% rename from server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetItemMeasureValue.js rename to server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetMeasureValue.js index ede45d98793..eae569c72e0 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetItemMeasureValue.js +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetMeasureValue.js @@ -23,7 +23,7 @@ import Measure from '../../../components/measure/Measure'; import { isDiffMetric } from '../../../helpers/measures'; import type { MeasureEnhanced } from '../../../components/measure/types'; -export default function FacetItemMeasureValue({ measure }: { measure: MeasureEnhanced }) { +export default function FacetMeasureValue({ measure }: { measure: MeasureEnhanced }) { if (isDiffMetric(measure.metric.key)) { return (
}> + closedFacets: { [string]: boolean } |}; export default class Sidebar extends React.PureComponent { @@ -41,16 +40,7 @@ export default class Sidebar extends React.PureComponent { constructor(props: Props) { super(props); - this.state = { - closedFacets: {}, - measuresByDomains: groupByDomains(props.measures) - }; - } - - componentWillReceiveProps(nextProps: Props) { - if (nextProps.measures !== this.props.measures) { - this.setState({ measuresByDomains: groupByDomains(nextProps.measures) }); - } + this.state = { closedFacets: {} }; } toggleFacet = (name: string) => { @@ -62,10 +52,9 @@ export default class Sidebar extends React.PureComponent { changeMetric = (metric: string) => this.props.updateQuery({ metric }); render() { - const { measuresByDomains } = this.state; return (
- {measuresByDomains.map(domain => + {groupByDomains(this.props.measures).map(domain => { - expect( - shallow() - ).toMatchSnapshot(); -}); - -it('should render open facet without value', () => { - expect(shallow()).toMatchSnapshot(); -}); - -it('should render closed facet with value', () => { - expect( - shallow() - ).toMatchSnapshot(); -}); - -it('should render closed facet without value', () => { - expect(shallow()).toMatchSnapshot(); -}); - -it('should render without link', () => { - expect(shallow()).toMatchSnapshot(); -}); - -it('should call onClick', () => { - const onClick = jest.fn(); - const wrapper = shallow(); - click(wrapper.find('a')); - expect(onClick).toHaveBeenCalled(); -}); diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetItemMeasureValue-test.js b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetMeasureValue-test.js similarity index 85% rename from server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetItemMeasureValue-test.js rename to server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetMeasureValue-test.js index d2a6ec5769a..b92096c3e40 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetItemMeasureValue-test.js +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetMeasureValue-test.js @@ -20,7 +20,7 @@ // @flow import React from 'react'; import { shallow } from 'enzyme'; -import FacetItemMeasureValue from '../FacetItemMeasureValue'; +import FacetMeasureValue from '../FacetMeasureValue'; const MEASURE = { metric: { @@ -45,9 +45,9 @@ const LEAK_MEASURE = { }; it('should display measure value', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallow()).toMatchSnapshot(); }); it('should display leak measure value', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallow()).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/DomainFacet-test.js.snap b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/DomainFacet-test.js.snap index 6ca87d36a3f..a55b82c48d7 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/DomainFacet-test.js.snap +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/DomainFacet-test.js.snap @@ -32,7 +32,7 @@ exports[`should display facet item list 1`] = ` } onClick={[Function]} stat={ - - - - - - - foo - - - 1 - - -
-`; - -exports[`should render closed facet without value 1`] = ` -
- - - - - - foo - - -
-`; - -exports[`should render open facet with value 1`] = ` -
- - - - - - foo - - -
-`; - -exports[`should render open facet without value 1`] = ` -
- - - - - - foo - - -
-`; - -exports[`should render without link 1`] = ` -
- - foo - -
-`; diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetItem-test.js.snap b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetItem-test.js.snap deleted file mode 100644 index 82e72d3b0af..00000000000 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetItem-test.js.snap +++ /dev/null @@ -1,105 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`should render active 1`] = ` - - - foo - - - -`; - -exports[`should render disabled 1`] = ` - - - foo - - - -`; - -exports[`should render effort stat 1`] = ` - - - foo - - - 1234 - - -`; - -exports[`should render half width 1`] = ` - - - foo - - - -`; - -exports[`should render inactive 1`] = ` - - - foo - - - -`; - -exports[`should render stat 1`] = ` - - - foo - - - 13 - - -`; diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetItemMeasureValue-test.js.snap b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetMeasureValue-test.js.snap similarity index 100% rename from server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetItemMeasureValue-test.js.snap rename to server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetMeasureValue-test.js.snap diff --git a/server/sonar-web/src/main/js/apps/issues/components/BulkChangeModal.js b/server/sonar-web/src/main/js/apps/issues/components/BulkChangeModal.js index 4340f1670bf..250c8ed2a6d 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/BulkChangeModal.js +++ b/server/sonar-web/src/main/js/apps/issues/components/BulkChangeModal.js @@ -22,7 +22,7 @@ import React from 'react'; import Modal from 'react-modal'; import Select from 'react-select'; import { pickBy, sortBy } from 'lodash'; -import SearchSelect from './SearchSelect'; +import SearchSelect from '../../../components/controls/SearchSelect'; import Checkbox from '../../../components/controls/Checkbox'; import Tooltip from '../../../components/controls/Tooltip'; import MarkdownTips from '../../../components/common/MarkdownTips'; diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/AssigneeFacet.js b/server/sonar-web/src/main/js/apps/issues/sidebar/AssigneeFacet.js index 20b3387486f..94407c286b6 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/AssigneeFacet.js +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/AssigneeFacet.js @@ -21,12 +21,12 @@ import React from 'react'; import { sortBy, uniq, without } from 'lodash'; import Avatar from '../../../components/ui/Avatar'; -import FacetBox from './components/FacetBox'; -import FacetHeader from './components/FacetHeader'; -import FacetItem from './components/FacetItem'; -import FacetItemsList from './components/FacetItemsList'; -import FacetFooter from './components/FacetFooter'; -import { searchAssignees } from '../utils'; +import FacetBox from '../../../components/facet/FacetBox'; +import FacetHeader from '../../../components/facet/FacetHeader'; +import FacetItem from '../../../components/facet/FacetItem'; +import FacetItemsList from '../../../components/facet/FacetItemsList'; +import FacetFooter from '../../../components/facet/FacetFooter'; +import { searchAssignees, formatFacetStat } from '../utils'; import { translate } from '../../../helpers/l10n'; import type { ReferencedUser, Component } from '../utils'; @@ -154,11 +154,10 @@ export default class AssigneeFacet extends React.PureComponent { {assignees.map(assignee => )} @@ -182,7 +181,7 @@ export default class AssigneeFacet extends React.PureComponent { render() { return ( - + )} @@ -93,7 +93,7 @@ export default class AuthorFacet extends React.PureComponent { render() { return ( - + {component == null && } {component == null && } {component == null && } {component != null && }
@@ -271,7 +261,7 @@ export default class CreationDateFacet extends React.PureComponent { render() { return ( - + )} @@ -114,7 +114,7 @@ export default class DirectoryFacet extends React.PureComponent { render() { return ( - + + {modes.map(mode => )} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/FileFacet.js b/server/sonar-web/src/main/js/apps/issues/sidebar/FileFacet.js index b6404f3fd3b..33af07a4212 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/FileFacet.js +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/FileFacet.js @@ -20,14 +20,15 @@ // @flow import React from 'react'; import { sortBy, without } from 'lodash'; -import FacetBox from './components/FacetBox'; -import FacetHeader from './components/FacetHeader'; -import FacetItem from './components/FacetItem'; -import FacetItemsList from './components/FacetItemsList'; -import type { ReferencedComponent } from '../utils'; +import FacetBox from '../../../components/facet/FacetBox'; +import FacetHeader from '../../../components/facet/FacetHeader'; +import FacetItem from '../../../components/facet/FacetItem'; +import FacetItemsList from '../../../components/facet/FacetItemsList'; import QualifierIcon from '../../../components/shared/QualifierIcon'; import { translate } from '../../../helpers/l10n'; import { collapsePath } from '../../../helpers/path'; +import { formatFacetStat } from '../utils'; +import type { ReferencedComponent } from '../utils'; type Props = {| facetMode: string, @@ -96,11 +97,10 @@ export default class FileFacet extends React.PureComponent { {files.map(file => )} @@ -110,7 +110,7 @@ export default class FileFacet extends React.PureComponent { render() { return ( - + )} @@ -114,7 +114,7 @@ export default class LanguageFacet extends React.PureComponent { render() { return ( - + )} @@ -107,7 +107,7 @@ export default class ModuleFacet extends React.PureComponent { render() { return ( - + )} @@ -173,7 +173,7 @@ export default class ProjectFacet extends React.PureComponent { render() { return ( - + ); @@ -105,7 +105,7 @@ export default class ResolutionFacet extends React.PureComponent { const resolutions = ['', 'FIXED', 'FALSE-POSITIVE', 'WONTFIX', 'REMOVED']; return ( - + )} @@ -126,7 +126,7 @@ export default class RuleFacet extends React.PureComponent { render() { return ( - + } onClick={this.handleItemClick} - stat={stat} + stat={formatFacetStat(stat, this.props.facetMode)} value={severity} /> ); @@ -89,7 +89,7 @@ export default class SeverityFacet extends React.PureComponent { const severities = ['BLOCKER', 'MINOR', 'CRITICAL', 'INFO', 'MAJOR']; return ( - + ); @@ -96,7 +96,7 @@ export default class StatusFacet extends React.PureComponent { const statuses = ['OPEN', 'RESOLVED', 'REOPENED', 'CLOSED', 'CONFIRMED']; return ( - + )} @@ -130,7 +130,7 @@ export default class TagFacet extends React.PureComponent { render() { return ( - + @@ -82,7 +82,7 @@ export default class TypeFacet extends React.PureComponent { } onClick={this.handleItemClick} - stat={stat} + stat={formatFacetStat(stat, this.props.facetMode)} value={type} /> ); @@ -92,7 +92,7 @@ export default class TypeFacet extends React.PureComponent { const types = ['BUG', 'VULNERABILITY', 'CODE_SMELL']; return ( - + + @@ -39,17 +35,16 @@ exports[`should render 1`] = ` } onClick={[Function]} - stat={13} + stat="13" value="foo" /> @@ -74,9 +69,7 @@ exports[`should render footer select option 1`] = ` `; exports[`should render without stats 1`] = ` - + + @@ -126,17 +115,16 @@ exports[`should select unassigned 1`] = ` } onClick={[Function]} - stat={13} + stat="13" value="foo" /> @@ -149,9 +137,7 @@ exports[`should select unassigned 1`] = ` `; exports[`should select user 1`] = ` - + @@ -187,17 +171,16 @@ exports[`should select user 1`] = ` } onClick={[Function]} - stat={13} + stat="13" value="foo" /> diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetBox.js b/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetBox.js deleted file mode 100644 index 9f0c6cf98ee..00000000000 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetBox.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 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. - */ -// @flow -import React from 'react'; - -type Props = {| - children?: React.Element<*>, - property: string -|}; - -export default function FacetBox(props: Props) { - return ( -
- {props.children} -
- ); -} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetItem.js b/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetItem.js deleted file mode 100644 index 88c5a0e7c77..00000000000 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetItem.js +++ /dev/null @@ -1,82 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 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. - */ -// @flow -import React from 'react'; -import classNames from 'classnames'; -import { formatMeasure } from '../../../../helpers/measures'; - -type Props = {| - active: boolean, - disabled: boolean, - facetMode: string, - halfWidth: boolean, - name: string | React.Element<*>, - onClick: string => void, - stat: ?number, - value: string -|}; - -export default class FacetItem extends React.PureComponent { - props: Props; - - static defaultProps = { - disabled: false, - halfWidth: false - }; - - handleClick = (event: Event & { currentTarget: HTMLElement }) => { - event.preventDefault(); - const value = event.currentTarget.dataset.value; - this.props.onClick(value); - }; - - render() { - const { stat } = this.props; - - const className = classNames('facet', 'search-navigator-facet', { - active: this.props.active, - 'search-navigator-facet-half': this.props.halfWidth - }); - - const formattedStat = - stat && - formatMeasure(stat, this.props.facetMode === 'effort' ? 'SHORT_WORK_DUR' : 'SHORT_INT'); - - return this.props.disabled - ? - - {this.props.name} - - {formattedStat != null && - - {formattedStat} - } - - : - - {this.props.name} - - {formattedStat != null && - - {formattedStat} - } - ; - } -} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetItemsList.js b/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetItemsList.js deleted file mode 100644 index 5d36d9934e3..00000000000 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetItemsList.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 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. - */ -// @flow -import React from 'react'; - -type Props = {| - children?: Array> -|}; - -export default function FacetItemsList(props: Props) { - return ( -
- {props.children} -
- ); -} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetItem-test.js b/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetItem-test.js deleted file mode 100644 index ddc84eca458..00000000000 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetItem-test.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 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. - */ -// @flow -import React from 'react'; -import { shallow } from 'enzyme'; -import { click } from '../../../../../helpers/testUtils'; -import FacetItem from '../FacetItem'; - -const renderFacetItem = (props: {}) => - shallow( - - ); - -it('should render active', () => { - expect(renderFacetItem({ active: true })).toMatchSnapshot(); -}); - -it('should render inactive', () => { - expect(renderFacetItem({ active: false })).toMatchSnapshot(); -}); - -it('should render stat', () => { - expect(renderFacetItem({ stat: 13 })).toMatchSnapshot(); -}); - -it('should render disabled', () => { - expect(renderFacetItem({ disabled: true })).toMatchSnapshot(); -}); - -it('should render half width', () => { - expect(renderFacetItem({ halfWidth: true })).toMatchSnapshot(); -}); - -it('should render effort stat', () => { - expect(renderFacetItem({ facetMode: 'effort', stat: 1234 })).toMatchSnapshot(); -}); - -it('should call onClick', () => { - const onClick = jest.fn(); - const wrapper = renderFacetItem({ onClick }); - click(wrapper, { currentTarget: { dataset: { value: 'bar' } } }); - expect(onClick).toHaveBeenCalled(); -}); diff --git a/server/sonar-web/src/main/js/apps/issues/utils.js b/server/sonar-web/src/main/js/apps/issues/utils.js index c3be4a5207b..adf2d8aba6e 100644 --- a/server/sonar-web/src/main/js/apps/issues/utils.js +++ b/server/sonar-web/src/main/js/apps/issues/utils.js @@ -20,6 +20,7 @@ // @flow import { searchMembers } from '../../api/organizations'; import { searchUsers } from '../../api/users'; +import { formatMeasure } from '../../helpers/measures'; import { queriesEqual, cleanQuery, @@ -165,6 +166,12 @@ export const parseFacets = (facets: Array): { [string]: Facet } => { return result; }; +export const formatFacetStat = (stat: ?number, mode: string): ?string => { + if (stat != null) { + return formatMeasure(stat, mode === 'effort' ? 'SHORT_WORK_DUR' : 'SHORT_INT'); + } +}; + export type ReferencedComponent = { key: string, name: string, diff --git a/server/sonar-web/src/main/js/apps/issues/components/SearchSelect.js b/server/sonar-web/src/main/js/components/controls/SearchSelect.js similarity index 97% rename from server/sonar-web/src/main/js/apps/issues/components/SearchSelect.js rename to server/sonar-web/src/main/js/components/controls/SearchSelect.js index 7d95fdde139..38515273b6c 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/SearchSelect.js +++ b/server/sonar-web/src/main/js/components/controls/SearchSelect.js @@ -21,7 +21,7 @@ import React from 'react'; import Select from 'react-select'; import { debounce } from 'lodash'; -import { translate, translateWithParameters } from '../../../helpers/l10n'; +import { translate, translateWithParameters } from '../../helpers/l10n'; type Option = { label: string, value: string }; diff --git a/server/sonar-web/src/main/js/apps/issues/components/__tests__/SearchSelect-test.js b/server/sonar-web/src/main/js/components/controls/__tests__/SearchSelect-test.js similarity index 100% rename from server/sonar-web/src/main/js/apps/issues/components/__tests__/SearchSelect-test.js rename to server/sonar-web/src/main/js/components/controls/__tests__/SearchSelect-test.js diff --git a/server/sonar-web/src/main/js/apps/issues/components/__tests__/__snapshots__/SearchSelect-test.js.snap b/server/sonar-web/src/main/js/components/controls/__tests__/__snapshots__/SearchSelect-test.js.snap similarity index 100% rename from server/sonar-web/src/main/js/apps/issues/components/__tests__/__snapshots__/SearchSelect-test.js.snap rename to server/sonar-web/src/main/js/components/controls/__tests__/__snapshots__/SearchSelect-test.js.snap diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetBox.js b/server/sonar-web/src/main/js/components/facet/FacetBox.js similarity index 100% rename from server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetBox.js rename to server/sonar-web/src/main/js/components/facet/FacetBox.js diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetFooter.js b/server/sonar-web/src/main/js/components/facet/FacetFooter.js similarity index 95% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetFooter.js rename to server/sonar-web/src/main/js/components/facet/FacetFooter.js index cc7d381b3e7..d11af837202 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetFooter.js +++ b/server/sonar-web/src/main/js/components/facet/FacetFooter.js @@ -19,7 +19,7 @@ */ // @flow import React from 'react'; -import SearchSelect from '../../components/SearchSelect'; +import SearchSelect from '../controls/SearchSelect'; type Option = { label: string, value: string }; diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetHeader.js b/server/sonar-web/src/main/js/components/facet/FacetHeader.js similarity index 98% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetHeader.js rename to server/sonar-web/src/main/js/components/facet/FacetHeader.js index eb084d38f65..42c7b274f89 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/FacetHeader.js +++ b/server/sonar-web/src/main/js/components/facet/FacetHeader.js @@ -20,7 +20,7 @@ // @flow /* eslint-disable max-len */ import React from 'react'; -import { translate } from '../../../../helpers/l10n'; +import { translate } from '../../helpers/l10n'; type Props = {| name: string, diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetItem.js b/server/sonar-web/src/main/js/components/facet/FacetItem.js similarity index 86% rename from server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetItem.js rename to server/sonar-web/src/main/js/components/facet/FacetItem.js index e84480b1317..4ecaf7650d4 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetItem.js +++ b/server/sonar-web/src/main/js/components/facet/FacetItem.js @@ -27,7 +27,7 @@ type Props = {| halfWidth: boolean, name: string | React.Element<*>, onClick: string => void, - stat: string | React.Element<*>, + stat?: ?(string | React.Element<*>), value: string |}; @@ -55,17 +55,19 @@ export default class FacetItem extends React.PureComponent { {this.props.name} - - {this.props.stat} - + {this.props.stat != null && + + {this.props.stat} + } : {this.props.name} - - {this.props.stat} - + {this.props.stat != null && + + {this.props.stat} + } ; } } diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetItemsList.js b/server/sonar-web/src/main/js/components/facet/FacetItemsList.js similarity index 100% rename from server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetItemsList.js rename to server/sonar-web/src/main/js/components/facet/FacetItemsList.js diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetBox-test.js b/server/sonar-web/src/main/js/components/facet/__tests__/FacetBox-test.js similarity index 97% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetBox-test.js rename to server/sonar-web/src/main/js/components/facet/__tests__/FacetBox-test.js index 2ebd4b3feaa..2fb313d3f85 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetBox-test.js +++ b/server/sonar-web/src/main/js/components/facet/__tests__/FacetBox-test.js @@ -25,7 +25,7 @@ import FacetBox from '../FacetBox'; it('should render', () => { expect( shallow( - +
) diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetFooter-test.js b/server/sonar-web/src/main/js/components/facet/__tests__/FacetFooter-test.js similarity index 100% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetFooter-test.js rename to server/sonar-web/src/main/js/components/facet/__tests__/FacetFooter-test.js diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetHeader-test.js b/server/sonar-web/src/main/js/components/facet/__tests__/FacetHeader-test.js similarity index 97% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetHeader-test.js rename to server/sonar-web/src/main/js/components/facet/__tests__/FacetHeader-test.js index ed3f143eedc..aaa674c1926 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetHeader-test.js +++ b/server/sonar-web/src/main/js/components/facet/__tests__/FacetHeader-test.js @@ -20,7 +20,7 @@ // @flow import React from 'react'; import { shallow } from 'enzyme'; -import { click } from '../../../../../helpers/testUtils'; +import { click } from '../../../helpers/testUtils'; import FacetHeader from '../FacetHeader'; it('should render open facet with value', () => { diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetItem-test.js b/server/sonar-web/src/main/js/components/facet/__tests__/FacetItem-test.js similarity index 88% rename from server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetItem-test.js rename to server/sonar-web/src/main/js/components/facet/__tests__/FacetItem-test.js index e8c8bfe4d54..2b602b29357 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetItem-test.js +++ b/server/sonar-web/src/main/js/components/facet/__tests__/FacetItem-test.js @@ -20,12 +20,12 @@ // @flow import React from 'react'; import { shallow } from 'enzyme'; -import { click } from '../../../../helpers/testUtils'; +import { click } from '../../../helpers/testUtils'; import FacetItem from '../FacetItem'; const renderFacetItem = (props: {}) => shallow( - + ); it('should render active', () => { @@ -37,7 +37,7 @@ it('should render inactive', () => { }); it('should render stat', () => { - expect(renderFacetItem({ stat: 13 })).toMatchSnapshot(); + expect(renderFacetItem({ stat: '13' })).toMatchSnapshot(); }); it('should render disabled', () => { @@ -49,7 +49,7 @@ it('should render half width', () => { }); it('should render effort stat', () => { - expect(renderFacetItem({ facetMode: 'effort', stat: 1234 })).toMatchSnapshot(); + expect(renderFacetItem({ facetMode: 'effort', stat: '1234' })).toMatchSnapshot(); }); it('should call onClick', () => { diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetItemsList-test.js b/server/sonar-web/src/main/js/components/facet/__tests__/FacetItemsList-test.js similarity index 100% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/FacetItemsList-test.js rename to server/sonar-web/src/main/js/components/facet/__tests__/FacetItemsList-test.js diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetBox-test.js.snap b/server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetBox-test.js.snap similarity index 86% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetBox-test.js.snap rename to server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetBox-test.js.snap index 317329065b1..e28d4538d46 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetBox-test.js.snap +++ b/server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetBox-test.js.snap @@ -3,7 +3,6 @@ exports[`should render 1`] = `
diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetFooter-test.js.snap b/server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetFooter-test.js.snap similarity index 100% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetFooter-test.js.snap rename to server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetFooter-test.js.snap diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetHeader-test.js.snap b/server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetHeader-test.js.snap similarity index 100% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetHeader-test.js.snap rename to server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetHeader-test.js.snap diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetItem-test.js.snap b/server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetItem-test.js.snap similarity index 91% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetItem-test.js.snap rename to server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetItem-test.js.snap index b8db949fded..6aff532c59f 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetItem-test.js.snap +++ b/server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetItem-test.js.snap @@ -3,7 +3,6 @@ exports[`should render active 1`] = ` @@ -30,7 +29,6 @@ exports[`should render disabled 1`] = ` exports[`should render effort stat 1`] = ` @@ -42,7 +40,7 @@ exports[`should render effort stat 1`] = ` - work_duration.x_days.3 + 1234 `; @@ -50,7 +48,6 @@ exports[`should render effort stat 1`] = ` exports[`should render half width 1`] = ` @@ -65,7 +62,6 @@ exports[`should render half width 1`] = ` exports[`should render inactive 1`] = ` @@ -80,7 +76,6 @@ exports[`should render inactive 1`] = ` exports[`should render stat 1`] = ` diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetItemsList-test.js.snap b/server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetItemsList-test.js.snap similarity index 100% rename from server/sonar-web/src/main/js/apps/issues/sidebar/components/__tests__/__snapshots__/FacetItemsList-test.js.snap rename to server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/FacetItemsList-test.js.snap -- 2.39.5