schema([ Forms\Components\Section::make('Data Absensi') ->schema([ Select::make('teacher_subject_id') ->label('Teacher Subject') ->required() ->options(function () { $user = auth()->user(); $query = TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear']); if ($user->hasRole('teacher')) { // Ambil ID kelas dimana user menjadi wali kelas $homeRoomClassIds = HomeRoomTeacher::where('teacher_id', $user->id) ->pluck('class_room_id') ->toArray(); $query->where(function($q) use ($user, $homeRoomClassIds) { // Mata pelajaran yang diajarkan oleh guru ini $q->where('teacher_id', $user->id) // ATAU kelas dimana dia menjadi wali kelas ->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 (callable $set, $state) { if ($state) { $teacherSubject = TeacherSubject::find($state); if ($teacherSubject) { $set('student_id', null); } } }) ->columnSpanFull(), Forms\Components\DatePicker::make('date') ->label('Date') ->required() ->default(now()) ->live(), Select::make('student_id') ->label('Student') ->required() ->searchable() ->options(function ($get) { $teacherSubjectId = $get('teacher_subject_id'); if ($teacherSubjectId) { $teacherSubject = TeacherSubject::find($teacherSubjectId); $students = ClassStudent::where('class_room_id', $teacherSubject->class_id) ->where('academic_year_id', $teacherSubject->academic_year_id) ->with('student') ->get() ->pluck('student.full_name', 'id') ->toArray(); return $students; } return []; }) ->getOptionLabelUsing(function ($value) { $student = Student::find($value); return $student ? $student->full_name . ' (' . $student->nis . ')' : null; }), Select::make('semester') ->label('Semester') ->required() ->options([ 'first' => 'First Semester', 'second' => 'Second Semester' ]), Select::make('status') ->label('Status') ->required() ->options([ 'present' => 'Present', 'absent' => 'Absent', 'permission' => 'Permission', 'sick' => 'Sick' ]) ->native(false), Forms\Components\Hidden::make('recorded_by') ->default(auth()->id()), Forms\Components\Textarea::make('notes') ->label('Notes') ->columnSpanFull() ])->columns(2) ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('student.full_name') ->label('Student') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('teacherSubject.class.class_name') ->label('Class') ->searchable(), Tables\Columns\TextColumn::make('teacherSubject.subject.name') ->label('Subject') ->searchable(), Tables\Columns\TextColumn::make('teacherSubject.teacher.name') ->label('Teacher') ->searchable(), Tables\Columns\TextColumn::make('date') ->label('Date') ->date('d/m/Y') ->sortable(), Tables\Columns\BadgeColumn::make('status') ->label('Status') ->formatStateUsing(fn (string $state): string => match ($state) { 'present' => 'Present', 'absent' => 'Absent', 'permission' => 'Permission', 'sick' => 'Sick' }) ->color(fn (string $state): string => match ($state) { 'present' => 'success', 'absent' => 'danger', 'permission' => 'warning', 'sick' => 'warning' }), Tables\Columns\TextColumn::make('semester') ->label('Semester') ->formatStateUsing(fn (string $state): string => match ($state) { 'first' => 'First Semester', 'second' => 'Second Semester' }), Tables\Columns\TextColumn::make('teacherSubject.academicYear.name') ->label('Academic Year') ->searchable(), Tables\Columns\TextColumn::make('recorder.name') ->label('Record by') ->toggleable(), ]) ->filters([ Tables\Filters\SelectFilter::make('status') ->label('Status') ->options([ 'present' => 'Present', 'absent' => 'Absent', 'permission' => 'Permission', 'sick' => 'Sick' ]), Tables\Filters\SelectFilter::make('semester') ->label('Semester') ->options([ 'first' => 'First Semester', 'second' => 'Second Semester' ]), Tables\Filters\Filter::make('date') ->form([ Forms\Components\DatePicker::make('date_from') ->label('From'), Forms\Components\DatePicker::make('date_until') ->label('To'), ]) ->query(function (Builder $query, array $data): Builder { return $query ->when( $data['date_from'], fn (Builder $query, $date): Builder => $query->whereDate('date', '>=', $date), ) ->when( $data['date_until'], fn (Builder $query, $date): Builder => $query->whereDate('date', '<=', $date), ); }), Tables\Filters\SelectFilter::make('teacher_subject_id') ->label('Teacher Subject') ->relationship('teacherSubject', 'id') ->searchable() ->getOptionLabelFromRecordUsing(fn (TeacherSubject $record) => $record->teacher->name . ' - ' . $record->subject->name) ->preload(), ]) ->actions([ Tables\Actions\EditAction::make() ->iconButton(), Tables\Actions\DeleteAction::make() ->iconButton(), ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('super_admin') || auth()->user()->hasRole('teacher')), ]), ]) ->defaultSort('date', 'desc') ->groups([ Tables\Grouping\Group::make('date') ->label('Date') ->date() ->collapsible(), Tables\Grouping\Group::make('teacherSubject.subject.name') ->label('Subjects') ->collapsible(), Tables\Grouping\Group::make('semester') ->label('Semester') ->collapsible(), ]); } public static function getRelations(): array { return [ // ]; } public static function getPages(): array { return [ 'index' => Pages\ListAttendances::route('/'), 'create' => Pages\CreateAttendances::route('/create'), 'edit' => Pages\EditAttendances::route('/{record}/edit'), 'multiple' => Pages\MultipleAttendances::route('/multiple'), ]; } }