diff --git a/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php b/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php index 6263fc6..77bca0b 100644 --- a/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php +++ b/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php @@ -4,6 +4,7 @@ use App\Enums\AssignmentType; use App\Filament\Resources\Learning\Assignments\Actions\SelectAllStudentsAction; +use App\Models\ClassSession; use App\Models\Course; use App\Models\Student; use App\Settings\GeneralSettings; @@ -39,7 +40,7 @@ public static function configure(Schema $schema): Schema ->autofocus() ->columnSpanFull(), - Grid::make(3) + Grid::make(2) ->schema([ Select::make('course_id') ->label('Mata Kuliah') @@ -53,6 +54,25 @@ public static function configure(Schema $schema): Schema ->live() ->required(), + Select::make('class_session_id') + ->label('Pertemuan Ke-') + ->placeholder('Pilih Pertemuan (Opsional)') + ->options(function (Get $get) { + $courseId = $get('course_id'); + if (! $courseId) { + return []; + } + + return ClassSession::where('course_id', $courseId) + ->orderBy('session_number') + ->pluck('session_number', 'id') + ->map(fn ($num) => "Sesi Ke-$num") + ->toArray(); + }) + ->searchable() + ->nullable() + ->helperText('Kosongkan jika tugas tidak terkait dengan sesi tertentu.'), + DateTimePicker::make('due_date') ->label('Batas Waktu') ->placeholder('Pilih Tanggal & Waktu') @@ -70,6 +90,7 @@ public static function configure(Schema $schema): Schema ->afterStateUpdated(function (Set $set) { $set('student_ids', []); $set('study_group_ids', []); + $set('class_session_id', null); }), ]) ->columnSpanFull(), diff --git a/app/Filament/Resources/Learning/ClassSessions/Pages/ListCourseSessions.php b/app/Filament/Resources/Learning/ClassSessions/Pages/ListCourseSessions.php index 4c0a12d..5fd9a3e 100644 --- a/app/Filament/Resources/Learning/ClassSessions/Pages/ListCourseSessions.php +++ b/app/Filament/Resources/Learning/ClassSessions/Pages/ListCourseSessions.php @@ -185,7 +185,7 @@ public function generateSessionsAction(): Action }); } - public function viewAttendanceAction(): Action + protected function viewAttendanceAction(): Action { return Action::make('viewAttendance') ->label('Lihat Presensi') @@ -198,6 +198,32 @@ public function viewAttendanceAction(): Action ])); } + protected function viewMaterialsAction(): Action + { + return Action::make('viewMaterials') + ->label('Daftar Materi') + ->modalHeading(fn (array $arguments) => 'Materi Kuliah - Sesi Ke-'.ClassSession::find($arguments['session'])->session_number) + ->modalSubmitAction(false) + ->modalCancelActionLabel('Tutup') + ->modalWidth(Width::Large) + ->modalContent(fn (array $arguments) => view('filament.resources.learning.class-sessions.materials-modal', [ + 'materials' => ClassSession::find($arguments['session'])->materials()->latest()->get(), + ])); + } + + protected function viewAssignmentsAction(): Action + { + return Action::make('viewAssignments') + ->label('Daftar Tugas') + ->modalHeading(fn (array $arguments) => 'Tugas Kuliah - Sesi Ke-'.ClassSession::find($arguments['session'])->session_number) + ->modalSubmitAction(false) + ->modalCancelActionLabel('Tutup') + ->modalWidth(Width::Large) + ->modalContent(fn (array $arguments) => view('filament.resources.learning.class-sessions.assignments-modal', [ + 'assignments' => ClassSession::find($arguments['session'])->assignments()->latest()->get(), + ])); + } + public function editSessionAction(): Action { return EditAction::make('editSession') diff --git a/app/Filament/Resources/Learning/ClassSessions/Pages/ManageClassSessions.php b/app/Filament/Resources/Learning/ClassSessions/Pages/ManageClassSessions.php index 681d4d0..ad2cae5 100644 --- a/app/Filament/Resources/Learning/ClassSessions/Pages/ManageClassSessions.php +++ b/app/Filament/Resources/Learning/ClassSessions/Pages/ManageClassSessions.php @@ -132,7 +132,7 @@ public function courses(): Collection }); } - public function viewAttendanceAction(): Action + protected function viewAttendanceAction(): Action { return Action::make('viewAttendance') ->label('Lihat Presensi') @@ -144,4 +144,30 @@ public function viewAttendanceAction(): Action 'attendances' => ClassSession::find($arguments['session'])->attendances()->with('student')->latest('attended_at')->get(), ])); } + + protected function viewMaterialsAction(): Action + { + return Action::make('viewMaterials') + ->label('Daftar Materi') + ->modalHeading(fn (array $arguments) => 'Materi Kuliah - Sesi Ke-'.ClassSession::find($arguments['session'])->session_number) + ->modalSubmitAction(false) + ->modalCancelActionLabel('Tutup') + ->modalWidth(Width::Large) + ->modalContent(fn (array $arguments) => view('filament.resources.learning.class-sessions.materials-modal', [ + 'materials' => ClassSession::find($arguments['session'])->materials()->latest()->get(), + ])); + } + + protected function viewAssignmentsAction(): Action + { + return Action::make('viewAssignments') + ->label('Daftar Tugas') + ->modalHeading(fn (array $arguments) => 'Tugas Kuliah - Sesi Ke-'.ClassSession::find($arguments['session'])->session_number) + ->modalSubmitAction(false) + ->modalCancelActionLabel('Tutup') + ->modalWidth(Width::Large) + ->modalContent(fn (array $arguments) => view('filament.resources.learning.class-sessions.assignments-modal', [ + 'assignments' => ClassSession::find($arguments['session'])->assignments()->latest()->get(), + ])); + } } diff --git a/app/Filament/Resources/Learning/Materials/MaterialResource.php b/app/Filament/Resources/Learning/Materials/MaterialResource.php index 8518da3..a0c0db2 100644 --- a/app/Filament/Resources/Learning/Materials/MaterialResource.php +++ b/app/Filament/Resources/Learning/Materials/MaterialResource.php @@ -10,6 +10,7 @@ use App\Filament\Actions\DefaultBulkActions; use App\Filament\Columns\TimestampColumns; use App\Filament\Resources\Learning\Materials\Pages\ManageMaterials; +use App\Models\ClassSession; use App\Models\Course; use App\Models\Material; use App\Settings\GeneralSettings; @@ -71,13 +72,24 @@ public static function form(Schema $schema): Schema ->live() ->required(), - DatePicker::make('published_at') - ->label('Tanggal Publikasi') - ->placeholder('Pilih Tanggal') - ->required() - ->native(false) - ->displayFormat('l, d F Y') - ->default(now()->toDateString()), + Select::make('class_session_id') + ->label('Pertemuan Ke-') + ->placeholder('Pilih Pertemuan (Opsional)') + ->options(function ($get) { + $courseId = $get('course_id'); + if (! $courseId) { + return []; + } + + return ClassSession::where('course_id', $courseId) + ->orderBy('session_number') + ->pluck('session_number', 'id') + ->map(fn ($num) => "Sesi Ke-$num") + ->toArray(); + }) + ->searchable() + ->nullable() + ->helperText('Kosongkan jika materi tidak terkait dengan sesi tertentu.'), ]) ->columnSpanFull(), @@ -128,15 +140,17 @@ public static function table(Table $table): Table ->searchable() ->sortable(), - TextColumn::make('published_at') - ->label('Tanggal Publikasi') + TextColumn::make('created_at') + ->label('Tanggal Dibuat') ->date('l, d F Y') ->sortable(), - TextColumn::make('description') - ->label('Deskripsi') - ->searchable() - ->sortable(), + TextColumn::make('classSession.session_number') + ->label('Pertemuan') + ->formatStateUsing(fn ($state) => $state ? "Sesi Ke-$state" : '-') + ->sortable() + ->badge() + ->color('gray'), ...TimestampColumns::make(), ]) @@ -151,17 +165,17 @@ public static function table(Table $table): Table }) ->searchable(), - Filter::make('published_at') + Filter::make('created_at') ->schema([ DatePicker::make('date') - ->label('Tanggal Publikasi') + ->label('Tanggal Dibuat') ->placeholder('Pilih Tanggal') ->native(false), ]) ->query(function (Builder $query, array $data): Builder { return $query->when( $data['date'], - fn (Builder $query, $date): Builder => $query->whereDate('published_at', $date), + fn (Builder $query, $date): Builder => $query->whereDate('created_at', $date), ); }), diff --git a/app/Models/Material.php b/app/Models/Material.php index 22d5f6f..15e0638 100644 --- a/app/Models/Material.php +++ b/app/Models/Material.php @@ -15,10 +15,6 @@ class Material extends Model implements HasMedia protected $guarded = ['id']; - protected $casts = [ - 'published_at' => 'datetime', - ]; - public function course(): BelongsTo { return $this->belongsTo(Course::class); diff --git a/database/migrations/2026_10_25_024508_create_materials_table.php b/database/migrations/2026_10_25_024508_create_materials_table.php index fe16ecb..981bf59 100644 --- a/database/migrations/2026_10_25_024508_create_materials_table.php +++ b/database/migrations/2026_10_25_024508_create_materials_table.php @@ -17,7 +17,6 @@ public function up(): void $table->foreignId('class_session_id')->nullable()->constrained()->nullOnDelete(); $table->string('title', 100); $table->text('description')->nullable(); - $table->timestamp('published_at')->nullable(); $table->timestamp('created_at')->useCurrent(); $table->timestamp('updated_at')->nullable()->useCurrentOnUpdate(); $table->softDeletes(); diff --git a/resources/views/filament/resources/learning/class-sessions/assignments-modal.blade.php b/resources/views/filament/resources/learning/class-sessions/assignments-modal.blade.php new file mode 100644 index 0000000..55f985c --- /dev/null +++ b/resources/views/filament/resources/learning/class-sessions/assignments-modal.blade.php @@ -0,0 +1,35 @@ +
+ @forelse($assignments as $assignment) +
+
+
+ +
+
+ + {{ $assignment->type->label() ?? 'TUGAS' }} + + {{ $assignment->title }} +
+ + + Deadline: {{ $assignment->due_date?->translatedFormat('d F Y, H:i') ?? '-' }} + +
+
+
+
+ + + +
+
+ @empty +
+ +

Belum ada tugas untuk sesi ini.

+
+ @endforelse +
diff --git a/resources/views/filament/resources/learning/class-sessions/index.blade.php b/resources/views/filament/resources/learning/class-sessions/index.blade.php index ab29caf..b0aaf96 100644 --- a/resources/views/filament/resources/learning/class-sessions/index.blade.php +++ b/resources/views/filament/resources/learning/class-sessions/index.blade.php @@ -41,14 +41,22 @@ {{ $session->time_range }} -
-
- - {{ $session->materials_count }} Materi +
+
+ + + {{ $session->materials_count }}Materi +
-
- - {{ $session->assignments_count }} Tugas +
+ + + {{ $session->assignments_count }}Tugas +
@if ($session->is_pending) diff --git a/resources/views/filament/resources/learning/class-sessions/materials-modal.blade.php b/resources/views/filament/resources/learning/class-sessions/materials-modal.blade.php new file mode 100644 index 0000000..00e307c --- /dev/null +++ b/resources/views/filament/resources/learning/class-sessions/materials-modal.blade.php @@ -0,0 +1,29 @@ +
+ @forelse($materials as $material) +
+
+
+ +
+
+ {{ $material->title }} + + Dibuat: {{ $material->created_at?->translatedFormat('d F Y') ?? '-' }} + +
+
+
+ + + +
+
+ @empty +
+ +

Belum ada materi untuk sesi ini.

+
+ @endforelse +
diff --git a/resources/views/filament/resources/learning/class-sessions/show.blade.php b/resources/views/filament/resources/learning/class-sessions/show.blade.php index 1e3ca5d..cfc57b4 100644 --- a/resources/views/filament/resources/learning/class-sessions/show.blade.php +++ b/resources/views/filament/resources/learning/class-sessions/show.blade.php @@ -36,12 +36,14 @@ class="flex items-center gap-1.5 font-bold text-success-600 dark:text-success-40 {{ $session->attendance_percentage }}%
-
+
{{ $session->materials_count }} Materi
-
- +
+ {{ $session->assignments_count }} Tugas