components([ TextInput::make('code') ->label('Kode') ->placeholder('FSI419') ->autocomplete(false) ->autofocus() ->required() ->maxLength(20) ->unique(ignoreRecord: true), TextInput::make('name') ->label('Nama') ->placeholder('Sistem Pendukung Keputusan') ->autocomplete(false) ->required() ->maxLength(100), TextInput::make('credit') ->label('SKS') ->placeholder('2') ->autocomplete(false) ->required() ->numeric() ->minValue(1) ->maxValue(6), TextInput::make('semester') ->label('Semester') ->placeholder('3') ->autocomplete(false) ->required() ->numeric() ->minValue(1) ->maxValue(8) ->helperText('Semester ke berapa mata kuliah ini diajarkan (1-8).'), Select::make('lecturer_id') ->label('Dosen Pengampu') ->placeholder('Pilih Dosen') ->relationship('lecturer', 'full_name') ->preload() ->searchable() ->helperText('Pilih dosen yang mengampu mata kuliah ini.') ->required(), ]) ->columns(1); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name') ->label('Nama') ->searchable(query: function (Builder $query, string $search) { $query->where('name', 'like', "%{$search}%") ->orWhere('code', 'like', "%{$search}%"); }) ->sortable() ->description(fn (Course $course) => $course->code), TextColumn::make('credit') ->label('SKS') ->sortable(), TextColumn::make('lecturer.full_name') ->label('Dosen Pengampu') ->searchable(), ...TimestampColumns::make(), ]) ->filters([ TrashedFilter::make() ->native(false) ->visible(fn () => auth()->user()->hasRole(RoleEnum::Developer)), ]) ->recordActions([ EditAction::make() ->modalWidth(Width::Large), DeleteAction::make(), ForceDeleteAction::make(), RestoreAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ ...DefaultBulkActions::make('Mata Kuliah'), ]), ]) ->emptyStateIcon(Heroicon::OutlinedRectangleStack) ->emptyStateDescription('Setelah Anda membuat data pertama, maka akan muncul disini.') ->defaultSort('code', 'desc') ->defaultGroup('semester') ->groups([ Group::make('semester') ->label('Semester') ->getTitleFromRecordUsing(fn (Course $record): string => 'Semester '.$record->semester) ->collapsible(), ]) ->deferFilters(false) ->paginated(false); } public static function getPages(): array { return [ 'index' => ManageCourses::route('/'), ]; } public static function getRecordRouteBindingEloquentQuery(): Builder { return parent::getRecordRouteBindingEloquentQuery() ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } }