Skip to content

Commit e9c2d36

Browse files
authored
Merge pull request #34 from xsnippet/filter-syntaxes
Get relevant syntax from list by user interaction
2 parents a64241a + 7effa88 commit e9c2d36

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)