mohamedsabil83/filament-hijri-picker
Installation:
composer require mohamedsabil83/filament-hijri-picker
Publish the config (if needed):
php artisan vendor:publish --provider="MohamedSabil83\FilamentHijriPicker\FilamentHijriPickerServiceProvider"
First Use Case:
Replace a standard DatePicker or DateTimePicker in a Filament form/resource with the Hijri equivalent:
use MohamedSabil83\FilamentHijriPicker\Fields\HijriDatePicker;
use MohamedSabil83\FilamentHijriPicker\Fields\HijriDateTimePicker;
// In a Filament form/resource
HijriDatePicker::make('event_date')
->required()
->default(now()->format('Y-m-d')),
// Or for datetime
HijriDateTimePicker::make('event_datetime')
->required()
->default(now()->format('Y-m-d H:i:s')),
Where to Look First:
config/filament-hijri-picker.php for package-specific configurations (e.g., locale, default format).Replacing Default Filament Date Fields:
Directly swap DatePicker/DateTimePicker with HijriDatePicker/HijriDateTimePicker in:
getFormFields() or getTableColumns().FormWidget).// Example in a Resource
public static function form(Form $form): Form
{
return $form
->schema([
HijriDatePicker::make('birth_date')
->label('تاريخ الميلاد')
->columnSpanFull(),
]);
}
Handling Hijri ↔ Gregorian Conversion:
Carbon methods to manually convert if needed:
use Carbon\Carbon;
$gregorianDate = Carbon::createFromFormat('Y-m-d', $hijriInput)->toDateTimeString();
Localization:
'locale' => 'ar', // Arabic (default), or 'en' for English labels
HijriDatePicker::make('expiry_date')
->label('تاريخ الانتهاء')
->placeholder('اختر تاريخاً'),
Integration with Filament Tables:
HijriDateColumn for displaying Hijri dates in tables:
use MohamedSabil83\FilamentHijriPicker\Columns\HijriDateColumn;
HijriDateColumn::make('created_at')
->label('تاريخ الإنشاء')
->dateFormat('Y-m-d'),
Dynamic Defaults:
HijriDatePicker::make('deadline')
->default(now()->translatedFormat('Y-m-d', 'ar_SA')), // Hijri format
Validation:
required, after):
HijriDatePicker::make('start_date')
->required()
->after('yesterday'),
Database Storage:
DATE or DATETIME types).string columns and handle conversion manually.Timezone Conflicts:
config/app.php (e.g., 'timezone' => 'Asia/Riyadh').Locale Mismatches:
locale: 'ar', clear the view cache:
php artisan view:clear
Carbon Version Issues:
carbon/carbon package is v2.x+ (Laravel 9+ compatible).composer require carbon/carbon:^2.66
Nested Forms/Relationships:
BelongsToMany) may require explicit conversion in accessors/mutators:
// Example mutator for a relationship
public function setEventDateAttribute($value) {
$this->attributes['event_date'] = Carbon::createFromFormat('Y-m-d', $value)->toDateTimeString();
}
Check Stored Values:
dd($model->event_date); // Should be Gregorian (e.g., "2023-10-01")
dd($model->event_date->translatedFormat('Y-m-d', 'ar_SA'));
Log Conversion Errors:
try-catch to log issues:
try {
$field = HijriDatePicker::make('date_field');
} catch (\Exception $e) {
Log::error('Hijri Picker Error: ' . $e->getMessage());
}
Test with Hardcoded Hijri Dates:
1445-01-01 = Gregorian 2023-08-30):
$hijriDate = '1445-01-01';
$gregorian = Carbon::createFromFormat('Y-m-d', $hijriDate)->toDateTimeString();
dd($gregorian); // Should output "2023-08-30 00:00:00"
Custom Hijri Formats:
d/m/Y):
// In a service provider
HijriDatePicker::macro('customFormat', function ($format) {
$this->format = $format;
return $this;
});
Usage:
HijriDatePicker::make('date')->customFormat('d/m/Y');
Additional Locales:
HijriPicker class and overriding __() methods.Custom Conversion Logic:
HijriDatePicker::make('date')
->usingCarbon(function () {
return Carbon::setLocale('ar_SA');
}),
Filament 3.x Compatibility:
support branch or fork the package.Performance:
// In a query scope
public function scopeHijriDate($query, $hijriDate) {
$gregorianDate = Carbon::createFromFormat('Y-m-d', $hijriDate)->toDateTimeString();
return $query->where('created_at', '>=', $gregorianDate);
}
How can I help you explore Laravel packages today?