react-date-picker
Version:
A carefully crafted date picker for React
451 lines (348 loc) • 13.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactClass = require('react-class');
var _reactClass2 = _interopRequireDefault(_reactClass);
var _reactFlex = require('react-flex');
var _reactInlineBlock = require('react-inline-block');
var _reactInlineBlock2 = _interopRequireDefault(_reactInlineBlock);
var _objectAssign = require('object-assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _assignDefined = require('./assignDefined');
var _assignDefined2 = _interopRequireDefault(_assignDefined);
var _toMoment2 = require('./toMoment');
var _toMoment3 = _interopRequireDefault(_toMoment2);
var _join = require('./join');
var _join2 = _interopRequireDefault(_join);
var _bemFactory = require('./bemFactory');
var _bemFactory2 = _interopRequireDefault(_bemFactory);
var _HistoryView = require('./HistoryView');
var _HistoryView2 = _interopRequireDefault(_HistoryView);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var ARROWS = {
prev: _react2.default.createElement(
'svg',
{ height: '24', viewBox: '0 0 24 24', width: '24' },
_react2.default.createElement('path', { d: 'M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z' }),
_react2.default.createElement('path', { d: 'M0 0h24v24H0z', fill: 'none' })
),
next: _react2.default.createElement(
'svg',
{ height: '24', viewBox: '0 0 24 24', width: '24' },
_react2.default.createElement('path', { d: 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z' }),
_react2.default.createElement('path', { d: 'M0 0h24v24H0z', fill: 'none' })
)
};
var bem = (0, _bemFactory2.default)('react-date-picker__nav-bar');
var NavBar = function (_Component) {
_inherits(NavBar, _Component);
function NavBar(props) {
_classCallCheck(this, NavBar);
var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(NavBar).call(this, props));
_this.state = {
viewDate: props.defaultViewDate
};
return _this;
}
_createClass(NavBar, [{
key: 'prepareViewDate',
value: function prepareViewDate(props) {
return props.viewDate === undefined ? this.state.viewDate : props.viewDate;
}
}, {
key: 'render',
value: function render() {
var props = this.p = (0, _objectAssign2.default)({}, this.props);
var viewMoment = props.viewMoment = props.viewMoment || this.toMoment(this.prepareViewDate(props));
props.historyViewEnabled = props.expandedHistoryView || props.enableHistoryView;
var secondary = props.secondary;
var className = (0, _join2.default)(props.className, bem(), bem(null, 'theme-' + props.theme), props.historyViewEnabled && bem(null, 'with-history-view'));
var historyView = props.historyViewEnabled ? this.renderHistoryView() : null;
var flexProps = (0, _objectAssign2.default)({}, props);
delete flexProps.arrows;
delete flexProps.date;
delete flexProps.enableHistoryView;
delete flexProps.historyViewEnabled;
delete flexProps.isDatePickerNavBar;
delete flexProps.minDate;
delete flexProps.maxDate;
delete flexProps.navDateFormat;
delete flexProps.onNavClick;
delete flexProps.onViewDateChange;
delete flexProps.secondary;
delete flexProps.theme;
delete flexProps.viewDate;
delete flexProps.viewMoment;
if (typeof props.cleanup == 'function') {
props.cleanup(flexProps);
}
return _react2.default.createElement(
_reactFlex.Flex,
_extends({ inline: true, row: true }, flexProps, { className: className }),
secondary && this.renderNav(-2, viewMoment),
this.renderNav(-1, viewMoment),
_react2.default.createElement(
_reactFlex.Item,
{
className: bem('date'),
style: { textAlign: 'center' },
onMouseDown: props.historyViewEnabled ? this.toggleHistoryView : null
},
this.renderNavDate(viewMoment)
),
this.renderNav(1, viewMoment),
secondary && this.renderNav(2, viewMoment),
historyView
);
}
}, {
key: 'renderHistoryView',
value: function renderHistoryView() {
var _this2 = this;
if (!this.state.historyView) {
return null;
}
var className = bem('history-view');
var _p = this.p;
var viewMoment = _p.viewMoment;
var theme = _p.theme;
var minDate = _p.minDate;
var maxDate = _p.maxDate;
var historyViewProps = (0, _assignDefined2.default)({
defaultViewDate: viewMoment,
defaultDate: viewMoment,
ref: function ref(view) {
_this2.historyView = view;
},
focusDecadeView: false,
className: className,
theme: theme,
onOkClick: this.onHistoryViewOk,
onCancelClick: this.onHistoryViewCancel
}, {
minDate: minDate,
maxDate: maxDate
});
if (this.props.renderHistoryView) {
return this.props.renderHistoryView(historyViewProps);
}
return _react2.default.createElement(_HistoryView2.default, historyViewProps);
}
}, {
key: 'toggleHistoryView',
value: function toggleHistoryView(event) {
if (this.isHistoryViewVisible()) {
this.hideHistoryView(event);
} else {
this.showHistoryView(event);
}
}
}, {
key: 'getHistoryView',
value: function getHistoryView() {
return this.historyView;
}
}, {
key: 'isHistoryViewVisible',
value: function isHistoryViewVisible() {
return !!this.historyView;
}
}, {
key: 'onHistoryViewOk',
value: function onHistoryViewOk(dateString, _ref) {
var dateMoment = _ref.dateMoment;
var timestamp = _ref.timestamp;
this.hideHistoryView();
this.onViewDateChange({ dateMoment: dateMoment, timestamp: timestamp });
}
}, {
key: 'onHistoryViewCancel',
value: function onHistoryViewCancel() {
this.hideHistoryView();
}
}, {
key: 'showHistoryView',
value: function showHistoryView(event) {
event.preventDefault();
this.setState({
historyView: true
});
if (this.props.onShowHistoryView) {
this.props.onShowHistoryView();
}
}
}, {
key: 'hideHistoryView',
value: function hideHistoryView(event) {
if (event && event.preventDefault) {
event.preventDefault();
}
this.setState({
historyView: false
});
if (this.props.onHideHistoryView) {
this.props.onHideHistoryView();
}
}
}, {
key: 'toMoment',
value: function toMoment(value, props) {
props = props || this.props;
return (0, _toMoment3.default)(value, {
locale: props.locale,
dateFormat: props.dateFormat
});
}
}, {
key: 'renderNav',
value: function renderNav(dir, viewMoment) {
var props = this.p;
var name = dir < 0 ? 'prev' : 'next';
var disabled = dir < 0 ? props.prevDisabled : props.nextDisabled;
var secondary = Math.abs(dir) == 2;
if (dir < 0 && props.minDate) {
var gotoMoment = this.getGotoMoment(dir, viewMoment).endOf('month');
if (gotoMoment.isBefore(this.toMoment(props.minDate))) {
disabled = true;
}
}
if (dir > 0 && props.maxDate) {
var _gotoMoment = this.getGotoMoment(dir, viewMoment).startOf('month');
if (_gotoMoment.isAfter(this.toMoment(props.maxDate))) {
disabled = true;
}
}
if (this.state.historyView) {
disabled = true;
}
var className = [bem('arrow'), bem('arrow--' + name), secondary && bem('secondary-arrow'), disabled && bem('arrow--disabled')];
var arrow = props.arrows[dir] || props.arrows[name] || ARROWS[name];
var children = void 0;
if (secondary) {
var dirArrow = props.arrows[dir];
if (dirArrow) {
children = dirArrow;
} else {
var secondArrow = _react2.default.createElement(
_reactInlineBlock2.default,
{ style: _defineProperty({ position: 'absolute' }, dir < 0 ? 'left' : 'left', 7) },
arrow
);
children = dir < 0 ? [secondArrow, arrow] : [secondArrow, arrow];
}
} else {
children = arrow;
}
var navProps = {
dir: dir,
name: name,
disabled: disabled,
className: (0, _join2.default)(className),
onClick: !disabled && this.onNavClick.bind(this, dir, viewMoment),
children: children
};
if (props.renderNav) {
return props.renderNav(navProps);
}
if (dir < 0 && props.renderNavPrev) {
return props.renderNavPrev(navProps);
}
if (dir > 0 && props.renderNavNext) {
return props.renderNavNext(navProps);
}
return _react2.default.createElement(_reactInlineBlock2.default, _extends({}, navProps, {
disabled: null,
name: null
}));
}
}, {
key: 'getGotoMoment',
value: function getGotoMoment(dir, viewMoment) {
viewMoment = viewMoment || this.p.viewMoment;
var sign = dir < 0 ? -1 : 1;
var abs = Math.abs(dir);
var mom = this.toMoment(viewMoment);
mom.add(sign, abs == 1 ? 'month' : 'year');
return mom;
}
}, {
key: 'onNavClick',
value: function onNavClick(dir, viewMoment, event) {
var props = this.props;
var dateMoment = this.toMoment(viewMoment);
if (props.onUpdate) {
dateMoment = props.onUpdate(dateMoment, dir);
} else {
var sign = dir < 0 ? -1 : 1;
var abs = Math.abs(dir);
dateMoment.add(sign, abs == 1 ? 'month' : 'year');
}
var timestamp = +dateMoment;
props.onNavClick(dir, viewMoment, event);
var disabled = dir < 0 ? props.prevDisabled : props.nextDisabled;
if (disabled) {
return;
}
this.onViewDateChange({
dateMoment: dateMoment,
timestamp: timestamp
});
}
}, {
key: 'renderNavDate',
value: function renderNavDate(viewMoment) {
var props = this.props;
var text = viewMoment.format(props.navDateFormat);
if (props.renderNavDate) {
return props.renderNavDate(viewMoment, text);
}
return text;
}
}, {
key: 'onViewDateChange',
value: function onViewDateChange(_ref3) {
var dateMoment = _ref3.dateMoment;
var timestamp = _ref3.timestamp;
if (this.props.viewDate === undefined) {
this.setState({
viewDate: timestamp
});
}
if (this.props.onViewDateChange) {
var dateString = dateMoment.format(this.props.dateFormat);
this.props.onViewDateChange(dateString, { dateString: dateString, dateMoment: dateMoment, timestamp: timestamp });
}
}
}]);
return NavBar;
}(_reactClass2.default);
exports.default = NavBar;
NavBar.defaultProps = {
arrows: {},
theme: 'default',
isDatePickerNavBar: true,
navDateFormat: 'MMM YYYY',
enableHistoryView: true,
onNavClick: function onNavClick(dir, viewMoment) {},
onViewDateChange: function onViewDateChange() {}
};
NavBar.propTypes = {
secondary: _react.PropTypes.bool,
renderNav: _react.PropTypes.func,
renderNavPrev: _react.PropTypes.func,
renderNavNext: _react.PropTypes.func,
arrows: _react.PropTypes.object,
navDateFormat: _react.PropTypes.string,
onUpdate: _react.PropTypes.func,
onNavClick: _react.PropTypes.func,
onViewDateChange: _react.PropTypes.func
};