thinkful-ui
Version:
Shared UI resources for Thinkful.
277 lines (235 loc) • 11.3 kB
JavaScript
;
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;