From: Stas Vilchik Date: Thu, 7 Jan 2016 16:11:07 +0000 (+0100) Subject: SONAR-7149 display a list of sub-components when start searching X-Git-Tag: 5.4-M4~16 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=88726dbd19b93375a6e6290f05168e051a334e5a;p=sonarqube.git SONAR-7149 display a list of sub-components when start searching --- diff --git a/server/sonar-web/src/main/js/apps/code/actions/index.js b/server/sonar-web/src/main/js/apps/code/actions/index.js index 1d3dfd73561..98526d00287 100644 --- a/server/sonar-web/src/main/js/apps/code/actions/index.js +++ b/server/sonar-web/src/main/js/apps/code/actions/index.js @@ -148,7 +148,14 @@ function retrieveComponent (componentKey, bucket) { let requestTree = (query, baseComponent, dispatch) => { dispatch(startFetching()); - return getTree(baseComponent.key, { q: query, s: 'qualifier,name' }) + + const params = { s: 'qualifier,name', qualifiers: 'BRC,FIL,UTS' }; + + if (query) { + params.q = query; + } + + return getTree(baseComponent.key, params) .then(r => dispatch(searchAction(r.components))) .then(() => dispatch(stopFetching())); }; @@ -199,7 +206,7 @@ export function browse (componentKey) { export function search (query, baseComponent) { return dispatch => { dispatch(updateQueryAction(query)); - if (query) { + if (query != null) { requestTree(query, baseComponent, dispatch); } else { dispatch(searchAction(null)); diff --git a/server/sonar-web/src/main/js/apps/code/components/Code.js b/server/sonar-web/src/main/js/apps/code/components/Code.js index f2c61b51ec7..f7120d283df 100644 --- a/server/sonar-web/src/main/js/apps/code/components/Code.js +++ b/server/sonar-web/src/main/js/apps/code/components/Code.js @@ -25,7 +25,7 @@ import Components from './Components'; import Breadcrumbs from './Breadcrumbs'; import SourceViewer from './SourceViewer'; import Search from './Search'; -import { initComponent, browse } from '../actions'; +import { initComponent, browse, search } from '../actions'; import { translate } from '../../../helpers/l10n'; @@ -33,8 +33,12 @@ class Code extends Component { componentDidMount () { const { dispatch, component, routing } = this.props; const selectedKey = (routing.path && decodeURIComponent(routing.path.substr(1))) || component.key; + dispatch(initComponent(component.key, component.breadcrumbs)) .then(() => dispatch(browse(selectedKey))); + + this.handleKeyDown = this.handleKeyDown.bind(this); + this.attachShortcuts(); } componentWillReceiveProps (nextProps) { @@ -47,11 +51,32 @@ class Code extends Component { } } + componentWillUnmount () { + this.removeShortcuts(); + } + + attachShortcuts () { + window.addEventListener('keyup', this.handleKeyDown); + } + + removeShortcuts () { + window.removeEventListener('keyup', this.handleKeyDown); + } + handleBrowse (component) { const { dispatch } = this.props; dispatch(browse(component.key)); } + handleKeyDown (e) { + const { dispatch, component, searchQuery } = this.props; + + // "t" key + if (e.keyCode === 84 && searchQuery == null) { + dispatch(search('', component)); + } + } + render () { const { fetching, @@ -65,7 +90,7 @@ class Code extends Component { const shouldShowSearchResults = !!searchResults; const shouldShowSourceViewer = !!sourceViewer; const shouldShowComponents = !shouldShowSearchResults && !shouldShowSourceViewer && components; - const shouldShowBreadcrumbs = !shouldShowSearchResults && Array.isArray(breadcrumbs) && breadcrumbs.length > 1; + const shouldShowBreadcrumbs = !shouldShowSearchResults && Array.isArray(breadcrumbs) && breadcrumbs.length > 1; const componentsClassName = classNames('spacer-top', { 'new-loading': fetching }); @@ -80,7 +105,9 @@ class Code extends Component { - +
+ +
{errorMessage && ( diff --git a/server/sonar-web/src/main/js/apps/code/components/Search.js b/server/sonar-web/src/main/js/apps/code/components/Search.js index 2a6c602926f..f71d5f4e424 100644 --- a/server/sonar-web/src/main/js/apps/code/components/Search.js +++ b/server/sonar-web/src/main/js/apps/code/components/Search.js @@ -21,40 +21,80 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import { search } from '../actions'; +import { translate } from '../../../helpers/l10n'; class Search extends Component { componentDidMount () { - this.refs.input.focus(); + this.focusSearchInput(); + } + + componentDidUpdate () { + this.focusSearchInput(); + } + + focusSearchInput () { + if (this.refs.input) { + this.refs.input.focus(); + } } handleSearch (e) { e.preventDefault(); const { dispatch, component } = this.props; - const query = this.refs.input.value; + const query = this.refs.input ? this.refs.input.value : ''; dispatch(search(query, component)); } + handleStopSearch (e) { + e.preventDefault(); + const { dispatch } = this.props; + dispatch(search(null)); + } + + handleKeyDown (e) { + const { dispatch } = this.props; + + // "escape" key + if (e.keyCode === 27) { + dispatch(search(null)); + } + } + render () { const { query } = this.props; + const hasQuery = query != null; return (
- - + {hasQuery && ( + + )} + {!hasQuery && ( + + )} + {hasQuery && ( + + )}
); } diff --git a/server/sonar-web/src/main/js/apps/code/reducers/index.js b/server/sonar-web/src/main/js/apps/code/reducers/index.js index 2c8b31a1ebb..596d92b91ea 100644 --- a/server/sonar-web/src/main/js/apps/code/reducers/index.js +++ b/server/sonar-web/src/main/js/apps/code/reducers/index.js @@ -76,7 +76,7 @@ export const initialState = { breadcrumbs: null, sourceViewer: null, searchResults: null, - searchQuery: '', + searchQuery: null, coverageMetric: null, baseBreadcrumbs: [], errorMessage: null @@ -104,7 +104,7 @@ export function current (state = initialState, action) { breadcrumbs, sourceViewer, searchResults: null, - searchQuery: '', + searchQuery: null, errorMessage: null }; case SEARCH: diff --git a/server/sonar-web/src/main/js/main/nav/templates/nav-shortcuts-help.hbs b/server/sonar-web/src/main/js/main/nav/templates/nav-shortcuts-help.hbs index 2ef8a865b8b..bfa98bc4495 100644 --- a/server/sonar-web/src/main/js/main/nav/templates/nav-shortcuts-help.hbs +++ b/server/sonar-web/src/main/js/main/nav/templates/nav-shortcuts-help.hbs @@ -23,14 +23,21 @@ -

{{t 'shortcuts.section.rules'}}

+
+

{{t 'shortcuts.section.rules'}}

+
    +
  •    {{t 'shortcuts.section.rules.navigate_between_rules'}}
  • +
  •    {{t 'shortcuts.section.rules.open_details'}}
  • +
  •    {{t 'shortcuts.section.rules.return_to_list'}}
  • +
  • a    {{t 'shortcuts.section.rules.activate'}}
  • +
  • d    {{t 'shortcuts.section.rules.deactivate'}}
  • +
+
+ +

{{t 'shortcuts.section.code'}}

    -
  •    {{t 'shortcuts.section.rules.navigate_between_rules'}}
  • -
  •    {{t 'shortcuts.section.rules.open_details'}}
  • -
  •    {{t 'shortcuts.section.rules.return_to_list'}}
  • -
  • a    {{t 'shortcuts.section.rules.activate'}}
  • -
  • d    {{t 'shortcuts.section.rules.deactivate'}}
  • +
  • t    {{t 'shortcuts.section.code.search'}}
diff --git a/server/sonar-web/tests/apps/code/store-test.js b/server/sonar-web/tests/apps/code/store-test.js index e8b36a58e4b..fb54c02d32d 100644 --- a/server/sonar-web/tests/apps/code/store-test.js +++ b/server/sonar-web/tests/apps/code/store-test.js @@ -225,7 +225,7 @@ describe('Code :: Store', () => { it('should be reset', () => { const stateBefore = Object.assign({}, initialState, { searchQuery: 'query' }); expect(current(stateBefore, browseAction(exampleComponent)).searchQuery) - .to.equal(''); + .to.be.null; }); }); describe('errorMessage', () => {