cruk-searchkit
Version:
Set of overriden and new searchkit components designed specifically for Cancer Research UK
145 lines (128 loc) • 4.17 kB
JSX
import React from 'react';
import moment from 'moment';
import MobileDetect from 'mobile-detect';
import { DateRangePicker } from 'react-dates';
import { SearchkitComponent } from 'searchkit';
import { CRUKSearchkitDateRangeAccessor } from './CRUKSearchkitDateRangeAccessor';
class CRUKSearchkitDateRange extends SearchkitComponent {
static propTypes = {
startDate: React.PropTypes.object,
endDate: React.PropTypes.object,
numberOfMonths: React.PropTypes.number,
initialVisibleMonth: React.PropTypes.func,
onDatesChange: React.PropTypes.func,
onFocusChange: React.PropTypes.func,
focusedInput: React.PropTypes.bool,
displayFormat: React.PropTypes.string,
showClearDates: React.PropTypes.bool,
field: React.PropTypes.string,
startDateField: React.PropTypes.string,
endDateField: React.PropTypes.string,
id: React.PropTypes.string,
...SearchkitComponent.propTypes
};
constructor(props) {
super(props);
this.state = {
focusedInput: null,
startDate: props.startDate || null,
endDate: props.endDate || null,
initialVisibleMonth: moment
};
this.noArgs = true;
this.accessor = this.defineAccessor();
this.onDatesChange = this.onDatesChange.bind(this);
this.onFocusChange = this.onFocusChange.bind(this);
this.updateParentState = this.updateParentState.bind(this);
}
onDatesChange({ startDate, endDate }) {
this.setState({ startDate, endDate }, () => {
this.updateAccessorState(startDate, endDate);
});
this.noArgs = false;
}
updateAccessorState(startDate, endDate) {
if (startDate && endDate) {
this.accessor.state = this.accessor.state.setValue({
min: startDate.format('YYYY-MM-DD'),
max: endDate.format('YYYY-MM-DD')
});
this.searchkit.performSearch();
} else if (!startDate && !endDate) {
this.accessor.state = this.accessor.state.clear();
this.searchkit.performSearch();
}
}
updateParentState(startDate, endDate) {
this.setState({
startDate: (startDate) ? moment(startDate) : startDate,
endDate: (endDate) ? moment(endDate) : endDate,
});
}
onFocusChange(focusedInput) {
this.setState({ focusedInput });
}
defineAccessor() {
const {
id,
title,
field,
startDate,
endDate,
interval,
startDateField,
endDateField
} = this.props;
const updateParentState = this.updateParentState;
return new CRUKSearchkitDateRangeAccessor(id, {
id,
startDate,
endDate,
title,
field,
interval,
updateParentState,
startDateField,
endDateField
});
}
render() {
const argState = this.accessor.getQueryObject();
const { focusedInput } = this.state;
let { startDate, endDate, initialVisibleMonth } = this.state;
/**
* These functions can return null so check for bool true.
*/
const md = new MobileDetect(window.navigator.userAgent);
const isMobile = md.mobile() || md.phone();
const numberOfMonths = isMobile ? 1 : 2;
if (this.noArgs &&
argState[this.props.id] !== undefined &&
Object.keys(argState[this.props.id]).length > 0) {
if (typeof argState[this.props.id].min !== undefined) {
startDate = moment(argState[this.props.id].min);
initialVisibleMonth = startDate;
}
endDate = (typeof argState[this.props.id].max !== undefined) ? moment(argState[this.props.id].max) : null;
}
return (
<div className={focusedInput ? 'cr-daterange-wrapper cr-daterange-wrapper--focused' : 'cr-daterange-wrapper'}>
<DateRangePicker
{...this.props}
onDatesChange={this.onDatesChange}
onFocusChange={this.onFocusChange}
focusedInput={focusedInput}
startDate={startDate}
endDate={endDate}
initialVisibleMonth={initialVisibleMonth}
displayFormat="DD/MM/YYYY"
numberOfMonths={numberOfMonths}
/>
</div>
);
}
}
CRUKSearchkitDateRange.defaultProps = {
isOutsideRange: () => false
};
export default CRUKSearchkitDateRange;