Skip to content

Commit c979a06

Browse files
feat:[LAR-31] Add filament thread table in cpanel (#169)
2 parents 84492f7 + 5798f25 commit c979a06

File tree

4 files changed

+129
-6
lines changed

4 files changed

+129
-6
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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\Actions\Action;
12+
use Filament\Tables\Actions\ActionGroup;
13+
use Filament\Tables\Columns\IconColumn;
14+
use Filament\Tables\Columns\TextColumn;
15+
use Filament\Tables\Filters\SelectFilter;
16+
use Filament\Tables\Table;
17+
18+
final class ThreadResource extends Resource
19+
{
20+
protected static ?string $model = Thread::class;
21+
22+
protected static ?string $navigationIcon = 'heroicon-o-chat-bubble-left-right';
23+
24+
public static function table(Table $table): Table
25+
{
26+
return $table
27+
->columns([
28+
TextColumn::make('title')
29+
->label('Titre')
30+
->sortable(),
31+
IconColumn::make('locked')
32+
->label('Vérrouillé')
33+
->options([
34+
'heroicon-s-lock-closed' => fn ($record) => $record->locked === true,
35+
'heroicon-s-lock-open' => fn ($record) => $record->locked === false,
36+
])
37+
->colors([
38+
'warning' => fn ($record) => $record->locked === true,
39+
'success' => fn ($record) => $record->locked === false,
40+
]),
41+
IconColumn::make('resolved_by')
42+
->label('Résolut')
43+
->getStateUsing(fn ($record) => $record->resolved_by == null ? 'heroicon-s-x-mark' : 'heroicon-s-check')
44+
->icon(fn ($state) => $state)
45+
->color(fn ($state) => $state === 'heroicon-s-x-mark' ? 'warning' : 'success')
46+
->sortable(),
47+
TextColumn::make('created_at')
48+
->label('Date de publication')
49+
->dateTime(),
50+
TextColumn::make('user.name')
51+
->label('Auteur'),
52+
])
53+
->filters([
54+
SelectFilter::make('Channels')->relationship('channels', 'name')->searchable()->preload(),
55+
])
56+
->actions([
57+
ActionGroup::make([
58+
Action::make('view')
59+
->label('Voir le thread')
60+
->icon('heroicon-o-eye')
61+
->color('success')
62+
->url(fn (Thread $record): string => route('forum.show', $record))
63+
->openUrlInNewTab(),
64+
Tables\Actions\DeleteAction::make(),
65+
]),
66+
])
67+
->bulkActions([
68+
Tables\Actions\BulkActionGroup::make([
69+
Tables\Actions\DeleteBulkAction::make(),
70+
]),
71+
]);
72+
}
73+
74+
public static function getPages(): array
75+
{
76+
return [
77+
'index' => Pages\ListThreads::route('/'),
78+
];
79+
}
80+
}
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: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Feature\Filament;
6+
7+
use App\Filament\Resources\ThreadResource;
8+
use App\Models\Thread;
9+
use Illuminate\Database\Eloquent\Factories\Sequence;
10+
use Livewire\Livewire;
11+
12+
beforeEach(function (): void {
13+
$this->user = $this->login();
14+
$this->ActingAs($this->user);
15+
$this->threads = Thread::factory()->count(2)->state(
16+
new Sequence(
17+
['locked' => false],
18+
['locked' => true]
19+
)
20+
)
21+
->create();
22+
});
23+
24+
describe(ThreadResource::class, function (): void {
25+
26+
it('page can display table with records', function (): void {
27+
Livewire::test(ThreadResource\Pages\ListThreads::class)
28+
->assertCanSeeTableRecords($this->threads);
29+
});
30+
})->group('threads');

0 commit comments

Comments
 (0)