UNPKG

react-widgets

Version:

An à la carte set of polished, extensible, and accessible inputs built for React

152 lines (119 loc) 4.62 kB
'use strict'; var babelHelpers = require('./util/babelHelpers.js'); exports.__esModule = true; var _react = require('react'); var _react2 = babelHelpers.interopRequireDefault(_react); var _classnames = require('classnames'); var _classnames2 = babelHelpers.interopRequireDefault(_classnames); var _utilDates = require('./util/dates'); var _utilDates2 = babelHelpers.interopRequireDefault(_utilDates); var _utilLocalizers = require('./util/localizers'); var _util_ = require('./util/_'); var _util_2 = babelHelpers.interopRequireDefault(_util_); var _utilPropTypes = require('./util/propTypes'); var _utilPropTypes2 = babelHelpers.interopRequireDefault(_utilPropTypes); var _utilWidgetHelpers = require('./util/widgetHelpers'); var format = function format(props) { return _utilLocalizers.date.getFormat('month', props.monthFormat); }; var propTypes = { optionID: _react2['default'].PropTypes.func, culture: _react2['default'].PropTypes.string, value: _react2['default'].PropTypes.instanceOf(Date), focused: _react2['default'].PropTypes.instanceOf(Date), min: _react2['default'].PropTypes.instanceOf(Date), max: _react2['default'].PropTypes.instanceOf(Date), onChange: _react2['default'].PropTypes.func.isRequired, monthFormat: _utilPropTypes2['default'].dateFormat }; var isEqual = function isEqual(dateA, dateB) { return _utilDates2['default'].eq(dateA, dateB, 'month'); }; var optionId = function optionId(id, date) { return id + '__year_' + _utilDates2['default'].year(date) + '-' + _utilDates2['default'].month(date); }; var YearView = _react2['default'].createClass({ displayName: 'YearView', mixins: [require('./mixins/RtlChildContextMixin'), require('./mixins/AriaDescendantMixin')()], propTypes: propTypes, componentDidUpdate: function componentDidUpdate() { var activeId = optionId(_utilWidgetHelpers.instanceId(this), this.props.focused); this.ariaActiveDescendant(activeId); }, render: function render() { var _props = this.props; var className = _props.className; var focused = _props.focused; var months = _utilDates2['default'].monthsInYear(_utilDates2['default'].year(focused)); var rows = _util_2['default'].chunk(months, 4); var elementProps = _util_2['default'].omit(this.props, Object.keys(propTypes)); return _react2['default'].createElement( 'table', babelHelpers._extends({}, elementProps, { role: 'grid', className: _classnames2['default'](className, 'rw-nav-view') }), _react2['default'].createElement( 'tbody', null, rows.map(this._row) ) ); }, _row: function _row(row, rowIdx) { var _this = this; var _props2 = this.props; var focused = _props2.focused; var disabled = _props2.disabled; var onChange = _props2.onChange; var value = _props2.value; var today = _props2.today; var culture = _props2.culture; var min = _props2.min; var max = _props2.max; var id = _utilWidgetHelpers.instanceId(this); var labelFormat = _utilLocalizers.date.getFormat('header'); return _react2['default'].createElement( 'tr', { key: rowIdx, role: 'row' }, row.map(function (date, colIdx) { var isFocused = isEqual(date, focused), isSelected = isEqual(date, value), currentMonth = isEqual(date, today), label = _utilLocalizers.date.format(date, labelFormat, culture); var currentID = optionId(id, date); return _utilDates2['default'].inRange(date, min, max, 'month') ? _react2['default'].createElement( 'td', { key: colIdx, role: 'gridcell', id: currentID, title: label, 'aria-selected': isSelected, 'aria-readonly': disabled, 'aria-label': label }, _react2['default'].createElement( 'span', { 'aria-labelledby': currentID, onClick: onChange.bind(null, date), className: _classnames2['default']('rw-btn', { 'rw-state-focus': isFocused, 'rw-state-selected': isSelected, 'rw-now': currentMonth }) }, _utilLocalizers.date.format(date, format(_this.props), culture) ) ) : _react2['default'].createElement( 'td', { key: colIdx, className: 'rw-empty-cell', role: 'presentation' }, ' ' ); }) ); } }); exports['default'] = YearView; module.exports = exports['default'];