]);
}
-let requestTree = (query, baseComponent, dispatch) => {
+function requestTree (query, baseComponent, dispatch) {
dispatch(startFetching());
-
- const params = { s: 'qualifier,name', qualifiers: 'BRC,FIL,UTS' };
-
- if (query) {
- params.q = query;
- }
-
- return getTree(baseComponent.key, params)
+ return getTree(baseComponent.key, { q: query, s: 'qualifier,name' })
.then(r => dispatch(searchAction(r.components)))
.then(() => dispatch(stopFetching()));
-};
-requestTree = _.debounce(requestTree, 250);
+}
async function getErrorMessage (response) {
switch (response.status) {
};
}
+let debouncedSearch = function (query, baseComponent, dispatch) {
+ if (query) {
+ requestTree(query, baseComponent, dispatch);
+ } else {
+ dispatch(searchAction(null));
+ }
+};
+debouncedSearch = _.debounce(debouncedSearch, 250);
+
export function search (query, baseComponent) {
return dispatch => {
dispatch(updateQueryAction(query));
- if (query != null) {
- requestTree(query, baseComponent, dispatch);
- } else {
- dispatch(searchAction(null));
- }
+ debouncedSearch(query, baseComponent, dispatch);
};
}
import Breadcrumbs from './Breadcrumbs';
import SourceViewer from './SourceViewer';
import Search from './Search';
-import { initComponent, browse, search } from '../actions';
+import { initComponent, browse } from '../actions';
import { translate } from '../../../helpers/l10n';
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) {
}
}
- 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,
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 });
<i className="spinner"/>
</div>
- <div className="page-actions">
- <Search component={this.props.component}/>
- </div>
+ <Search component={this.props.component}/>
</header>
{errorMessage && (
import { connect } from 'react-redux';
import { search } from '../actions';
-import { translate } from '../../../helpers/l10n';
class Search extends Component {
componentDidMount () {
- this.focusSearchInput();
- }
-
- componentDidUpdate () {
- this.focusSearchInput();
- }
-
- focusSearchInput () {
- if (this.refs.input) {
- this.refs.input.focus();
- }
+ this.refs.input.focus();
}
handleSearch (e) {
e.preventDefault();
const { dispatch, component } = this.props;
- const query = this.refs.input ? this.refs.input.value : '';
+ const query = 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 (
<form
onSubmit={this.handleSearch.bind(this)}
className="search-box code-search-box">
- {hasQuery && (
- <input
- ref="input"
- onChange={this.handleSearch.bind(this)}
- onKeyDown={this.handleKeyDown.bind(this)}
- value={query}
- className="search-box-input"
- type="search"
- name="q"
- placeholder="Search"
- maxLength="100"
- autoComplete="off"
- style={{ visibility: hasQuery ? 'visible': 'hidden' }}/>
- )}
- {!hasQuery && (
- <button className="search-box-submit">
- {translate('search_verb')}
- </button>
- )}
- {hasQuery && (
- <button
- className="search-box-submit"
- onClick={this.handleStopSearch.bind(this)}>
- {translate('cancel')}
- </button>
- )}
+ <button className="search-box-submit button-clean">
+ <i className="icon-search"></i>
+ </button>
+ <input
+ ref="input"
+ onChange={this.handleSearch.bind(this)}
+ value={query}
+ className="search-box-input"
+ type="search"
+ name="q"
+ placeholder="Search"
+ maxLength="100"
+ autoComplete="off"/>
</form>
);
}
breadcrumbs: null,
sourceViewer: null,
searchResults: null,
- searchQuery: null,
+ searchQuery: '',
coverageMetric: null,
baseBreadcrumbs: [],
errorMessage: null
breadcrumbs,
sourceViewer,
searchResults: null,
- searchQuery: null,
+ searchQuery: '',
errorMessage: null
};
case SEARCH:
</ul>
</div>
- <div class="spacer-bottom">
- <h3 class="shortcuts-section-title">{{t 'shortcuts.section.rules'}}</h3>
- <ul class="shortcuts-list">
- <li><span class="shortcut-button">↑</span> <span
- class="shortcut-button">↓</span> {{t 'shortcuts.section.rules.navigate_between_rules'}}</li>
- <li><span class="shortcut-button">→</span> {{t 'shortcuts.section.rules.open_details'}}</li>
- <li><span class="shortcut-button">←</span> {{t 'shortcuts.section.rules.return_to_list'}}</li>
- <li><span class="shortcut-button">a</span> {{t 'shortcuts.section.rules.activate'}}</li>
- <li><span class="shortcut-button">d</span> {{t 'shortcuts.section.rules.deactivate'}}</li>
- </ul>
- </div>
-
- <h3 class="shortcuts-section-title">{{t 'shortcuts.section.code'}}</h3>
+ <h3 class="shortcuts-section-title">{{t 'shortcuts.section.rules'}}</h3>
<ul class="shortcuts-list">
- <li><span class="shortcut-button">t</span> {{t 'shortcuts.section.code.search'}}</li>
+ <li><span class="shortcut-button">↑</span> <span
+ class="shortcut-button">↓</span> {{t 'shortcuts.section.rules.navigate_between_rules'}}</li>
+ <li><span class="shortcut-button">→</span> {{t 'shortcuts.section.rules.open_details'}}</li>
+ <li><span class="shortcut-button">←</span> {{t 'shortcuts.section.rules.return_to_list'}}</li>
+ <li><span class="shortcut-button">a</span> {{t 'shortcuts.section.rules.activate'}}</li>
+ <li><span class="shortcut-button">d</span> {{t 'shortcuts.section.rules.deactivate'}}</li>
</ul>
</div>
it('should be reset', () => {
const stateBefore = Object.assign({}, initialState, { searchQuery: 'query' });
expect(current(stateBefore, browseAction(exampleComponent)).searchQuery)
- .to.be.null;
+ .to.equal('');
});
});
describe('errorMessage', () => {