form->fill(); } protected function getFormSchema(): array { return [ Forms\Components\Grid::make(2) ->schema([ Forms\Components\Select::make('teacherSubjectId') ->label('Teacher Subject') ->options( TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear'])->get()->mapWithKeys(function ($item) { return [ $item->id => "{$item->teacher->name} - {$item->subject->name} - {$item->class->class_name} - {$item->academicYear->name}" ]; })->toArray() ) ->searchable() ->reactive() ->afterStateUpdated(function ($state) { $this->teacherSubjectId = $state; $this->loadStudents(); }), Forms\Components\Select::make('semester') ->label('Semester') ->required() ->default('first') ->options([ 'first' => 'First Semester', 'second' => 'Second Semester' ]) ->live() ->afterStateUpdated(function ($state) { $this->semester = $state; $this->loadStudents(); }), ]), ]; } public function loadStudents(): void { if (!$this->teacherSubjectId) { $this->students = []; return; } $this->teacherSubject = TeacherSubject::with(['subject','class','academicYear','teacher']) ->where('id', $this->teacherSubjectId) ->firstOrFail(); $classStudents = ClassStudent::where('class_room_id', $this->teacherSubject->class_id) ->where('academic_year_id', $this->teacherSubject->academic_year_id) ->with('student') ->get(); $isSubjectReligion = $this->teacherSubject->subject->is_religious; $subjectName = strtolower($this->teacherSubject->subject->name); $result = []; foreach ($classStudents as $classStudent) { $student = $classStudent->student; if (!$student) continue; // Jaga-jaga kalau relasi student-nya null $existingAssessment = Assessment::where('student_id', $student->id) ->where('teacher_subject_id', $this->teacherSubjectId) ->where('semester', $this->semester) ->first(); if ($isSubjectReligion) { $studentReligion = strtolower($student->religion); if (!str_contains($subjectName, $studentReligion)) { continue; // Skip kalau agama tidak cocok } } $result[] = [ 'id' => $student->id, 'name' => $student->full_name, 'nis' => $student->nis, 'score' => $existingAssessment ? $existingAssessment->score : null, ]; } $this->students = $result; } public function submit(): void { if (!$this->teacherSubjectId || empty($this->students)) { Notification::make() ->title('Error') ->body('Please select a teacher subject and enter student scores.') ->danger() ->send(); return; } foreach ($this->students as $student) { if (!isset($student['score'])) continue; Assessment::updateOrCreate( [ 'student_id' => $student['id'], 'teacher_subject_id' => $this->teacherSubjectId, ], [ 'score' => $student['score'], 'semester' => $this->semester, ] ); } Notification::make() ->title('Success') ->body('Assessments saved successfully.') ->success() ->send(); } protected function getHeaderActions(): array { return [ Actions\Action::make('back') ->label('Back to Assessments') ->url(static::getResource()::getUrl('index')), ]; } }