columns([ TextColumn::make('id') ->label('ID') ->sortable(), TextColumn::make('series.name') ->label('系列') ->searchable(), TextColumn::make('official_title') ->label('官方书名') ->searchable() ->wrap(), TextColumn::make('stage') ->label('学段') ->formatStateUsing(function ($state): string { return match ($state) { 'primary' => '小学', 'junior' => '初中', 'senior' => '高中', default => $state, }; }) ->badge() ->color('info'), TextColumn::make('grade') ->label('年级') ->formatStateUsing(function ($state): string { return $state ? "{$state}年级" : '-'; }), TextColumn::make('semester') ->label('学期') ->formatStateUsing(function ($state): string { return match ($state) { 1 => '上学期', 2 => '下学期', default => '-', }; }) ->badge() ->color('success'), TextColumn::make('naming_scheme') ->label('体系') ->formatStateUsing(function ($state): string { return match ($state) { 'new' => '新体系', 'old' => '旧体系', default => $state, }; }) ->badge(), TextColumn::make('status') ->label('状态') ->formatStateUsing(function ($state): string { return match ($state) { 'draft' => '草稿', 'published' => '已发布', 'archived' => '已归档', default => $state, }; }) ->badge() ->color(function ($state): string { return match ($state) { 'draft' => 'gray', 'published' => 'success', 'archived' => 'danger', default => 'gray', }; }), TextColumn::make('created_at') ->label('创建时间') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('updated_at') ->label('更新时间') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ SelectFilter::make('stage') ->label('学段') ->options([ 'primary' => '小学', 'junior' => '初中', 'senior' => '高中', ]), SelectFilter::make('status') ->label('状态') ->options([ 'draft' => '草稿', 'published' => '已发布', 'archived' => '已归档', ]), ]) ->actions([ EditAction::make() ->label('编辑'), Action::make('delete') ->label('删除') ->color('danger') ->icon('heroicon-o-trash') ->requiresConfirmation() ->modalHeading('删除教材') ->modalDescription('确定要删除这个教材吗?此操作无法撤销。') ->action(function (Model $record) { // 添加调试日志 \Log::info('Deleting textbook', ['id' => $record->id, 'record' => $record]); if (!$record || !$record->id) { \Filament\Notifications\Notification::make() ->title('错误') ->body('无效的教材记录。') ->danger() ->send(); return; } $apiService = app(\App\Services\TextbookApiService::class); $deleted = $apiService->deleteTextbook($record->id); \Log::info('Delete result', ['deleted' => $deleted]); if ($deleted) { \Filament\Notifications\Notification::make() ->title('成功') ->body('教材删除成功。') ->success() ->send(); } else { \Filament\Notifications\Notification::make() ->title('错误') ->body('删除失败,请重试。') ->danger() ->send(); } }), Action::make('view_catalog') ->label('查看目录') ->icon('heroicon-o-list-bullet') ->url(fn(Model $record): string => route('filament.admin.resources.textbook-catalogs.index', ['tableFilters[textbook_id][value]' => $record->id]) ), ]) ->bulkActions([ \Filament\Actions\BulkActionGroup::make([ \Filament\Actions\DeleteBulkAction::make() ->label('批量删除'), ]), ]) ->defaultSort('sort_order') ->paginated([10, 25, 50, 100]); } }