cruk-searchkit
Version:
Set of overriden and new searchkit components designed specifically for Cancer Research UK
74 lines (61 loc) • 1.8 kB
JSX
import React from 'react';
import ReactDOM from 'react-dom';
import bem from 'bem-cn';
import {
SearchkitComponent
} from 'searchkit';
import CRUKCustomElasticGetter from '../getter/CRUKCustomElasticGetter'
import {
CRUKSearchkitDidYouMeanAccessor
} from './CRUKSearchkitDidYouMeanAccessor';
const mainClass = bem('cr-did-you-mean');
/**
* CRUKSearchkitAutocomplete component.
*/
export default class CRUKSearchkitDidYouMean extends SearchkitComponent {
accessor:CRUKSearchkitDidYouMeanAccessor
static propTypes = {
field: React.PropTypes.string,
minResults: React.PropTypes.number
}
static defaultProps = {
field: 'body',
minResults: 10
}
constructor(props) {
super(props);
this.clickHandle = this.clickHandle.bind(this);
this.getQueryAccessorIndex = this.getQueryAccessorIndex.bind(this);
}
clickHandle(e) {
e.preventDefault();
const sbAccessorIndex = this.getQueryAccessorIndex();
if (sbAccessorIndex) {
this.searchkit.accessors.accessors[sbAccessorIndex].state.value = e.target.innerHTML;
this.searchkit.performSearch();
}
}
getQueryAccessorIndex() {
return this.searchkit.accessors.accessors
.map((v, i) => {
return v.key === 'xss-q' ? i : null;
})
.filter(v => typeof v === 'number')
.join();
}
defineAccessor() {
return new CRUKSearchkitDidYouMeanAccessor(this.props.field);
}
render() {
const suggestion = this.accessor.getSuggestion();
if (!suggestion || this.searchkit.results.hits.total > this.props.minResults) return null;
return (
<p className={mainClass()} >
Did you mean
<a href="#t" className={mainClass('link')} onClick={this.clickHandle}>
{suggestion}
</a>?
</p>
);
}
}