Files
hr/app/Filament/Support/HrForm.php
2026-07-30 17:24:40 +05:00

75 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Filament\Support;
use App\Services\Leave\LeaveDaysCalculator;
use Carbon\Carbon;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set;
class HrForm
{
public static function fileUpload(string $name): FileUpload
{
return FileUpload::make($name)
->disk(config('hr.file_uploads.disk'))
->directory(config('hr.file_uploads.directory'))
->visibility('private');
}
public static function employeeSelect(): Select
{
return Select::make('employee_id')
->relationship('employee', 'full_name')
->searchable()
->preload()
->required();
}
public static function leaveDaysDisplay(): TextInput
{
return TextInput::make('days')
->label('Days')
->numeric()
->disabled()
->dehydrated(false)
->afterStateHydrated(function (TextInput $component, $state, Set $set, Get $get): void {
self::syncLeaveDays($set, $get);
});
}
public static function leaveDatePicker(string $name, string $label): DatePicker
{
return DatePicker::make($name)
->label($label)
->required()
->live()
->afterStateUpdated(fn (Set $set, Get $get) => self::syncLeaveDays($set, $get));
}
public static function syncLeaveDays(Set $set, Get $get): void
{
$startDate = $get('start_date');
$endDate = $get('end_date');
if (! $startDate || ! $endDate) {
$set('days', null);
return;
}
$days = app(LeaveDaysCalculator::class)->between(
Carbon::parse($startDate),
Carbon::parse($endDate),
);
$set('days', $days);
}
}