columns([ ...RowIndexColumn::make(), TextColumn::make('name') ->label('Nama') ->searchable() ->sortable(), ToggleColumn::make('is_active') ->label('Aktif?') ->sortable() ->getStateUsing(fn (SubClassification $record): bool => $record->is_active === IsActive::ACTIVE) ->updateStateUsing(function (SubClassification $record, bool $state): void { $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->save(); CheerfulNotification::success( CheerfulNotification::getByKey('status.updated'), CheerfulNotification::getByKey('status.update_success') )->send(); }), ...TimestampColumns::make(), ]) ->filters([ SelectFilter::make('is_active') ->label('Status') ->options(IsActive::class) ->native(false), SelectFilter::make('classification') ->label('Klasifikasi') ->relationship('classification', 'name') ->searchable() ->preload() ->native(false), TrashedFilter::make() ->native(false) ->visible(fn () => auth()->user()?->hasRole(RoleEnum::DEVELOPER->value)), ]) ->recordActions([ EditAction::make() ->modalWidth(Width::Large), DeleteAction::make(), ForceDeleteAction::make(), RestoreAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ ...DefaultBulkActions::make('Subklasifikasi'), ]), ]) ->emptyStateIcon(Heroicon::OutlinedQueueList) ->emptyStateHeading(fn () => CheerfulNotification::getByKey('classification.sub.empty_state_heading')) ->emptyStateDescription(fn () => CheerfulNotification::getByKey('classification.sub.empty_state')) ->defaultSort('created_at', 'desc') ->deferFilters(false) ->paginated([25, 50, 100, 'all']) ->deferLoading() ->groups([ Group::make('classification.name') ->label('Klasifikasi') ->collapsible(), ]) ->defaultGroup('classification.name'); } }