UNPKG

react-jalali-picker

Version:

A React component library for selecting dates, featuring both a DatePicker and a RangePicker that support Jalali (Persian) and Gregorian calendars.

103 lines (102 loc) 5.82 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var react_1 = __importStar(require("react")); var dayjs_1 = __importDefault(require("dayjs")); var jalali_plugin_dayjs_1 = __importDefault(require("jalali-plugin-dayjs")); var localeData_1 = __importDefault(require("dayjs/plugin/localeData")); var clsx_1 = __importDefault(require("clsx")); dayjs_1.default.extend(localeData_1.default); dayjs_1.default.extend(jalali_plugin_dayjs_1.default); var DatePicker = function (_a) { var selectedDate = _a.value, onChange = _a.onChange, _b = _a.locale, locale = _b === void 0 ? "fa" : _b, _c = _a.calendarType, calendarType = _c === void 0 ? "jalali" : _c, _d = _a.direction, direction = _d === void 0 ? "rtl" : _d; var _e = (0, react_1.useState)((0, dayjs_1.default)((0, dayjs_1.default)().locale(locale).calendar(calendarType))), currentMonth = _e[0], setCurrentMonth = _e[1]; var getWeekdays = (function () { var localizedDayjs = (0, dayjs_1.default)().locale(locale); var localeData = localizedDayjs.localeData(); var weekdaysMin = localeData.weekdaysMin(); var firstDayOfWeek = localeData.firstDayOfWeek(); var orderedWeekdays = []; for (var i = 0; i < 7; i++) { orderedWeekdays.push(weekdaysMin[(i + firstDayOfWeek) % 7]); } return orderedWeekdays; })(); var handleDayClick = function (day, month) { var selectedDate = month.date(day); onChange(selectedDate); }; var renderDays = function (month) { var daysInMonth = month.daysInMonth(); var firstDayOfMonth = locale === "fa" ? (month.startOf("month").day() + 1) % 7 : month.startOf("month").day(); var prevMonth = month.subtract(1, "month"); var nextMonth = month.add(1, "month"); var daysInPrevMonth = prevMonth.daysInMonth(); var daysArray = []; for (var i = 0; i < firstDayOfMonth; i++) { var day = daysInPrevMonth - firstDayOfMonth + i + 1; daysArray.push(react_1.default.createElement("div", { key: "prev-".concat(prevMonth, "-").concat(day), className: "day disabled-day" }, day)); } for (var day = 1; day <= daysInMonth; day++) { var date = month.date(day); var isSelected = selectedDate && date.isSame(selectedDate, "day"); daysArray.push(react_1.default.createElement("div", { key: day, className: (0, clsx_1.default)("day", { isSelected: isSelected }), onClick: handleDayClick.bind(null, day, month) }, day)); } var totalCells = firstDayOfMonth + daysInMonth; var emptyCellsAfter = 42 - totalCells; for (var i = 1; i <= emptyCellsAfter; i++) { daysArray.push(react_1.default.createElement("div", { key: "next-".concat(nextMonth, "-").concat(i), className: "day disabled-day" }, i)); } return daysArray; }; var headerBtns = function (next, unit) { if (next) { setCurrentMonth(currentMonth.add(1, unit)); } else { setCurrentMonth(currentMonth.subtract(1, unit)); } }; return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("div", { className: (0, clsx_1.default)("react-jalali-date-picker-wrapper", direction) }, react_1.default.createElement("div", { className: "current-month" }, react_1.default.createElement("div", { className: "calendar-header" }, react_1.default.createElement("div", { className: "prv-btns" }, react_1.default.createElement("button", { onClick: headerBtns.bind(null, false, "year") }, "\u2039\u2039"), react_1.default.createElement("button", { onClick: headerBtns.bind(null, false, "month") }, "\u2039")), react_1.default.createElement("div", { className: "month-year-header" }, currentMonth.format("MMMM YYYY")), react_1.default.createElement("div", { className: "next-btns" }, react_1.default.createElement("button", { onClick: headerBtns.bind(null, true, "month") }, "\u203A"), react_1.default.createElement("button", { onClick: headerBtns.bind(null, true, "year") }, "\u203A\u203A"))), react_1.default.createElement("div", { className: "calendar-grid" }, getWeekdays.map(function (day) { return (react_1.default.createElement("div", { key: day, className: "day-name" }, day)); }), renderDays(currentMonth)))))); }; exports.default = DatePicker;