UNPKG

thinkful-ui

Version:

Shared UI resources for Thinkful.

277 lines (235 loc) 11.3 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var cx = require('classnames'); var _ = require('lodash'); var moment = require('moment-timezone'); var PropTypes = require('prop-types'); var React = require('react'); var Icon = require('../Icon'); // We get the day of the year here to avoid calling for each `Day` var TODAY = moment(); var Day = function Day(_ref) { var date = _ref.date, unclickable = _ref.unclickable, otherMonth = _ref.otherMonth, active = _ref.active, onClick = _ref.onClick; var isToday = date.year() === TODAY.year() && date.dayOfYear() === TODAY.dayOfYear(); var classes = cx('day', { 'other-month': otherMonth, active: active, today: moment().dayOfYear() === moment(date).dayOfYear(), unclickable: unclickable }); return /*#__PURE__*/React.createElement("div", { className: classes, onClick: onClick }, date.date() === 1 && /*#__PURE__*/React.createElement("div", { className: "day-tiny-text" }, date.format('MMM')), isToday && /*#__PURE__*/React.createElement("div", { className: "day-tiny-text" }, "Today"), date.date()); }; Day.propTypes = { active: PropTypes.bool, date: PropTypes.object.isRequired, onClick: PropTypes.func, otherMonth: PropTypes.bool, unclickable: PropTypes.bool }; var DatePicker = /*#__PURE__*/function (_React$Component) { _inherits(DatePicker, _React$Component); var _super = _createSuper(DatePicker); function DatePicker() { var _this; _classCallCheck(this, DatePicker); _this = _super.call(this); _this._checkClickAway = _this._checkClickAway.bind(_assertThisInitialized(_this)); _this._generateDays = _this._generateDays.bind(_assertThisInitialized(_this)); _this._handleClick = _this._handleClick.bind(_assertThisInitialized(_this)); _this._navigateForward = _this._navigateForward.bind(_assertThisInitialized(_this)); _this._navigateBack = _this._navigateBack.bind(_assertThisInitialized(_this)); _this._toggleOpen = _this._toggleOpen.bind(_assertThisInitialized(_this)); _this.state = { activeIndex: null, days: [], monthsNavigated: 0, value: null, visible: false }; return _this; } _createClass(DatePicker, [{ key: "componentDidMount", value: function componentDidMount() { this._generateDays(this.props.defaultDate); document.addEventListener('click', this._checkClickAway.bind(this)); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { document.removeEventListener('click', this._checkClickAway.bind(this)); } }, { key: "componentWillReceiveProps", value: function componentWillReceiveProps(newProps) { if (this.props.defaultDate.dayOfYear() !== newProps.defaultDate.dayOfYear()) { this._generateDays(newProps.defaultDate); } } }, { key: "_checkClickAway", value: function _checkClickAway(event) { // Close the picker if the click wasn't on the dropdown button or calendar if (this.dropdownButton && !this.dropdownButton.contains(event.target) && this.calendar && !this.calendar.contains(event.target)) { this.setState({ visible: false }); } } }, { key: "_generateDays", value: function _generateDays() { var defaultDate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var _this$state = this.state, monthsNavigated = _this$state.monthsNavigated, activeIndex = _this$state.activeIndex; // If called on initial render, check defaultDate to determine if calendar // should start on a month different than the current one if (defaultDate) { monthsNavigated = defaultDate.month() - moment().month(); } var startDay = moment().add(monthsNavigated, 'month').startOf('month').startOf('week').startOf('day'); var endDay = moment().add(monthsNavigated, 'month').endOf('month').endOf('week').startOf('day'); var totalDays = endDay.diff(startDay, 'days') + 1; var days = _.map(Array(totalDays), function (i, idx) { return { dateObj: moment(startDay).add(idx, 'day'), dayOfYear: moment(startDay).add(idx, 'day').dayOfYear() }; }); // Keep existing activeIndex if it is defined and a new defaultDate has not come thru activeIndex = !!defaultDate || !activeIndex || activeIndex === -1 ? _.findIndex(days, { dayOfYear: moment(defaultDate || '').dayOfYear() }) : activeIndex; this.setState({ days: days, activeIndex: activeIndex, monthsNavigated: monthsNavigated }); } }, { key: "_handleClick", value: function _handleClick(event, newDay) { var days = this.state.days; var handleChange = this.props.handleChange; var newActiveIndex = _.findIndex(days, { dayOfYear: newDay }); this.setState({ activeIndex: newActiveIndex, value: days[newActiveIndex].dateObj }); this._toggleOpen(); handleChange(days[newActiveIndex].dateObj); } }, { key: "_navigateForward", value: function _navigateForward() { this.state.monthsNavigated = this.state.monthsNavigated + 1; this._generateDays(); } }, { key: "_navigateBack", value: function _navigateBack() { this.state.monthsNavigated = this.state.monthsNavigated - 1; this._generateDays(); } }, { key: "_toggleOpen", value: function _toggleOpen() { this.setState({ visible: !this.state.visible }); } }, { key: "render", value: function render() { var _this2 = this; var _this$props = this.props, className = _this$props.className, placeholder = _this$props.placeholder; var _this$state2 = this.state, days = _this$state2.days, activeIndex = _this$state2.activeIndex, monthsNavigated = _this$state2.monthsNavigated, value = _this$state2.value, visible = _this$state2.visible; var activeDay = days[activeIndex] && days[activeIndex].dateObj || moment(); var datePickerClasses = cx('date-picker', { hidden: !visible }); return /*#__PURE__*/React.createElement("div", { className: cx("date-picker-container", className) }, /*#__PURE__*/React.createElement("div", { className: "button date-picker-button", onClick: this._toggleOpen.bind(this), ref: function ref(c) { return _this2.dropdownButton = c; } }, !value && placeholder || activeDay.format('MM.DD.YYYY'), /*#__PURE__*/React.createElement(Icon, { name: "navigatedown" })), /*#__PURE__*/React.createElement("div", { className: datePickerClasses, ref: function ref(c) { return _this2.calendar = c; } }, /*#__PURE__*/React.createElement(Icon, { name: "navigateleft", onClick: this._navigateBack.bind(this) }), /*#__PURE__*/React.createElement(Icon, { name: "navigateright", onClick: this._navigateForward.bind(this) }), /*#__PURE__*/React.createElement("div", { className: "selected-day" }, moment(activeDay).format('dddd, MMMM Do')), /*#__PURE__*/React.createElement("div", { className: "day-headings" }, ['S', 'M', 'T', 'W', 'H', 'F', 'S'].map(function (day, key) { return /*#__PURE__*/React.createElement("div", { key: key, className: "day-heading" }, day); })), /*#__PURE__*/React.createElement("div", { className: "days-container" }, days.map(function (day, key) { return /*#__PURE__*/React.createElement(Day, { date: day.dateObj, key: key, active: key === activeIndex, otherMonth: day.dateObj.month() !== moment().add(monthsNavigated, 'month').month(), unclickable: false, onClick: function onClick(event) { return _this2._handleClick(event, day.dayOfYear); } }); })))); } }]); return DatePicker; }(React.Component); DatePicker.defaultProps = { className: PropTypes.string, defaultDate: PropTypes.object, placeholder: PropTypes.string }; DatePicker.defaultProps = { defaultDate: moment() }; module.exports = DatePicker;