columns([ TextColumn::make('author_name') ->label('作者') ->searchable() ->weight('bold'), TextColumn::make('content') ->label('内容') ->limit(60) ->searchable(), TextColumn::make('post.title') ->label('文章') ->limit(30) ->description(fn ($record) => $record->post ? \Illuminate\Support\Str::limit($record->post->excerpt_or_fallback, 50) : null) ->url(fn ($record) => $record->post ? route('posts.show', $record->post->slug ?: $record->post->id) : null) ->openUrlInNewTab(), TextColumn::make('status') ->label('状态') ->badge() ->formatStateUsing(fn ($state) => match ($state) { 'published' => '已发布', 'pending' => '待审核', 'spam' => '垃圾', 'rejected' => '已拒绝', default => $state, }) ->color(fn ($state) => match ($state) { 'published' => 'success', 'pending' => 'warning', 'spam' => 'danger', default => 'gray', }), TextColumn::make('ip') ->label('IP'), TextColumn::make('created_at') ->label('时间') ->dateTime('Y-m-d H:i') ->sortable(), ]) ->filters([ SelectFilter::make('status') ->label('状态') ->options([ 'published' => '已发布', 'pending' => '待审核', 'spam' => '垃圾', 'rejected' => '已拒绝', ]), ], \Filament\Tables\Enums\FiltersLayout::AboveContent) ->recordActions([ Action::make('approve') ->label('通过') ->icon('heroicon-o-check') ->color('success') ->visible(fn (Comment $record) => $record->status !== 'published') ->action(function (Comment $record): void { $record->update(['status' => 'published']) ->recordUrl(null) ->recordAction(null); $record->post?->increment('comment_count'); }), Action::make('spam') ->label('垃圾') ->icon('heroicon-o-x-mark') ->color('danger') ->visible(fn (Comment $record) => $record->status !== 'spam') ->action(fn (Comment $record) => $record->update(['status' => 'spam'])), EditAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]) ->defaultSort('created_at', 'desc'); } }