react-dates
Version:
A responsive and accessible date range picker component built with React
389 lines (319 loc) • 12.2 kB
JavaScript
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 _object = require('object.assign');
var _object2 = _interopRequireDefault(_object);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _airbnbPropTypes = require('airbnb-prop-types');
var _reactWithStyles = require('react-with-styles');
var _defaultPhrases = require('../defaultPhrases');
var _getPhrasePropTypes = require('../utils/getPhrasePropTypes');
var _getPhrasePropTypes2 = _interopRequireDefault(_getPhrasePropTypes);
var _OpenDirectionShape = require('../shapes/OpenDirectionShape');
var _OpenDirectionShape2 = _interopRequireDefault(_OpenDirectionShape);
var _DateInput = require('./DateInput');
var _DateInput2 = _interopRequireDefault(_DateInput);
var _IconPositionShape = require('../shapes/IconPositionShape');
var _IconPositionShape2 = _interopRequireDefault(_IconPositionShape);
var _RightArrow = require('./RightArrow');
var _RightArrow2 = _interopRequireDefault(_RightArrow);
var _LeftArrow = require('./LeftArrow');
var _LeftArrow2 = _interopRequireDefault(_LeftArrow);
var _CloseButton = require('./CloseButton');
var _CloseButton2 = _interopRequireDefault(_CloseButton);
var _CalendarIcon = require('./CalendarIcon');
var _CalendarIcon2 = _interopRequireDefault(_CalendarIcon);
var _constants = require('../constants');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var propTypes = (0, _airbnbPropTypes.forbidExtraProps)((0, _object2['default'])({}, _reactWithStyles.withStylesPropTypes, {
startDateId: _propTypes2['default'].string,
startDatePlaceholderText: _propTypes2['default'].string,
screenReaderMessage: _propTypes2['default'].string,
endDateId: _propTypes2['default'].string,
endDatePlaceholderText: _propTypes2['default'].string,
onStartDateFocus: _propTypes2['default'].func,
onEndDateFocus: _propTypes2['default'].func,
onStartDateChange: _propTypes2['default'].func,
onEndDateChange: _propTypes2['default'].func,
onStartDateShiftTab: _propTypes2['default'].func,
onEndDateTab: _propTypes2['default'].func,
onClearDates: _propTypes2['default'].func,
onKeyDownArrowDown: _propTypes2['default'].func,
onKeyDownQuestionMark: _propTypes2['default'].func,
startDate: _propTypes2['default'].string,
endDate: _propTypes2['default'].string,
isStartDateFocused: _propTypes2['default'].bool,
isEndDateFocused: _propTypes2['default'].bool,
showClearDates: _propTypes2['default'].bool,
disabled: _propTypes2['default'].bool,
required: _propTypes2['default'].bool,
readOnly: _propTypes2['default'].bool,
openDirection: _OpenDirectionShape2['default'],
showCaret: _propTypes2['default'].bool,
showDefaultInputIcon: _propTypes2['default'].bool,
inputIconPosition: _IconPositionShape2['default'],
customInputIcon: _propTypes2['default'].node,
customArrowIcon: _propTypes2['default'].node,
customCloseIcon: _propTypes2['default'].node,
// accessibility
isFocused: _propTypes2['default'].bool, // describes actual DOM focus
// i18n
phrases: _propTypes2['default'].shape((0, _getPhrasePropTypes2['default'])(_defaultPhrases.DateRangePickerInputPhrases)),
isRTL: _propTypes2['default'].bool
}));
var defaultProps = {
startDateId: _constants.START_DATE,
endDateId: _constants.END_DATE,
startDatePlaceholderText: 'Start Date',
endDatePlaceholderText: 'End Date',
screenReaderMessage: '',
onStartDateFocus: function () {
function onStartDateFocus() {}
return onStartDateFocus;
}(),
onEndDateFocus: function () {
function onEndDateFocus() {}
return onEndDateFocus;
}(),
onStartDateChange: function () {
function onStartDateChange() {}
return onStartDateChange;
}(),
onEndDateChange: function () {
function onEndDateChange() {}
return onEndDateChange;
}(),
onStartDateShiftTab: function () {
function onStartDateShiftTab() {}
return onStartDateShiftTab;
}(),
onEndDateTab: function () {
function onEndDateTab() {}
return onEndDateTab;
}(),
onClearDates: function () {
function onClearDates() {}
return onClearDates;
}(),
onKeyDownArrowDown: function () {
function onKeyDownArrowDown() {}
return onKeyDownArrowDown;
}(),
onKeyDownQuestionMark: function () {
function onKeyDownQuestionMark() {}
return onKeyDownQuestionMark;
}(),
startDate: '',
endDate: '',
isStartDateFocused: false,
isEndDateFocused: false,
showClearDates: false,
disabled: false,
required: false,
readOnly: false,
openDirection: _constants.OPEN_DOWN,
showCaret: false,
showDefaultInputIcon: false,
inputIconPosition: _constants.ICON_BEFORE_POSITION,
customInputIcon: null,
customArrowIcon: null,
customCloseIcon: null,
// accessibility
isFocused: false,
// i18n
phrases: _defaultPhrases.DateRangePickerInputPhrases,
isRTL: false
};
function DateRangePickerInput(_ref) {
var startDate = _ref.startDate,
startDateId = _ref.startDateId,
startDatePlaceholderText = _ref.startDatePlaceholderText,
screenReaderMessage = _ref.screenReaderMessage,
isStartDateFocused = _ref.isStartDateFocused,
onStartDateChange = _ref.onStartDateChange,
onStartDateFocus = _ref.onStartDateFocus,
onStartDateShiftTab = _ref.onStartDateShiftTab,
endDate = _ref.endDate,
endDateId = _ref.endDateId,
endDatePlaceholderText = _ref.endDatePlaceholderText,
isEndDateFocused = _ref.isEndDateFocused,
onEndDateChange = _ref.onEndDateChange,
onEndDateFocus = _ref.onEndDateFocus,
onEndDateTab = _ref.onEndDateTab,
onKeyDownArrowDown = _ref.onKeyDownArrowDown,
onKeyDownQuestionMark = _ref.onKeyDownQuestionMark,
onClearDates = _ref.onClearDates,
showClearDates = _ref.showClearDates,
disabled = _ref.disabled,
required = _ref.required,
readOnly = _ref.readOnly,
showCaret = _ref.showCaret,
openDirection = _ref.openDirection,
showDefaultInputIcon = _ref.showDefaultInputIcon,
inputIconPosition = _ref.inputIconPosition,
customInputIcon = _ref.customInputIcon,
customArrowIcon = _ref.customArrowIcon,
customCloseIcon = _ref.customCloseIcon,
isFocused = _ref.isFocused,
phrases = _ref.phrases,
isRTL = _ref.isRTL,
styles = _ref.styles;
var calendarIcon = customInputIcon || _react2['default'].createElement(_CalendarIcon2['default'], (0, _reactWithStyles.css)(styles.DateRangePickerInput_calendarIcon_svg));
var arrowIcon = customArrowIcon || (isRTL ? _react2['default'].createElement(_LeftArrow2['default'], (0, _reactWithStyles.css)(styles.DateRangePickerInput_arrow_svg)) : _react2['default'].createElement(_RightArrow2['default'], (0, _reactWithStyles.css)(styles.DateRangePickerInput_arrow_svg)));
var closeIcon = customCloseIcon || _react2['default'].createElement(_CloseButton2['default'], (0, _reactWithStyles.css)(styles.DateRangePickerInput_clearDates_svg));
var screenReaderText = screenReaderMessage || phrases.keyboardNavigationInstructions;
var inputIcon = (showDefaultInputIcon || customInputIcon !== null) && _react2['default'].createElement(
'button',
_extends({}, (0, _reactWithStyles.css)(styles.DateRangePickerInput_calendarIcon), {
type: 'button',
disabled: disabled,
'aria-label': phrases.focusStartDate,
onClick: onKeyDownArrowDown
}),
calendarIcon
);
return _react2['default'].createElement(
'div',
(0, _reactWithStyles.css)(styles.DateRangePickerInput, disabled && styles.DateRangePickerInput__disabled, isRTL && styles.DateRangePickerInput__rtl),
inputIconPosition === _constants.ICON_BEFORE_POSITION && inputIcon,
_react2['default'].createElement(_DateInput2['default'], {
id: startDateId,
placeholder: startDatePlaceholderText,
displayValue: startDate,
screenReaderMessage: screenReaderText,
focused: isStartDateFocused,
isFocused: isFocused,
disabled: disabled,
required: required,
readOnly: readOnly,
showCaret: showCaret,
openDirection: openDirection,
onChange: onStartDateChange,
onFocus: onStartDateFocus,
onKeyDownShiftTab: onStartDateShiftTab,
onKeyDownArrowDown: onKeyDownArrowDown,
onKeyDownQuestionMark: onKeyDownQuestionMark
}),
_react2['default'].createElement(
'div',
_extends({}, (0, _reactWithStyles.css)(styles.DateRangePickerInput_arrow), {
'aria-hidden': 'true',
role: 'presentation'
}),
arrowIcon
),
_react2['default'].createElement(_DateInput2['default'], {
id: endDateId,
placeholder: endDatePlaceholderText,
displayValue: endDate,
screenReaderMessage: screenReaderText,
focused: isEndDateFocused,
isFocused: isFocused,
disabled: disabled,
required: required,
readOnly: readOnly,
showCaret: showCaret,
openDirection: openDirection,
onChange: onEndDateChange,
onFocus: onEndDateFocus,
onKeyDownTab: onEndDateTab,
onKeyDownArrowDown: onKeyDownArrowDown,
onKeyDownQuestionMark: onKeyDownQuestionMark
}),
showClearDates && _react2['default'].createElement(
'button',
_extends({
type: 'button',
'aria-label': phrases.clearDates
}, (0, _reactWithStyles.css)(styles.DateRangePickerInput_clearDates, !(startDate || endDate) && styles.DateRangePickerInput_clearDates__hide), {
onClick: onClearDates,
disabled: disabled
}),
closeIcon
),
inputIconPosition === _constants.ICON_AFTER_POSITION && inputIcon
);
}
DateRangePickerInput.propTypes = propTypes;
DateRangePickerInput.defaultProps = defaultProps;
exports['default'] = (0, _reactWithStyles.withStyles)(function (_ref2) {
var _ref2$reactDates = _ref2.reactDates,
color = _ref2$reactDates.color,
sizing = _ref2$reactDates.sizing;
return {
DateRangePickerInput: {
backgroundColor: color.background,
border: '1px solid ' + String(color.core.grayLighter),
display: 'inline-block'
},
DateRangePickerInput__disabled: {
background: color.disabled
},
DateRangePickerInput__rtl: {
direction: 'rtl'
},
DateRangePickerInput_arrow: {
display: 'inline-block',
verticalAlign: 'middle'
},
DateRangePickerInput_arrow_svg: {
verticalAlign: 'middle',
fill: color.text,
height: sizing.arrowWidth,
width: sizing.arrowWidth
},
DateRangePickerInput_clearDates: {
background: 'none',
border: 0,
color: 'inherit',
font: 'inherit',
lineHeight: 'normal',
overflow: 'visible',
cursor: 'pointer',
display: 'inline-block',
verticalAlign: 'middle',
padding: 10,
margin: '0 10px 0 5px',
':focus': {
background: color.core.border,
borderRadius: '50%'
},
':hover': {
background: color.core.border,
borderRadius: '50%'
}
},
DateRangePickerInput_clearDates__hide: {
visibility: 'hidden'
},
DateRangePickerInput_clearDates_svg: {
fill: color.core.grayLight,
height: 12,
width: 15,
verticalAlign: 'middle'
},
DateRangePickerInput_calendarIcon: {
background: 'none',
border: 0,
color: 'inherit',
font: 'inherit',
lineHeight: 'normal',
overflow: 'visible',
cursor: 'pointer',
display: 'inline-block',
verticalAlign: 'middle',
padding: 10,
margin: '0 5px 0 10px'
},
DateRangePickerInput_calendarIcon_svg: {
fill: color.core.grayLight,
height: 15,
width: 14,
verticalAlign: 'middle'
}
};
})(DateRangePickerInput);