UNPKG

react-widgets

Version:

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

159 lines (125 loc) 4.94 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 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, yearFormat: _utilPropTypes2['default'].dateFormat }; var isEqual = function isEqual(dataA, dateB) { return _utilDates2['default'].eq(dataA, dateB, 'year'); }; var optionId = function optionId(id, date) { return id + '__decade_' + _utilDates2['default'].year(date); }; exports['default'] = _react2['default'].createClass({ displayName: 'DecadeView', mixins: [require('./mixins/PureRenderMixin'), 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 years = getDecadeYears(focused); var rows = _util_2['default'].chunk(years, 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); return _react2['default'].createElement( 'tr', { key: 'row_' + rowIdx, role: 'row' }, row.map(function (date, colIdx) { var isFocused = isEqual(date, focused), isSelected = isEqual(date, value), currentYear = isEqual(date, today), label = _utilLocalizers.date.format(date, _utilLocalizers.date.getFormat('year', _this.props.yearFormat), culture); var currentID = optionId(id, date); return !_utilDates2['default'].inRange(date, min, max, 'year') ? _react2['default'].createElement( 'td', { key: colIdx, role: 'presentation', className: 'rw-empty-cell' }, ' ' ) : _react2['default'].createElement( 'td', { key: colIdx, role: 'gridcell', id: currentID, title: label, 'aria-selected': isSelected, 'aria-label': label, 'aria-readonly': disabled }, _react2['default'].createElement( 'span', { 'aria-labelledby': currentID, onClick: onChange.bind(null, date), className: _classnames2['default']('rw-btn', { 'rw-off-range': !inDecade(date, focused), 'rw-state-focus': isFocused, 'rw-state-selected': isSelected, 'rw-now': currentYear }) }, label ) ); }) ); } }); function inDecade(date, start) { return _utilDates2['default'].gte(date, _utilDates2['default'].startOf(start, 'decade'), 'year') && _utilDates2['default'].lte(date, _utilDates2['default'].endOf(start, 'decade'), 'year'); } function getDecadeYears(_date) { var days = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], date = _utilDates2['default'].add(_utilDates2['default'].startOf(_date, 'decade'), -2, 'year'); return days.map(function () { return date = _utilDates2['default'].add(date, 1, 'year'); }); } module.exports = exports['default'];