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
JavaScript
;
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;