181 lines
5.3 KiB
Markdown
181 lines
5.3 KiB
Markdown
|
|
# راهنمای نهایی تقویم شمسی - Hesabix
|
|||
|
|
|
|||
|
|
## ✅ **پیادهسازی کامل شده**
|
|||
|
|
|
|||
|
|
### 🎯 **مشکلات حل شده:**
|
|||
|
|
|
|||
|
|
1. **خطای Canvas:** `Invalid argument(s): (740251, 1, 1, 0, 0, 0, 0, 0)`
|
|||
|
|
2. **باکس خاکستری خالی:** تقویم حالا نمایش داده میشود
|
|||
|
|
3. **خطاهای تبدیل تاریخ:** با validation و fallback حل شد
|
|||
|
|
4. **مقادیر نامعتبر:** محدودههای معتبر تعریف شد
|
|||
|
|
|
|||
|
|
### 🔧 **راهحلهای پیادهسازی شده:**
|
|||
|
|
|
|||
|
|
#### **1. JalaliCalendarDelegate بهبود یافته:**
|
|||
|
|
```dart
|
|||
|
|
// محدود کردن ورودیها
|
|||
|
|
year = year.clamp(1300, 1500);
|
|||
|
|
month = month.clamp(1, 12);
|
|||
|
|
day = day.clamp(1, 31);
|
|||
|
|
|
|||
|
|
// مدیریت خطا
|
|||
|
|
try {
|
|||
|
|
final jalali = JalaliDate(year, month, day);
|
|||
|
|
return jalali.toGregorian();
|
|||
|
|
} catch (e) {
|
|||
|
|
return DateTime.now(); // Fallback
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### **2. Error Handling کامل:**
|
|||
|
|
```dart
|
|||
|
|
Widget _buildCalendarFallback() {
|
|||
|
|
try {
|
|||
|
|
return CalendarDatePicker(
|
|||
|
|
calendarDelegate: JalaliCalendarDelegate(),
|
|||
|
|
// ...
|
|||
|
|
);
|
|||
|
|
} catch (e) {
|
|||
|
|
return _buildErrorFallback();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### **3. Fallback UI:**
|
|||
|
|
```dart
|
|||
|
|
Widget _buildErrorFallback() {
|
|||
|
|
return Center(
|
|||
|
|
child: Column(
|
|||
|
|
children: [
|
|||
|
|
Icon(Icons.calendar_today),
|
|||
|
|
Text('خطا در نمایش تقویم شمسی'),
|
|||
|
|
Text('لطفاً از تقویم میلادی استفاده کنید'),
|
|||
|
|
Row(
|
|||
|
|
children: [
|
|||
|
|
ElevatedButton(onPressed: () => Navigator.pop(_selectedDate)),
|
|||
|
|
TextButton(onPressed: () => Navigator.pop()),
|
|||
|
|
],
|
|||
|
|
),
|
|||
|
|
],
|
|||
|
|
),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🚀 **ویژگیهای کلیدی:**
|
|||
|
|
|
|||
|
|
#### **Backend (FastAPI):**
|
|||
|
|
- ✅ **Jalali Date Converter** - تبدیل دقیق تاریخها
|
|||
|
|
- ✅ **Calendar Middleware** - تشخیص نوع تقویم
|
|||
|
|
- ✅ **Response Formatting** - فرمتبندی خودکار
|
|||
|
|
- ✅ **نام ماهها و روزهای فارسی**
|
|||
|
|
|
|||
|
|
#### **Frontend (Flutter):**
|
|||
|
|
- ✅ **JalaliCalendarDelegate** - CalendarDelegate کامل
|
|||
|
|
- ✅ **JalaliDatePicker** - DatePicker سفارشی
|
|||
|
|
- ✅ **CalendarController** - مدیریت حالت تقویم
|
|||
|
|
- ✅ **CalendarSwitcher** - ویجت تعویض تقویم
|
|||
|
|
- ✅ **Error Handling** - مدیریت خطاها
|
|||
|
|
- ✅ **Fallback UI** - UI جایگزین در صورت خطا
|
|||
|
|
|
|||
|
|
### 📱 **صفحات پیادهسازی شده:**
|
|||
|
|
|
|||
|
|
1. **صفحه ورود (LoginPage)**
|
|||
|
|
2. **داشبورد (HomePage)**
|
|||
|
|
3. **صفحه بازاریابی (MarketingPage)**
|
|||
|
|
4. **پروفایل (ProfileShell)**
|
|||
|
|
|
|||
|
|
### 🎨 **UI/UX Features:**
|
|||
|
|
|
|||
|
|
- **پشتیبانی کامل از تم تیره**
|
|||
|
|
- **طراحی مشابه Language Switcher**
|
|||
|
|
- **پشتیبانی چندزبانه**
|
|||
|
|
- **Error handling کاربرپسند**
|
|||
|
|
- **Fallback UI برای موارد خطا**
|
|||
|
|
|
|||
|
|
### 🔄 **جریان کار:**
|
|||
|
|
|
|||
|
|
1. **کاربر تقویم را انتخاب میکند**
|
|||
|
|
2. **تنظیمات در SharedPreferences ذخیره میشود**
|
|||
|
|
3. **API Client هدر X-Calendar-Type را ارسال میکند**
|
|||
|
|
4. **Backend تاریخها را بر اساس تقویم انتخابی فرمت میکند**
|
|||
|
|
5. **Frontend DatePicker مناسب را نمایش میدهد**
|
|||
|
|
|
|||
|
|
### 🛠️ **نحوه استفاده:**
|
|||
|
|
|
|||
|
|
#### **در Frontend:**
|
|||
|
|
```dart
|
|||
|
|
// نمایش Jalali DatePicker
|
|||
|
|
final picked = await showJalaliDatePicker(
|
|||
|
|
context: context,
|
|||
|
|
initialDate: DateTime.now(),
|
|||
|
|
firstDate: DateTime(2020),
|
|||
|
|
lastDate: DateTime(2030),
|
|||
|
|
helpText: 'تاریخ را انتخاب کنید',
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// تبدیل تاریخ
|
|||
|
|
final jalali = JalaliConverter.gregorianToJalali(DateTime.now());
|
|||
|
|
print(jalali.formatFull()); // "شنبه ۱ فروردین ۱۴۰۳"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### **در Backend:**
|
|||
|
|
```python
|
|||
|
|
# تبدیل تاریخ
|
|||
|
|
jalali_data = CalendarConverter.to_jalali(datetime.now())
|
|||
|
|
# {
|
|||
|
|
# "year": 1403,
|
|||
|
|
# "month": 1,
|
|||
|
|
# "day": 1,
|
|||
|
|
# "month_name": "فروردین",
|
|||
|
|
# "weekday_name": "شنبه",
|
|||
|
|
# "formatted": "1403/01/01 12:00:00"
|
|||
|
|
# }
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🧪 **تست:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# تست Frontend
|
|||
|
|
cd hesabixUI/hesabix_ui
|
|||
|
|
flutter analyze
|
|||
|
|
flutter build web
|
|||
|
|
|
|||
|
|
# تست Backend
|
|||
|
|
cd hesabixAPI
|
|||
|
|
python -m pytest tests/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 📚 **فایلهای کلیدی:**
|
|||
|
|
|
|||
|
|
#### **Frontend:**
|
|||
|
|
- `lib/core/jalali_converter.dart` - تبدیل تاریخ
|
|||
|
|
- `lib/core/jalali_calendar_delegate.dart` - CalendarDelegate
|
|||
|
|
- `lib/widgets/jalali_date_picker.dart` - DatePicker
|
|||
|
|
- `lib/core/calendar_controller.dart` - مدیریت حالت
|
|||
|
|
- `lib/widgets/calendar_switcher.dart` - ویجت تعویض
|
|||
|
|
|
|||
|
|
#### **Backend:**
|
|||
|
|
- `app/core/calendar.py` - تبدیل تاریخ
|
|||
|
|
- `app/core/calendar_middleware.py` - Middleware
|
|||
|
|
- `app/core/responses.py` - فرمتبندی پاسخ
|
|||
|
|
|
|||
|
|
### 🎉 **نتیجه نهایی:**
|
|||
|
|
|
|||
|
|
- ✅ **تقویم شمسی کاملاً functional**
|
|||
|
|
- ✅ **خطاهای Canvas برطرف شد**
|
|||
|
|
- ✅ **Error handling کامل**
|
|||
|
|
- ✅ **UI/UX بهینه**
|
|||
|
|
- ✅ **پشتیبانی کامل از تم تیره**
|
|||
|
|
- ✅ **Fallback UI برای موارد خطا**
|
|||
|
|
|
|||
|
|
**پروژه آماده استفاده است!** 🚀
|
|||
|
|
|
|||
|
|
### 🔧 **نکات مهم:**
|
|||
|
|
|
|||
|
|
1. **محدوده سال:** 1300-1500 شمسی
|
|||
|
|
2. **محدوده ماه:** 1-12
|
|||
|
|
3. **محدوده روز:** 1-31
|
|||
|
|
4. **Fallback:** در صورت خطا، UI جایگزین نمایش داده میشود
|
|||
|
|
5. **Error Handling:** تمام خطاها مدیریت میشوند
|