form->fill(); } public function loadData($subject, $class): void { $this->learningObjectivesList = LearningObjective::with(["subject", "class"]) ->where('subject_id', $subject) ->where('class_room_id', $class) ->get() ->pluck("description", "id") ->toArray(); } protected function getFormSchema(): array { return [ Forms\Components\Grid::make(2) ->schema([ Select::make('teacherSubjectId') ->label('Guru per-Mapel') ->required() ->options(function () { $user = auth()->user(); $query = TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear']); if ($user->hasRole('teacher')) { $homeRoomClassIds = HomeRoomTeacher::where('teacher_id', $user->id) ->pluck('class_room_id') ->toArray(); $query->where(function($q) use ($user, $homeRoomClassIds) { $q->where('teacher_id', $user->id) ->orWhereIn('class_id', $homeRoomClassIds); }); } return $query->get()->mapWithKeys(fn ($item) => [ $item->id => sprintf('%s - %s - %s - %s', $item->teacher->name, $item->subject->name, $item->class->class_name, $item->academicYear->name ) ]); }) ->searchable() ->live() ->afterStateUpdated(function ($state) { $this->teacherSubjectId = $state; $this->loadStudents(); }), Forms\Components\Select::make('semester') ->label('Semester') ->required() ->default('first') ->options([ 'first' => 'Ganjil', 'second' => 'Genap' ]) ->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(); $this->loadData($this->teacherSubject->subject->id, $this->teacherSubject->class->id); $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 } } // Ambil tujuan pembelajaran tertinggi dari tabel assessment_learning_objectives $highestObjectives = AssessmentLearningObjective::where('student_id', $student->id) ->where('teacher_subject_id', $this->teacherSubjectId) ->where('type', 'highest') ->pluck('learning_objective_id') ->toArray(); // Ambil tujuan pembelajaran lebih rendah dari tabel assessment_learning_objectives $lowerObjectives = AssessmentLearningObjective::where('student_id', $student->id) ->where('teacher_subject_id', $this->teacherSubjectId) ->where('type', 'lower') ->pluck('learning_objective_id') ->toArray(); $result[] = [ 'id' => $student->id, 'name' => $student->full_name, 'nis' => $student->nis, 'nisn' => $student->nisn, 'gender' => $student->gender, 'birth_date' => $student->birth_date, 'score' => $existingAssessment ? $existingAssessment->score : 0, // 'learning_objectives' => $existingAssessment && is_array($existingAssessment->learning_objectives) // ? $existingAssessment->learning_objectives // : [], // 'learning_objectives_lower' => $existingAssessment && is_array($existingAssessment->learning_objectives_lower) // ? $existingAssessment->learning_objectives_lower // : [], 'learning_objectives' => $highestObjectives, 'learning_objectives_lower' => $lowerObjectives, ]; } $this->students = $result; } public function addLearningObjective(int $studentIndex, string $type = "highest"): void { if($type === "lower") { if (!isset($this->students[$studentIndex]['learning_objectives_lower'])) { $this->students[$studentIndex]['learning_objectives_lower'] = []; } $this->students[$studentIndex]['learning_objectives_lower'][] = null; } else { if (!isset($this->students[$studentIndex]['learning_objectives'])) { $this->students[$studentIndex]['learning_objectives'] = []; } $this->students[$studentIndex]['learning_objectives'][] = null; } } public function removeLearningObjective(int $studentIndex, int $objectiveIndex, string $type = "highest"): void { if ($type === "lower") { if (isset($this->students[$studentIndex]['learning_objectives_lower']) && is_array($this->students[$studentIndex]['learning_objectives_lower'])) { // Check if the specific objectiveIndex exists within the array // This will be true for null values too, which is what we want for removal if (array_key_exists($objectiveIndex, $this->students[$studentIndex]['learning_objectives_lower'])) { unset($this->students[$studentIndex]['learning_objectives_lower'][$objectiveIndex]); // Reindex the array to prevent gaps in keys, which can cause issues with Livewire $this->students[$studentIndex]['learning_objectives_lower'] = array_values($this->students[$studentIndex]['learning_objectives_lower']); } } } else { if (isset($this->students[$studentIndex]['learning_objectives']) && is_array($this->students[$studentIndex]['learning_objectives'])) { // Check if the specific objectiveIndex exists within the array // This will be true for null values too, which is what we want for removal if (array_key_exists($objectiveIndex, $this->students[$studentIndex]['learning_objectives'])) { unset($this->students[$studentIndex]['learning_objectives'][$objectiveIndex]); // Reindex the array to prevent gaps in keys, which can cause issues with Livewire $this->students[$studentIndex]['learning_objectives'] = array_values($this->students[$studentIndex]['learning_objectives']); } } } } public function submit(): void { if (!$this->teacherSubjectId || empty($this->students)) { Notification::make() ->title('Error') ->body('Pilih guru per-mapel dan masukkan nilai siswa.') ->danger() ->send(); return; } foreach ($this->students as $student) { if (isset($student['score']) || !empty(array_filter($student['learning_objectives'] ?? [])) || !empty(array_filter($student['learning_objectives_lower'] ?? []))) { Assessment::updateOrCreate( [ 'student_id' => $student['id'], 'teacher_subject_id' => $this->teacherSubjectId, 'semester' => $this->semester, ], [ 'score' => $student['score'] ?? 0, ] ); } AssessmentLearningObjective::where('student_id', $student['id']) ->where('teacher_subject_id', $this->teacherSubjectId) ->where('type', 'highest') ->delete(); if (!empty($student['learning_objectives'])) { foreach (array_filter($student['learning_objectives']) as $loId) { AssessmentLearningObjective::create([ 'student_id' => $student['id'], 'teacher_subject_id' => $this->teacherSubjectId, 'learning_objective_id' => $loId, 'type' => 'highest', ]); } } AssessmentLearningObjective::where('student_id', $student['id']) ->where('teacher_subject_id', $this->teacherSubjectId) ->where('type', 'lower') ->delete(); if (!empty($student['learning_objectives_lower'])) { foreach (array_filter($student['learning_objectives_lower']) as $loId) { // Filter nulls AssessmentLearningObjective::create([ 'student_id' => $student['id'], 'teacher_subject_id' => $this->teacherSubjectId, 'learning_objective_id' => $loId, 'type' => 'lower', ]); } } } Notification::make() ->title('Berhasil') ->body('Penilaian dan Tujuan Pembelajaran berhasil disimpan.') ->success() ->send(); } protected function getHeaderActions(): array { return [ Actions\Action::make('back') ->label('Kembali ke halaman assessment') ->url(static::getResource()::getUrl('index')), ]; } }