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:** تمام خطاها مدیریت میشوند
|