Toolbar.js (4687B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 const { 8 Component, 9 createFactory, 10 } = require("resource://devtools/client/shared/vendor/react.mjs"); 11 const { 12 connect, 13 } = require("resource://devtools/client/shared/vendor/react-redux.js"); 14 const { 15 FILTER_SEARCH_DELAY, 16 } = require("resource://devtools/client/netmonitor/src/constants.js"); 17 const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.mjs"); 18 const Actions = require("resource://devtools/client/netmonitor/src/actions/index.js"); 19 const dom = require("resource://devtools/client/shared/vendor/react-dom-factories.js"); 20 const { 21 L10N, 22 } = require("resource://devtools/client/netmonitor/src/utils/l10n.js"); 23 const { button, span, div } = dom; 24 25 // Components 26 const SearchBox = createFactory( 27 require("resource://devtools/client/shared/components/SearchBox.js") 28 ); 29 30 /** 31 * Network Search toolbar component. 32 * 33 * Provides tools for greater control over search. 34 */ 35 class Toolbar extends Component { 36 static get propTypes() { 37 return { 38 searchboxRef: PropTypes.object.isRequired, 39 clearSearchResults: PropTypes.func.isRequired, 40 search: PropTypes.func.isRequired, 41 closeSearch: PropTypes.func.isRequired, 42 addSearchQuery: PropTypes.func.isRequired, 43 clearSearchResultAndCancel: PropTypes.func.isRequired, 44 caseSensitive: PropTypes.bool.isRequired, 45 toggleCaseSensitiveSearch: PropTypes.func.isRequired, 46 connector: PropTypes.object.isRequired, 47 query: PropTypes.string, 48 }; 49 } 50 51 /** 52 * Render a separator. 53 */ 54 renderSeparator() { 55 return span({ className: "devtools-separator" }); 56 } 57 58 /** 59 * Handles what we do when key is pressed in search input. 60 * 61 * @param event 62 * @param conn 63 */ 64 onKeyDown(event, connector) { 65 switch (event.key) { 66 case "Escape": 67 event.preventDefault(); 68 this.props.closeSearch(); 69 break; 70 case "Enter": 71 event.preventDefault(); 72 this.props.addSearchQuery(event.target.value); 73 this.props.search(connector, event.target.value); 74 break; 75 } 76 } 77 78 renderModifiers() { 79 return div( 80 { className: "search-modifiers" }, 81 span({ className: "pipe-divider" }), 82 this.renderCaseSensitiveButton() 83 ); 84 } 85 86 /** 87 * Render a clear button to clear search results. 88 */ 89 renderClearButton() { 90 return button({ 91 className: 92 "devtools-button devtools-clear-icon ws-frames-list-clear-button", 93 title: L10N.getStr("netmonitor.search.toolbar.clear"), 94 onClick: () => { 95 this.props.clearSearchResults(); 96 }, 97 }); 98 } 99 100 /** 101 * Render the case sensitive search modifier button 102 */ 103 renderCaseSensitiveButton() { 104 const { caseSensitive, toggleCaseSensitiveSearch } = this.props; 105 const active = caseSensitive ? "checked" : ""; 106 107 return button({ 108 id: "devtools-network-search-caseSensitive", 109 className: `devtools-button ${active}`, 110 title: L10N.getStr("netmonitor.search.toolbar.caseSensitive"), 111 onClick: toggleCaseSensitiveSearch, 112 }); 113 } 114 115 /** 116 * Render Search box. 117 */ 118 renderFilterBox() { 119 const { addSearchQuery, clearSearchResultAndCancel, connector, query } = 120 this.props; 121 return SearchBox({ 122 keyShortcut: "CmdOrCtrl+Shift+F", 123 placeholder: L10N.getStr("netmonitor.search.toolbar.inputPlaceholder"), 124 type: "search", 125 delay: FILTER_SEARCH_DELAY, 126 ref: this.props.searchboxRef, 127 initialValue: query, 128 onClearButtonClick: () => clearSearchResultAndCancel(), 129 onChange: newQuery => addSearchQuery(newQuery), 130 onKeyDown: event => this.onKeyDown(event, connector), 131 }); 132 } 133 134 render() { 135 return div( 136 { 137 id: "netmonitor-toolbar-container", 138 className: "devtools-toolbar devtools-input-toolbar", 139 }, 140 this.renderFilterBox(), 141 this.renderModifiers() 142 ); 143 } 144 } 145 146 module.exports = connect( 147 state => ({ 148 caseSensitive: state.search.caseSensitive, 149 query: state.search.query, 150 }), 151 dispatch => ({ 152 closeSearch: () => dispatch(Actions.closeSearch()), 153 openSearch: () => dispatch(Actions.openSearch()), 154 clearSearchResultAndCancel: () => 155 dispatch(Actions.clearSearchResultAndCancel()), 156 toggleCaseSensitiveSearch: () => 157 dispatch(Actions.toggleCaseSensitiveSearch()), 158 search: (connector, query) => dispatch(Actions.search(connector, query)), 159 addSearchQuery: query => dispatch(Actions.addSearchQuery(query)), 160 }) 161 )(Toolbar);