From efa01089ec6281dae274459151cf03062e987753 Mon Sep 17 00:00:00 2001 From: Jeffrey Fan Date: Mon, 8 Aug 2016 00:10:10 +0800 Subject: [PATCH 1/9] Add RC.DatePicker/RC.DayPickerInput/RC.Portal component --- .../client/lib/RC.DayPicker/DayPicker.js | 1548 +++++++++++++++++ .../lib/RC.DayPicker/DayPickerInput.jsx | 141 ++ .../client/lib/RC.DayPicker/style.css | 122 ++ .../client/lib/RC.Portal/Portal.jsx | 34 + 4 files changed, 1845 insertions(+) create mode 100644 source/mobile-base/client/lib/RC.DayPicker/DayPicker.js create mode 100644 source/mobile-base/client/lib/RC.DayPicker/DayPickerInput.jsx create mode 100644 source/mobile-base/client/lib/RC.DayPicker/style.css create mode 100644 source/mobile-base/client/lib/RC.Portal/Portal.jsx diff --git a/source/mobile-base/client/lib/RC.DayPicker/DayPicker.js b/source/mobile-base/client/lib/RC.DayPicker/DayPicker.js new file mode 100644 index 00000000..20b91f32 --- /dev/null +++ b/source/mobile-base/client/lib/RC.DayPicker/DayPicker.js @@ -0,0 +1,1548 @@ +window.DayPicker = RC.DayPicker = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + /* eslint-disable no-var */ + /* eslint-env node */ + + var DayPicker = __webpack_require__(1); + var DateUtils = __webpack_require__(10); + var LocaleUtils = __webpack_require__(11); + var Weekday = __webpack_require__(13); + var Navbar = __webpack_require__(6); + var PropTypes = __webpack_require__(5); + + module.exports = DayPicker.default || DayPicker; + module.exports.DateUtils = DateUtils.default || DateUtils; + module.exports.LocaleUtils = LocaleUtils.default || LocaleUtils; + module.exports.WeekdayPropTypes = Weekday.WeekdayPropTypes; + module.exports.NavbarPropTypes = Navbar.NavbarPropTypes; + module.exports.PropTypes = PropTypes; + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + '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 = __webpack_require__(2); + + var _react2 = _interopRequireDefault(_react); + + var _reactIsDeprecated = __webpack_require__(3); + + var _Caption = __webpack_require__(4); + + var _Caption2 = _interopRequireDefault(_Caption); + + var _Navbar = __webpack_require__(6); + + var _Navbar2 = _interopRequireDefault(_Navbar); + + var _Month = __webpack_require__(7); + + var _Month2 = _interopRequireDefault(_Month); + + var _Day = __webpack_require__(12); + + var _Day2 = _interopRequireDefault(_Day); + + var _Weekday = __webpack_require__(13); + + var _Weekday2 = _interopRequireDefault(_Weekday); + + var _Helpers = __webpack_require__(9); + + var Helpers = _interopRequireWildcard(_Helpers); + + var _DateUtils = __webpack_require__(10); + + var DateUtils = _interopRequireWildcard(_DateUtils); + + var _LocaleUtils = __webpack_require__(11); + + var LocaleUtils = _interopRequireWildcard(_LocaleUtils); + + var _keys = __webpack_require__(14); + + var _keys2 = _interopRequireDefault(_keys); + + var _PropTypes = __webpack_require__(5); + + var _PropTypes2 = _interopRequireDefault(_PropTypes); + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + + function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + + 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 DayPicker = function (_Component) { + _inherits(DayPicker, _Component); + + function DayPicker(props) { + _classCallCheck(this, DayPicker); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(DayPicker).call(this, props)); + + _initialiseProps.call(_this); + + _this.renderDayInMonth = _this.renderDayInMonth.bind(_this); + _this.showNextMonth = _this.showNextMonth.bind(_this); + _this.showPreviousMonth = _this.showPreviousMonth.bind(_this); + + _this.handleKeyDown = _this.handleKeyDown.bind(_this); + _this.handleDayClick = _this.handleDayClick.bind(_this); + _this.handleDayKeyDown = _this.handleDayKeyDown.bind(_this); + + _this.state = _this.getStateFromProps(props); + return _this; + } + + _createClass(DayPicker, [{ + key: 'componentWillReceiveProps', + value: function componentWillReceiveProps(nextProps) { + if (this.props.initialMonth !== nextProps.initialMonth) { + this.setState(this.getStateFromProps(nextProps)); + } + } + }, { + key: 'getModifiersFromProps', + value: function getModifiersFromProps(props) { + var modifiers = _extends({}, props.modifiers); + if (props.selectedDays) { + modifiers.selected = props.selectedDays; + } + if (props.disabledDays) { + modifiers.disabled = props.disabledDays; + } + return modifiers; + } + }, { + key: 'getDayNodes', + value: function getDayNodes() { + return this.refs.dayPicker.querySelectorAll('.DayPicker-Day:not(.DayPicker-Day--outside)'); + } + }, { + key: 'getNextNavigableMonth', + value: function getNextNavigableMonth() { + return DateUtils.addMonths(this.state.currentMonth, this.props.numberOfMonths); + } + }, { + key: 'getPreviousNavigableMonth', + value: function getPreviousNavigableMonth() { + return DateUtils.addMonths(this.state.currentMonth, -1); + } + }, { + key: 'allowPreviousMonth', + value: function allowPreviousMonth() { + var previousMonth = DateUtils.addMonths(this.state.currentMonth, -1); + return this.allowMonth(previousMonth); + } + }, { + key: 'allowNextMonth', + value: function allowNextMonth() { + var nextMonth = DateUtils.addMonths(this.state.currentMonth, this.props.numberOfMonths); + return this.allowMonth(nextMonth); + } + }, { + key: 'allowMonth', + value: function allowMonth(d) { + var _props = this.props; + var fromMonth = _props.fromMonth; + var toMonth = _props.toMonth; + var canChangeMonth = _props.canChangeMonth; + + if (!canChangeMonth || fromMonth && Helpers.getMonthsDiff(fromMonth, d) < 0 || toMonth && Helpers.getMonthsDiff(toMonth, d) > 0) { + return false; + } + return true; + } + }, { + key: 'allowYearChange', + value: function allowYearChange() { + return this.props.canChangeMonth; + } + }, { + key: 'showMonth', + value: function showMonth(d, callback) { + var _this2 = this; + + if (!this.allowMonth(d)) { + return; + } + this.setState({ currentMonth: Helpers.startOfMonth(d) }, function () { + if (callback) { + callback(); + } + if (_this2.props.onMonthChange) { + _this2.props.onMonthChange(_this2.state.currentMonth); + } + }); + } + }, { + key: 'showNextMonth', + value: function showNextMonth(callback) { + if (!this.allowNextMonth()) { + return; + } + var deltaMonths = this.props.pagedNavigation ? this.props.numberOfMonths : 1; + var nextMonth = DateUtils.addMonths(this.state.currentMonth, deltaMonths); + this.showMonth(nextMonth, callback); + } + }, { + key: 'showPreviousMonth', + value: function showPreviousMonth(callback) { + if (!this.allowPreviousMonth()) { + return; + } + var deltaMonths = this.props.pagedNavigation ? this.props.numberOfMonths : 1; + var previousMonth = DateUtils.addMonths(this.state.currentMonth, -deltaMonths); + this.showMonth(previousMonth, callback); + } + }, { + key: 'showNextYear', + value: function showNextYear() { + if (!this.allowYearChange()) { + return; + } + var nextMonth = DateUtils.addMonths(this.state.currentMonth, 12); + this.showMonth(nextMonth); + } + }, { + key: 'showPreviousYear', + value: function showPreviousYear() { + if (!this.allowYearChange()) { + return; + } + var nextMonth = DateUtils.addMonths(this.state.currentMonth, -12); + this.showMonth(nextMonth); + } + }, { + key: 'focusFirstDayOfMonth', + value: function focusFirstDayOfMonth() { + this.getDayNodes()[0].focus(); + } + }, { + key: 'focusLastDayOfMonth', + value: function focusLastDayOfMonth() { + var dayNodes = this.getDayNodes(); + dayNodes[dayNodes.length - 1].focus(); + } + }, { + key: 'focusPreviousDay', + value: function focusPreviousDay(dayNode) { + var _this3 = this; + + var dayNodes = this.getDayNodes(); + var dayNodeIndex = [].concat(_toConsumableArray(dayNodes)).indexOf(dayNode); + + if (dayNodeIndex === 0) { + this.showPreviousMonth(function () { + return _this3.focusLastDayOfMonth(); + }); + } else { + dayNodes[dayNodeIndex - 1].focus(); + } + } + }, { + key: 'focusNextDay', + value: function focusNextDay(dayNode) { + var _this4 = this; + + var dayNodes = this.getDayNodes(); + var dayNodeIndex = [].concat(_toConsumableArray(dayNodes)).indexOf(dayNode); + + if (dayNodeIndex === dayNodes.length - 1) { + this.showNextMonth(function () { + return _this4.focusFirstDayOfMonth(); + }); + } else { + dayNodes[dayNodeIndex + 1].focus(); + } + } + }, { + key: 'focusNextWeek', + value: function focusNextWeek(dayNode) { + var _this5 = this; + + var dayNodes = this.getDayNodes(); + var dayNodeIndex = [].concat(_toConsumableArray(dayNodes)).indexOf(dayNode); + var isInLastWeekOfMonth = dayNodeIndex > dayNodes.length - 8; + + if (isInLastWeekOfMonth) { + this.showNextMonth(function () { + var daysAfterIndex = dayNodes.length - dayNodeIndex; + var nextMonthDayNodeIndex = 7 - daysAfterIndex; + _this5.getDayNodes()[nextMonthDayNodeIndex].focus(); + }); + } else { + dayNodes[dayNodeIndex + 7].focus(); + } + } + }, { + key: 'focusPreviousWeek', + value: function focusPreviousWeek(dayNode) { + var _this6 = this; + + var dayNodes = this.getDayNodes(); + var dayNodeIndex = [].concat(_toConsumableArray(dayNodes)).indexOf(dayNode); + var isInFirstWeekOfMonth = dayNodeIndex <= 6; + + if (isInFirstWeekOfMonth) { + this.showPreviousMonth(function () { + var previousMonthDayNodes = _this6.getDayNodes(); + var startOfLastWeekOfMonth = previousMonthDayNodes.length - 7; + var previousMonthDayNodeIndex = startOfLastWeekOfMonth + dayNodeIndex; + previousMonthDayNodes[previousMonthDayNodeIndex].focus(); + }); + } else { + dayNodes[dayNodeIndex - 7].focus(); + } + } + + // Event handlers + + }, { + key: 'handleKeyDown', + value: function handleKeyDown(e) { + e.persist(); + + switch (e.keyCode) { + case _keys2.default.LEFT: + this.showPreviousMonth(); + break; + case _keys2.default.RIGHT: + this.showNextMonth(); + break; + case _keys2.default.UP: + this.showPreviousYear(); + break; + case _keys2.default.DOWN: + this.showNextYear(); + break; + default: + break; + } + + if (this.props.onKeyDown) { + this.props.onKeyDown(e); + } + } + }, { + key: 'handleDayKeyDown', + value: function handleDayKeyDown(e, day, modifiers) { + e.persist(); + switch (e.keyCode) { + case _keys2.default.LEFT: + Helpers.cancelEvent(e); + this.focusPreviousDay(e.target); + break; + case _keys2.default.RIGHT: + Helpers.cancelEvent(e); + this.focusNextDay(e.target); + break; + case _keys2.default.UP: + Helpers.cancelEvent(e); + this.focusPreviousWeek(e.target); + break; + case _keys2.default.DOWN: + Helpers.cancelEvent(e); + this.focusNextWeek(e.target); + break; + case _keys2.default.ENTER: + case _keys2.default.SPACE: + Helpers.cancelEvent(e); + if (this.props.onDayClick) { + this.handleDayClick(e, day, modifiers); + } + break; + default: + break; + } + if (this.props.onDayKeyDown) { + this.props.onDayKeyDown(e, day, modifiers); + } + } + }, { + key: 'handleDayClick', + value: function handleDayClick(e, day, modifiers) { + e.persist(); + if (modifiers.outside) { + this.handleOutsideDayClick(day); + } + this.props.onDayClick(e, day, modifiers); + } + }, { + key: 'handleOutsideDayClick', + value: function handleOutsideDayClick(day) { + var currentMonth = this.state.currentMonth; + var numberOfMonths = this.props.numberOfMonths; + + var diffInMonths = Helpers.getMonthsDiff(currentMonth, day); + if (diffInMonths > 0 && diffInMonths >= numberOfMonths) { + this.showNextMonth(); + } else if (diffInMonths < 0) { + this.showPreviousMonth(); + } + } + }, { + key: 'renderNavbar', + value: function renderNavbar() { + var _props2 = this.props; + var locale = _props2.locale; + var localeUtils = _props2.localeUtils; + var canChangeMonth = _props2.canChangeMonth; + var navbarComponent = _props2.navbarComponent; + var navbarElement = _props2.navbarElement; + + var attributes = _objectWithoutProperties(_props2, ['locale', 'localeUtils', 'canChangeMonth', 'navbarComponent', 'navbarElement']); + + if (!canChangeMonth) return null; + var props = { + className: 'DayPicker-NavBar', + nextMonth: this.getNextNavigableMonth(), + previousMonth: this.getPreviousNavigableMonth(), + showPreviousButton: this.allowPreviousMonth(), + showNextButton: this.allowNextMonth(), + onNextClick: this.showNextMonth, + onPreviousClick: this.showPreviousMonth, + dir: attributes.dir, + locale: locale, + localeUtils: localeUtils + }; + if (navbarElement) { + return _react2.default.cloneElement(navbarElement, props); + } + return _react2.default.createElement(navbarComponent, props); + } + }, { + key: 'renderDayInMonth', + value: function renderDayInMonth(day, month) { + var dayModifiers = []; + if (DateUtils.isSameDay(day, new Date())) { + dayModifiers.push('today'); + } + if (day.getMonth() !== month.getMonth()) { + dayModifiers.push('outside'); + } + dayModifiers = [].concat(_toConsumableArray(dayModifiers), _toConsumableArray(Helpers.getModifiersForDay(day, this.getModifiersFromProps(this.props)))); + + var isOutside = day.getMonth() !== month.getMonth(); + var tabIndex = null; + if (this.props.onDayClick && !isOutside) { + tabIndex = -1; + // Focus on the first day of the month + if (day.getDate() === 1) { + tabIndex = this.props.tabIndex; + } + } + var key = '' + day.getFullYear() + day.getMonth() + day.getDate(); + return _react2.default.createElement( + _Day2.default, + { + key: '' + (isOutside ? 'outside-' : '') + key, + day: day, + modifiers: dayModifiers, + empty: isOutside && !this.props.enableOutsideDays && !this.props.fixedWeeks, + + tabIndex: tabIndex, + + ariaLabel: this.props.localeUtils.formatDay(day, this.props.locale), + ariaDisabled: isOutside || dayModifiers.indexOf('disabled') > -1, + ariaSelected: dayModifiers.indexOf('selected') > -1, + + onMouseEnter: this.props.onDayMouseEnter, + onMouseLeave: this.props.onDayMouseLeave, + onKeyDown: this.handleDayKeyDown, + onTouchStart: this.props.onDayTouchStart, + onTouchEnd: this.props.onDayTouchEnd, + onFocus: this.props.onDayFocus, + onClick: this.props.onDayClick ? this.handleDayClick : undefined + }, + this.props.renderDay(day) + ); + } + }, { + key: 'renderMonths', + value: function renderMonths() { + var months = []; + var firstDayOfWeek = this.props.localeUtils.getFirstDayOfWeek(this.props.locale); + + for (var i = 0; i < this.props.numberOfMonths; i++) { + var month = DateUtils.addMonths(this.state.currentMonth, i); + + months.push(_react2.default.createElement( + _Month2.default, + { + key: i, + month: month, + locale: this.props.locale, + localeUtils: this.props.localeUtils, + firstDayOfWeek: firstDayOfWeek, + fixedWeeks: this.props.fixedWeeks, + + className: 'DayPicker-Month', + wrapperClassName: 'DayPicker-Body', + weekClassName: 'DayPicker-Week', + + weekdayComponent: this.props.weekdayComponent, + weekdayElement: this.props.weekdayElement, + captionElement: this.props.captionElement, + + onCaptionClick: this.props.onCaptionClick + }, + this.renderDayInMonth + )); + } + + if (this.props.reverseMonths) { + months.reverse(); + } + return months; + } + }, { + key: 'render', + value: function render() { + var customProps = Helpers.getCustomProps(this.props, DayPicker.propTypes); + var className = 'DayPicker DayPicker--' + this.props.locale; + + if (!this.props.onDayClick) { + className = className + ' DayPicker--interactionDisabled'; + } + if (this.props.className) { + className = className + ' ' + this.props.className; + } + + return _react2.default.createElement( + 'div', + _extends({}, customProps, { + className: className, + ref: 'dayPicker', + role: 'application', + tabIndex: this.props.canChangeMonth && this.props.tabIndex, + onKeyDown: this.handleKeyDown + }), + this.renderNavbar(), + this.renderMonths() + ); + } + }]); + + return DayPicker; + }(_react.Component); + + DayPicker.VERSION = '2.4.1'; + DayPicker.propTypes = { + initialMonth: _react.PropTypes.instanceOf(Date), + numberOfMonths: _react.PropTypes.number, + selectedDays: _react.PropTypes.func, + disabledDays: _react.PropTypes.func, + + modifiers: _react.PropTypes.object, + + locale: _react.PropTypes.string, + localeUtils: _PropTypes2.default.localeUtils, + + enableOutsideDays: _react.PropTypes.bool, + fixedWeeks: _react.PropTypes.bool, + canChangeMonth: _react.PropTypes.bool, + reverseMonths: _react.PropTypes.bool, + pagedNavigation: _react.PropTypes.bool, + fromMonth: _react.PropTypes.instanceOf(Date), + toMonth: _react.PropTypes.instanceOf(Date), + + onKeyDown: _react.PropTypes.func, + onDayClick: _react.PropTypes.func, + onDayKeyDown: _react.PropTypes.func, + onDayMouseEnter: _react.PropTypes.func, + onDayMouseLeave: _react.PropTypes.func, + onDayTouchStart: _react.PropTypes.func, + onDayTouchEnd: _react.PropTypes.func, + onDayFocus: _react.PropTypes.func, + onMonthChange: _react.PropTypes.func, + onCaptionClick: _react.PropTypes.func, + + renderDay: _react.PropTypes.func, + weekdayComponent: (0, _reactIsDeprecated.deprecate)(_react.PropTypes.func, 'react-day-picker: the `weekdayComponent` prop is deprecated from v2.3. Please pass a React element to the `weekdayElement` prop instead.'), // eslint-disable-line max-len + weekdayElement: _react.PropTypes.element, + navbarComponent: (0, _reactIsDeprecated.deprecate)(_react.PropTypes.func, 'react-day-picker: the `navbarComponent` prop is deprecated from v2.3. Please pass a React element to the `navbarElement` prop instead.'), // eslint-disable-line max-len + navbarElement: _react.PropTypes.element, + + captionElement: _react.PropTypes.element, + + dir: _react.PropTypes.string, + className: _react.PropTypes.string, + tabIndex: _react.PropTypes.number + + }; + DayPicker.defaultProps = { + tabIndex: 0, + initialMonth: new Date(), + numberOfMonths: 1, + locale: 'en', + localeUtils: LocaleUtils, + enableOutsideDays: false, + fixedWeeks: false, + canChangeMonth: true, + reverseMonths: false, + pagedNavigation: false, + renderDay: function renderDay(day) { + return day.getDate(); + }, + weekdayElement: _react2.default.createElement(_Weekday2.default, null), + navbarElement: _react2.default.createElement(_Navbar2.default, null), + captionElement: _react2.default.createElement(_Caption2.default, null) + }; + + var _initialiseProps = function _initialiseProps() { + this.getStateFromProps = function (props) { + var initialMonth = Helpers.startOfMonth(props.initialMonth); + var currentMonth = initialMonth; + + if (props.pagedNavigation && props.numberOfMonths > 1 && props.fromMonth) { + var diffInMonths = Helpers.getMonthsDiff(props.fromMonth, currentMonth); + currentMonth = DateUtils.addMonths(props.fromMonth, Math.floor(diffInMonths / props.numberOfMonths) * props.numberOfMonths); + } + return { currentMonth: currentMonth }; + }; + }; + + exports.default = DayPicker; + //# sourceMappingURL=DayPicker.js.map + +/***/ }, +/* 2 */ +/***/ function(module, exports) { + + module.exports = React; + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + "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; }; + + exports.deprecate = deprecate; + exports.addIsDeprecated = addIsDeprecated; + + /** + * Wraps a singular React.PropTypes.[type] with + * a console.warn call that is only called if the + * prop is not undefined/null and is only called + * once. + * @param {Object} propType React.PropType type + * @param {String} message Deprecation message + * @return {Function} ReactPropTypes checkType + */ + function deprecate(propType, message) { + var warned = false; + return function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var props = args[0]; + var propName = args[1]; + + var prop = props[propName]; + if (prop !== undefined && prop !== null && !warned) { + warned = true; + console.warn(message); + } + return propType.call.apply(propType, [this].concat(args)); + }; + } + + /** + * Returns a copy of `PropTypes` with an `isDeprecated` + * method available on all top-level propType options. + * @param {React.PropTypes} PropTypes + * @return {React.PropTypes} newPropTypes + */ + function addIsDeprecated(PropTypes) { + var newPropTypes = _extends({}, PropTypes); + for (var type in newPropTypes) { + if (newPropTypes.hasOwnProperty(type)) { + var propType = newPropTypes[type]; + propType = propType.bind(newPropTypes); + propType.isDeprecated = deprecate.bind(newPropTypes, propType); + newPropTypes[type] = propType; + } + } + return newPropTypes; + } + + +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = Caption; + + var _react = __webpack_require__(2); + + var _react2 = _interopRequireDefault(_react); + + var _PropTypes = __webpack_require__(5); + + var _PropTypes2 = _interopRequireDefault(_PropTypes); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function Caption(_ref) { + var date = _ref.date; + var locale = _ref.locale; + var localeUtils = _ref.localeUtils; + var onClick = _ref.onClick; + + return _react2.default.createElement( + 'div', + { className: 'DayPicker-Caption', onClick: onClick, role: 'heading' }, + localeUtils.formatMonthTitle(date, locale) + ); + } + + Caption.propTypes = { + date: _react.PropTypes.instanceOf(Date), + locale: _react.PropTypes.string, + localeUtils: _PropTypes2.default.localeUtils, + onClick: _react.PropTypes.func + }; + //# sourceMappingURL=Caption.js.map + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _react = __webpack_require__(2); + + exports.default = { + localeUtils: _react.PropTypes.shape({ + formatMonthTitle: _react.PropTypes.func, + formatWeekdayShort: _react.PropTypes.func, + formatWeekdayLong: _react.PropTypes.func, + getFirstDayOfWeek: _react.PropTypes.func + }) + }; + //# sourceMappingURL=PropTypes.js.map + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.NavbarPropTypes = undefined; + exports.default = Navbar; + + var _react = __webpack_require__(2); + + var _react2 = _interopRequireDefault(_react); + + var _PropTypes = __webpack_require__(5); + + var _PropTypes2 = _interopRequireDefault(_PropTypes); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var buttonBaseClass = 'DayPicker-NavButton DayPicker-NavButton'; + + function Navbar(_ref) { + var className = _ref.className; + var showPreviousButton = _ref.showPreviousButton; + var showNextButton = _ref.showNextButton; + var onPreviousClick = _ref.onPreviousClick; + var onNextClick = _ref.onNextClick; + var dir = _ref.dir; + + var previousClickHandler = dir === 'rtl' ? onNextClick : onPreviousClick; + var nextClickHandler = dir === 'rtl' ? onPreviousClick : onNextClick; + + var previousButton = showPreviousButton && _react2.default.createElement('span', { + role: 'button', + key: 'previous', + className: buttonBaseClass + '--prev', + onClick: function onClick() { + return previousClickHandler(); + } + }); + + var nextButton = showNextButton && _react2.default.createElement('span', { + role: 'button', + key: 'right', + className: buttonBaseClass + '--next', + onClick: function onClick() { + return nextClickHandler(); + } + }); + + return _react2.default.createElement( + 'div', + { className: className }, + dir === 'rtl' ? [nextButton, previousButton] : [previousButton, nextButton] + ); + } + + var NavbarPropTypes = exports.NavbarPropTypes = { + className: _react.PropTypes.string, + nextMonth: _react.PropTypes.instanceOf(Date), + previousMonth: _react.PropTypes.instanceOf(Date), + showPreviousButton: _react.PropTypes.bool, + showNextButton: _react.PropTypes.bool, + onPreviousClick: _react.PropTypes.func, + onNextClick: _react.PropTypes.func, + dir: _react.PropTypes.string, + locale: _react.PropTypes.string, + localeUtils: _PropTypes2.default.localeUtils + }; + + Navbar.propTypes = NavbarPropTypes; + + Navbar.defaultProps = { + className: 'DayPicker-NavBar', + dir: 'ltr', + showPreviousButton: true, + showNextButton: true + }; + //# sourceMappingURL=Navbar.js.map + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = Month; + + var _react = __webpack_require__(2); + + var _react2 = _interopRequireDefault(_react); + + var _PropTypes = __webpack_require__(5); + + var _PropTypes2 = _interopRequireDefault(_PropTypes); + + var _Weekdays = __webpack_require__(8); + + var _Weekdays2 = _interopRequireDefault(_Weekdays); + + var _Helpers = __webpack_require__(9); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function Month(_ref) { + var month = _ref.month; + var locale = _ref.locale; + var localeUtils = _ref.localeUtils; + var captionElement = _ref.captionElement; + var onCaptionClick = _ref.onCaptionClick; + var children = _ref.children; + var firstDayOfWeek = _ref.firstDayOfWeek; + var className = _ref.className; + var wrapperClassName = _ref.wrapperClassName; + var weekClassName = _ref.weekClassName; + var weekdayComponent = _ref.weekdayComponent; + var weekdayElement = _ref.weekdayElement; + var fixedWeeks = _ref.fixedWeeks; + + var captionProps = { + date: month, + localeUtils: localeUtils, + locale: locale, + onClick: onCaptionClick ? function (e) { + return onCaptionClick(e, month); + } : undefined + }; + var weeks = (0, _Helpers.getWeekArray)(month, firstDayOfWeek, fixedWeeks); + return _react2.default.createElement( + 'div', + { className: className }, + _react2.default.cloneElement(captionElement, captionProps), + _react2.default.createElement(_Weekdays2.default, { + locale: locale, + localeUtils: localeUtils, + weekdayComponent: weekdayComponent, + weekdayElement: weekdayElement + }), + _react2.default.createElement( + 'div', + { className: wrapperClassName, role: 'grid' }, + weeks.map(function (week, j) { + return _react2.default.createElement( + 'div', + { key: j, className: weekClassName, role: 'gridcell' }, + week.map(function (day) { + return children(day, month); + }) + ); + }) + ) + ); + } + + Month.propTypes = { + month: _react.PropTypes.instanceOf(Date).isRequired, + captionElement: _react.PropTypes.node.isRequired, + firstDayOfWeek: _react.PropTypes.number.isRequired, + locale: _react.PropTypes.string.isRequired, + localeUtils: _PropTypes2.default.localeUtils.isRequired, + onCaptionClick: _react.PropTypes.func, + children: _react.PropTypes.func.isRequired, + className: _react.PropTypes.string, + wrapperClassName: _react.PropTypes.string, + weekClassName: _react.PropTypes.string, + weekdayComponent: _react.PropTypes.func, + weekdayElement: _react.PropTypes.element, + fixedWeeks: _react.PropTypes.bool + }; + //# sourceMappingURL=Month.js.map + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = Weekdays; + + var _react = __webpack_require__(2); + + var _react2 = _interopRequireDefault(_react); + + var _PropTypes = __webpack_require__(5); + + var _PropTypes2 = _interopRequireDefault(_PropTypes); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function Weekdays(_ref) { + var locale = _ref.locale; + var localeUtils = _ref.localeUtils; + var weekdayComponent = _ref.weekdayComponent; + var weekdayElement = _ref.weekdayElement; + + var days = []; + for (var i = 0; i < 7; i++) { + var elementProps = { + key: i, + className: 'DayPicker-Weekday', + weekday: i, + localeUtils: localeUtils, + locale: locale + }; + var element = weekdayElement ? _react2.default.cloneElement(weekdayElement, elementProps) : _react2.default.createElement(weekdayComponent, elementProps); + days.push(element); + } + + return _react2.default.createElement( + 'div', + { className: 'DayPicker-Weekdays', role: 'rowgroup' }, + _react2.default.createElement( + 'div', + { className: 'DayPicker-WeekdaysRow', role: 'columnheader' }, + days + ) + ); + } + + Weekdays.propTypes = { + locale: _react.PropTypes.string.isRequired, + localeUtils: _PropTypes2.default.localeUtils.isRequired, + weekdayComponent: _react.PropTypes.func, + weekdayElement: _react.PropTypes.element + }; + //# sourceMappingURL=Weekdays.js.map + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.cancelEvent = cancelEvent; + exports.getCustomProps = getCustomProps; + exports.getFirstDayOfMonth = getFirstDayOfMonth; + exports.getDaysInMonth = getDaysInMonth; + exports.getModifiersForDay = getModifiersForDay; + exports.getMonthsDiff = getMonthsDiff; + exports.getWeekArray = getWeekArray; + exports.startOfMonth = startOfMonth; + + var _DateUtils = __webpack_require__(10); + + var _LocaleUtils = __webpack_require__(11); + + function cancelEvent(e) { + e.preventDefault(); + e.stopPropagation(); + } + + function getCustomProps(props, propTypes) { + var customProps = {}; + Object.keys(props).filter(function (propName) { + return !propTypes.hasOwnProperty(propName); + }).forEach(function (propName) { + customProps[propName] = props[propName]; + }); + return customProps; + } + + function getFirstDayOfMonth(d) { + return new Date(d.getFullYear(), d.getMonth(), 1, 12); + } + + function getDaysInMonth(d) { + var resultDate = getFirstDayOfMonth(d); + + resultDate.setMonth(resultDate.getMonth() + 1); + resultDate.setDate(resultDate.getDate() - 1); + + return resultDate.getDate(); + } + + function getModifiersForDay(d) { + var modifierFunctions = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + return Object.keys(modifierFunctions).reduce(function (modifiers, modifier) { + var func = modifierFunctions[modifier]; + if (func(d)) { + modifiers.push(modifier); + } + return modifiers; + }, []); + } + + function getMonthsDiff(d1, d2) { + return d2.getMonth() - d1.getMonth() + 12 * (d2.getFullYear() - d1.getFullYear()); + } + + function getWeekArray(d) { + var firstDayOfWeek = arguments.length <= 1 || arguments[1] === undefined ? (0, _LocaleUtils.getFirstDayOfWeek)() : arguments[1]; + var fixedWeeks = arguments[2]; + + var daysInMonth = getDaysInMonth(d); + var dayArray = []; + + var week = []; + var weekArray = []; + + for (var i = 1; i <= daysInMonth; i++) { + dayArray.push(new Date(d.getFullYear(), d.getMonth(), i, 12)); + } + + dayArray.forEach(function (day) { + if (week.length > 0 && day.getDay() === firstDayOfWeek) { + weekArray.push(week); + week = []; + } + week.push(day); + if (dayArray.indexOf(day) === dayArray.length - 1) { + weekArray.push(week); + } + }); + + // unshift days to start the first week + var firstWeek = weekArray[0]; + for (var _i = 7 - firstWeek.length; _i > 0; _i--) { + var outsideDate = (0, _DateUtils.clone)(firstWeek[0]); + outsideDate.setDate(firstWeek[0].getDate() - 1); + firstWeek.unshift(outsideDate); + } + + // push days until the end of the last week + var lastWeek = weekArray[weekArray.length - 1]; + for (var _i2 = lastWeek.length; _i2 < 7; _i2++) { + var _outsideDate = (0, _DateUtils.clone)(lastWeek[lastWeek.length - 1]); + _outsideDate.setDate(lastWeek[lastWeek.length - 1].getDate() + 1); + lastWeek.push(_outsideDate); + } + + // add extra weeks to reach 6 weeks + if (fixedWeeks && weekArray.length < 6) { + var lastExtraWeek = void 0; + + for (var _i3 = weekArray.length; _i3 < 6; _i3++) { + lastExtraWeek = weekArray[weekArray.length - 1]; + var lastDay = lastExtraWeek[lastExtraWeek.length - 1]; + var extraWeek = []; + + for (var j = 0; j < 7; j++) { + var _outsideDate2 = (0, _DateUtils.clone)(lastDay); + _outsideDate2.setDate(lastDay.getDate() + j + 1); + extraWeek.push(_outsideDate2); + } + + weekArray.push(extraWeek); + } + } + + return weekArray; + } + + function startOfMonth(d) { + var newDate = (0, _DateUtils.clone)(d); + newDate.setDate(1); + newDate.setHours(12, 0, 0, 0); // always set noon to avoid time zone issues + return newDate; + } + //# sourceMappingURL=Helpers.js.map + +/***/ }, +/* 10 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.clone = clone; + exports.addMonths = addMonths; + exports.isSameDay = isSameDay; + exports.isPastDay = isPastDay; + exports.isDayBetween = isDayBetween; + exports.addDayToRange = addDayToRange; + exports.isDayInRange = isDayInRange; + + /** + * Clone a date object. + * + * @param {Date} d The date to clone + * @return {Date} The cloned date + */ + function clone(d) { + return new Date(d.getTime()); + } + + /** + * Return `d` as a new date with `n` months added. + * @param {[type]} d + * @param {[type]} n + */ + function addMonths(d, n) { + var newDate = clone(d); + newDate.setMonth(d.getMonth() + n); + return newDate; + } + + /** + * Return `true` if two dates are the same day, ignoring the time. + * + * @param {Date} d1 + * @param {Date} d2 + * @return {Boolean} + */ + function isSameDay(d1, d2) { + if (!d1 || !d2) { + return false; + } + return d1.getDate() === d2.getDate() && d1.getMonth() === d2.getMonth() && d1.getFullYear() === d2.getFullYear(); + } + + /** + * Return `true` if a day is in the past, e.g. yesterday or any day + * before yesterday. + * + * @param {Date} d + * @return {Boolean} + */ + function isPastDay(d) { + var today = new Date(); + today.setHours(0, 0, 0, 0); + return d < today; + } + + /** + * Return `true` if day `d` is between days `d1` and `d2`, + * without including them. + * + * @param {Date} d + * @param {Date} d1 + * @param {Date} d2 + * @return {Boolean} + */ + function isDayBetween(d, d1, d2) { + var date = clone(d); + var date1 = clone(d1); + var date2 = clone(d2); + + date.setHours(0, 0, 0, 0); + date1.setHours(0, 0, 0, 0); + date2.setHours(0, 0, 0, 0); + return date1 < date && date < date2 || date2 < date && date < date1; + } + + /** + * Add a day to a range and return a new range. A range is an object with + * `from` and `to` days. + * + * @param {Date} day + * @param {Object} range + * @return {Object} Returns a new range object + */ + function addDayToRange(day) { + var range = arguments.length <= 1 || arguments[1] === undefined ? { from: null, to: null } : arguments[1]; + var from = range.from; + var to = range.to; + + if (!from) { + from = day; + } else if (from && to && isSameDay(from, to) && isSameDay(day, from)) { + from = null; + to = null; + } else if (to && day < from) { + from = day; + } else if (to && isSameDay(day, to)) { + from = day; + to = day; + } else { + to = day; + if (to < from) { + to = from; + from = day; + } + } + + return { from: from, to: to }; + } + + /** + * Return `true` if a day is included in a range of days. + * + * @param {Date} day + * @param {Object} range + * @return {Boolean} + */ + function isDayInRange(day, range) { + var from = range.from; + var to = range.to; + + return from && isSameDay(day, from) || to && isSameDay(day, to) || from && to && isDayBetween(day, from, to); + } + + exports.default = { + addDayToRange: addDayToRange, + addMonths: addMonths, + clone: clone, + isSameDay: isSameDay, + isDayInRange: isDayInRange, + isDayBetween: isDayBetween, + isPastDay: isPastDay + }; + //# sourceMappingURL=DateUtils.js.map + +/***/ }, +/* 11 */ +/***/ function(module, exports) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.formatDay = formatDay; + exports.formatMonthTitle = formatMonthTitle; + exports.formatWeekdayShort = formatWeekdayShort; + exports.formatWeekdayLong = formatWeekdayLong; + exports.getFirstDayOfWeek = getFirstDayOfWeek; + exports.getMonths = getMonths; + var WEEKDAYS_LONG = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + + var WEEKDAYS_SHORT = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; + + var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + + function formatDay(day) { + return day.toDateString(); + } + + function formatMonthTitle(d) { + return MONTHS[d.getMonth()] + ' ' + d.getFullYear(); + } + + function formatWeekdayShort(i) { + return WEEKDAYS_SHORT[i]; + } + + function formatWeekdayLong(i) { + return WEEKDAYS_LONG[i]; + } + + function getFirstDayOfWeek() { + return 0; + } + + function getMonths() { + return MONTHS; + } + + exports.default = { + formatDay: formatDay, + formatMonthTitle: formatMonthTitle, + formatWeekdayShort: formatWeekdayShort, + formatWeekdayLong: formatWeekdayLong, + getFirstDayOfWeek: getFirstDayOfWeek, + getMonths: getMonths + }; + //# sourceMappingURL=LocaleUtils.js.map + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = Day; + + var _react = __webpack_require__(2); + + var _react2 = _interopRequireDefault(_react); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function handleEvent(handler, day, modifiers) { + if (!handler) { + return undefined; + } + var dayState = {}; + modifiers.forEach(function (modifier) { + dayState[modifier] = true; + }); + return function (e) { + e.persist(); + handler(e, day, dayState); + }; + } + function Day(_ref) { + var day = _ref.day; + var tabIndex = _ref.tabIndex; + var empty = _ref.empty; + var modifiers = _ref.modifiers; + var onMouseEnter = _ref.onMouseEnter; + var onMouseLeave = _ref.onMouseLeave; + var onClick = _ref.onClick; + var onKeyDown = _ref.onKeyDown; + var onTouchStart = _ref.onTouchStart; + var onTouchEnd = _ref.onTouchEnd; + var onFocus = _ref.onFocus; + var ariaLabel = _ref.ariaLabel; + var ariaDisabled = _ref.ariaDisabled; + var ariaSelected = _ref.ariaSelected; + var children = _ref.children; + + var className = 'DayPicker-Day'; + className += modifiers.map(function (modifier) { + return ' ' + className + '--' + modifier; + }).join(''); + if (empty) { + return _react2.default.createElement('div', { role: 'gridcell', 'aria-disabled': true, className: className }); + } + return _react2.default.createElement( + 'div', + { + className: className, + tabIndex: tabIndex, + role: 'gridcell', + 'aria-label': ariaLabel, + 'aria-disabled': ariaDisabled.toString(), + 'aria-selected': ariaSelected.toString(), + onClick: handleEvent(onClick, day, modifiers), + onKeyDown: handleEvent(onKeyDown, day, modifiers), + onMouseEnter: handleEvent(onMouseEnter, day, modifiers), + onMouseLeave: handleEvent(onMouseLeave, day, modifiers), + onTouchEnd: handleEvent(onTouchEnd, day, modifiers), + onTouchStart: handleEvent(onTouchStart, day, modifiers), + onFocus: handleEvent(onFocus, day, modifiers) + }, + children + ); + } + + Day.propTypes = { + day: _react.PropTypes.instanceOf(Date).isRequired, + children: _react.PropTypes.node.isRequired, + + ariaDisabled: _react.PropTypes.bool, + ariaLabel: _react.PropTypes.string, + ariaSelected: _react.PropTypes.bool, + empty: _react.PropTypes.bool, + modifiers: _react.PropTypes.array, + onClick: _react.PropTypes.func, + onKeyDown: _react.PropTypes.func, + onMouseEnter: _react.PropTypes.func, + onMouseLeave: _react.PropTypes.func, + onTouchEnd: _react.PropTypes.func, + onTouchStart: _react.PropTypes.func, + onFocus: _react.PropTypes.func, + tabIndex: _react.PropTypes.number + }; + + Day.defaultProps = { + modifiers: [], + empty: false + }; + //# sourceMappingURL=Day.js.map + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.WeekdayPropTypes = undefined; + exports.default = Weekday; + + var _react = __webpack_require__(2); + + var _react2 = _interopRequireDefault(_react); + + var _PropTypes = __webpack_require__(5); + + var _PropTypes2 = _interopRequireDefault(_PropTypes); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function Weekday(_ref) { + var weekday = _ref.weekday; + var className = _ref.className; + var localeUtils = _ref.localeUtils; + var locale = _ref.locale; + + return _react2.default.createElement( + 'div', + { className: className }, + _react2.default.createElement( + 'abbr', + { title: localeUtils.formatWeekdayLong(weekday, locale) }, + localeUtils.formatWeekdayShort(weekday, locale) + ) + ); + } + + var WeekdayPropTypes = exports.WeekdayPropTypes = { + weekday: _react.PropTypes.number, + className: _react.PropTypes.string, + locale: _react.PropTypes.string, + localeUtils: _PropTypes2.default.localeUtils + }; + + Weekday.propTypes = WeekdayPropTypes; + //# sourceMappingURL=Weekday.js.map + +/***/ }, +/* 14 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = { + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + ENTER: 13, + SPACE: 32 + }; + //# sourceMappingURL=keys.js.map + +/***/ } +/******/ ]); +//# sourceMappingURL=DayPicker.js.map \ No newline at end of file diff --git a/source/mobile-base/client/lib/RC.DayPicker/DayPickerInput.jsx b/source/mobile-base/client/lib/RC.DayPicker/DayPickerInput.jsx new file mode 100644 index 00000000..b793225f --- /dev/null +++ b/source/mobile-base/client/lib/RC.DayPicker/DayPickerInput.jsx @@ -0,0 +1,141 @@ +/** + * Created on 8/7/16. + */ + + +RC.DayPickerInput = class extends RC.CSS { + constructor(p) { + super(p) + this.state = { + opened: false, //是否已经打开 + } + } + open() { + + this.setState({ + opened: true + }) + } + + close() { + this.setState({ + opened: false + }) + } + + formatDate(date) { + return date? moment(date).format('YYYY-MM-DD'):'' + } + + openOnInput(e) { + + e.stopPropagation(); + e.preventDefault() + this.open() + } + + baseStyles(np, ns) { + + const pickerAreaHeight = this.props.height || 300 + + return { + pickerArea:{ + position:'fixed', + left:0, + bottom:0, + width:"100%", + height:pickerAreaHeight, + background: "#fff", + zIndex: 9999999, + + + fontSize: '1.33em', + border: '1px solid #777', + borderTopColor: '#898989', + borderBottomWidth: 0, + borderRadius: '5px 5px 0 0', + boxShadow: '0 12px 36px 16px rgba(0,0,0,.24)', + }, + inputLabel:{ + textAlign:'center', + }, + inputElement:{ + width: '80%', + padding: '6px 0 6px 0', + textAlign: 'center' + } + } + } + + componentDidMount() { + var self = this + + function closeOnHTMLClick(e) { + + + if (!self.state.opened) return; + + if (self._input) { + if (e.target !== self._input) {//???.getDOMNode() + if ($(e.target).parents('.picker-modal').length === 0) { + self.close(); + } + } + } + else { + + if ($(e.target).parents('.picker-modal').length === 0) + self.close(); + } + } + + $('html').on('click', closeOnHTMLClick); + + } + render() { + let self= this + let styles = this.css.get("styles") + + let displayValue = self.formatDate(this.props.date) + + + return
+ +
+ { + self.props.label?
+ {self.props.label } +
:'' + } + + + self._input = c} + value={displayValue} + type="text" + readOnly={self.props.readOnly || true} + onClick={self.openOnInput.bind(self)}/> +
+ + { + self.state.opened ? +
+ +
+ +
: '' + } + + +
+ } + +} \ No newline at end of file diff --git a/source/mobile-base/client/lib/RC.DayPicker/style.css b/source/mobile-base/client/lib/RC.DayPicker/style.css new file mode 100644 index 00000000..aeab5023 --- /dev/null +++ b/source/mobile-base/client/lib/RC.DayPicker/style.css @@ -0,0 +1,122 @@ +/* DayPicker styles */ + +.DayPicker { + display: flex; + flex-wrap: wrap; + justify-content: center; + position: relative; + padding: 1rem 0; + user-select: none; +} + +.DayPicker-Month { + display: table; + border-collapse: collapse; + border-spacing: 0; + user-select: none; + margin: 0 1rem; +} + + .DayPicker-NavBar { + position: absolute; + left: 0; + right: 0; + padding: 0 .5rem; + } + + .DayPicker-NavButton { + position: absolute; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + cursor: pointer; + } + + .DayPicker-NavButton--prev { + left: 1rem; + background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjI2cHgiIGhlaWdodD0iNTBweCIgdmlld0JveD0iMCAwIDI2IDUwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5wcmV2PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CiAgICAgICAgPGcgaWQ9InByZXYiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzLjM5MzE5MywgMjUuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMy4zOTMxOTMsIC0yNS4wMDAwMDApIHRyYW5zbGF0ZSgwLjg5MzE5MywgMC4wMDAwMDApIiBmaWxsPSIjNTY1QTVDIj4KICAgICAgICAgICAgPHBhdGggZD0iTTAsNDkuMTIzNzMzMSBMMCw0NS4zNjc0MzQ1IEwyMC4xMzE4NDU5LDI0LjcyMzA2MTIgTDAsNC4yMzEzODMxNCBMMCwwLjQ3NTA4NDQ1OSBMMjUsMjQuNzIzMDYxMiBMMCw0OS4xMjM3MzMxIEwwLDQ5LjEyMzczMzEgWiIgaWQ9InJpZ2h0IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K"); + } + + .DayPicker-NavButton--next { + right: 1rem; + background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjI2cHgiIGhlaWdodD0iNTBweCIgdmlld0JveD0iMCAwIDI2IDUwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5uZXh0PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CiAgICAgICAgPGcgaWQ9Im5leHQiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuOTUxNDUxLCAwLjAwMDAwMCkiIGZpbGw9IiM1NjVBNUMiPgogICAgICAgICAgICA8cGF0aCBkPSJNMCw0OS4xMjM3MzMxIEwwLDQ1LjM2NzQzNDUgTDIwLjEzMTg0NTksMjQuNzIzMDYxMiBMMCw0LjIzMTM4MzE0IEwwLDAuNDc1MDg0NDU5IEwyNSwyNC43MjMwNjEyIEwwLDQ5LjEyMzczMzEgTDAsNDkuMTIzNzMzMSBaIiBpZD0icmlnaHQiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPgo="); + } + + + .DayPicker-Caption { + display: table-caption; + height: 1.5rem; + text-align: center; + } + + .DayPicker-Weekdays { + display: table-header-group; + } + + .DayPicker-WeekdaysRow { + display: table-row; + } + + .DayPicker-Weekday { + display: table-cell; + padding: .5rem; + font-size: .875em; + text-align: center; + color: #8b9898; + } + + .DayPicker-Body { + display: table-row-group; + } + + .DayPicker-Week { + display: table-row; + } + + .DayPicker-Day { + display: table-cell; + padding: .5rem; + border: 1px solid #eaecec; + text-align: center; + cursor: pointer; + vertical-align: middle; + } + + .DayPicker--interactionDisabled .DayPicker-Day { + cursor: default; + } + +/* Default modifiers */ + +.DayPicker-Day--today { + color: #d0021b; + font-weight: 500; +} + +.DayPicker-Day--disabled { + color: #dce0e0; + cursor: default; + background-color: #eff1f1; +} + +.DayPicker-Day--outside { + cursor: default; + color: #dce0e0; +} + +/* Example modifiers */ + +.DayPicker-Day--sunday { + background-color: #f7f8f8; +} + +.DayPicker-Day--sunday:not(.DayPicker-Day--today) { + color: #dce0e0; +} + +.DayPicker-Day--selected:not(.DayPicker-Day--disabled):not(.DayPicker-Day--outside) { + color: #FFF; + background-color: #4A90E2; +} diff --git a/source/mobile-base/client/lib/RC.Portal/Portal.jsx b/source/mobile-base/client/lib/RC.Portal/Portal.jsx new file mode 100644 index 00000000..b0880ff1 --- /dev/null +++ b/source/mobile-base/client/lib/RC.Portal/Portal.jsx @@ -0,0 +1,34 @@ +/** + * Created on 3/19/16. + */ + +RC.Portal = React.createClass({ + render: () => null, + portalElement: null, + componentDidMount() { + var p = this.props.portalId && document.getElementById(this.props.portalId); + if (!p) { + var p = document.createElement('div'); + p.id = this.props.portalId; + document.body.appendChild(p); + } + this.portalElement = p; + this.componentDidUpdate(); + }, + componentWillUnmount() { + document.body.removeChild(this.portalElement); + }, + componentDidUpdate() { + React.render( +
+ {this.props.children} +
+ , this.portalElement); + } +}); \ No newline at end of file From a475c7ae863ed05376dc2ce590cd6c1de70d01b1 Mon Sep 17 00:00:00 2001 From: Jeffrey Fan Date: Mon, 8 Aug 2016 00:12:18 +0800 Subject: [PATCH 2/9] Add new method API program.getTrialClassesSchedule/program.getMakeupClassesSchedule --- .../module/registration/trialClasses.js | 63 ++++++++++++++++++- source/mobile-base/server/methods/program.js | 11 ++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/source/_packages_/module/registration/trialClasses.js b/source/_packages_/module/registration/trialClasses.js index c743173e..e89cc785 100644 --- a/source/_packages_/module/registration/trialClasses.js +++ b/source/_packages_/module/registration/trialClasses.js @@ -207,6 +207,39 @@ function getAvailableTrialLessons(programId, startDt, endDt) { return availableLessons; } +/* +* @return ['2016-05-20','2016-05-20'] //days that has class +* */ +function getAvailableTrialLessonsSchedule(programId){ + const program = Collections.program.findOne({_id:programId}); + if (!program) { + throw new Meteor.Error(500, 'program not found','Invalid class id: ' + programId); + } + + //find all sessions not ended + const sessions = Collections.session.find({ + endDate : {$gte:new Date()} + }, { + sort: { + startDate: 1 + } + }).fetch(); + + const endDates= _.pluck(sessions, 'endDate') + const maxEndDate = _.max(endDates,(d)=>new Date(d).getTime()) + + const lessons = getAvailableTrialLessons(programId, new Date(), maxEndDate) + + //according to EdminForce.utils.dateFormat = 'YYYY-MM-DDTHH:mm:ss'; + let dates = _.map(lessons,(item)=>{ + return item.lessonDate && item.lessonDate.split('T')[0] + }) + dates = _.uniq(dates).sort() + + return dates +} + + /* * returns a list of students who are eligible for a specified trial class */ @@ -410,6 +443,31 @@ function getAvailableMakeupLessons(userId, studentID, classID, startDt, endDt) { } +function getAvailableMakeupLessonsSchedule(userId, studentID, classID){ + //find all sessions not ended + const sessions = Collections.session.find({ + endDate : {$gte:new Date()} + }, { + sort: { + startDate: 1 + } + }).fetch(); + + const endDates= _.pluck(sessions, 'endDate') + const maxEndDate = _.max(endDates,(d)=>new Date(d).getTime()) + + const lessons = getAvailableMakeupLessons(userId, studentID, classID, new Date(), maxEndDate) + + //according to EdminForce.utils.dateFormat = 'YYYY-MM-DDTHH:mm:ss'; + let dates = _.map(lessons,(item)=>{ + return item.lessonDate && item.lessonDate.split('T')[0] + }) + dates = _.uniq(dates).sort() + + return dates +} + + EdminForce.Registration.getAvailableTrialLessons = getAvailableTrialLessons; EdminForce.Registration.getAvailableMakeupLessons = getAvailableMakeupLessons; @@ -417,4 +475,7 @@ EdminForce.Registration.getTrialStudents = getTrialStudents; EdminForce.Registration.validateStudentForClass = validateStudentForClass; EdminForce.Registration.bookTrial = bookTrial; EdminForce.Registration.isAvailableForMakeup = isAvailableForMakeup; -EdminForce.Registration.isAvailableForTrial = isAvailableForTrial; \ No newline at end of file +EdminForce.Registration.isAvailableForTrial = isAvailableForTrial; + +EdminForce.Registration.getAvailableTrialLessonsSchedule = getAvailableTrialLessonsSchedule; +EdminForce.Registration.getAvailableMakeupLessonsSchedule = getAvailableMakeupLessonsSchedule; \ No newline at end of file diff --git a/source/mobile-base/server/methods/program.js b/source/mobile-base/server/methods/program.js index 4037f15c..c1adb2d4 100644 --- a/source/mobile-base/server/methods/program.js +++ b/source/mobile-base/server/methods/program.js @@ -6,6 +6,11 @@ Meteor.methods({ check([startDt,endDt] [Date]); return EdminForce.Registration.getAvailableTrialLessons(programID, startDt, endDt); }, + 'program.getTrialClassesSchedule':function(programID){ + check(programID, String); + return EdminForce.Registration.getAvailableTrialLessonsSchedule(programID); + + }, // get a list of students who are eligible for trial class 'program.getTrialStudents': function(classID) { @@ -41,6 +46,12 @@ Meteor.methods({ check([startDt,endDt] [Date]); return EdminForce.Registration.getAvailableMakeupLessons(this.userId, studentID, classID, startDt, endDt); }, + 'program.getMakeupClassesSchedule':function(studentID, classID){ + check([studentID,classID], [String]); + check([startDt,endDt] [Date]); + return EdminForce.Registration.getAvailableMakeupLessonsSchedule(this.userId, studentID, classID); + + }, 'program.bookMakeup': function(studentID, classID, lessonDate) { check(studentID, String); From d2b45a8b1d04bb7c270ec91fddb66aabb48204cf Mon Sep 17 00:00:00 2001 From: Jeffrey Fan Date: Mon, 8 Aug 2016 00:13:54 +0800 Subject: [PATCH 3/9] implement disable logic base on new day picker --- .../programs/components/dateSelector.jsx | 1 + .../programs/components/makeupClasses.jsx | 24 ++++++++++- .../programs/components/trialClasses.jsx | 27 ++++++++++-- .../programs/containers/makeupClasses.js | 39 +++++++++++++++++- .../programs/containers/trialClasses.js | 41 ++++++++++++++++++- 5 files changed, 125 insertions(+), 7 deletions(-) diff --git a/source/mobile-base/client/modules/programs/components/dateSelector.jsx b/source/mobile-base/client/modules/programs/components/dateSelector.jsx index 50f100e9..03b0361c 100644 --- a/source/mobile-base/client/modules/programs/components/dateSelector.jsx +++ b/source/mobile-base/client/modules/programs/components/dateSelector.jsx @@ -2,6 +2,7 @@ * Created on 7/17/16. */ +//todo delete EdminForce.Components.DateSelector = class extends RC.CSS { constructor(p) { diff --git a/source/mobile-base/client/modules/programs/components/makeupClasses.jsx b/source/mobile-base/client/modules/programs/components/makeupClasses.jsx index 6eeb55a6..1eb3b88b 100644 --- a/source/mobile-base/client/modules/programs/components/makeupClasses.jsx +++ b/source/mobile-base/client/modules/programs/components/makeupClasses.jsx @@ -6,14 +6,23 @@ EdminForce.Components.MakeupClasses = class extends RC.CSS { }; this.onSelectDay = this.onSelectDay.bind(this); + this.isDisable = this.isDisable.bind(this); + } - onSelectDay(day) { + onSelectDay(e, day, { selected, disabled }) { + if(disabled) return; + day = moment(day).startOf('d'); if (!this.props.makeupDate || day.diff(this.props.makeupDate,'d') != 0) { this.props.context.LocalState.set('makeupDate', day.toDate()); } } + isDisable(day){ + let availableDates = this.props.availableDates + let dayF = moment(day).tz(EdminForce.Settings.timeZone).format('YYYY-MM-DD') + return availableDates && availableDates.indexOf(dayF)===-1 + } onSelectLesson(classData) { let path = FlowRouter.path('/makeupClassSummary', null, { @@ -66,7 +75,18 @@ EdminForce.Components.MakeupClasses = class extends RC.CSS {
- + + { + // + } + + DayPicker.DateUtils.isSameDay(day, this.props.makeupDate) } + onDayClick={this.onSelectDay} + /> +
{ this.renderClasses() }
diff --git a/source/mobile-base/client/modules/programs/components/trialClasses.jsx b/source/mobile-base/client/modules/programs/components/trialClasses.jsx index 9c7ada75..912ed9ae 100644 --- a/source/mobile-base/client/modules/programs/components/trialClasses.jsx +++ b/source/mobile-base/client/modules/programs/components/trialClasses.jsx @@ -9,18 +9,28 @@ EdminForce.Components.TrialClasses = class extends RC.CSS { } this.onSelectDay = this.onSelectDay.bind(this); + this.isDisable = this.isDisable.bind(this); + } getTrialStudents(classItem) { this.props.actions.showTrialEligibleStudents(classItem); } - onSelectDay(day) { + onSelectDay(e, day, { selected, disabled }) { + if(disabled) return; + day = moment(day).startOf('d'); if (!this.props.trialDate || day.diff(this.props.trialDate,'d') != 0) { this.props.context.LocalState.set('trialDate', day.toDate()); } } + isDisable(day){ + let availableDates = this.props.availableDates + let dayF = moment(day).tz(EdminForce.Settings.timeZone).format('YYYY-MM-DD') + return availableDates && availableDates.indexOf(dayF)===-1 + } + render() { let self = this; @@ -60,9 +70,20 @@ EdminForce.Components.TrialClasses = class extends RC.CSS {

Only available classes are listed here. If you need to book trial class on a particular date which is not shown here, please call the school.



+ { + // + } + + DayPicker.DateUtils.isSameDay(day, this.props.trialDate) } + onDayClick={this.onSelectDay} + /> + + - - + { lessons.length ? lessonElements :lessonElementsEmpty } diff --git a/source/mobile-base/client/modules/programs/containers/makeupClasses.js b/source/mobile-base/client/modules/programs/containers/makeupClasses.js index 336ceae9..569d25a1 100644 --- a/source/mobile-base/client/modules/programs/containers/makeupClasses.js +++ b/source/mobile-base/client/modules/programs/containers/makeupClasses.js @@ -40,5 +40,42 @@ const reactiveFnMakeupClasses = ({context,actions,studentID,classID}, onData) => actions.clearErrors(errorId); } }; -EdminForce.Containers.MakeupClasses = Composer.composeWithTracker(reactiveFnMakeupClasses)(EdminForce.Components.MakeupClasses); + +const availableDates = ({context,actions,studentID,classID}, onData)=>{ + const errorId = 'ERROR_MAKEUPCLASSES_AVAIBLE_DATES'; + const methodName = 'program.getMakeupClassesSchedule'; + + const error = context.LocalState.get(errorId); + if (error) { + onData(null, { + availableDates : [], + error + }) + } + else { + + Meteor.call(methodName, programID, function(methodError, result) { + + console.log(result) + onData(null,{ + availableDates : result || [], + error: methodError + }); + }); + + } + + return () => { + actions.clearErrors(errorId); + } +} + + +EdminForce.Containers.MakeupClasses = Composer.composeAll( + Composer.composeWithTracker(reactiveFnMakeupClasses), + Composer.composeWithTracker(availableDates) + +)(EdminForce.Components.TrialClasses) + +//Composer.composeWithTracker(reactiveFnMakeupClasses)(EdminForce.Components.MakeupClasses); diff --git a/source/mobile-base/client/modules/programs/containers/trialClasses.js b/source/mobile-base/client/modules/programs/containers/trialClasses.js index 5c0d3cf9..b78625b5 100644 --- a/source/mobile-base/client/modules/programs/containers/trialClasses.js +++ b/source/mobile-base/client/modules/programs/containers/trialClasses.js @@ -21,8 +21,11 @@ const reactiveFnTrialClasses = ({context,actions,programID}, onData) => { // call onData with no data to show loading screen onData(); + console.log('Meteor.call trialDate====',trialDate) // call method to get trial classes in 4 weeks Meteor.call('program.getTrialClasses', programID, trialDate, trialDate, function(methodError, result) { + console.log('Meteor.call trialDate====result',result) + if (!methodError){ EdminForce.utils.parseLessonDate(result); } @@ -42,4 +45,40 @@ const reactiveFnTrialClasses = ({context,actions,programID}, onData) => { } }; -EdminForce.Containers.TrialClasses = Composer.composeWithTracker(reactiveFnTrialClasses)(EdminForce.Components.TrialClasses); + +const availableDates = ({context,actions,programID}, onData)=>{ + const errorId = 'ERROR_TRIALCLASSES_AVAIBLE_DATES'; + const methodName = 'program.getTrialClassesSchedule'; + + const error = context.LocalState.get(errorId); + if (error) { + onData(null, { + availableDates : [], + error + }) + } + else { + + Meteor.call(methodName, programID, function(methodError, result) { + + //console.log(result) + onData(null,{ + availableDates : result || [], + error: methodError + }); + }); + + } + + return () => { + actions.clearErrors(errorId); + } +} +EdminForce.Containers.TrialClasses = + Composer.composeAll( + Composer.composeWithTracker(reactiveFnTrialClasses), + Composer.composeWithTracker(availableDates) + + )(EdminForce.Components.TrialClasses) + + //Composer.composeWithTracker(reactiveFnTrialClasses)(EdminForce.Components.TrialClasses); From 74b20dd2cad566e882b4cf15c1f0a210ca1a1a5d Mon Sep 17 00:00:00 2001 From: Jeffrey Fan Date: Tue, 16 Aug 2016 00:04:53 +0800 Subject: [PATCH 4/9] Fix data issue for makeup-classes --- .../client/modules/programs/containers/makeupClasses.js | 4 ++-- source/mobile-base/server/methods/program.js | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/source/mobile-base/client/modules/programs/containers/makeupClasses.js b/source/mobile-base/client/modules/programs/containers/makeupClasses.js index 569d25a1..3b7ca26c 100644 --- a/source/mobile-base/client/modules/programs/containers/makeupClasses.js +++ b/source/mobile-base/client/modules/programs/containers/makeupClasses.js @@ -54,7 +54,7 @@ const availableDates = ({context,actions,studentID,classID}, onData)=>{ } else { - Meteor.call(methodName, programID, function(methodError, result) { + Meteor.call(methodName, studentID, classID, function(methodError, result) { console.log(result) onData(null,{ @@ -75,7 +75,7 @@ EdminForce.Containers.MakeupClasses = Composer.composeAll( Composer.composeWithTracker(reactiveFnMakeupClasses), Composer.composeWithTracker(availableDates) -)(EdminForce.Components.TrialClasses) +)(EdminForce.Components.MakeupClasses) //Composer.composeWithTracker(reactiveFnMakeupClasses)(EdminForce.Components.MakeupClasses); diff --git a/source/mobile-base/server/methods/program.js b/source/mobile-base/server/methods/program.js index c1adb2d4..2e07c198 100644 --- a/source/mobile-base/server/methods/program.js +++ b/source/mobile-base/server/methods/program.js @@ -48,7 +48,6 @@ Meteor.methods({ }, 'program.getMakeupClassesSchedule':function(studentID, classID){ check([studentID,classID], [String]); - check([startDt,endDt] [Date]); return EdminForce.Registration.getAvailableMakeupLessonsSchedule(this.userId, studentID, classID); }, From 9f77e7036c64c5ec5fef754f42b1d28d7a973cf8 Mon Sep 17 00:00:00 2001 From: Jacky Date: Sun, 21 Aug 2016 18:20:06 -0700 Subject: [PATCH 5/9] update code --- .../client/page/Registrations/ResisterSummaryPage.jsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/admin-base/client/page/Registrations/ResisterSummaryPage.jsx b/source/admin-base/client/page/Registrations/ResisterSummaryPage.jsx index 5364c529..d94dc2c4 100644 --- a/source/admin-base/client/page/Registrations/ResisterSummaryPage.jsx +++ b/source/admin-base/client/page/Registrations/ResisterSummaryPage.jsx @@ -448,6 +448,11 @@ KUI.Registration_SummaryPage = class extends KUI.Page{ }); } else if(way === 'pay later'){ + Meteor.setTimeout(function(){ + self.m.Email.callMeteorMethod('sendRegistrationClassConfirmEmail', [{orderID : cid}], { + success : function(){} + }); + }, 100); FlowRouter.go('/student/'+self.studentID); } else{ From d73de79e6f410cea0ac983d1bdfec1f5f6dcbf10 Mon Sep 17 00:00:00 2001 From: Jin Li Date: Sun, 28 Aug 2016 12:19:19 -0700 Subject: [PATCH 6/9] JinL - fixed a bug in calcolor attendance page --- source/admin-base/client/page/Teachers/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/admin-base/client/page/Teachers/index.jsx b/source/admin-base/client/page/Teachers/index.jsx index 846c740e..7999f739 100644 --- a/source/admin-base/client/page/Teachers/index.jsx +++ b/source/admin-base/client/page/Teachers/index.jsx @@ -232,7 +232,7 @@ KUI.Teachers_index = class extends RC.CSS { newDate < this.currentSession.startDate || newDate > moment(this.currentSession.endDate).endOf('d').toDate()) { let classIdx = 0; - this.filterClassBySelectedTeacher(classIdx, newDate); + this.filterClassBySelectedTeacher(this.state.selectedTeacherIdx, newDate); this.getStudents(classIdx, () => { this.setState({ selectedDate: newDate, From d18ca893445eba172b80e0ed65fba5bfc405e616 Mon Sep 17 00:00:00 2001 From: Jacky Date: Wed, 31 Aug 2016 20:19:15 -0700 Subject: [PATCH 7/9] update code --- source/_packages_/module/AdminUser/Permission.jsx | 4 ++-- source/_packages_/module/AdminUser/class.jsx | 4 ++++ source/admin-base/client/lib/util.jsx | 2 +- source/admin-base/lib/router/base.jsx | 1 + 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/source/_packages_/module/AdminUser/Permission.jsx b/source/_packages_/module/AdminUser/Permission.jsx index 4195db62..995f385c 100644 --- a/source/_packages_/module/AdminUser/Permission.jsx +++ b/source/_packages_/module/AdminUser/Permission.jsx @@ -43,9 +43,9 @@ KG.define('EF-AdminPermission', class extends Base{ } addTestData(){ //add admin role - this._db.remove({role : 'admin'}); + //this._db.remove({role : 'admin'}); - let f = false; + let f = true; this._db.insert({ role : 'admin', nickName : 'Admin', diff --git a/source/_packages_/module/AdminUser/class.jsx b/source/_packages_/module/AdminUser/class.jsx index c10a7adb..6de45222 100644 --- a/source/_packages_/module/AdminUser/class.jsx +++ b/source/_packages_/module/AdminUser/class.jsx @@ -205,11 +205,15 @@ let AdminUser = class extends Base{ let m = KG.DataHelper.getDepModule(); let user = Meteor.user(); + //console.log(user); if(!user){ return false; } else{ let u = self._db.findOne({_id : user._id}); + if(u.role === 'superadmin'){ + u.role = 'admin'; + } let role = self.pm.getDB().findOne({role : u.role}); u.permission = role; diff --git a/source/admin-base/client/lib/util.jsx b/source/admin-base/client/lib/util.jsx index f3affa31..1b0267e1 100644 --- a/source/admin-base/client/lib/util.jsx +++ b/source/admin-base/client/lib/util.jsx @@ -189,7 +189,7 @@ util.user = { if(!user){ return false; } - if(user.role === 'admin'){ + if(user.role === 'admin' || user.role === 'superadmin'){ return true; } diff --git a/source/admin-base/lib/router/base.jsx b/source/admin-base/lib/router/base.jsx index bf3bd0c8..2cbb200f 100644 --- a/source/admin-base/lib/router/base.jsx +++ b/source/admin-base/lib/router/base.jsx @@ -49,6 +49,7 @@ if(Meteor.isClient){ KG.get('EF-AdminUser').callMeteorMethod('getCurrentUser', [], { success : function(user){ + console.log(user); App.user = user; callback(user); } From 588a4d862ba35e9fda88e059cae062e4e59bba15 Mon Sep 17 00:00:00 2001 From: Jacky Date: Wed, 31 Aug 2016 20:29:49 -0700 Subject: [PATCH 8/9] update code --- source/admin-base/client/page/Report/ClassStudent_Pending.jsx | 2 +- .../client/page/Report/ClassStudent_ProgramRegistration.jsx | 2 ++ source/admin-base/client/page/Report/Coupon.jsx | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/source/admin-base/client/page/Report/ClassStudent_Pending.jsx b/source/admin-base/client/page/Report/ClassStudent_Pending.jsx index b605a021..3763c0c0 100644 --- a/source/admin-base/client/page/Report/ClassStudent_Pending.jsx +++ b/source/admin-base/client/page/Report/ClassStudent_Pending.jsx @@ -95,7 +95,7 @@ KUI.Report_ClassStudent_Pending = class extends KUI.Page{ return ( -

+

Pending Registration Report

diff --git a/source/admin-base/client/page/Report/ClassStudent_ProgramRegistration.jsx b/source/admin-base/client/page/Report/ClassStudent_ProgramRegistration.jsx index 4c64c296..59c4185d 100644 --- a/source/admin-base/client/page/Report/ClassStudent_ProgramRegistration.jsx +++ b/source/admin-base/client/page/Report/ClassStudent_ProgramRegistration.jsx @@ -153,6 +153,8 @@ console.log(rs); } return ( +

Program Registration Report

+
+

Coupon Report

+
From 75e35877d756fae792b537ab5a5fc5d3824b0f2f Mon Sep 17 00:00:00 2001 From: Jacky Date: Wed, 31 Aug 2016 20:32:56 -0700 Subject: [PATCH 9/9] update code --- source/admin-base/client/page/Programs/session.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/admin-base/client/page/Programs/session.jsx b/source/admin-base/client/page/Programs/session.jsx index 9071daf6..8cee3df6 100644 --- a/source/admin-base/client/page/Programs/session.jsx +++ b/source/admin-base/client/page/Programs/session.jsx @@ -94,7 +94,7 @@ KUI.Program_session = class extends RC.CSSMeteorData{ } ]; - let format = 'YYYY-MM-DD'; + let format = KG.const.dateFormat; var list = _.map(this.data.list, (item)=>{ item.startDate = moment(item.startDate).format(format); item.endDate = moment(item.endDate).format(format);