UNPKG

react-advance-jalaali-datepicker2

Version:

Jalaali React Date Picker developed with love by Alireza Kasaaian

468 lines (420 loc) 20.8 kB
(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "react", "react-dom", "moment-jalaali", "./Partials/Days", "./Partials/Months", "./Partials/Styles", "./Partials/Input", "./Partials/Background", "./Partials/Years"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("react"), require("react-dom"), require("moment-jalaali"), require("./Partials/Days"), require("./Partials/Months"), require("./Partials/Styles"), require("./Partials/Input"), require("./Partials/Background"), require("./Partials/Years")); } else { var mod = { exports: {} }; factory(mod.exports, global.react, global.reactDom, global.momentJalaali, global.Days, global.Months, global.Styles, global.Input, global.Background, global.Years); global.index = mod.exports; } })(this, function (exports, _react, _reactDom, _momentJalaali, _Days, _Months, _Styles, _Input, _Background, _Years) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react2 = _interopRequireDefault(_react); var _reactDom2 = _interopRequireDefault(_reactDom); var _momentJalaali2 = _interopRequireDefault(_momentJalaali); var _Days2 = _interopRequireDefault(_Days); var _Months2 = _interopRequireDefault(_Months); var _Styles2 = _interopRequireDefault(_Styles); var _Input2 = _interopRequireDefault(_Input); var _Background2 = _interopRequireDefault(_Background); var _Years2 = _interopRequireDefault(_Years); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var canUseDOM = !!(typeof window !== "undefined" && window.document && window.document.createElement); _momentJalaali2.default.loadPersian([]); var JDatePicker = function (_React$Component) { _inherits(JDatePicker, _React$Component); function JDatePicker(props) { var _this2 = this; _classCallCheck(this, JDatePicker); var _this = _possibleConstructorReturn(this, (JDatePicker.__proto__ || Object.getPrototypeOf(JDatePicker)).call(this, props)); _this.handleClose = function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(e) { var datepickerWrapper; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: datepickerWrapper = document.getElementById("datepickerWrapper"); if (datepickerWrapper) { _context.next = 3; break; } return _context.abrupt("return"); case 3: if (!(!datepickerWrapper.contains(e.target) && e.target.id !== 'dp')) { _context.next = 7; break; } _this.setState({ openPicker: false }); _context.next = 7; return _this.removePicker(); case 7: case "end": return _context.stop(); } } }, _callee, _this2); })); return function (_x) { return _ref.apply(this, arguments); }; }(); _this.renderDialogForm = function () { var _this$state = _this.state, eventTarget = _this$state.eventTarget, daysCount = _this$state.daysCount, selectedDay = _this$state.selectedDay, currentMonth = _this$state.currentMonth, selectedYear = _this$state.selectedYear, selectedMonthFirstDay = _this$state.selectedMonthFirstDay, openPicker = _this$state.openPicker; var _this$props = _this.props, disableFromUnix = _this$props.disableFromUnix, monthTitleEnable = _this$props.monthTitleEnable; console.log("openPicker in state has " + openPicker + "value"); var boundingClientRect = eventTarget.getBoundingClientRect(); var jDatePickerWrapper = document.createElement("div"); jDatePickerWrapper.style.position = "absolute"; jDatePickerWrapper.style.top = boundingClientRect.top + eventTarget.clientHeight + "px"; jDatePickerWrapper.style.left = boundingClientRect.left + eventTarget.clientWidth - 300 + "px"; jDatePickerWrapper.style.width = "300px"; jDatePickerWrapper.style.zIndex = "9999"; jDatePickerWrapper.id = "datepickerWrapper"; var jDatePicker = document.createElement("div"); jDatePicker.className = "JDatePicker"; jDatePickerWrapper.append(jDatePicker); _reactDom2.default.render(_react2.default.createElement( "div", null, _react2.default.createElement( "div", { className: "JDheader" }, _react2.default.createElement(_Years2.default, { changeEvent: function changeEvent(returnedYear) { return _this.yearSelected(returnedYear); }, year: selectedYear }), _react2.default.createElement(_Months2.default, { monthTitleEnable: monthTitleEnable, clickEvent: function clickEvent(returnedMonth) { return _this.monthsClicked(returnedMonth); }, month: currentMonth }) ), _react2.default.createElement( "div", { className: "days-titles" }, _react2.default.createElement( "div", null, "\u0634" ), _react2.default.createElement( "div", null, "\u06CC" ), _react2.default.createElement( "div", null, "\u062F" ), _react2.default.createElement( "div", null, "\u0633" ), _react2.default.createElement( "div", null, "\u0686" ), _react2.default.createElement( "div", null, "\u067E" ), _react2.default.createElement( "div", null, "\u062C" ) ), _react2.default.createElement(_Days2.default, { disableFromUnix: disableFromUnix, selectedYear: selectedYear, selectedDay: selectedDay, currentMonth: currentMonth, daysCount: daysCount, firstDay: selectedMonthFirstDay, clickEvent: function clickEvent(day, momentDay) { return _this.daysClicked(day, momentDay); } }) ), jDatePicker); document.body.append(jDatePickerWrapper); }; _this.removePicker = function () { setTimeout(function () { document.getElementById("datepickerWrapper") && document.getElementById("datepickerWrapper").remove(); }, 10); }; _this.daysInMonth = _this.daysInMonth.bind(_this); var preSelected = ""; if (_this.props.preSelected) preSelected = _this.props.preSelected; _this.state = { openPicker: false, eventTarget: {}, selectedYear: parseInt((0, _momentJalaali2.default)().format("jYYYY")), currentMonth: parseInt((0, _momentJalaali2.default)().format("jMM")), selectedMonthFirstDay: (0, _momentJalaali2.default)((0, _momentJalaali2.default)().format("jYYYY") + "/" + (0, _momentJalaali2.default)().format("jMM") + "/01", "jYYYY/jMM/jDD").weekday(), selectedDay: preSelected.length > 1 ? (0, _momentJalaali2.default)(preSelected, _this.props.format).format("jYYYYjMMjDD") : "", inputValue: preSelected }; _this.state.daysCount = _this.daysInMonth((0, _momentJalaali2.default)().format("jMM"), (0, _momentJalaali2.default)().format("jYYYY")); return _this; } _createClass(JDatePicker, [{ key: "componentDidMount", value: function componentDidMount() { var selectedMonthFirstDay = this.state.selectedMonthFirstDay; if (canUseDOM && !document.getElementById("jdstyle")) { var css = (0, _Styles2.default)(selectedMonthFirstDay), head = document.head || document.getElementsByTagName("head")[0], style = document.createElement("style"); style.type = "text/css"; style.id = "jdstyle"; if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } head.appendChild(style); /*const script = document.createElement("script"); script.src="./static/fontAwesome.js"; script.async=true; document.body.appendChild(script);*/ } } }, { key: "componentDidUpdate", value: function componentDidUpdate(preProps) { var _props = this.props, preSelected = _props.preSelected, format = _props.format; if (this.props.controllValue && preProps.preSelected !== preSelected && preSelected !== this.state.selectedDay) this.setState({ selectedDay: preSelected.length > 1 ? (0, _momentJalaali2.default)(preSelected, this.props.format).format("jYYYYjMMjDD") : "", inputValue: preSelected }); } }, { key: "componentWillMount", value: function componentWillMount() { document.addEventListener('mousedown', this.handleClose, false); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { document.removeEventListener('mousedown', this.handleClose, false); } }, { key: "daysInMonth", value: function daysInMonth(month, selectedYear) { if (month > 0 && month < 7) return 31;else if (month > 6 && month < 12) return 30;else if (month == 12 && _momentJalaali2.default.jIsLeapYear(selectedYear)) return 30;else if (month == 12 && !_momentJalaali2.default.jIsLeapYear(selectedYear)) return 29; } }, { key: "daysClicked", value: function daysClicked(day, momentDay) { this.removePicker(); this.setState({ openPicker: false }); var _props2 = this.props, onChange = _props2.onChange, format = _props2.format; if (!format) format = "jYYYY-jMM-jDD"; if (this.state.selectedDay != momentDay) { this.setState({ selectedDay: momentDay, inputValue: (0, _momentJalaali2.default)(momentDay + " 23:59:59", "jYYYYjMMjDD HH:mm:ss").format(format) }); } var formatted = void 0; if (!!format) formatted = (0, _momentJalaali2.default)(momentDay + " 23:59:59", "jYYYYjMMjDD HH:mm:ss").format(format); if (onChange) this.props.onChange((0, _momentJalaali2.default)(momentDay + " 23:59:59", "jYYYYjMMjDD HH:mm:ss").unix(), formatted); } }, { key: "monthsClicked", value: function monthsClicked(month) { var selectedYear = this.state.selectedYear; var year = selectedYear; var thisMonth = month; this.setState({ daysCount: 0 }); this.removePicker(); if (month == 0) { this.setState({ currentMonth: 12, daysCount: this.daysInMonth(12, selectedYear - 1), selectedYear: selectedYear - 1 }); thisMonth = 12; year = selectedYear - 1; } else if (month == 13) { this.setState({ currentMonth: 1, daysCount: this.daysInMonth(1, selectedYear + 1), selectedYear: selectedYear + 1 }); thisMonth = 1; year = selectedYear + 1; } else this.setState({ currentMonth: month, daysCount: this.daysInMonth(month, selectedYear) }); this.firstDayOfMonth(thisMonth, year); } }, { key: "firstDayOfMonth", value: function firstDayOfMonth(mo, ye) { var month = mo.toString(); var year = ye.toString(); if (month.length == 1) month = "0" + month; this.setState({ selectedMonthFirstDay: (0, _momentJalaali2.default)(year + "/" + month + "/01", "jYYYY/jMM/jDD").weekday() }); } }, { key: "yearSelected", value: function yearSelected(year) { this.setState({ selectedYear: year }); this.firstDayOfMonth(this.state.currentMonth, year); this.removePicker(); } }, { key: "render", value: function render() { var _this3 = this; var _state = this.state, openPicker = _state.openPicker, inputValue = _state.inputValue; var _props3 = this.props, id = _props3.id, placeholder = _props3.placeholder, containerClass = _props3.containerClass, inputTextAlign = _props3.inputTextAlign, inputComponent = _props3.inputComponent, cancelOnBackgroundClick = _props3.cancelOnBackgroundClick; var inputAlign = !!inputTextAlign && typeof inputTextAlign != "undefined" ? inputTextAlign : "right"; return _react2.default.createElement( "div", { style: { textAlign: "initial" }, className: containerClass, ref: function ref(node) { return _this3.node = node; } }, _react2.default.createElement(_Input2.default, { type: "text", id: id, placeholder: placeholder, dir: "ltr", style: { textAlign: inputAlign }, readOnly: true, value: inputValue, onClick: function onClick(event) { console.log("clicked in input text field"); _this3.setState({ openPicker: !openPicker, eventTarget: event.target }); }, component: inputComponent }), cancelOnBackgroundClick && openPicker && _react2.default.createElement(_Background2.default, { onClick: function onClick() { console.log("remove datepicker wrapper"); _this3.removePicker(); _this3.setState({ openPicker: false }); } }), openPicker && this.renderDialogForm() ); } }]); return JDatePicker; }(_react2.default.Component); exports.default = JDatePicker; });