cluedin-widget
Version:
This project contains all the pages needed for browsing entities and searching them. The aim is to replace the CluedIn.Webapp project with this one when all the pages ( including the Admin page ) will be ported to REACT.
119 lines (97 loc) • 3.93 kB
JSX
import React, { Component } from 'react';
import SearchBox from '../search/searchBox.jsx';
import ReactDom from 'react-dom';
export default class CluedInSearchBox extends Component {
constructor( props ) {
super( props );
this.state = { index: -1, valueForInput: props.defaultValue };
}
componentWillReceiveProps( nextProp ) {
if( this.props.defaultValue !== nextProp.defaultValue ) {
this.setState( {
valueForInput: nextProp.defaultValue
} );
}
}
updateSearchValue( e ) {
const { onEnter, suggestedSearches } = this.props;
const { index, valueForInput } = this.state;
if( e.key === 'Enter' ) {
if( index < 0 ) {
onEnter( valueForInput || '*');
} else {
onEnter( suggestedSearches[ index ].Name );
}
this.setState( { index: -1, escape: true } );
} else if( e.key === 'Escape' ) {
this.setState( { index: -1, escape: true } );
} else if( e.key === 'ArrowDown' ) {
if( this.state.index === suggestedSearches.length ) {
this.setState( { index: 0, escape: false } );
} else {
this.setState( { index: (this.state.index + 1), escape: false } );
}
}
else if( e.key === 'ArrowUp' ) {
if( this.state.index >= 0 ) {
this.setState( { index: (this.state.index - 1), escape: false } );
}
} else {
this.setState( { index: -1, escape: false } );
// onSearchQueryChanged( value );
}
}
onSearchButtonClick() {
let searchBoxInput = this.refs.searchBoxInput;
let value = searchBoxInput.value || '*';
this.setState( { index: -1, escape: true } );
this.props.onEnter( value );
}
onSuggestedClick( index ) {
const { suggestedSearches } = this.props;
this.setState( { index: -1, escape: true } );
this.props.onEnter( suggestedSearches[ index ].Name );
}
componentDidMount() {
var self = this;
var domNode = ReactDom.findDOMNode( this );
document.addEventListener( 'click', function( e ) {
if( (!domNode || !domNode.contains( e.target )) ) {
self.setState( { index: -1, escape: true } );
}
}, true );
}
search( e ) {
const { onSearchQueryChanged } = this.props;
this.setState( { valueForInput: e.target.value } );
onSearchQueryChanged( e.target.value );
}
render() {
const { suggestedSearches } = this.props;
const { index, escape } = this.state;
let autoComplete;
let self = this;
if( !escape ) {
autoComplete = <ul ref="autoComplete" className="cluedIn_searchBox_autoComplete">
{ suggestedSearches.map( ( s, currentIndex ) => {
var nameToRender = s.Name;
let selectedClass = "";
if( index === currentIndex ) {
selectedClass = "selected";
}
return (
<li key={currentIndex} onClick={self.onSuggestedClick.bind(self, currentIndex)}
className={selectedClass}>{nameToRender}</li>);
} )}
</ul>;
}
return (
<div className="cluedIn_searchBox" onKeyUp={this.updateSearchValue.bind(this)}>
<input ref="searchBoxInput" onChange={this.search.bind(this)} value={this.state.valueForInput || ""}
type="text"/>
<i onClick={this.onSearchButtonClick.bind(this)} className="cluedIn_searchBox_button fa fa-search"></i>
{autoComplete}
</div>
);
}
};