Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

3 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
  6. var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
  7. var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
  8. var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
  9. var _createClass2 = require('babel-runtime/helpers/createClass');
  10. var _createClass3 = _interopRequireDefault(_createClass2);
  11. var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
  12. var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
  13. var _inherits2 = require('babel-runtime/helpers/inherits');
  14. var _inherits3 = _interopRequireDefault(_inherits2);
  15. var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
  16. var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
  17. var _react = require('react');
  18. var _react2 = _interopRequireDefault(_react);
  19. var _propTypes = require('prop-types');
  20. var _propTypes2 = _interopRequireDefault(_propTypes);
  21. var _reactEventListener = require('react-event-listener');
  22. var _reactEventListener2 = _interopRequireDefault(_reactEventListener);
  23. var _keycode = require('keycode');
  24. var _keycode2 = _interopRequireDefault(_keycode);
  25. var _transitions = require('../styles/transitions');
  26. var _transitions2 = _interopRequireDefault(_transitions);
  27. var _CalendarActionButtons = require('./CalendarActionButtons');
  28. var _CalendarActionButtons2 = _interopRequireDefault(_CalendarActionButtons);
  29. var _CalendarMonth = require('./CalendarMonth');
  30. var _CalendarMonth2 = _interopRequireDefault(_CalendarMonth);
  31. var _CalendarYear = require('./CalendarYear');
  32. var _CalendarYear2 = _interopRequireDefault(_CalendarYear);
  33. var _CalendarToolbar = require('./CalendarToolbar');
  34. var _CalendarToolbar2 = _interopRequireDefault(_CalendarToolbar);
  35. var _DateDisplay = require('./DateDisplay');
  36. var _DateDisplay2 = _interopRequireDefault(_DateDisplay);
  37. var _SlideIn = require('../internal/SlideIn');
  38. var _SlideIn2 = _interopRequireDefault(_SlideIn);
  39. var _dateUtils = require('./dateUtils');
  40. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  41. var daysArray = [].concat((0, _toConsumableArray3.default)(Array(7)));
  42. var Calendar = function (_Component) {
  43. (0, _inherits3.default)(Calendar, _Component);
  44. function Calendar() {
  45. var _ref;
  46. var _temp, _this, _ret;
  47. (0, _classCallCheck3.default)(this, Calendar);
  48. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  49. args[_key] = arguments[_key];
  50. }
  51. return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = Calendar.__proto__ || (0, _getPrototypeOf2.default)(Calendar)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
  52. displayDate: undefined,
  53. displayMonthDay: undefined,
  54. selectedDate: undefined,
  55. transitionDirection: 'left',
  56. transitionEnter: true
  57. }, _this.calendarRefs = {}, _this.handleClickDay = function (event, date) {
  58. _this.setSelectedDate(date);
  59. if (_this.props.onClickDay) _this.props.onClickDay(event, date);
  60. }, _this.handleMonthChange = function (months) {
  61. var nextDirection = _this.context.muiTheme.isRtl ? 'right' : 'left';
  62. var prevDirection = _this.context.muiTheme.isRtl ? 'left' : 'right';
  63. var direction = months >= 0 ? nextDirection : prevDirection;
  64. _this.setState({
  65. transitionDirection: direction,
  66. displayDate: _this.props.utils.addMonths(_this.state.displayDate, months)
  67. });
  68. }, _this.handleClickYear = function (event, year) {
  69. _this.setSelectedDate(_this.props.utils.setYear(_this.state.selectedDate, year), event);
  70. _this.handleClickDateDisplayMonthDay();
  71. }, _this.handleClickDateDisplayMonthDay = function () {
  72. _this.setState({
  73. displayMonthDay: true
  74. });
  75. }, _this.handleClickDateDisplayYear = function () {
  76. _this.setState({
  77. displayMonthDay: false
  78. });
  79. }, _this.handleWindowKeyDown = function (event) {
  80. if (_this.props.open) {
  81. var nextArrow = _this.context.muiTheme.isRtl ? 'left' : 'right';
  82. var prevArrow = _this.context.muiTheme.isRtl ? 'right' : 'left';
  83. switch ((0, _keycode2.default)(event)) {
  84. case 'up':
  85. if (event.altKey && event.shiftKey) {
  86. _this.addSelectedYears(-1);
  87. } else if (event.shiftKey) {
  88. _this.addSelectedMonths(-1);
  89. } else {
  90. _this.addSelectedDays(-7);
  91. }
  92. break;
  93. case 'down':
  94. if (event.altKey && event.shiftKey) {
  95. _this.addSelectedYears(1);
  96. } else if (event.shiftKey) {
  97. _this.addSelectedMonths(1);
  98. } else {
  99. _this.addSelectedDays(7);
  100. }
  101. break;
  102. case nextArrow:
  103. if (event.altKey && event.shiftKey) {
  104. _this.addSelectedYears(1);
  105. } else if (event.shiftKey) {
  106. _this.addSelectedMonths(1);
  107. } else {
  108. _this.addSelectedDays(1);
  109. }
  110. break;
  111. case prevArrow:
  112. if (event.altKey && event.shiftKey) {
  113. _this.addSelectedYears(-1);
  114. } else if (event.shiftKey) {
  115. _this.addSelectedMonths(-1);
  116. } else {
  117. _this.addSelectedDays(-1);
  118. }
  119. break;
  120. }
  121. }
  122. }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
  123. }
  124. (0, _createClass3.default)(Calendar, [{
  125. key: 'componentWillMount',
  126. value: function componentWillMount() {
  127. this.setState({
  128. displayDate: this.props.utils.getFirstDayOfMonth(this.props.initialDate),
  129. selectedDate: this.props.initialDate,
  130. displayMonthDay: !this.props.openToYearSelection
  131. });
  132. }
  133. }, {
  134. key: 'componentWillReceiveProps',
  135. value: function componentWillReceiveProps(nextProps) {
  136. if (nextProps.initialDate !== this.props.initialDate) {
  137. var date = nextProps.initialDate || new Date();
  138. this.setState({
  139. displayDate: this.props.utils.getFirstDayOfMonth(date),
  140. selectedDate: date
  141. });
  142. }
  143. }
  144. }, {
  145. key: 'getMinDate',
  146. value: function getMinDate() {
  147. return this.props.minDate || this.props.utils.addYears(new Date(), -100);
  148. }
  149. }, {
  150. key: 'getMaxDate',
  151. value: function getMaxDate() {
  152. return this.props.maxDate || this.props.utils.addYears(new Date(), 100);
  153. }
  154. }, {
  155. key: 'getSelectedDate',
  156. value: function getSelectedDate() {
  157. return this.state.selectedDate;
  158. }
  159. }, {
  160. key: 'isSelectedDateDisabled',
  161. value: function isSelectedDateDisabled() {
  162. if (!this.state.displayMonthDay) {
  163. return false;
  164. }
  165. if (this.calendarRefs.calendar) {
  166. return this.calendarRefs.calendar.isSelectedDateDisabled();
  167. } else {
  168. return false;
  169. }
  170. }
  171. }, {
  172. key: 'addSelectedDays',
  173. value: function addSelectedDays(days) {
  174. this.setSelectedDate(this.props.utils.addDays(this.state.selectedDate, days));
  175. }
  176. }, {
  177. key: 'addSelectedMonths',
  178. value: function addSelectedMonths(months) {
  179. this.setSelectedDate(this.props.utils.addMonths(this.state.selectedDate, months));
  180. }
  181. }, {
  182. key: 'addSelectedYears',
  183. value: function addSelectedYears(years) {
  184. this.setSelectedDate(this.props.utils.addYears(this.state.selectedDate, years));
  185. }
  186. }, {
  187. key: 'setDisplayDate',
  188. value: function setDisplayDate(date, newSelectedDate) {
  189. var newDisplayDate = this.props.utils.getFirstDayOfMonth(date);
  190. if (newDisplayDate !== this.state.displayDate) {
  191. var nextDirection = this.context.muiTheme.isRtl ? 'right' : 'left';
  192. var prevDirection = this.context.muiTheme.isRtl ? 'left' : 'right';
  193. var direction = newDisplayDate > this.state.displayDate ? nextDirection : prevDirection;
  194. this.setState({
  195. displayDate: newDisplayDate,
  196. transitionDirection: direction,
  197. selectedDate: newSelectedDate || this.state.selectedDate
  198. });
  199. }
  200. }
  201. }, {
  202. key: 'setSelectedDate',
  203. value: function setSelectedDate(date) {
  204. var adjustedDate = date;
  205. var minDate = this.getMinDate();
  206. var maxDate = this.getMaxDate();
  207. if ((0, _dateUtils.isBeforeDate)(date, minDate)) {
  208. adjustedDate = minDate;
  209. } else if ((0, _dateUtils.isAfterDate)(date, maxDate)) {
  210. adjustedDate = maxDate;
  211. }
  212. var newDisplayDate = this.props.utils.getFirstDayOfMonth(adjustedDate);
  213. if (newDisplayDate !== this.state.displayDate) {
  214. this.setDisplayDate(newDisplayDate, adjustedDate);
  215. } else {
  216. this.setState({
  217. selectedDate: adjustedDate
  218. });
  219. }
  220. }
  221. }, {
  222. key: 'getToolbarInteractions',
  223. value: function getToolbarInteractions() {
  224. return {
  225. prevMonth: this.props.utils.monthDiff(this.state.displayDate, this.getMinDate()) > 0,
  226. nextMonth: this.props.utils.monthDiff(this.state.displayDate, this.getMaxDate()) < 0
  227. };
  228. }
  229. }, {
  230. key: 'yearSelector',
  231. value: function yearSelector() {
  232. if (!this.props.disableYearSelection) {
  233. return _react2.default.createElement(_CalendarYear2.default, {
  234. key: 'years',
  235. DateTimeFormat: this.props.DateTimeFormat,
  236. locale: this.props.locale,
  237. onClickYear: this.handleClickYear,
  238. selectedDate: this.state.selectedDate,
  239. minDate: this.getMinDate(),
  240. maxDate: this.getMaxDate(),
  241. utils: this.props.utils
  242. });
  243. }
  244. }
  245. }, {
  246. key: 'render',
  247. value: function render() {
  248. var _this2 = this;
  249. var prepareStyles = this.context.muiTheme.prepareStyles;
  250. var hideCalendarDate = this.props.hideCalendarDate;
  251. var toolbarInteractions = this.getToolbarInteractions();
  252. var isLandscape = this.props.mode === 'landscape';
  253. var calendarTextColor = this.context.muiTheme.datePicker.calendarTextColor;
  254. var styles = {
  255. root: {
  256. color: calendarTextColor,
  257. userSelect: 'none',
  258. width: !hideCalendarDate && isLandscape ? 479 : 310
  259. },
  260. calendar: {
  261. display: 'flex',
  262. flexDirection: 'column'
  263. },
  264. calendarContainer: {
  265. display: 'flex',
  266. alignContent: 'space-between',
  267. justifyContent: 'space-between',
  268. flexDirection: 'column',
  269. fontSize: 12,
  270. fontWeight: 400,
  271. padding: '0px 8px',
  272. transition: _transitions2.default.easeOut()
  273. },
  274. yearContainer: {
  275. display: 'flex',
  276. justifyContent: 'space-between',
  277. flexDirection: 'column',
  278. height: 272,
  279. marginTop: 10,
  280. overflow: 'hidden',
  281. width: 310
  282. },
  283. weekTitle: {
  284. display: 'flex',
  285. flexDirection: 'row',
  286. justifyContent: 'space-between',
  287. fontWeight: '500',
  288. height: 20,
  289. lineHeight: '15px',
  290. opacity: '0.5',
  291. textAlign: 'center'
  292. },
  293. weekTitleDay: {
  294. width: 42
  295. },
  296. transitionSlide: {
  297. height: 214
  298. }
  299. };
  300. var weekTitleDayStyle = prepareStyles(styles.weekTitleDay);
  301. var _props = this.props,
  302. cancelLabel = _props.cancelLabel,
  303. DateTimeFormat = _props.DateTimeFormat,
  304. firstDayOfWeek = _props.firstDayOfWeek,
  305. locale = _props.locale,
  306. okLabel = _props.okLabel,
  307. onClickCancel = _props.onClickCancel,
  308. onClickOk = _props.onClickOk,
  309. utils = _props.utils;
  310. return _react2.default.createElement(
  311. 'div',
  312. { style: prepareStyles(styles.root) },
  313. _react2.default.createElement(_reactEventListener2.default, {
  314. target: 'window',
  315. onKeyDown: this.handleWindowKeyDown
  316. }),
  317. !hideCalendarDate && _react2.default.createElement(_DateDisplay2.default, {
  318. DateTimeFormat: DateTimeFormat,
  319. disableYearSelection: this.props.disableYearSelection,
  320. onClickMonthDay: this.handleClickDateDisplayMonthDay,
  321. onClickYear: this.handleClickDateDisplayYear,
  322. locale: locale,
  323. monthDaySelected: this.state.displayMonthDay,
  324. mode: this.props.mode,
  325. selectedDate: this.state.selectedDate
  326. }),
  327. _react2.default.createElement(
  328. 'div',
  329. { style: prepareStyles(styles.calendar) },
  330. this.state.displayMonthDay && _react2.default.createElement(
  331. 'div',
  332. { style: prepareStyles(styles.calendarContainer) },
  333. _react2.default.createElement(_CalendarToolbar2.default, {
  334. DateTimeFormat: DateTimeFormat,
  335. locale: locale,
  336. displayDate: this.state.displayDate,
  337. onMonthChange: this.handleMonthChange,
  338. prevMonth: toolbarInteractions.prevMonth,
  339. nextMonth: toolbarInteractions.nextMonth
  340. }),
  341. _react2.default.createElement(
  342. 'div',
  343. { style: prepareStyles(styles.weekTitle) },
  344. daysArray.map(function (event, i) {
  345. return _react2.default.createElement(
  346. 'span',
  347. { key: i, style: weekTitleDayStyle },
  348. (0, _dateUtils.localizedWeekday)(DateTimeFormat, locale, i, firstDayOfWeek)
  349. );
  350. })
  351. ),
  352. _react2.default.createElement(
  353. _SlideIn2.default,
  354. { direction: this.state.transitionDirection, style: styles.transitionSlide },
  355. _react2.default.createElement(_CalendarMonth2.default, {
  356. DateTimeFormat: DateTimeFormat,
  357. locale: locale,
  358. displayDate: this.state.displayDate,
  359. firstDayOfWeek: this.props.firstDayOfWeek,
  360. key: this.state.displayDate.toDateString(),
  361. minDate: this.getMinDate(),
  362. maxDate: this.getMaxDate(),
  363. onClickDay: this.handleClickDay,
  364. ref: function ref(_ref2) {
  365. return _this2.calendarRefs.calendar = _ref2;
  366. },
  367. selectedDate: this.state.selectedDate,
  368. shouldDisableDate: this.props.shouldDisableDate,
  369. utils: utils
  370. })
  371. )
  372. ),
  373. !this.state.displayMonthDay && _react2.default.createElement(
  374. 'div',
  375. { style: prepareStyles(styles.yearContainer) },
  376. this.yearSelector()
  377. ),
  378. okLabel && _react2.default.createElement(_CalendarActionButtons2.default, {
  379. autoOk: this.props.autoOk,
  380. cancelLabel: cancelLabel,
  381. okLabel: okLabel,
  382. onClickCancel: onClickCancel,
  383. onClickOk: onClickOk
  384. })
  385. )
  386. );
  387. }
  388. }]);
  389. return Calendar;
  390. }(_react.Component);
  391. Calendar.defaultProps = {
  392. DateTimeFormat: _dateUtils.dateTimeFormat,
  393. disableYearSelection: false,
  394. initialDate: new Date(),
  395. locale: 'en-US',
  396. utils: _dateUtils.defaultUtils
  397. };
  398. Calendar.contextTypes = {
  399. muiTheme: _propTypes2.default.object.isRequired
  400. };
  401. Calendar.propTypes = process.env.NODE_ENV !== "production" ? {
  402. DateTimeFormat: _propTypes2.default.func.isRequired,
  403. autoOk: _propTypes2.default.bool,
  404. cancelLabel: _propTypes2.default.node,
  405. disableYearSelection: _propTypes2.default.bool,
  406. firstDayOfWeek: _propTypes2.default.number,
  407. hideCalendarDate: _propTypes2.default.bool,
  408. initialDate: _propTypes2.default.object,
  409. locale: _propTypes2.default.string.isRequired,
  410. maxDate: _propTypes2.default.object,
  411. minDate: _propTypes2.default.object,
  412. mode: _propTypes2.default.oneOf(['portrait', 'landscape']),
  413. okLabel: _propTypes2.default.node,
  414. onClickCancel: _propTypes2.default.func,
  415. onClickDay: _propTypes2.default.func,
  416. onClickOk: _propTypes2.default.func,
  417. open: _propTypes2.default.bool,
  418. openToYearSelection: _propTypes2.default.bool,
  419. shouldDisableDate: _propTypes2.default.func,
  420. utils: _propTypes2.default.object
  421. } : {};
  422. exports.default = Calendar;