feat: add dynamic session generation with configurable count and start date to GenerateSessionsAction

This commit is contained in:
Yoga Pangestu 2026-03-31 09:24:43 +07:00
parent b2c8355e38
commit 8a42a92d81

View File

@ -7,6 +7,7 @@
use Carbon\Carbon; use Carbon\Carbon;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\TextInput;
use Filament\Support\Colors\Color; use Filament\Support\Colors\Color;
class GenerateSessionsAction extends Action class GenerateSessionsAction extends Action
@ -24,18 +25,45 @@ protected function setUp(): void
->color(Color::Orange) ->color(Color::Orange)
->requiresConfirmation() ->requiresConfirmation()
->modalHeading('Generate Sesi Pembelajaran') ->modalHeading('Generate Sesi Pembelajaran')
->modalDescription('Sistem akan men-generate atau memperbarui sesi 1 sampai 16 secara otomatis berdasarkan jadwal mata kuliah ini.') ->modalDescription('Sistem akan men-generate atau memperbarui sesi secara otomatis berdasarkan jadwal mata kuliah ini.')
->schema([ ->schema(function ($livewire) {
DatePicker::make('start_date') $lastSession = $livewire->course->classSessions()->latest('session_number')->first();
->label('Tanggal Pertemuan Ke-1') $lastNumber = $lastSession?->session_number ?? 0;
->default(now()) $nextNumber = $lastNumber + 1;
->required() $lastDate = $lastSession?->date ? Carbon::parse($lastSession->date) : now();
->native(false)
->displayFormat('l, d F Y'), return [
]) TextInput::make('total_sessions')
->label('Jumlah Sesi Baru')
->numeric()
->default(function () use ($lastNumber) {
return $lastNumber === 0 ? 16 : 1;
})
->minValue(1)
->maxValue(32)
->required()
->placeholder('Contoh: 14')
->helperText($lastNumber > 0
? "Sesi terakhir adalah No. {$lastNumber}. Sesi baru akan dimulai dari No. {$nextNumber}."
: 'Belum ada sesi. Sesi akan dibuat mulai dari No. 1.'),
DatePicker::make('start_date')
->label($lastNumber > 0
? "Tanggal Sesi Ke-{$nextNumber}"
: 'Tanggal Pertemuan Ke-1')
->default(function () use ($lastNumber, $lastDate) {
// Default to next week if sessions already exist
return $lastNumber > 0 ? $lastDate->addWeek()->toDateString() : now()->toDateString();
})
->required()
->native(false)
->displayFormat('l, d F Y'),
];
})
->action(function (array $data, $livewire) { ->action(function (array $data, $livewire) {
$course = $livewire->course; $course = $livewire->course;
$schedule = $course->courseSchedules()->first(); $schedule = $course->courseSchedules()->first();
$totalNewSessions = (int) ($data['total_sessions'] ?? 1);
if (! $schedule) { if (! $schedule) {
SystemNotification::danger( SystemNotification::danger(
@ -48,16 +76,21 @@ protected function setUp(): void
return; return;
} }
$lastSession = $course->classSessions()->latest('session_number')->first();
$lastNumber = $lastSession?->session_number ?? 0;
$nextNumber = $lastNumber + 1;
$maxNumber = $lastNumber + $totalNewSessions;
$startDate = Carbon::parse($data['start_date']); $startDate = Carbon::parse($data['start_date']);
for ($i = 1; $i <= 16; $i++) { for ($i = $nextNumber; $i <= $maxNumber; $i++) {
ClassSession::updateOrCreate( ClassSession::updateOrCreate(
[ [
'course_id' => $course->id, 'course_id' => $course->id,
'session_number' => $i, 'session_number' => $i,
], ],
[ [
'date' => $startDate->copy()->addWeeks($i - 1)->toDateString(), 'date' => $startDate->copy()->addWeeks($i - $nextNumber)->toDateString(),
'start_time' => $schedule->start_time, 'start_time' => $schedule->start_time,
'end_time' => $schedule->end_time, 'end_time' => $schedule->end_time,
] ]
@ -66,9 +99,9 @@ protected function setUp(): void
SystemNotification::success( SystemNotification::success(
'Hore! Sesi Siap ✨🚀', 'Hore! Sesi Siap ✨🚀',
'16 Sesi berhasil digenerate dan diperbarui. Selamat mengajar! 🎉', $totalNewSessions.' Sesi baru (No. '.$nextNumber.' sampai '.$maxNumber.') berhasil digenerate. 🎉',
'Verifikasi Sesi Berhasil', 'Verifikasi Sesi Berhasil',
'Seluruh 16 sesi pembelajaran telah berhasil dikonfigurasi secara otomatis ke dalam sistem.' 'Seluruh '.$totalNewSessions.' sesi pembelajaran tambahan telah berhasil dikonfigurasi secara otomatis.'
)->send(); )->send();
}); });
} }