diff --git a/app/Filament/Resources/ThreadResource.php b/app/Filament/Resources/ThreadResource.php new file mode 100644 index 00000000..c59f63ab --- /dev/null +++ b/app/Filament/Resources/ThreadResource.php @@ -0,0 +1,80 @@ +columns([ + TextColumn::make('title') + ->label('Titre') + ->sortable(), + IconColumn::make('locked') + ->label('Vérrouillé') + ->options([ + 'heroicon-s-lock-closed' => fn ($record) => $record->locked === true, + 'heroicon-s-lock-open' => fn ($record) => $record->locked === false, + ]) + ->colors([ + 'warning' => fn ($record) => $record->locked === true, + 'success' => fn ($record) => $record->locked === false, + ]), + IconColumn::make('resolved_by') + ->label('Résolut') + ->getStateUsing(fn ($record) => $record->resolved_by == null ? 'heroicon-s-x-mark' : 'heroicon-s-check') + ->icon(fn ($state) => $state) + ->color(fn ($state) => $state === 'heroicon-s-x-mark' ? 'warning' : 'success') + ->sortable(), + TextColumn::make('created_at') + ->label('Date de publication') + ->dateTime(), + TextColumn::make('user.name') + ->label('Auteur'), + ]) + ->filters([ + SelectFilter::make('Channels')->relationship('channels', 'name')->searchable()->preload(), + ]) + ->actions([ + ActionGroup::make([ + Action::make('view') + ->label('Voir le thread') + ->icon('heroicon-o-eye') + ->color('success') + ->url(fn (Thread $record): string => route('forum.show', $record)) + ->openUrlInNewTab(), + Tables\Actions\DeleteAction::make(), + ]), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListThreads::route('/'), + ]; + } +} diff --git a/app/Filament/Resources/ThreadResource/Pages/ListThreads.php b/app/Filament/Resources/ThreadResource/Pages/ListThreads.php new file mode 100644 index 00000000..ffbc8eff --- /dev/null +++ b/app/Filament/Resources/ThreadResource/Pages/ListThreads.php @@ -0,0 +1,13 @@ +group(function (): void { Route::get('/', [ArticlesController::class, 'index'])->name('articles'); - Route::get('/new', [ArticlesController::class, 'create'])->name('articles.new')->middleware(['auth','verified']); + Route::get('/new', [ArticlesController::class, 'create'])->name('articles.new')->middleware(['auth', 'verified']); Route::get('/{article}', [ArticlesController::class, 'show'])->name('articles.show'); - Route::get('/{article}/edit', [ArticlesController::class, 'edit'])->name('articles.edit')->middleware(['auth','verified']); + Route::get('/{article}/edit', [ArticlesController::class, 'edit'])->name('articles.edit')->middleware(['auth', 'verified']); }); // Discussions Route::prefix('discussions')->as('discussions.')->group(function (): void { Route::get('/', [DiscussionController::class, 'index'])->name('index'); - Route::get('/new', [DiscussionController::class, 'create'])->name('new')->middleware(['auth','verified']); + Route::get('/new', [DiscussionController::class, 'create'])->name('new')->middleware(['auth', 'verified']); Route::get('/{discussion}', [DiscussionController::class, 'show'])->name('show'); - Route::get('/{discussion}/edit', [DiscussionController::class, 'edit'])->name('edit')->middleware(['auth','verified']); + Route::get('/{discussion}/edit', [DiscussionController::class, 'edit'])->name('edit')->middleware(['auth', 'verified']); }); // Forum @@ -55,9 +55,9 @@ Route::redirect('/channels', '/forum'); Route::get('/', [ThreadController::class, 'index'])->name('index'); Route::get('/channels/{channel}', [ThreadController::class, 'channel'])->name('channels'); - Route::get('/new-thread', [ThreadController::class, 'create'])->name('new')->middleware(['auth','verified']); + Route::get('/new-thread', [ThreadController::class, 'create'])->name('new')->middleware(['auth', 'verified']); Route::get('/{thread}', [ThreadController::class, 'show'])->name('show'); - Route::get('/{thread}/edit', [ThreadController::class, 'edit'])->name('edit')->middleware(['auth','verified']); + Route::get('/{thread}/edit', [ThreadController::class, 'edit'])->name('edit')->middleware(['auth', 'verified']); }); // Replies diff --git a/tests/Feature/Filament/ThreadTest.php b/tests/Feature/Filament/ThreadTest.php new file mode 100644 index 00000000..39b10466 --- /dev/null +++ b/tests/Feature/Filament/ThreadTest.php @@ -0,0 +1,30 @@ +user = $this->login(); + $this->ActingAs($this->user); + $this->threads = Thread::factory()->count(2)->state( + new Sequence( + ['locked' => false], + ['locked' => true] + ) + ) + ->create(); +}); + +describe(ThreadResource::class, function (): void { + + it('page can display table with records', function (): void { + Livewire::test(ThreadResource\Pages\ListThreads::class) + ->assertCanSeeTableRecords($this->threads); + }); +})->group('threads');