schema([ Forms\Components\Section::make('Informasi Absensi') ->schema([ Forms\Components\Select::make('teacher_subject_id') ->label('Teacher Subject') ->required() ->relationship('teacherSubject', 'id') ->getOptionLabelFromRecordUsing(fn (TeacherSubject $record) => $record->teacher->name . ' - ' . $record->subject->name . ' - ' . $record->class->class_name . ' - ' . $record->academic_year) ->searchable() ->preload() ->columnSpanFull(), Forms\Components\DatePicker::make('date') ->label('Date') ->required() ->default(now()) ->maxDate(now()), Forms\Components\Select::make('student_id') ->label('Student') ->required() ->searchable() ->options(Student::pluck('full_name', 'id')->toArray()) ->getOptionLabelUsing(function ($value) { $student = Student::find($value); return $student ? $student->full_name . ' (' . $student->nis . ')' : null; }), Forms\Components\Select::make('semester') ->label('Semester') ->required() ->options([ 'first' => 'First Semester', 'second' => 'Second Semester' ]), Forms\Components\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.academic_year') ->label('Academic Year') ->searchable(), Tables\Columns\TextColumn::make('recorder.name') ->label('Record by') ->toggleable(), Tables\Columns\TextColumn::make('notes') ->label('Notes') ->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(), ]), ]) ->emptyStateActions([ Tables\Actions\CreateAction::make(), ]) ->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'), ]; } }