application/components/common/content-search/search.js
import React from 'react';
import Paper from 'material-ui/Paper';
import TextField from 'material-ui/TextField';
import SelectField from 'material-ui/SelectField';
import MenuItem from 'material-ui/MenuItem';
import IconButton from 'material-ui/IconButton';
import FlatButton from 'material-ui/FlatButton';
import Divider from 'material-ui/Divider';
import FontIcon from 'material-ui/FontIcon';
import {connect} from 'react-redux'
import {Col, Row} from '../../flexbox';
import BaseView from './../../base-view';
import {contentSearchFetch, contentSearchReset} from './../../../redux/actions/content-search-actions';
import ReduxPaginator from './../redux-paginator';
import ContentResults from './content-results';
class ContentSearch extends BaseView {
constructor(props) {
super(props);
this.displayName = 'ContentSearch';
this.state = {
'keywords': '',
'content_type': this.props.contentType ? this.props.contentType : false
};
this.handleSearch = this.handleSearch.bind(this);
this.handleSelectContent = this.handleSelectContent.bind(this);
this.handleKeyDown = this.handleKeyDown.bind(this);
this.handlePagination = this.handlePagination.bind(this);
}
componentDidMount() {
const {dispatch} = this.props;
dispatch(contentSearchReset())
.then(() => this.handleSearch());
}
handleChangeView(type, e) {
this.setState({'viewType': type});
}
handlePagination(page) {
console.log(page);
this.state.page = page;
this.handleSearch();
}
handleChangeType(type, e) {
this.setState({'type': type}, () => {
this.handleSearch();
});
}
/**
* Simple search handler. See the API search docs
* for field specifications
*/
handleSearch() {
const page = this.state.page ? this.state.page : 1;
let filters = null;
if (this.state.content_type) {
filters = {
'content_type': this.state.content_type
};
}
this.props.dispatch(contentSearchFetch({
'keywords': this.refs.keywords.getValue(),
'author': this.refs.author.getValue(),
'tag': this.refs.tag.getValue(),
'type': 'content',
'filters': filters,
'page': page
})).then(() => {
if (!window) {
return;
}
// forces the modal reposition when the contents of the search box
// update
window.dispatchEvent(new Event('resize'))
});
}
/**
* Bubble the select media back up to the parent component
*/
handleSelectContent(m) {
if (this.props.onSelectContent) {
this.props.onSelectContent(m);
}
}
handleKeyDown(e) {
if (e.which === 13) {
this.handleSearch();
}
}
handleFilterType(type, e) {
this.setState({
'content_type': type
}, () => {
this.handleSearch.call(this);
});
}
render() {
return (
<div>
<Row middle='xs'>
<Col xs={12}>
<strong>Search Content</strong>
</Col>
</Row>
<div>
<Row middle='xs'>
<Col xs={12}>
<TextField
ref='keywords'
onKeyDown={this.handleKeyDown}
placeholder='Keywords'
fullWidth={true}
/>
</Col>
</Row>
<Row middle='xs'>
<Col xs={6}>
<TextField
ref='tag'
onKeyDown={this.handleKeyDown}
placeholder='Tag'
/>
</Col>
<Col xs={6}>
<TextField
ref='author'
onKeyDown={this.handleKeyDown}
placeholder='Author'
/>
</Col>
</Row>
<Divider />
<Row middle='xs' className='clear-bottom clear-top'>
<Col xs={6}>
Type:
<span className={'state-pill' + (!this.state.content_type ? ' active' : '')} onClick={this.handleFilterType.bind(this, false)}>Any</span>
<span className={'state-pill' + (this.state.content_type == 'article' ? ' active' : '')} onClick={this.handleFilterType.bind(this, 'article')}>Article</span>
<span className={'state-pill' + (this.state.content_type == 'media' ? ' active' : '')} onClick={this.handleFilterType.bind(this, 'media')}>Media</span>
<span className={'state-pill' + (this.state.content_type == 'post' ? ' active' : '')} onClick={this.handleFilterType.bind(this, 'post')}>Post</span>
<span className={'state-pill' + (this.state.content_type == 'page' ? ' active' : '')} onClick={this.handleFilterType.bind(this, 'page')}>Page</span>
</Col>
<Col xs={6} right='xs'>
<ReduxPaginator pagination={this.props.contentSearch.pagination} onPaginate={this.handlePagination.bind(this)} />
</Col>
</Row>
<ContentResults onSelectContent={this.handleSelectContent} view={this.state.viewType} />
</div>
</div>
);
}
}
// This is just to force the modal to resize on update
export default connect((state) => {
return {
contentSearch: state.contentSearch
}
})(ContentSearch);