
اگر روی داشبورد فروش، پنل مالی یا یک ERP واقعی کار کرده باشید، احتمالاً این صحنه برایتان آشناست:
«فروش این ماه را با ماه قبل مقایسه کن… حالا یک ماه عقب برو… حالا بازه مقایسه هم باید همزمان عقب برود.»
بیشتر Date Pickerهای رایج فقط «یک تاریخ» یا حداکثر «یک بازه» میگیرند. در پروژههای بزرگ سازمانی، مسئله اصلی اغلب چیز دیگری است: مقایسه دو بازه زمانی با تجربه کاربری شبیه ابزارهای enterprise مثل Dynamics / Analytics — و اگر محصول فارسی باشد، همهٔ اینها باید روی تقویم شمسی (جلالی) درست کار کند؛ از جمله سال کبیسه.
اینجا است که [react-persian-range-picker](https://www.npmjs.com/package/react-persian-range-picker) معنا پیدا میکند: کتابخانهای سبک برای React که از سادهترین سناریو (یک تاریخ) تا پیچیدهترین (حرکت همزمان بازه + مقایسه) را پوشش میدهد.

در اپلیکیشنهای ERP و BI معمولاً این نیازها همزمان وجود دارند:
انتخاب بازه جاری (مثلاً ۱ تا ۳۰ فروردین)
تعریف بازه مقایسه (مثلاً همان بازه در ماه قبل یا سال قبل)
جابهجایی سریع دوره با دکمههای «یک گام عقب / جلو»
پشتیبانی بومی از تقویم شمسی بدون تبدیلهای شکننده
رعایت سال کبیسه جلالی در اعتبارسنجی و محاسبه طول ماه
خروجی استاندارد برای API (timestamp یا ISO string)
نسخه میلادی برای محصولات دوزبانه (calendarType="gregorian")
بسیاری از کتابخانههای Jalali فقط تقویم را نمایش میدهند؛ لایهٔ «مقایسه سازمانی + ناوبری همزمان» را خودتان باید از صفر بسازید.
RangePicker برای سناریوی analytics/ERP طراحی شده: بازه اصلی + بازه مقایسه، تبهای Day / Week / Month / Year و انتخاب دستی.
یکی از نقاط قوت مهم این پروژه، دکمهٔ حرکت گامی است:
با یک کلیک، بازه اصلی یک گام عقب/جلو میرود
همزمان بازه مقایسه هم یک گام متناظر جابهجا میشود
این رفتار برای تحلیل روند در ERP حیاتی است و در تجربهٔ کلاسیک بسیاری از pickerهای عمومی — و حتی الگوهای رایج enterprise — بهصورت آماده کمتر دیده میشود.
موتور تاریخ روی [jalaali-js](https://www.npmjs.com/package/jalaali-js) (الگوریتم Borkowski) بنا شده و برای سال کبیسه و طول ماههای شمسی طراحی شده است؛ نه اینکه فقط روی یک موتور میلادی یک adapter بدلی سوار شود. پشتیبانی میلادی هم از طریق calendarType در دسترس است.
علاوه بر Range:
DatePicker (با ماسک و زمان)
Mask کیبوردی YYYY/MM/DD با فوکوس سگمنت (سال → ماه → روز)
TimePicker
Calendar قابلembed
هوکهای useRenderPosition و useMediaQuery
توابع formatExport / formatIDateExport
وابستگی runtime تاریخ فقط jalaali-js است و React بهصورت peer dependency مصرف میشود — مناسب bundleهای سازمانی که از سنگینشدن پکیجها حساساند. بدون نیاز به moment-jalaali.
npm i react-persian-range-picker # یا yarn add react-persian-range-picker
Peer dependencies: react و react-dom (نسخه ۱۷ / ۱۸ / ۱۹).
import { useState } from 'react'; import { DatePicker } from 'react-persian-range-picker'; import type { DatePickerValue } from 'react-persian-range-picker'; export function InvoiceDateField() { const [value, setValue] = useState<DatePickerValue>(null); return ( <DatePicker calendarType="jalali" exportType="timeStamp" showMask allowClear value={value} ={setValue} primaryColor="#1c39bb" /> ); }
import { Mask } from 'react-persian-range-picker'; <Mask calendarType="jalali" exportType="IsoString" allowClear maskPlaceHolder="____/__/__" onMaskChange={(v) => console.log(v)} ={(msg) => console.warn(msg)} />
import { TimePicker } from 'react-persian-range-picker'; <TimePicker exportType="timeStamp" showSecond showNow minuteStep={5} ={(v) => console.log(v)} />
import { useState } from 'react'; import { RangePicker } from 'react-persian-range-picker'; import type { HandleParams, IDate } from 'react-persian-range-picker'; export function SalesFilter() { const [range, setRange] = useState<IDate | null>(null); return ( <RangePicker calendarType="jalali" exportType="timeStamp" showComparison isShowNavigationButton value={range ?? undefined} ={(e: HandleParams) => { const date = e.Data?.date as IDate | undefined; if (date) setRange(date); }} onCompareDateChange={(e) => { console.log('compare', e.Data); }} ={(e) => console.log('submit', e)} primaryColor="#1c39bb" /> ); }

انتخاب کنید اگر:
داشبورد/ERP دارید و مقایسه بازه بخشی از UX اصلی است
تقویم شمسی باید first-class باشد (نه adapter فرعی)
میخواهید ناوبری دوره روی بازه + مقایسه همزمان کار کند
محصولات دوزبانه دارید و گاهی به Gregorian هم نیاز است
نمیخواهید فقط برای تاریخ، کل Ant Design یا MUI را به پروژه تحمیل کنید

آیا سال کبیسه شمسی پشتیبانی میشود؟
بله. موتور روی jalaali-js است و اعتبارسنجی ماسک/تقویم با آگاهی از کبیسه انجام میشود.
آیا فقط شمسی است؟
خیر. با calendarType="gregorian" میتوانید میلادی کار کنید.
React 19؟
بله؛ peer برای React ۱۷ / ۱۸ / ۱۹ تعریف شده است.
TypeScript؟
بله؛ تایپها در پکیج منتشر میشوند.
دمو زنده: GitHub Pages
GitHub: Persian-range-picker
نویسنده: Hamidreza Fallahi
react-persian-range-picker فقط «یک تقویم شمسی دیگر» نیست؛ یک جعبه ابزار زمانی برای React است: از DatePicker و Mask تا Range Comparison و ناوبری همزمان بازه/مقایسه — با موتور جلالی واقعی، پشتیبانی میلادی، و footprint سبک برای production.
اگر روی محصول فارسی زبان سازمانی کار میکنید، یکبار دمو را با showComparison و دکمه های ناوبری امتحان کنید — همان جایی است که تفاوت را حس میکنید.
npm i react-persian-range-picker