UNPKG

react-date-field

Version:
427 lines (319 loc) 12 kB
'use strict'; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactClass = require('react-class'); var _reactClass2 = _interopRequireDefault(_reactClass); var _objectAssign = require('object-assign'); var _objectAssign2 = _interopRequireDefault(_objectAssign); var _reactFlex = require('react-flex'); var _reactField = require('react-field'); var _reactField2 = _interopRequireDefault(_reactField); var _reactDatePicker = require('react-date-picker'); var _reactDatePicker2 = _interopRequireDefault(_reactDatePicker); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var toUpperFirst = require('./toUpperFirst'); var toMoment = require('./toMoment'); var isDate = require('./isDate'); var isMoment = require('./isMoment'); var CONFIG = require('./config'); function emptyFn() {} var Utils = require('react-field-component-utils'); module.exports = _react2.default.createClass({ displayName: 'ReactDateField', mixins: [Utils], getInitialState: function getInitialState() { return { defaultValue: this.props.defaultValue, pickerVisible: this.props.defaultPickerVisible }; }, getDefaultProps: function getDefaultProps() { return { constrainTo: true, validate: true, calendarToolColor: '#a8a8a8', calendarToolOverColor: '#7F7C7C', calendarToolWidth: 15, showPickerOnFocus: true, dateFormat: CONFIG.dateFormat, strict: true, defaultStyle: { display: 'inline-block' }, defaultFieldStyle: { width: '100%' }, defaultPickerFactory: DatePickerFactory, defaultPickerStyle: { background: 'white', zIndex: 1, position: 'absolute', left: 0, top: '100%' } }; }, render: function render() { this.toMoment = function (value, config) { return toMoment(value, this.props.dateFormat, config || { strict: this.props.strict }); }; var state = this.state; var props = this.prepareProps(this.props, state); var picker = this.renderPicker(props, state); var hiddenField = this.renderHiddenField(props, state); return _react2.default.createElement( 'div', this.prepareWrapperProps(props, state), hiddenField, _react2.default.createElement( Field, props.fieldProps, picker ) ); }, renderPicker: function renderPicker(props, state) { return this._renderPicker(props, state); }, renderHiddenField: function renderHiddenField(props, state) { return props.hiddenName ? _react2.default.createElement('input', { type: 'hidden', value: this.getValue(props, state), name: props.hiddenName }) : null; }, format: function format(moment) { return moment.format(this.props.dateFormat); }, prepareProps: function prepareProps(thisProps, state) { var props = {}; (0, _objectAssign2.default)(props, thisProps); props.value = this.prepareValue(props, state); props.tools = this.renderTools; props.style = this.prepareStyle(props); props.fieldProps = this.prepareFieldProps(props, state); props.pickerProps = this.preparePickerProps(props); return props; }, renderTools: function renderTools(props, clearTool) { var calendarTool = props.renderCalendarTool || this.renderCalendarTool; return [clearTool, calendarTool(props)]; }, renderCalendarTool: function renderCalendarTool(props) { if (props.disabled || props.readOnly) { return; } var state = this.state; var color = state.calendarToolMouseOver ? props.calendarToolOverColor : props.calendarToolColor; var width = props.calendarToolWidth; var style = normalize({ position: 'relative', display: 'flex', flexFlow: 'row', alignItems: 'stretch', cursor: 'pointer', padding: '7px 5px 5px 5px', boxSizing: 'border-box' }); var innerStyle = { width: width, borderColor: color, borderStyle: 'solid', borderWidth: '4px 2px 2px 2px', boxSizing: 'border-box', position: 'relative' }; var topMarkerStyle = { borderColor: color, borderStyle: 'solid', borderWidth: '0px 3px 0px 3px', boxSizing: 'border-box', height: 5, right: 1, left: 1, top: -6, position: 'absolute' }; var centerMarkerStyle = { position: 'absolute', bottom: 2, right: 2, width: 4, height: 4, background: color }; return _react2.default.createElement( 'div', { style: style, key: 'calendarTool', onMouseEnter: this.handleCalendarToolMouseEnter, onMouseLeave: this.handleCalendarToolMouseLeave, onClick: this.handleCalendarToolClick, onMouseDown: this.handleCalendarToolMouseDown }, _react2.default.createElement( 'div', { style: innerStyle }, _react2.default.createElement('div', { style: topMarkerStyle }), _react2.default.createElement('div', { style: centerMarkerStyle }) ) ); }, handleCalendarToolMouseEnter: function handleCalendarToolMouseEnter() { this.setState({ calendarToolMouseOver: true }); }, handleCalendarToolMouseLeave: function handleCalendarToolMouseLeave() { this.setState({ calendarToolMouseOver: false }); }, handleCalendarToolClick: function handleCalendarToolClick() { this.togglePicker(); }, handleCalendarToolMouseDown: function handleCalendarToolMouseDown(event) { event.preventDefault(); }, prepareValue: function prepareValue(props, state) { var value = this.getValue(props, state); props.strictMoment = this.toMoment(value, { strict: true }); props.moment = props.strictMoment.isValid() ? this.toMoment(props.strictMoment) : this.toMoment(value); if (isDate(value) || typeof value == 'number' || isMoment(value)) { value = this.format(props.moment); } var valid = true; if (props.strictMoment.isValid()) { value = this.format(props.moment); } else if (!props.moment.isValid()) { valid = false; // delete props.moment } props.valid = valid; return value; }, preparePickerProps: function preparePickerProps(props) { var pickerProps = this._preparePickerProps(props); if (props.valid) { pickerProps.date = props.moment; } pickerProps.onMouseDown = this.handlePickerMouseDown.bind(this, props, pickerProps); pickerProps.onChange = this.handlePickerChange.bind(this, props, pickerProps); // pickerProps.style.position return pickerProps; }, handlePickerMouseDown: function handlePickerMouseDown(props, pickerProps, event) { var initialPickerProps = this.props.pickerProps; if (initialPickerProps && initialPickerProps.onMouseDown) { initialPickerProps.onMouseDown(event); } event.preventDefault(); }, handlePickerChange: function handlePickerChange(props, pickerProps, text, moment) { var initialPickerProps = this.props.pickerProps || {}; var args = [].slice.call(arguments, 2);(initialPickerProps.onChange || emptyFn).apply(null, args); this.notify(text); this.setPickerVisible(false); }, prepareFieldProps: function prepareFieldProps(props, state) { var fieldProps = this._prepareFieldProps(props, state); fieldProps.value = props.value; if (fieldProps.validate === true) { fieldProps.validate = function () { return props.strictMoment.isValid(); }; } return fieldProps; }, prepareStyle: function prepareStyle(props) { var style = {}; (0, _objectAssign2.default)(style, props.defaultStyle, props.style); return style; }, getValue: function getValue(props, state) { return props.value === undefined ? state.defaultValue : props.value; }, handleKeyDown: function handleKeyDown(props, event) { var key = event.key; var fn = 'handle' + toUpperFirst(key) + 'KeyDown'; if (this[fn]) { this[fn](props, event); } }, handleChange: function handleChange(props, value, fieldProps, event) { if (props.readOnly && event && event.type == 'input') { //cancel change event from input return; } var moment = this.toMoment(value); if (this.props.value === undefined) { this.setState({ defaultValue: value }); } var args = [value, moment, event];(props.onChange || emptyFn).apply(null, args); var fieldProps = this.props.fieldProps || {};(fieldProps.onChange || emptyFn).apply(null, args); }, prepareWrapperProps: function prepareWrapperProps(props) { var wrapperProps = this._prepareWrapperProps.apply(this, arguments); wrapperProps.style = this.prepareWrapperStyle(props, wrapperProps); return wrapperProps; }, prepareWrapperStyle: function prepareWrapperStyle(props, wrapperProps) { var style = (0, _objectAssign2.default)({}, wrapperProps.style); if (style.position != 'absolute') { //in order for the style.position = 'relative'; } return style; }, notify: function notify() { return this._notify.apply(this, arguments); }, focus: function focus() { return this._focus.apply(this, arguments); }, getInput: function getInput() { return this._getInput.apply(this, arguments); }, isFocused: function isFocused() { return this._isFocused.apply(this, arguments); }, handleFocus: function handleFocus(event) { if (this.props.showPickerOnFocus) { this.setPickerVisible(true); } var fieldProps = this.props.fieldProps; if (fieldProps && fieldProps.onFocus) { fieldProps.onFocus(event); } if (this.props.onFocus) { this.props.onFocus(event); } }, handleBlur: function handleBlur(event) { this.setPickerVisible(false); var fieldProps = this.props.fieldProps; if (fieldProps && fieldProps.onBlur) { fieldProps.onBlur(event); } if (this.props.onBlur) { this.props.onBlur(event); } }, isPickerVisible: function isPickerVisible() { return this._isPickerVisible(); }, setPickerVisible: function setPickerVisible(bool) { if (bool != this.state.pickerVisible) { var value = this.getValue(this.props, this.state); var fn = bool ? this.props.onPickerShow : this.props.onPickerHide;(fn || emptyFn)(value); this.setState({ pickerVisible: bool }); } }, togglePicker: function togglePicker() { this.setState({ pickerVisible: !this.state.pickerVisible }); } });