@mamrp/components 1.3.2 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,391 @@
1
+ import React__default from 'react';
2
+ import { Control } from 'react-hook-form';
3
+ import { DateView } from '@mui/x-date-pickers';
4
+ import { Moment } from 'moment-jalaali';
5
+
6
+ /**
7
+ * DateRangePicker - کامپوننت پیشرفته انتخاب بازه تاریخ شمسی
8
+ *
9
+ * یک کامپوننت کامل و حرفه‌ای برای انتخاب بازه تاریخ با پشتیبانی از تقویم فارسی/شمسی
10
+ * این کامپوننت از کتابخانه‌های MUI، moment-jalaali و react-icons استفاده می‌کند
11
+ *
12
+ * @version 3.0.0
13
+ * @author Frontend Team
14
+ * @since 2024
15
+ * @updated October 2025
16
+ *
17
+ * ویژگی‌های کلیدی:
18
+ * ✅ پشتیبانی کامل از تقویم شمسی (فارسی)
19
+ * ✅ انتخاب بازه تاریخ با نمایش visual و range highlighting
20
+ * ✅ Responsive design - سازگار با موبایل و دسکتاپ (breakpoint: 700px)
21
+ * ✅ سه حالت نمایش: تقویم popup، DatePicker جداگانه، یا تک/دوتایی
22
+ * ✅ تب‌های هوشمند: حالت خودکار و دستی برای انتخاب تاریخ
23
+ * ✅ آیکون‌های حرفه‌ای React Icons در تمام بخش‌ها
24
+ * ✅ آیکون پاک کردن در input با UX بهبود یافته
25
+ * ✅ سفارشی‌سازی کامل استایل و رنگ‌بندی
26
+ * ✅ پشتیبانی از validation با React Hook Form
27
+ * ✅ قابلیت تنظیم محدوده تاریخ (min/max)
28
+ * ✅ حالت loading و disabled
29
+ * ✅ چندین حالت text alignment (left, center, right)
30
+ * ✅ لیست ماه‌ها به صورت 3 ستونی با CSS Grid
31
+ * ✅ هایلایت روزهای جمعه، امروز و بازه انتخاب شده
32
+ * ✅ انیمیشن و hover effects
33
+ * ✅ تغییر خودکار تب در حالت دستی
34
+ * ✅ عدم بسته شدن پنجره بعد از پاک کردن
35
+ * ✅ راهنمای هوشمند برای کاربر
36
+ *
37
+ * نحوه استفاده:
38
+ * ```tsx
39
+ * import DateRangePicker from './components/date-range-picker';
40
+ * import { useForm } from 'react-hook-form';
41
+ *
42
+ * const MyComponent = () => {
43
+ * const { control } = useForm();
44
+ *
45
+ * return (
46
+ * <DateRangePicker
47
+ * fromDate="startDate"
48
+ * toDate="endDate"
49
+ * control={control}
50
+ * label="انتخاب بازه تاریخ"
51
+ * persian={true}
52
+ * align="center"
53
+ * clear={true}
54
+ * dualCalendar={false} // جدید: کنترل تقویم دوم
55
+ * singleCalendar={false}
56
+ * useMobilePickers={false}
57
+ * />
58
+ * );
59
+ * };
60
+ * ```
61
+ *
62
+ * مثال‌های مختلف:
63
+ *
64
+ * 1. حالت پایه (پیش‌فرض - تک تقویم با تب‌های هوشمند):
65
+ * ```tsx
66
+ * <DateRangePicker
67
+ * fromDate="from"
68
+ * toDate="to"
69
+ * control={control}
70
+ * />
71
+ * ```
72
+ *
73
+ * 2. فعال کردن تقویم دوم:
74
+ * ```tsx
75
+ * <DateRangePicker
76
+ * fromDate="from"
77
+ * toDate="to"
78
+ * control={control}
79
+ * dualCalendar={true} // تقویم دوم فعال می‌شود
80
+ * />
81
+ * ```
82
+ *
83
+ * 3. تک تقویم بدون تب‌های هوشمند:
84
+ * ```tsx
85
+ * <DateRangePicker
86
+ * fromDate="from"
87
+ * toDate="to"
88
+ * control={control}
89
+ * singleCalendar={true}
90
+ * />
91
+ * ```
92
+ *
93
+ * 4. حالت DatePicker جداگانه:
94
+ * ```tsx
95
+ * <DateRangePicker
96
+ * fromDate="from"
97
+ * toDate="to"
98
+ * control={control}
99
+ * useMobilePickers={true}
100
+ * />
101
+ * ```
102
+ *
103
+ * 5. با محدودیت تاریخ و سفارشی‌سازی:
104
+ * ```tsx
105
+ * <DateRangePicker
106
+ * fromDate="from"
107
+ * toDate="to"
108
+ * control={control}
109
+ * minDate={moment().subtract(1, 'year')}
110
+ * maxDate={moment()}
111
+ * label="بازه زمانی گزارش"
112
+ * size="small"
113
+ * align="center"
114
+ * dualCalendar={true}
115
+ * />
116
+ * ```
117
+ *
118
+ * ویژگی‌های تب‌های هوشمند (جدید در v3.0):
119
+ *
120
+ * ```tsx
121
+ * // حالت هوشمند (پیش‌فرض): 🤖
122
+ * // - خودکار تشخیص می‌دهد کاربر کدام تاریخ را می‌خواهد
123
+ * // - اولین کلیک: تاریخ شروع ← تب "تا تاریخ" فعال
124
+ * // - دومین کلیک: تاریخ پایان (با تشخیص ترتیب)
125
+ * // - کلیک سوم: شروع مجدد
126
+ *
127
+ * // حالت دستی: 👤
128
+ * // - کاربر خودش تب را انتخاب می‌کند
129
+ * // - بعد از انتخاب "از تاریخ" ← خودکار به "تا تاریخ" می‌رود
130
+ * // - بعد از انتخاب "تا تاریخ" ← خودکار به "از تاریخ" برمی‌گردد
131
+ * ```
132
+ *
133
+ * آیکون‌های استفاده شده (React Icons):
134
+ *
135
+ * ```tsx
136
+ * // Input Icons:
137
+ * MdCalendarToday // آیکون تقویم
138
+ * MdClear // آیکون پاک کردن
139
+ *
140
+ * // Tab Icons:
141
+ * MdSmartToy // حالت هوشمند
142
+ * MdPerson // حالت دستی
143
+ * MdDateRange // از تاریخ
144
+ * MdEvent // تا تاریخ
145
+ *
146
+ * // Guide Icons:
147
+ * MdGpsFixed // راهنمای انتخاب
148
+ * MdCheckCircle // تأیید انتخاب
149
+ * ```
150
+ *
151
+ * @interface DateRangePickerProps
152
+ * @property {string} fromDate - نام فیلد تاریخ شروع در form
153
+ * @property {string} toDate - نام فیلد تاریخ پایان در form
154
+ * @property {Control<any>} control - React Hook Form control object
155
+ * @property {DateView[]} [fromViews] - نماهای قابل نمایش برای تاریخ شروع (پیش‌فرض: ["year", "month", "day"])
156
+ * @property {DateView} [fromOpenTo] - نمای ابتدایی برای تاریخ شروع (پیش‌فرض: "day")
157
+ * @property {DateView[]} [toViews] - نماهای قابل نمایش برای تاریخ پایان (پیش‌فرض: ["year", "month", "day"])
158
+ * @property {DateView} [toOpenTo] - نمای ابتدایی برای تاریخ پایان (پیش‌فرض: "day")
159
+ * @property {string} [label] - برچسب فیلد (پیش‌فرض: "انتخاب بازه")
160
+ * @property {"small" | "medium"} [size] - اندازه فیلد (پیش‌فرض: "medium")
161
+ * @property {boolean} [disabled] - غیرفعال کردن کامپوننت (پیش‌فرض: false)
162
+ * @property {boolean} [persian] - استفاده از تاریخ فارسی (پیش‌فرض: true)
163
+ * @property {"right" | "center" | "left"} [align] - تراز متن (پیش‌فرض: "left")
164
+ * @property {boolean} [isLoading] - نمایش حالت loading (پیش‌فرض: false)
165
+ * @property {Moment} [minDate] - حداقل تاریخ قابل انتخاب
166
+ * @property {Moment} [maxDate] - حداکثر تاریخ قابل انتخاب
167
+ * @property {boolean} [clear] - نمایش دکمه پاک کردن (پیش‌فرض: true)
168
+ * @property {boolean} [singleCalendar] - نمایش تک تقویم بدون تب‌ها (پیش‌فرض: false)
169
+ * @property {boolean} [useMobilePickers] - استفاده از DatePicker جداگانه (پیش‌فرض: false)
170
+ * @property {boolean} [dualCalendar] - فعال‌سازی تقویم دوم (پیش‌فرض: false)
171
+ *
172
+ * منطق نمایش تقویم‌ها:
173
+ * - اگر dualCalendar = true ← دو تقویم کنار هم
174
+ * - اگر singleCalendar = true ← تک تقویم بدون تب
175
+ * - اگر useMobilePickers = true ← دو DatePicker جداگانه
176
+ * - پیش‌فرض ← تک تقویم با تب‌های هوشمند
177
+ *
178
+ * نکات مهم:
179
+ * - کامپوننت خودکار mobile detection دارد (breakpoint: 700px)
180
+ * - در حالت موبایل، تقویم‌ها responsive می‌شوند
181
+ * - فرمت خروجی همیشه "YYYY-MM-DD" است
182
+ * - روزهای جمعه با رنگ قرمز نمایش داده می‌شوند
183
+ * - امکان انتخاب بازه با کلیک و visual feedback وجود دارد
184
+ * - validation errors از React Hook Form پشتیبانی می‌شود
185
+ * - آیکون پاک کردن فقط در صورت وجود تاریخ نمایش داده می‌شود
186
+ * - پاک کردن از داخل popup، پنجره را نمی‌بندد
187
+ * - پاک کردن از input icon، پنجره را باز نمی‌کند
188
+ *
189
+ * Dependencies:
190
+ * - @mui/material
191
+ * - @mui/x-date-pickers
192
+ * - @mui/x-date-pickers/AdapterMomentJalaali
193
+ * - moment-jalaali
194
+ * - react-hook-form
195
+ * - react-icons/md
196
+ *
197
+ * @example
198
+ * // استفاده در فرم با تمام قابلیت‌ها
199
+ * const form = useForm({
200
+ * defaultValues: {
201
+ * startDate: '',
202
+ * endDate: ''
203
+ * }
204
+ * });
205
+ *
206
+ * // حالت پیش‌فرض با تب‌های هوشمند
207
+ * <DateRangePicker
208
+ * fromDate="startDate"
209
+ * toDate="endDate"
210
+ * control={form.control}
211
+ * label="انتخاب دوره زمانی"
212
+ * />
213
+ *
214
+ * // حالت dual calendar
215
+ * <DateRangePicker
216
+ * fromDate="startDate"
217
+ * toDate="endDate"
218
+ * control={form.control}
219
+ * dualCalendar={true}
220
+ * label="انتخاب بازه با دو تقویم"
221
+ * />
222
+ */
223
+
224
+ interface DateRangePickerProps {
225
+ fromDate: string;
226
+ toDate: string;
227
+ fromViews?: DateView[] | undefined;
228
+ fromOpenTo?: DateView | undefined;
229
+ toViews?: DateView[] | undefined;
230
+ toOpenTo?: DateView | undefined;
231
+ control: Control<any>;
232
+ label?: string;
233
+ size?: "small" | "medium";
234
+ disabled?: boolean;
235
+ persian?: boolean;
236
+ align?: "right" | "center" | "left";
237
+ isLoading?: boolean;
238
+ minDate?: Moment;
239
+ maxDate?: Moment;
240
+ clear?: boolean;
241
+ singleCalendar?: boolean;
242
+ useMobilePickers?: boolean;
243
+ dualCalendar?: boolean;
244
+ }
245
+ /**
246
+ * DateRangePicker - کامپوننت انتخاب بازه تاریخ شمسی
247
+ *
248
+ * یک کامپوننت پیشرفته و کامل برای انتخاب بازه تاریخ با پشتیبانی از تقویم فارسی/شمسی
249
+ * این کامپوننت از کتابخانه‌های MUI و moment-jalaali استفاده می‌کند
250
+ *
251
+ * @version 2.0.0
252
+ * @author Frontend MAMRP Team
253
+ * @since 2024
254
+ *
255
+ *
256
+ * نحوه استفاده:
257
+ * ```tsx
258
+ * import DateRangePicker from './components/date-range-picker';
259
+ * import { useForm } from 'react-hook-form';
260
+ *
261
+ * const MyComponent = () => {
262
+ * const { control } = useForm();
263
+ *
264
+ * return (
265
+ * <DateRangePicker
266
+ * fromDate="startDate"
267
+ * toDate="endDate"
268
+ * control={control}
269
+ * label="انتخاب بازه تاریخ"
270
+ * persian={true}
271
+ * align="center"
272
+ * clear={true}
273
+ * singleCalendar={false}
274
+ * useMobilePickers={false}
275
+ * />
276
+ * );
277
+ * };
278
+ * ```
279
+ *
280
+ * مثال‌های مختلف:
281
+ *
282
+ * 1. حالت پایه:
283
+ * ```tsx
284
+ * <DateRangePicker
285
+ * fromDate="from"
286
+ * toDate="to"
287
+ * control={control}
288
+ * />
289
+ * ```
290
+ *
291
+ * 2. با تک تقویم:
292
+ * ```tsx
293
+ * <DateRangePicker
294
+ * fromDate="from"
295
+ * toDate="to"
296
+ * control={control}
297
+ * singleCalendar={true}
298
+ * />
299
+ * ```
300
+ *
301
+ * 3. با DatePicker جداگانه:
302
+ * ```tsx
303
+ * <DateRangePicker
304
+ * fromDate="from"
305
+ * toDate="to"
306
+ * control={control}
307
+ * useMobilePickers={true}
308
+ * />
309
+ * ```
310
+ *
311
+ * 4. با محدودیت تاریخ:
312
+ * ```tsx
313
+ * <DateRangePicker
314
+ * fromDate="from"
315
+ * toDate="to"
316
+ * control={control}
317
+ * minDate={moment().subtract(1, 'year')}
318
+ * maxDate={moment()}
319
+ * />
320
+ * ```
321
+ *
322
+ * 5. سفارشی‌سازی کامل:
323
+ * ```tsx
324
+ * <DateRangePicker
325
+ * fromDate="startDate"
326
+ * toDate="endDate"
327
+ * control={control}
328
+ * label="بازه زمانی گزارش"
329
+ * size="small"
330
+ * align="center"
331
+ * persian={true}
332
+ * clear={true}
333
+ * disabled={false}
334
+ * isLoading={false}
335
+ * singleCalendar={false}
336
+ * useMobilePickers={false}
337
+ * fromViews={["year", "month", "day"]}
338
+ * fromOpenTo="day"
339
+ * toViews={["year", "month", "day"]}
340
+ * toOpenTo="day"
341
+ * />
342
+ * ```
343
+ *
344
+ * @interface DateRangePickerProps
345
+ * @property {string} fromDate - نام فیلد تاریخ شروع در form
346
+ * @property {string} toDate - نام فیلد تاریخ پایان در form
347
+ * @property {Control<any>} control - React Hook Form control object
348
+ * @property {DateView[]} [fromViews] - نماهای قابل نمایش برای تاریخ شروع (پیش‌فرض: ["year", "month", "day"])
349
+ * @property {DateView} [fromOpenTo] - نمای ابتدایی برای تاریخ شروع (پیش‌فرض: "day")
350
+ * @property {DateView[]} [toViews] - نماهای قابل نمایش برای تاریخ پایان (پیش‌فرض: ["year", "month", "day"])
351
+ * @property {DateView} [toOpenTo] - نمای ابتدایی برای تاریخ پایان (پیش‌فرض: "day")
352
+ * @property {string} [label] - برچسب فیلد (پیش‌فرض: "انتخاب بازه")
353
+ * @property {"small" | "medium"} [size] - اندازه فیلد (پیش‌فرض: "medium")
354
+ * @property {boolean} [disabled] - غیرفعال کردن کامپوننت (پیش‌فرض: false)
355
+ * @property {boolean} [persian] - استفاده از تاریخ فارسی (پیش‌فرض: true)
356
+ * @property {"right" | "center" | "left"} [align] - تراز متن (پیش‌فرض: "left")
357
+ * @property {boolean} [isLoading] - نمایش حالت loading (پیش‌فرض: false)
358
+ * @property {Moment} [minDate] - حداقل تاریخ قابل انتخاب
359
+ * @property {Moment} [maxDate] - حداکثر تاریخ قابل انتخاب
360
+ * @property {boolean} [clear] - نمایش دکمه پاک کردن (پیش‌فرض: true)
361
+ * @property {boolean} [singleCalendar] - نمایش تک تقویم به جای دوتایی (پیش‌فرض: false)
362
+ * @property {boolean} [useMobilePickers] - استفاده از DatePicker جداگانه به جای popup (پیش‌فرض: false)
363
+ *
364
+ * نکات مهم:
365
+ * - کامپوننت خودکار mobile detection دارد (breakpoint: 700px)
366
+ * - در حالت موبایل، تقویم‌ها responsive می‌شوند
367
+ * - فرمت خروجی همیشه "YYYY-MM-DD" است
368
+ * - روزهای جمعه با رنگ قرمز نمایش داده می‌شوند
369
+ * - امکان انتخاب بازه با کلیک و drag وجود دارد
370
+ * - validation errors از React Hook Form پشتیبانی می‌شود
371
+ *
372
+ *
373
+ * @example
374
+ * // استفاده در فرم ساده
375
+ * const form = useForm({
376
+ * defaultValues: {
377
+ * startDate: '',
378
+ * endDate: ''
379
+ * }
380
+ * });
381
+ *
382
+ * <DateRangePicker
383
+ * fromDate="startDate"
384
+ * toDate="endDate"
385
+ * control={form.control}
386
+ * label="انتخاب دوره زمانی"
387
+ * />
388
+ */
389
+ declare const DateRangePicker: React__default.FC<DateRangePickerProps>;
390
+
391
+ export { DateRangePicker };