react-tag-input
Version:
React tags is a fantastically simple tagging component for your React projects
61 lines (55 loc) • 2.21 kB
JavaScript
;
var React = require('react');
var Suggestions = React.createClass({
displayName: "Suggestions",
propTypes: {
query: React.PropTypes.string.isRequired,
selectedIndex: React.PropTypes.number.isRequired,
suggestions: React.PropTypes.array.isRequired,
handleClick: React.PropTypes.func.isRequired,
handleHover: React.PropTypes.func.isRequired,
minQueryLength: React.PropTypes.number,
shouldRenderSuggestions: React.PropTypes.func,
classNames: React.PropTypes.object
},
markIt: function markIt(input, query) {
var escapedRegex = query.trim().replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&");
var r = RegExp(escapedRegex, "gi");
return {
__html: input.replace(r, "<mark>$&</mark>")
};
},
shouldRenderSuggestions: function shouldRenderSuggestions(query) {
var props = this.props;
var minQueryLength = props.minQueryLength || 2;
return props.query.length >= minQueryLength;
},
render: function render() {
var props = this.props;
var suggestions = this.props.suggestions.map(function (item, i) {
return React.createElement(
"li",
{ key: i,
onClick: props.handleClick.bind(null, i),
onMouseOver: props.handleHover.bind(null, i),
className: i == props.selectedIndex ? "active" : "" },
React.createElement("span", { dangerouslySetInnerHTML: this.markIt(item, props.query) })
);
}.bind(this));
if (suggestions.length === 0 || this.props.shouldRenderSuggestions != null && !this.props.shouldRenderSuggestions(props.query) || this.props.shouldRenderSuggestions == null && !this.shouldRenderSuggestions(props.query)) {
return null;
}
return React.createElement(
"div",
{ className: this.props.classNames.suggestions },
React.createElement(
"ul",
null,
" ",
suggestions,
" "
)
);
}
});
module.exports = Suggestions;