Skip to content

Commit 8196a78

Browse files
author
Chri$
committed
feat:[lar-32] Add article list in cpanel with action
1 parent 75f48d7 commit 8196a78

File tree

11 files changed

+4693
-161
lines changed

11 files changed

+4693
-161
lines changed
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 ApprovedAction extends \Filament\Tables\Actions\Action
10+
{
11+
use CanCustomizeProcess;
12+
public static function getDefaultName(): ?string
13+
{
14+
return 'approved';
15+
}
16+
17+
protected function setUp(): void
18+
{
19+
parent::setUp();
20+
21+
$this->label(__('Approuver'));
22+
23+
$this->modalHeading(fn (): string => __('Voulez vous approuver cet article', ['label' => $this->getRecordTitle()]));
24+
25+
$this->modalSubmitActionLabel(__('Approuver'));
26+
27+
$this->successNotificationTitle(__('Opération effectuée avec succès'));
28+
29+
$this->color('success');
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(['approved_at' => now(), 'declined_at' => null]));
39+
40+
if (! $result) {
41+
$this->failure();
42+
43+
return;
44+
}
45+
46+
$this->success();
47+
});
48+
}
49+
}
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-check');
32+
33+
$this->requiresConfirmation();
34+
35+
$this->modalIcon('heroicon-s-check');
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: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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+
18+
class ArticleResource extends Resource
19+
{
20+
protected static ?string $model = Article::class;
21+
22+
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
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+
TextColumn::make('status')
32+
->label('Status')
33+
->getStateUsing(function ($record) {
34+
if ($record->approved_at) {
35+
return 'Approuver';
36+
} elseif ($record->declined_at) {
37+
return 'Décliner';
38+
} elseif($record->submitted_at) {
39+
return 'Soumis';
40+
}
41+
})
42+
->colors([
43+
'success' => 'Approuver',
44+
'danger' => 'Décliner',
45+
'warning' => 'Soumis',
46+
])
47+
->badge(),
48+
TextColumn::make('submitted_at')
49+
->label('Date de soumission')
50+
->dateTime(),
51+
TextColumn::make('user.name')
52+
->label('Auteur')
53+
->sortable()
54+
])
55+
->filters([
56+
Filter::make('submitted_at')->query( fn (Builder $query) => $query->whereNotNull('submitted_at'))->label('Soumis'),
57+
Filter::make('declined_at')->query( fn (Builder $query) => $query->whereNotNull('declined_at'))->label('Décliner'),
58+
Filter::make('approved_at')->query( fn (Builder $query) => $query->whereNotNull('approved_at'))->label('Approuver')
59+
])
60+
61+
->actions([
62+
ActionGroup::make([
63+
ApprovedAction::make('approved'),
64+
DeclinedAction::make('declined'),
65+
Tables\Actions\DeleteAction::make('delete'),
66+
]),
67+
68+
])
69+
->bulkActions([
70+
Tables\Actions\BulkActionGroup::make([
71+
Tables\Actions\DeleteBulkAction::make(),
72+
]),
73+
]);
74+
}
75+
76+
public static function getPages(): array
77+
{
78+
return [
79+
'index' => Pages\ListArticles::route('/'),
80+
];
81+
}
82+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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+
use Filament\Tables\Actions\DeleteAction;
9+
10+
class ListArticles extends ListRecords
11+
{
12+
protected static string $resource = ArticleResource::class;
13+
14+
protected function getHeaderActions(): array
15+
{
16+
return [
17+
18+
];
19+
}
20+
}

app/Models/Article.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Illuminate\Database\Eloquent\Builder;
1717
use Illuminate\Database\Eloquent\Factories\HasFactory;
1818
use Illuminate\Database\Eloquent\Model;
19+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
1920
use Illuminate\Support\Str;
2021
use Spatie\MediaLibrary\HasMedia;
2122
use Spatie\MediaLibrary\InteractsWithMedia;
@@ -74,6 +75,14 @@ public function getRouteKeyName(): string
7475
return 'slug';
7576
}
7677

78+
79+
public function user(): BelongsTo
80+
{
81+
return $this->belongsTo(User::class);
82+
}
83+
84+
85+
7786
public function excerpt(int $limit = 110): string
7887
{
7988
return Str::limit(strip_tags((string) md_to_html($this->body)), $limit);

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
])

0 commit comments

Comments
 (0)