mirror of
https://github.com/usebruno/bruno.git
synced 2025-02-16 09:50:17 +01:00
feature: add search results count to CodeMirror (#1498)
This commit is contained in:
parent
65b80cfd06
commit
67de396927
@ -14,6 +14,24 @@ const StyledWrapper = styled.div`
|
|||||||
background: #d2d7db;
|
background: #d2d7db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
#search-results-count {
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
top: calc(100% + 1px);
|
||||||
|
right: 0;
|
||||||
|
border-width: 0 0 1px 1px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: ${(props) => props.theme.codemirror.border};
|
||||||
|
padding: 0.1em 0.8em;
|
||||||
|
background-color: ${(props) => props.theme.codemirror.bg};
|
||||||
|
color: rgb(102, 102, 102);
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
textarea.cm-editor {
|
textarea.cm-editor {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
@ -111,6 +111,7 @@ export default class CodeEditor extends React.Component {
|
|||||||
// unnecessary updates during the update lifecycle.
|
// unnecessary updates during the update lifecycle.
|
||||||
this.cachedValue = props.value || '';
|
this.cachedValue = props.value || '';
|
||||||
this.variables = {};
|
this.variables = {};
|
||||||
|
this.searchResultsCountElementId = 'search-results-count';
|
||||||
|
|
||||||
this.lintOptions = {
|
this.lintOptions = {
|
||||||
esversion: 11,
|
esversion: 11,
|
||||||
@ -157,8 +158,16 @@ export default class CodeEditor extends React.Component {
|
|||||||
this.props.onSave();
|
this.props.onSave();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Cmd-F': 'findPersistent',
|
'Cmd-F': (cm) => {
|
||||||
'Ctrl-F': 'findPersistent',
|
cm.execCommand('findPersistent');
|
||||||
|
this._bindSearchHandler();
|
||||||
|
this._appendSearchResultsCount();
|
||||||
|
},
|
||||||
|
'Ctrl-F': (cm) => {
|
||||||
|
cm.execCommand('findPersistent');
|
||||||
|
this._bindSearchHandler();
|
||||||
|
this._appendSearchResultsCount();
|
||||||
|
},
|
||||||
'Cmd-H': 'replace',
|
'Cmd-H': 'replace',
|
||||||
'Ctrl-H': 'replace',
|
'Ctrl-H': 'replace',
|
||||||
Tab: function (cm) {
|
Tab: function (cm) {
|
||||||
@ -310,6 +319,8 @@ export default class CodeEditor extends React.Component {
|
|||||||
this.editor.off('change', this._onEdit);
|
this.editor.off('change', this._onEdit);
|
||||||
this.editor = null;
|
this.editor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._unbindSearchHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -346,4 +357,62 @@ export default class CodeEditor extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bind handler to search input to count number of search results
|
||||||
|
*/
|
||||||
|
_bindSearchHandler = () => {
|
||||||
|
const searchInput = document.querySelector('.CodeMirror-search-field');
|
||||||
|
|
||||||
|
if (searchInput) {
|
||||||
|
searchInput.addEventListener('input', this._countSearchResults);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unbind handler to search input to count number of search results
|
||||||
|
*/
|
||||||
|
_unbindSearchHandler = () => {
|
||||||
|
const searchInput = document.querySelector('.CodeMirror-search-field');
|
||||||
|
|
||||||
|
if (searchInput) {
|
||||||
|
searchInput.removeEventListener('input', this._countSearchResults);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append search results count to search dialog
|
||||||
|
*/
|
||||||
|
_appendSearchResultsCount = () => {
|
||||||
|
const dialog = document.querySelector('.CodeMirror-dialog.CodeMirror-dialog-top');
|
||||||
|
|
||||||
|
if (dialog) {
|
||||||
|
const searchResultsCount = document.createElement('span');
|
||||||
|
searchResultsCount.id = this.searchResultsCountElementId;
|
||||||
|
dialog.appendChild(searchResultsCount);
|
||||||
|
|
||||||
|
this._countSearchResults();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count search results and update state
|
||||||
|
*/
|
||||||
|
_countSearchResults = () => {
|
||||||
|
let count = 0;
|
||||||
|
|
||||||
|
const searchInput = document.querySelector('.CodeMirror-search-field');
|
||||||
|
|
||||||
|
if (searchInput && searchInput.value.length > 0) {
|
||||||
|
const text = new RegExp(searchInput.value, 'gi');
|
||||||
|
const matches = this.editor.getValue().match(text);
|
||||||
|
count = matches ? matches.length : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const searchResultsCountElement = document.querySelector(`#${this.searchResultsCountElementId}`);
|
||||||
|
|
||||||
|
if (searchResultsCountElement) {
|
||||||
|
searchResultsCountElement.innerText = `${count} results`;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user