UNPKG

material-ui-arabic-datepicker

Version:

React components, that implements material design date and time pickers for material-ui v1 including a customized Datepicker with arabic header, months and weekdays and English numbers, modfied implementation from materail-ui-pickers

335 lines (267 loc) 10.9 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.Calendar = undefined; var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _withStyles = require('@material-ui/core/styles/withStyles'); var _withStyles2 = _interopRequireDefault(_withStyles); var _reactEventListener = require('react-event-listener'); var _reactEventListener2 = _interopRequireDefault(_reactEventListener); var _keycode = require('keycode'); var _keycode2 = _interopRequireDefault(_keycode); var _CalendarHeader = require('./CalendarHeader'); var _CalendarHeader2 = _interopRequireDefault(_CalendarHeader); var _propTypes3 = require('../constants/prop-types'); var _propTypes4 = _interopRequireDefault(_propTypes3); var _DayWrapper = require('./DayWrapper'); var _DayWrapper2 = _interopRequireDefault(_DayWrapper); var _Day = require('./Day'); var _Day2 = _interopRequireDefault(_Day); var _WithUtils = require('../_shared/WithUtils'); var _WithUtils2 = _interopRequireDefault(_WithUtils); var _dateUtils = require('../_helpers/date-utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable no-unused-expressions */ var Calendar = exports.Calendar = function (_Component) { (0, _inherits3.default)(Calendar, _Component); function Calendar() { var _ref; var _temp, _this, _ret; (0, _classCallCheck3.default)(this, Calendar); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = Calendar.__proto__ || (0, _getPrototypeOf2.default)(Calendar)).call.apply(_ref, [this].concat(args))), _this), _this.state = { currentMonth: _this.props.utils.getStartOfMonth(_this.props.date) }, _this.onDateSelect = function (day) { var _this$props = _this.props, date = _this$props.date, utils = _this$props.utils; var withHours = utils.setHours(day, utils.getHours(date)); var withMinutes = utils.setMinutes(withHours, utils.getMinutes(date)); _this.props.onChange(withMinutes); }, _this.handleChangeMonth = function (newMonth) { _this.setState({ currentMonth: newMonth }); }, _this.validateMinMaxDate = function (day) { var _this$props2 = _this.props, minDate = _this$props2.minDate, maxDate = _this$props2.maxDate, utils = _this$props2.utils; return minDate && utils.isBeforeDay(day, utils.date(minDate)) || maxDate && utils.isAfterDay(day, utils.date(maxDate)); }, _this.shouldDisablePrevMonth = function () { var _this$props3 = _this.props, utils = _this$props3.utils, disablePast = _this$props3.disablePast, minDate = _this$props3.minDate; var now = utils.date(); return !utils.isBefore(utils.getStartOfMonth(disablePast && utils.isAfter(now, minDate) ? now : utils.date(minDate)), _this.state.currentMonth); }, _this.shouldDisableNextMonth = function () { var _this$props4 = _this.props, utils = _this$props4.utils, disableFuture = _this$props4.disableFuture, maxDate = _this$props4.maxDate; var now = utils.date(); return !utils.isAfter(utils.getStartOfMonth(disableFuture && utils.isBefore(now, maxDate) ? now : utils.date(maxDate)), _this.state.currentMonth); }, _this.shouldDisableDate = function (day) { var _this$props5 = _this.props, disablePast = _this$props5.disablePast, disableFuture = _this$props5.disableFuture, shouldDisableDate = _this$props5.shouldDisableDate, utils = _this$props5.utils; return disableFuture && utils.isAfterDay(day, utils.date()) || disablePast && utils.isBeforeDay(day, utils.date()) || _this.validateMinMaxDate(day) || shouldDisableDate(day); }, _this.moveToDay = function (day) { if (day && !_this.shouldDisableDate(day)) { _this.props.onChange(day); } }, _this.handleKeyDown = function (event) { var _this$props6 = _this.props, theme = _this$props6.theme, date = _this$props6.date, utils = _this$props6.utils; switch ((0, _keycode2.default)(event)) { case 'up': _this.moveToDay(utils.addDays(date, -7)); break; case 'down': _this.moveToDay(utils.addDays(date, 7)); break; case 'left': theme.direction === 'ltr' ? _this.moveToDay(utils.addDays(date, -1)) : _this.moveToDay(utils.addDays(date, 1)); break; case 'right': theme.direction === 'ltr' ? _this.moveToDay(utils.addDays(date, 1)) : _this.moveToDay(utils.addDays(date, -1)); break; default: // if keycode is not handled, stop execution return; } // if event was handled prevent other side effects (e.g. page scroll) event.preventDefault(); }, _this.renderWeeks = function () { var utils = _this.props.utils; var currentMonth = _this.state.currentMonth; var weeks = utils.getWeekArray(currentMonth); return weeks.map(function (week) { return _react2.default.createElement( 'div', { key: 'week-' + week[0].toString(), className: _this.props.classes.week }, _this.renderDays(week) ); }); }, _this.renderDays = function (week) { var _this$props7 = _this.props, date = _this$props7.date, renderDay = _this$props7.renderDay, utils = _this$props7.utils; var selectedDate = utils.startOfDay(date); var currentMonthNumber = utils.getMonth(_this.state.currentMonth); var now = utils.date(); return week.map(function (day) { var disabled = _this.shouldDisableDate(day); var dayInCurrentMonth = utils.getMonth(day) === currentMonthNumber; var dayComponent = _react2.default.createElement( _Day2.default, { current: utils.isSameDay(day, now), hidden: !dayInCurrentMonth, disabled: disabled, selected: utils.isSameDay(selectedDate, day) }, utils.getDayText(day) ); if (renderDay) { dayComponent = renderDay(day, selectedDate, dayInCurrentMonth, dayComponent); } return _react2.default.createElement( _DayWrapper2.default, { key: day.toString(), value: day, dayInCurrentMonth: dayInCurrentMonth, disabled: disabled, onSelect: _this.onDateSelect }, dayComponent ); }); }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret); } (0, _createClass3.default)(Calendar, [{ key: 'componentDidMount', value: function componentDidMount() { var _props = this.props, date = _props.date, minDate = _props.minDate, maxDate = _props.maxDate, utils = _props.utils, disableFuture = _props.disableFuture, disablePast = _props.disablePast; if (this.shouldDisableDate(date)) { this.onDateSelect((0, _dateUtils.findClosestEnabledDate)({ date: date, utils: utils, minDate: minDate, maxDate: maxDate, disablePast: disablePast, disableFuture: disableFuture, shouldDisableDate: this.shouldDisableDate })); } } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { this.setState({ currentMonth: this.props.utils.getStartOfMonth(nextProps.date) }); } }, { key: 'render', value: function render() { var currentMonth = this.state.currentMonth; var _props2 = this.props, classes = _props2.classes, utils = _props2.utils; return _react2.default.createElement( _react.Fragment, null, _react2.default.createElement(_reactEventListener2.default, { target: 'window', onKeyDown: this.handleKeyDown }), _react2.default.createElement(_CalendarHeader2.default, { currentMonth: currentMonth, onMonthChange: this.handleChangeMonth, leftArrowIcon: this.props.leftArrowIcon, rightArrowIcon: this.props.rightArrowIcon, disablePrevMonth: this.shouldDisablePrevMonth(), disableNextMonth: this.shouldDisableNextMonth(), utils: utils }), _react2.default.createElement( 'div', { className: classes.calendar }, this.renderWeeks() ) ); } }]); return Calendar; }(_react.Component); Calendar.propTypes = { date: _propTypes2.default.object.isRequired, minDate: _propTypes4.default.date, maxDate: _propTypes4.default.date, classes: _propTypes2.default.object.isRequired, onChange: _propTypes2.default.func.isRequired, disablePast: _propTypes2.default.bool, disableFuture: _propTypes2.default.bool, leftArrowIcon: _propTypes2.default.node, rightArrowIcon: _propTypes2.default.node, renderDay: _propTypes2.default.func, theme: _propTypes2.default.object.isRequired, shouldDisableDate: _propTypes2.default.func, utils: _propTypes2.default.object.isRequired }; Calendar.defaultProps = { minDate: '1900-01-01', maxDate: '2100-01-01', disablePast: false, disableFuture: false, leftArrowIcon: undefined, rightArrowIcon: undefined, renderDay: undefined, shouldDisableDate: function shouldDisableDate() { return false; } }; var styles = function styles(theme) { return { calendar: { height: 36 * 6, marginTop: theme.spacing.unit * 1.5 }, week: { display: 'flex', justifyContent: 'center' } }; }; exports.default = (0, _withStyles2.default)(styles, { name: 'MuiPickersCalendar', withTheme: true })((0, _WithUtils2.default)()(Calendar));