Skip to content

Commit 7b8a253

Browse files
author
Chri$
committed
feat:[LAR-32] Add article list wit action in cpanl
1 parent bef79c0 commit 7b8a253

File tree

7 files changed

+284
-0
lines changed

7 files changed

+284
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace App\Filament\Actions;
4+
5+
use Filament\Actions\Concerns\CanCustomizeProcess;
6+
use Illuminate\Database\Eloquent\Model;
7+
8+
class ApprovedAction extends \Filament\Tables\Actions\Action
9+
{
10+
use CanCustomizeProcess;
11+
public static function getDefaultName(): ?string
12+
{
13+
return 'approved';
14+
}
15+
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
$this->label(__('Approuver'));
21+
22+
$this->modalHeading(fn (): string => __('Voulez vous approuver cet article', ['label' => $this->getRecordTitle()]));
23+
24+
$this->modalSubmitActionLabel(__('Approuver'));
25+
26+
$this->successNotificationTitle(__('Opération effectuée avec succès'));
27+
28+
$this->color('success');
29+
30+
$this->icon( 'heroicon-s-check');
31+
32+
$this->requiresConfirmation();
33+
34+
$this->modalIcon('heroicon-s-check');
35+
36+
$this->action(function (): void {
37+
$result = $this->process(static fn (Model $record) => $record->update(['approved_at' => now(), 'declined_at' => null]));
38+
39+
if (! $result) {
40+
$this->failure();
41+
42+
return;
43+
}
44+
45+
$this->success();
46+
});
47+
}
48+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace App\Filament\Actions;
4+
5+
use Filament\Actions\Concerns\CanCustomizeProcess;
6+
use Filament\Support\Facades\FilamentIcon;
7+
use Illuminate\Database\Eloquent\Model;
8+
9+
class DeclinedAction extends \Filament\Tables\Actions\Action
10+
{
11+
use CanCustomizeProcess;
12+
public static function getDefaultName(): ?string
13+
{
14+
return 'declined';
15+
}
16+
17+
protected function setUp(): void
18+
{
19+
parent::setUp();
20+
21+
$this->label(__('Décliner'));
22+
23+
$this->modalHeading(fn (): string => __('Voulez vous décliner cet article', ['label' => $this->getRecordTitle()]));
24+
25+
$this->modalSubmitActionLabel(__('Décliner'));
26+
27+
$this->successNotificationTitle(__('Opération effectuée avec succès'));
28+
29+
$this->color('warning');
30+
31+
$this->icon( 'heroicon-s-x-mark');
32+
33+
$this->requiresConfirmation();
34+
35+
$this->modalIcon('heroicon-s-x-mark');
36+
37+
$this->action(function (): void {
38+
$result = $this->process(static fn (Model $record) => $record->update(['declined_at' => now(), 'approved_at' => null]));
39+
40+
if (! $result) {
41+
$this->failure();
42+
43+
return;
44+
}
45+
46+
$this->success();
47+
});
48+
}
49+
}

app/Filament/Clusters/Articles.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace App\Filament\Clusters;
4+
5+
use Filament\Clusters\Cluster;
6+
7+
class Articles extends Cluster
8+
{
9+
protected static ?string $navigationIcon = 'heroicon-o-squares-2x2';
10+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
3+
namespace App\Filament\Resources;
4+
5+
use App\Filament\Actions\ApprovedAction;
6+
use App\Filament\Actions\DeclinedAction;
7+
use App\Filament\Resources\ArticleResource\Pages;
8+
use App\Models\Article;
9+
use Filament\Resources\Resource;
10+
use Filament\Tables;
11+
use Filament\Tables\Columns\TextColumn;
12+
use Filament\Tables\Table;
13+
use Filament\Tables\Filters\Filter;
14+
use Illuminate\Database\Eloquent\Builder;
15+
use Filament\Tables\Actions\ActionGroup;
16+
17+
class ArticleResource extends Resource
18+
{
19+
protected static ?string $model = Article::class;
20+
21+
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
22+
public static function table(Table $table): Table
23+
{
24+
return $table
25+
->columns([
26+
TextColumn::make('title')
27+
->label('Titre')
28+
->sortable(),
29+
TextColumn::make('status')
30+
->label('Status')
31+
->getStateUsing(function ($record) {
32+
if ($record->approved_at) {
33+
return 'Approuver';
34+
} elseif ($record->declined_at) {
35+
return 'Décliner';
36+
} elseif($record->submitted_at) {
37+
return 'Soumis';
38+
}else{
39+
return 'Brouillon';
40+
}
41+
})
42+
->colors([
43+
'success' => 'Approuver',
44+
'danger' => 'Décliner',
45+
'warning' => 'Soumis',
46+
'default' => 'Brouillon',
47+
])
48+
->badge(),
49+
TextColumn::make('submitted_at')
50+
->label('Date de soumission')
51+
->dateTime(),
52+
TextColumn::make('user.name')
53+
->label('Auteur')
54+
->sortable()
55+
])
56+
->filters([
57+
Filter::make('submitted_at')->query( fn (Builder $query) => $query->whereNotNull('submitted_at'))->label('Soumis'),
58+
Filter::make('declined_at')->query( fn (Builder $query) => $query->whereNotNull('declined_at'))->label('Décliner'),
59+
Filter::make('approved_at')->query( fn (Builder $query) => $query->whereNotNull('approved_at'))->label('Approuver')
60+
])
61+
62+
->actions([
63+
ActionGroup::make([
64+
ApprovedAction::make('approved'),
65+
DeclinedAction::make('declined'),
66+
Tables\Actions\DeleteAction::make('delete'),
67+
]),
68+
69+
])
70+
->bulkActions([
71+
Tables\Actions\BulkActionGroup::make([
72+
Tables\Actions\DeleteBulkAction::make(),
73+
]),
74+
]);
75+
}
76+
77+
public static function getPages(): array
78+
{
79+
return [
80+
'index' => Pages\ListArticles::route('/'),
81+
];
82+
}
83+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\ArticleResource\Pages;
4+
5+
use App\Filament\Resources\ArticleResource;
6+
use Filament\Actions;
7+
use Filament\Resources\Pages\ListRecords;
8+
9+
class ListArticles extends ListRecords
10+
{
11+
protected static string $resource = ArticleResource::class;
12+
13+
protected function getHeaderActions(): array
14+
{
15+
return [
16+
17+
];
18+
}
19+
}

app/Providers/Filament/AdminPanelProvider.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public function panel(Panel $panel): Panel
3939
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
4040
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
4141
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
42+
->discoverClusters(in: app_path('Filament/Clusters'), for: 'App\\Filament\\Clusters')
4243
->pages([
4344
Pages\Dashboard::class,
4445
])
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use App\Filament\Resources\ArticleResource;
6+
use Filament\Tables\Actions\DeleteAction;
7+
use App\Models\Article;
8+
use Livewire\Livewire;
9+
10+
beforeEach(function (): void {
11+
$this->user = $this->login();
12+
$this->articles = Article::factory()->count(10)->create([
13+
'submitted_at' => now(),
14+
]);
15+
});
16+
17+
describe(ArticleResource::class, function (): void {
18+
19+
it('page can display table with records', function (): void {
20+
Livewire::test(ArticleResource\Pages\ListArticles::class)
21+
->assertCanSeeTableRecords($this->articles);
22+
});
23+
24+
it('table can render columns', function (): void {
25+
Livewire::test(ArticleResource\Pages\ListArticles::class)
26+
->assertCanRenderTableColumn('title')
27+
->assertCanRenderTableColumn('status')
28+
->assertCanRenderTableColumn('status')
29+
->assertCanRenderTableColumn('submitted_at');
30+
});
31+
32+
it('admin user can approved article', function (): void {
33+
$article = Article::factory()->create(['submitted_at' => now()]);
34+
35+
Livewire::test(ArticleResource\Pages\ListArticles::class)
36+
->callTableAction('approved', $article);
37+
38+
$article->refresh();
39+
40+
expect($article->approved_at)
41+
->not
42+
->toBe(null);
43+
44+
expect($article->declined_at)
45+
->toBe(null);
46+
});
47+
48+
it('admin user can declined article', function (): void {
49+
$article = Article::factory()->create(['submitted_at' => now()]);
50+
51+
Livewire::test(ArticleResource\Pages\ListArticles::class)
52+
->callTableAction('declined', $article);
53+
54+
$article->refresh();
55+
56+
expect($article->declined_at)
57+
->not
58+
->toBe(null);
59+
60+
expect($article->approved_at)
61+
->toBe(null);
62+
});
63+
64+
// it('admin user can deleted article', function () {
65+
// $article = Article::factory()->create(['submitted_at' => now()]);
66+
67+
// Livewire::test(ArticleResource\Pages\ListArticles::class)
68+
// ->callTableAction('delete', $article);
69+
// //->callAction(DeleteAction::class);
70+
71+
// expect(Article::find($article->id))
72+
// ->toBe(null);
73+
// });
74+
})->group('articles');

0 commit comments

Comments
 (0)