Skip to content

Commit b28fe02

Browse files
author
Chri$
committed
feat:[LAR-31] Add filament thread table in cpanel
1 parent bf2c3fd commit b28fe02

File tree

4 files changed

+131
-6
lines changed

4 files changed

+131
-6
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Filament\Resources;
6+
7+
use App\Filament\Resources\ThreadResource\Pages;
8+
use App\Models\Thread;
9+
use Filament\Resources\Resource;
10+
use Filament\Tables;
11+
use Filament\Tables\Columns\TextColumn;
12+
use Filament\Tables\Filters\Filter;
13+
use Filament\Tables\Filters\SelectFilter;
14+
use Filament\Tables\Table;
15+
use Illuminate\Database\Eloquent\Builder;
16+
17+
final class ThreadResource extends Resource
18+
{
19+
protected static ?string $model = Thread::class;
20+
21+
protected static ?string $navigationIcon = 'heroicon-o-chat-bubble-left-right';
22+
23+
public static function table(Table $table): Table
24+
{
25+
return $table
26+
->columns([
27+
TextColumn::make('title')
28+
->label('Titre')
29+
->sortable(),
30+
TextColumn::make('locked')
31+
->label('Vérrouillé')
32+
->getStateUsing(fn ($record) => ($record->locked) ? 'Oui' : 'Non')
33+
->colors([
34+
'success' => 'Oui',
35+
'danger' => 'Non',
36+
])
37+
->badge(),
38+
TextColumn::make('created_at')
39+
->label('Date de publication')
40+
->dateTime(),
41+
TextColumn::make('user.name')
42+
->label('Auteur'),
43+
])
44+
->filters([
45+
Filter::make('is_locked')->query(fn (Builder $query) => $query->where('locked', true))->label('Vérrouillé'),
46+
SelectFilter::make('Auteur')->relationship('user', 'name')->searchable()->preload(),
47+
])
48+
->actions([
49+
Tables\Actions\DeleteAction::make(),
50+
])
51+
->bulkActions([
52+
Tables\Actions\BulkActionGroup::make([
53+
Tables\Actions\DeleteBulkAction::make(),
54+
]),
55+
]);
56+
}
57+
58+
public static function getPages(): array
59+
{
60+
return [
61+
'index' => Pages\ListThreads::route('/'),
62+
];
63+
}
64+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Filament\Resources\ThreadResource\Pages;
6+
7+
use App\Filament\Resources\ThreadResource;
8+
use Filament\Resources\Pages\ListRecords;
9+
10+
final class ListThreads extends ListRecords
11+
{
12+
protected static string $resource = ThreadResource::class;
13+
}

routes/web.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,27 @@
3737
// Articles
3838
Route::prefix('articles')->group(function (): void {
3939
Route::get('/', [ArticlesController::class, 'index'])->name('articles');
40-
Route::get('/new', [ArticlesController::class, 'create'])->name('articles.new')->middleware(['auth','verified']);
40+
Route::get('/new', [ArticlesController::class, 'create'])->name('articles.new')->middleware(['auth', 'verified']);
4141
Route::get('/{article}', [ArticlesController::class, 'show'])->name('articles.show');
42-
Route::get('/{article}/edit', [ArticlesController::class, 'edit'])->name('articles.edit')->middleware(['auth','verified']);
42+
Route::get('/{article}/edit', [ArticlesController::class, 'edit'])->name('articles.edit')->middleware(['auth', 'verified']);
4343
});
4444

4545
// Discussions
4646
Route::prefix('discussions')->as('discussions.')->group(function (): void {
4747
Route::get('/', [DiscussionController::class, 'index'])->name('index');
48-
Route::get('/new', [DiscussionController::class, 'create'])->name('new')->middleware(['auth','verified']);
48+
Route::get('/new', [DiscussionController::class, 'create'])->name('new')->middleware(['auth', 'verified']);
4949
Route::get('/{discussion}', [DiscussionController::class, 'show'])->name('show');
50-
Route::get('/{discussion}/edit', [DiscussionController::class, 'edit'])->name('edit')->middleware(['auth','verified']);
50+
Route::get('/{discussion}/edit', [DiscussionController::class, 'edit'])->name('edit')->middleware(['auth', 'verified']);
5151
});
5252

5353
// Forum
5454
Route::prefix('forum')->as('forum.')->group(function (): void {
5555
Route::redirect('/channels', '/forum');
5656
Route::get('/', [ThreadController::class, 'index'])->name('index');
5757
Route::get('/channels/{channel}', [ThreadController::class, 'channel'])->name('channels');
58-
Route::get('/new-thread', [ThreadController::class, 'create'])->name('new')->middleware(['auth','verified']);
58+
Route::get('/new-thread', [ThreadController::class, 'create'])->name('new')->middleware(['auth', 'verified']);
5959
Route::get('/{thread}', [ThreadController::class, 'show'])->name('show');
60-
Route::get('/{thread}/edit', [ThreadController::class, 'edit'])->name('edit')->middleware(['auth','verified']);
60+
Route::get('/{thread}/edit', [ThreadController::class, 'edit'])->name('edit')->middleware(['auth', 'verified']);
6161
});
6262

6363
// Replies
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Feature\Filament;
6+
7+
use App\Filament\Resources\ThreadResource;
8+
use App\Filament\Resources\ThreadResource\Pages\ListThreads;
9+
use App\Models\Thread;
10+
use Illuminate\Database\Eloquent\Factories\Sequence;
11+
use Livewire\Livewire;
12+
13+
beforeEach(function (): void {
14+
$this->user = $this->login();
15+
$this->ActingAs($this->user);
16+
$this->threads = Thread::factory()->count(10)->state(
17+
new Sequence(
18+
['locked' => false],
19+
['locked' => true]
20+
)
21+
)
22+
->create();
23+
});
24+
25+
describe(ThreadResource::class, function (): void {
26+
27+
it('page can display table with records', function (): void {
28+
Livewire::test(ThreadResource\Pages\ListThreads::class)
29+
->assertCanSeeTableRecords($this->threads);
30+
});
31+
32+
it('admin user can filter thread by `locked`', function (): void {
33+
Livewire::test(ListThreads::class)
34+
->assertCanSeeTableRecords($this->threads)
35+
->filterTable('is_locked')
36+
->assertCountTableRecords(5);
37+
});
38+
39+
it('can filter thread by `user_id`', function (): void {
40+
$authorId = $this->threads->first()->user_id;
41+
Livewire::test(ListThreads::class)
42+
->assertCanSeeTableRecords($this->threads)
43+
->filterTable('Auteur', $authorId)
44+
->assertCanSeeTableRecords($this->threads->where('user_id', $authorId))
45+
->assertCanNotSeeTableRecords($this->threads->where('user_id', '!=', $authorId));
46+
});
47+
48+
})->group('threads');

0 commit comments

Comments
 (0)