UNPKG

ffr-components

Version:

Fiori styled UI components

419 lines (370 loc) 14.5 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; import _createClass from "@babel/runtime/helpers/esm/createClass"; import _possibleConstructorReturn from "@babel/runtime/helpers/esm/possibleConstructorReturn"; import _getPrototypeOf from "@babel/runtime/helpers/esm/getPrototypeOf"; import _assertThisInitialized from "@babel/runtime/helpers/esm/assertThisInitialized"; import _inherits from "@babel/runtime/helpers/esm/inherits"; // Import React Framework import React, { Component } from 'react'; import classnames from 'classnames'; import FocusTrap from 'focus-trap-react'; // Import Utils import { isMobile } from '../utils'; // Import Customized Components import Button from '../button'; import Calendar from '../calendar'; import "./style.css"; // Import Utils KeyCode import "../theme/theme.css"; import { KeyCode } from '../utils'; var DatePicker = /*#__PURE__*/ function (_Component) { _inherits(DatePicker, _Component); function DatePicker(props) { var _this; _classCallCheck(this, DatePicker); _this = _possibleConstructorReturn(this, _getPrototypeOf(DatePicker).call(this, props)); _this.openCalendar = function (type) { var hidden = !_this.state.hidden; if (type === 'input') { if (_this.state.hidden) { _this.setState({ hidden: hidden }, function () { setTimeout(function () { _this.setState({ trapFocus: !hidden }); }, 300); }); } } else { _this.setState({ hidden: hidden }, function () { setTimeout(function () { _this.setState({ trapFocus: !hidden }); }, 300); }); } }; _this.modifyDate = function (e) { _this.setState({ formattedDate: e.target.value }); }; _this.formatDate = function (date) { var formatDate = ''; if (_this.props.enableRangeSelection) { if (date.length === 0) { return ''; } var firstDateMonth = date[0].getMonth() + 1; var firstDateDay = date[0].getDate(); var firstDateYear = date[0].getFullYear(); var secondDateMonth = date[1].getMonth() + 1; var secondDateDay = date[1].getDate(); var secondDateYear = date[1].getFullYear(); if (firstDateYear >= 3000 || secondDateYear >= 3000) { return ''; } formatDate = firstDateMonth + '/' + firstDateDay + '/' + firstDateYear + '-' + secondDateMonth + '/' + secondDateDay + '/' + secondDateYear; } return formatDate; }; _this.sendUpdate = function (e) { if (e.key === 'Enter') { _this.validateDates(); } }; _this.click = function (e) { if (_this.component.contains(e.target)) { return; } _this.clickOutside(); }; _this.isDateEnabled = function (dateToCheck) { return _this.calendarRef.current && _this.calendarRef.current.displayDisabled(new Date(dateToCheck)) === ''; }; _this.validateDates = function () { var regex = /[!$%^&*()_+|~=`{}[\]:'<>?,.a-zA-Z]/; //Checks first if range is enabled if (_this.props.enableRangeSelection) { //If the formattedDate contains a list of special characters symbols then it will be reset if (_this.state.formattedDate.search(regex) !== -1 || _this.state.formattedDate === '' || _this.state.formattedDate.split('-').length < 2) { _this.setState({ formattedDate: '', arrSelectedDates: 'undefined', hidden: false }); } else { //Breaks the input into an array var dateRange = _this.state.formattedDate.split('-'); // check if start and end dates are enabled if (_this.isDateEnabled(dateRange[0]) && _this.isDateEnabled(dateRange[1])) { var dateSeparatedFirstRange = dateRange[0].split('/'); var dateSeparatedSecondRange = dateRange[1].split('/'); //First date var firstYearRange = parseInt(dateSeparatedFirstRange[2]); var firstDateRange = parseInt(dateSeparatedFirstRange[1]); var firstMonthRange = parseInt(dateSeparatedFirstRange[0]); //Second date var secondYearRange = parseInt(dateSeparatedSecondRange[2]); var secondDateRange = parseInt(dateSeparatedSecondRange[1]); var secondMonthRange = parseInt(dateSeparatedSecondRange[0]); //Checks if the input is actually numbers and follows the required form if (1 <= firstDateRange && firstDateRange <= 31 && 1 <= firstMonthRange && firstMonthRange <= 12 && firstYearRange <= 3000 && 1 <= secondDateRange && secondDateRange <= 31 && 1 <= secondMonthRange && secondMonthRange <= 12 && secondYearRange <= 3000) { var firstDate = new Date(firstYearRange, firstMonthRange - 1, firstDateRange); var secondDate = new Date(secondYearRange, secondMonthRange - 1, secondDateRange); var arrSelected = []; //Swaps the order in case one date is bigger than the other firstDate.getTime() > secondDate.getTime() ? arrSelected = [secondDate, firstDate] : arrSelected = [firstDate, secondDate]; _this.setState({ selectedDate: '', arrSelectedDates: arrSelected }); } else { _this.setState({ formattedDate: '', selectedDate: 'undefined', arrSelectedDates: 'undefined' }); } } else { _this.setState({ formattedDate: '', selectedDate: 'undefined', arrSelectedDates: 'undefined' }); } } } else { // check if entered date is enabled if (_this.isDateEnabled(_this.state.formattedDate)) { if (_this.state.formattedDate.search(regex) !== -1) { _this.setState({ formattedDate: _this.formatDate(_this.state.selectedDate), selectedDate: 'undefined' }); } else { var dateSeparated = _this.state.formattedDate.split('/'); var year = parseInt(dateSeparated[2]); var date = parseInt(dateSeparated[1]); var month = parseInt(dateSeparated[0]); if (1 <= date && date <= 31 && 1 <= month && month <= 12 && year <= 3000) { _this.setState({ selectedDate: new Date(year, month - 1, date) }); } else { _this.setState({ selectedDate: 'undefined', formattedDate: '' }); } } } else { _this.setState({ selectedDate: 'undefined', formattedDate: '' }); } } }; _this.clickOutside = function () { // this.validateDates(); _this.setState({ hidden: true, trapFocus: false }); }; _this.updateDate = function (date) { var formatDate; var _this$props = _this.props, onChange = _this$props.onChange, dateFormat = _this$props.dateFormat, enableRangeSelection = _this$props.enableRangeSelection; onChange && onChange(+date); if (enableRangeSelection) { if (date.length === 2) { var firstDateMonth = date[0].getMonth() + 1; var firstDateDay = date[0].getDate(); var firstDateYear = date[0].getFullYear(); var secondDateMonth = date[1].getMonth() + 1; var secondDateDay = date[1].getDate(); var secondDateYear = date[1].getFullYear(); if (dateFormat) { formatDate = "".concat(dateFormat(date[0]), " - ").concat(dateFormat(date[1])); } else { formatDate = firstDateMonth + '/' + firstDateDay + '/' + firstDateYear + '-' + secondDateMonth + '/' + secondDateDay + '/' + secondDateYear; } _this.setState({ hidden: true, arrSelectedDates: date, formattedDate: formatDate }); } else { var _firstDateMonth = date[0].getMonth() + 1; var _firstDateDay = date[0].getDate(); var _firstDateYear = date[0].getFullYear(); if (dateFormat) { formatDate = dateFormat(date[0]); } else { formatDate = _firstDateMonth + '/' + _firstDateDay + '/' + _firstDateYear; } _this.setState({ arrSelectedDates: date, formattedDate: formatDate }); } } else { var month = date.getMonth() + 1; var day = date.getDate(); var year = date.getFullYear(); if (dateFormat) { formatDate = dateFormat(date); } else { formatDate = month + '/' + day + '/' + year; } _this.setState({ hidden: true, trapFocus: false, selectedDate: date, formattedDate: formatDate }); } }; _this.renderCalender = function () { var _this$props2 = _this.props, enableRangeSelection = _this$props2.enableRangeSelection, disableWeekends = _this$props2.disableWeekends, disableBeforeDate = _this$props2.disableBeforeDate, disableAfterDate = _this$props2.disableAfterDate, disableWeekday = _this$props2.disableWeekday, disablePastDates = _this$props2.disablePastDates, disableFutureDates = _this$props2.disableFutureDates, blockedDates = _this$props2.blockedDates, disabledDates = _this$props2.disabledDates, today = _this$props2.today; return React.createElement(Calendar, { today: today, blockedDates: blockedDates, customDate: enableRangeSelection ? _this.state.arrSelectedDates : _this.state.selectedDate, disableAfterDate: disableAfterDate, disableBeforeDate: disableBeforeDate, disableFutureDates: disableFutureDates, disablePastDates: disablePastDates, disableWeekday: disableWeekday, disableWeekends: disableWeekends, disabledDates: disabledDates, enableRangeSelection: enableRangeSelection, onChange: _this.updateDate, ref: _this.calendarRef }); }; _this.state = { hidden: true, selectedDate: '', arrSelectedDates: [], formattedDate: '', trapFocus: false }; _this.isMobile = isMobile(); _this.calendarRef = React.createRef(); _this.handleKeyDown = _this.handleKeyDown.bind(_assertThisInitialized(_this)); return _this; } _createClass(DatePicker, [{ key: "handleKeyDown", value: function handleKeyDown(e) { var _this2 = this; if (e.altKey && [KeyCode.DOWN, KeyCode.UP].indexOf(e.keyCode) !== -1) { var hidden = this.state.hidden; this.setState({ hidden: !hidden }, function () { setTimeout(function () { _this2.setState({ trapFocus: hidden }); }, 300); }); } } }, { key: "UNSAFE_componentWillMount", value: function UNSAFE_componentWillMount() { document.addEventListener('mousedown', this.click, false); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { document.removeEventListener('mousedown', this.click, false); } }, { key: "render", value: function render() { var _this3 = this; var _this$props3 = this.props, compact = _this$props3.compact, className = _this$props3.className, inputProps = _this$props3.inputProps, buttonProps = _this$props3.buttonProps; var datePickerClasses = classnames('ffr-date-picker', className); var datePickerInputGroupClasses = classnames('fd-input-group', 'fd-input-group--after', { 'fd-input-group--compact': compact }); var datePickerInputClasses = classnames('fd-input', { 'fd-input--compact': compact }); return (// eslint-disable-next-line jsx-a11y/no-static-element-interactions React.createElement("div", { onKeyDown: this.handleKeyDown, className: datePickerClasses, ref: function ref(component) { return _this3.component = component; } }, React.createElement("div", { className: "fd-popover" }, React.createElement("div", { className: "fd-popover__control" }, React.createElement("div", { className: datePickerInputGroupClasses }, React.createElement("input", _extends({}, inputProps, { className: datePickerInputClasses, onChange: this.modifyDate, onClick: function onClick() { return _this3.openCalendar('input'); }, onKeyPress: this.sendUpdate, placeholder: "mm/dd/yyyy", type: "text", value: this.state.formattedDate })), React.createElement("span", { className: "fd-input-group__addon fd-input-group__addon--after fd-input-group__addon--button" }, React.createElement("button", _extends({}, buttonProps, { type: "button", className: "fd-button--light sap-icon--calendar", tabIndex: "-1", onClick: function onClick() { return _this3.openCalendar(); } }))))), React.createElement("div", { "aria-hidden": this.state.hidden, className: "fd-popover__body fd-popover__body--left fd-popover__body--no-arrow" }, this.isMobile ? React.createElement(React.Fragment, null, React.createElement(Button, { typeAttr: "button", className: "fd-popover__close-calendar", option: "light", onClick: this.clickOutside }, "Cancel"), this.renderCalender()) : React.createElement(FocusTrap, { active: this.state.trapFocus, focusTrapOptions: { clickOutsideDeactivates: true, escapeDeactivates: false } }, this.renderCalender())))) ); } }]); return DatePicker; }(Component); DatePicker.displayName = 'DatePicker'; DatePicker.defaultProps = { today: new Date() }; export { DatePicker as default };