@resmio/mantecao
Version:
A react UI library for resmio
221 lines (173 loc) • 8.03 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _taggedTemplateLiteral2 = require('babel-runtime/helpers/taggedTemplateLiteral');
var _taggedTemplateLiteral3 = _interopRequireDefault(_taggedTemplateLiteral2);
var _templateObject = (0, _taggedTemplateLiteral3.default)(['\n display: flex;\n justify-content: space-between;\n\n & select:first-of-type + select {\n margin-right: 0.3em;\n margin-left: 0.3em;\n }\n'], ['\n display: flex;\n justify-content: space-between;\n\n & select:first-of-type + select {\n margin-right: 0.3em;\n margin-left: 0.3em;\n }\n']),
_templateObject2 = (0, _taggedTemplateLiteral3.default)(['\n font-size: 0.9em;\n color: ', ';\n'], ['\n font-size: 0.9em;\n color: ', ';\n']),
_templateObject3 = (0, _taggedTemplateLiteral3.default)(['\n cursor: pointer;\n color: ', ';\n padding-top: 0.2em;\n\n &:hover {\n color: ', ';\n }\n'], ['\n cursor: pointer;\n color: ', ';\n padding-top: 0.2em;\n\n &:hover {\n color: ', ';\n }\n']);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var t = _interopRequireWildcard(_propTypes);
var _styledComponents = require('styled-components');
var _styledComponents2 = _interopRequireDefault(_styledComponents);
var _variables = require('../variables');
var _dates = require('../utils/dates');
var _Select = require('./Select');
var _Select2 = _interopRequireDefault(_Select);
var _TrashIcon = require('../icons/TrashIcon');
var _TrashIcon2 = _interopRequireDefault(_TrashIcon);
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 }; }
var StyledWrapper = _styledComponents2.default.div(_templateObject);
var StyledError = _styledComponents2.default.div(_templateObject2, _variables.colors.amaranth);
var StyledTrash = _styledComponents2.default.span(_templateObject3, _variables.colors.dustyGray, _variables.colors.emperor);
// Date Generation
var days = [].concat((0, _toConsumableArray3.default)(Array(31 + 1).keys())).slice(1);
var actualYear = (0, _dates.getYearFromDate)(new Date());
var years = (0, _dates.getPastYears)(120, actualYear
// Validation
);var validate = function validate(date) {
if (date.day === 0 && date.month === 0 && date.year === 0) {
return {}; // <-- need a way to clear the errors since it is maintained in this component's state - we can fix this somehow later
}
var errors = {};
if (date.day === 0) {
errors.day = true;
}
if (date.month === 0) {
errors.month = true;
}
if (date.year === 0) {
errors.year = true;
}
if (!(0, _dates.isValidDate)(date)) {
errors.invalid = true;
}
return errors;
};
// Component
// - Props:
// - date :DateString (date='2017-05-03')
// - monthBeforeDay :Boolean
// - onChange :Func
var DateSelector = function (_Component) {
(0, _inherits3.default)(DateSelector, _Component);
function DateSelector() {
var _ref;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, DateSelector);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = DateSelector.__proto__ || (0, _getPrototypeOf2.default)(DateSelector)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
date: {
day: (0, _dates.getDayFromDate)(_this.props.date),
// Month is 0 based so we need to add 1 here
month: (0, _dates.getMonthFromDate)(_this.props.date) + 1,
year: (0, _dates.getYearFromDate)(_this.props.date)
},
errors: {}
}, _this.handleInputChange = function (evt) {
var date = _this.state.date;
date[evt.target.id] = parseInt(evt.target.value, 10);
var errors = validate(date);
_this.setState({ date: date, errors: errors }, function () {
return _this.props.onChange(_this.state);
});
}, _this.resetDate = function () {
_this.setState({
date: { day: 0, month: 0, year: 0 },
errors: {}
}, function () {
return _this.props.onChange(_this.state);
});
}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
(0, _createClass3.default)(DateSelector, [{
key: 'render',
// doing the onchange in the component lifecycle was causing some strange behavior
// when the values changed - so we do it with the methods that change the date
// componentDidUpdate () {
// this.props.onChange(this.state)
// }
value: function render() {
var day = _react2.default.createElement(_Select2.default, {
name: this.props.dayString || 'Day',
id: 'day',
options: days,
selected: this.state.date.day,
onOptionChange: this.handleInputChange,
hasError: this.state.errors.day
});
var month = _react2.default.createElement(_Select2.default, {
name: this.props.monthString || 'Month',
id: 'month',
options: this.props.monthNames || _dates.MONTH_NAMES,
values: [].concat((0, _toConsumableArray3.default)(Array(13).keys())).slice(1),
selected: this.state.date.month,
onOptionChange: this.handleInputChange,
hasError: this.state.errors.month
});
return _react2.default.createElement(
'div',
null,
_react2.default.createElement(
StyledWrapper,
null,
this.props.monthBeforeDay ? month : day,
this.props.monthBeforeDay ? day : month,
_react2.default.createElement(_Select2.default, {
name: this.props.yearString || 'Year',
id: 'year',
options: years,
selected: this.state.date.year,
onOptionChange: this.handleInputChange,
hasError: this.state.errors.year,
optionsAsValues: true
}),
this.props.allowReset && _react2.default.createElement(
StyledTrash,
{ onClick: this.resetDate },
_react2.default.createElement(_TrashIcon2.default, { style: { width: '2em', height: '2em' } })
)
),
this.state.errors.invalid && _react2.default.createElement(
StyledError,
null,
this.props.errorString || 'Please provide a valid date'
)
);
}
}]);
return DateSelector;
}(_react.Component);
DateSelector.defaultProps = {
date: '1999-12-31'
};
DateSelector.propTypes = process.env.NODE_ENV !== "production" ? {
allowReset: t.bool,
date: t.string,
dayString: t.string,
errorString: t.string,
monthBeforeDay: t.bool,
monthNames: t.array,
monthString: t.string,
onChange: t.func.isRequired,
yearString: t.string
} : {};
exports.default = DateSelector;