Skip to content

Commit 7effa88

Browse files
committed
Get relevant syntax from list by user interaction
Since we have a long list of syntaxes, we need to simplify the search for the needed one. Now the list is filtered according to the value entered by the user. In case result list is empty 'No results found' message will be displayed.
1 parent c123122 commit 7effa88

File tree

3 files changed

+47
-17
lines changed

3 files changed

+47
-17
lines changed

src/components/Syntaxes.jsx

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import React from 'react';
22
import { Scrollbars } from 'react-custom-scrollbars';
33
import { connect } from 'react-redux';
44

5-
import Input from './common/Input';
5+
import regExpEscape from './../helpers';
66
import * as actions from '../actions';
77

8-
class Syntaxes extends React.Component {
8+
class Syntaxes extends React.PureComponent {
99
constructor(props) {
1010
super(props);
1111
this.state = { activeIndex: -1 };
1212
this.onClickHandler = this.onClickHandler.bind(this);
13+
this.onSyntaxSearch = this.onSyntaxSearch.bind(this);
1314
}
1415

1516
componentDidMount() {
@@ -24,30 +25,51 @@ class Syntaxes extends React.Component {
2425
this.props.onClick(syntax);
2526
}
2627

27-
render() {
28+
onSyntaxSearch(e) {
29+
this.setState({ searchSyntax: e.target.value.trim() });
30+
}
31+
32+
getSyntaxes() {
33+
let { syntaxes } = this.props;
34+
35+
if (this.state.searchSyntax) {
36+
syntaxes = this.filterSyntaxes(regExpEscape(this.state.searchSyntax));
37+
}
38+
39+
return syntaxes.map((syntax, index) => {
40+
const active = this.state.activeIndex === index ? 'active' : '';
41+
return (
42+
<li
43+
className={`new-snippet-lang-item ${active}`}
44+
data-syntax={syntax}
45+
data-index={index}
46+
key={syntax}
47+
>
48+
{syntax}
49+
</li>
50+
);
51+
});
52+
}
53+
54+
filterSyntaxes(searchSyntax) {
2855
const { syntaxes } = this.props;
56+
const regExp = new RegExp(searchSyntax, 'gi');
57+
return syntaxes.filter(syntax => syntax.match(regExp));
58+
}
59+
60+
render() {
61+
const syntaxes = this.getSyntaxes();
2962

3063
return (
3164
[
3265
<div className="new-snippet-lang-header" key="Syntax input">
33-
<Input placeholder="Type to search..." />
66+
<input className="input" placeholder="Type to search..." onChange={this.onSyntaxSearch} />
3467
</div>,
3568
<div className="new-snippet-lang-list-wrapper" key="Syntax list">
69+
{syntaxes.size ? null : <div className="new-snippet-lang-empty">No results found</div>}
3670
<Scrollbars>
3771
<ul className="new-snippet-lang-list" onClick={this.onClickHandler} role="presentation">
38-
{syntaxes.map((syntax, index) => {
39-
const active = this.state.activeIndex === index ? 'active' : '';
40-
return (
41-
<li
42-
className={`new-snippet-lang-item ${active}`}
43-
data-syntax={syntax}
44-
data-index={index}
45-
key={syntax}
46-
>
47-
{syntax}
48-
</li>
49-
);
50-
})}
72+
{syntaxes}
5173
</ul>
5274
</Scrollbars>
5375
</div>,

src/helpers/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const regExpEscape = string => string.replace(/[-[\]{}()*+?.,\\^$|]/g, '\\$&');
2+
3+
export default regExpEscape;

src/styles/NewSnippet.styl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ lang-bar-width = 230px
7070
height: 100%
7171
&-wrapper
7272
flex: 1
73+
&-empty
74+
padding: 13px 15px
75+
font-size: 14px
76+
font-weight: 300
77+
color: text-grey
7378
&-item
7479
font-size: 14px
7580
padding: 13px 15px

0 commit comments

Comments
 (0)