Skip to content

Commit 5ea1c0c

Browse files
committed
feat: [LAR-69] update ArticleResource
1 parent f73503b commit 5ea1c0c

File tree

14 files changed

+186
-95
lines changed

14 files changed

+186
-95
lines changed

app/Filament/Resources/ArticleResource.php

Lines changed: 67 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
namespace App\Filament\Resources;
66

77
use App\Filament\Resources\ArticleResource\Pages;
8+
use App\Gamify\Points\ArticlePublished;
89
use App\Models\Article;
910
use Filament\Resources\Resource;
11+
use Filament\Support\Enums\MaxWidth;
1012
use Filament\Tables;
1113
use Filament\Tables\Actions\Action;
1214
use Filament\Tables\Actions\ActionGroup;
1315
use Filament\Tables\Actions\BulkAction;
14-
use Filament\Tables\Columns\TextColumn;
15-
use Filament\Tables\Filters\Filter;
16+
use Filament\Tables\Enums\FiltersLayout;
1617
use Filament\Tables\Table;
1718
use Illuminate\Database\Eloquent\Builder;
1819
use Illuminate\Database\Eloquent\Collection;
@@ -23,26 +24,56 @@ final class ArticleResource extends Resource
2324

2425
protected static ?string $navigationIcon = 'heroicon-o-newspaper';
2526

27+
public static function getNavigationGroup(): ?string
28+
{
29+
return __('Contenu');
30+
}
31+
2632
public static function table(Table $table): Table
2733
{
2834
return $table
35+
->modifyQueryUsing(fn (Builder $query): Builder => $query->latest())
2936
->columns([
30-
TextColumn::make('title')
37+
Tables\Columns\SpatieMediaLibraryImageColumn::make('media')
38+
->collection('media')
39+
->label('Image'),
40+
Tables\Columns\TextColumn::make('title')
3141
->label('Titre')
32-
->sortable(),
33-
TextColumn::make('user.name')
42+
->limit(50)
43+
->tooltip(function (Tables\Columns\TextColumn $column): ?string {
44+
$state = $column->getState();
45+
46+
if (strlen($state) <= $column->getCharacterLimit()) {
47+
return null;
48+
}
49+
50+
return $state;
51+
})
52+
->sortable()
53+
->searchable(),
54+
Tables\Columns\TextColumn::make('user.name')
3455
->label('Auteur')
35-
->sortable(),
36-
TextColumn::make('submitted_at')
37-
->label('Date de soumission')
38-
->dateTime(),
56+
->sortable()
57+
->searchable(),
58+
Tables\Columns\IconColumn::make('published_at')
59+
->label('Publié')
60+
->getStateUsing(fn (Article $record) => $record->isPublished())
61+
->boolean(),
62+
Tables\Columns\TextColumn::make('submitted_at')
63+
->label('Soumission')
64+
->placeholder('N/A')
65+
->date(),
66+
Tables\Columns\TextColumn::make('approved_at')
67+
->label('Approbation')
68+
->placeholder('N/A')
69+
->date()
70+
->toggleable(),
71+
Tables\Columns\TextColumn::make('declined_at')
72+
->label('Décliner')
73+
->placeholder('N/A')
74+
->date()
75+
->toggleable(isToggledHiddenByDefault: true),
3976
])
40-
->filters([
41-
Filter::make('submitted_at')->query(fn (Builder $query) => $query->whereNotNull('submitted_at'))->label('Soumis'),
42-
Filter::make('declined_at')->query(fn (Builder $query) => $query->whereNotNull('declined_at'))->label('Décliner'),
43-
Filter::make('approved_at')->query(fn (Builder $query) => $query->whereNotNull('approved_at'))->label('Approuver'),
44-
])
45-
4677
->actions([
4778
ActionGroup::make([
4879
Action::make('approved')
@@ -57,6 +88,8 @@ public static function table(Table $table): Table
5788
->action(function ($record): void {
5889
$record->approved_at = now();
5990
$record->save();
91+
92+
givePoint(new ArticlePublished($record));
6093
}),
6194
Action::make('declined')
6295
->visible(fn (Article $record) => $record->isAwaitingApproval())
@@ -71,22 +104,16 @@ public static function table(Table $table): Table
71104
$record->declined_at = now();
72105
$record->save();
73106
}),
107+
Tables\Actions\Action::make('show')
108+
->icon('untitledui-eye')
109+
->url(fn (Article $record) => route('articles.show', $record))
110+
->openUrlInNewTab()
111+
->label('Afficher'),
74112
Tables\Actions\DeleteAction::make(),
75113
]),
76114
])
77115
->bulkActions([
78116
Tables\Actions\BulkActionGroup::make([
79-
BulkAction::make('approved')
80-
->label('Approuver la sélection')
81-
->icon('heroicon-s-check')
82-
->color('success')
83-
->action(fn (Collection $records) => $records->each->update(['approved_at' => now()]))
84-
->deselectRecordsAfterCompletion()
85-
->requiresConfirmation()
86-
->modalIcon('heroicon-s-check')
87-
->modalHeading('Approuver')
88-
->modalDescription('Voulez-vous vraiment approuver ces articles ?')
89-
->modalSubmitActionLabel('Confirmer'),
90117
BulkAction::make('declined')
91118
->label('Décliner la sélection')
92119
->icon('heroicon-s-x-mark')
@@ -101,7 +128,20 @@ public static function table(Table $table): Table
101128

102129
Tables\Actions\DeleteBulkAction::make(),
103130
]),
104-
]);
131+
])
132+
->filters([
133+
Tables\Filters\TernaryFilter::make('submitted_at')
134+
->label('Soumis')
135+
->nullable(),
136+
Tables\Filters\TernaryFilter::make('declined_at')
137+
->label('Décliner')
138+
->nullable(),
139+
Tables\Filters\TernaryFilter::make('approved_at')
140+
->label('Approuver')
141+
->nullable(),
142+
], layout: FiltersLayout::AboveContentCollapsible)
143+
->filtersFormColumns(4)
144+
->filtersFormWidth(MaxWidth::FourExtraLarge);
105145
}
106146

107147
public static function getPages(): array

app/Filament/Resources/ArticleResource/Pages/ListArticles.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,16 @@
55
namespace App\Filament\Resources\ArticleResource\Pages;
66

77
use App\Filament\Resources\ArticleResource;
8+
use App\Models\Article;
9+
use Closure;
810
use Filament\Resources\Pages\ListRecords;
911

1012
final class ListArticles extends ListRecords
1113
{
1214
protected static string $resource = ArticleResource::class;
15+
16+
public function isTableRecordSelectable(): ?Closure
17+
{
18+
return fn (Article $record): bool => $record->isNotPublished();
19+
}
1320
}

app/Filament/Resources/ChannelResource.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ final class ChannelResource extends Resource
2020
{
2121
protected static ?string $model = Channel::class;
2222

23-
protected static ?string $navigationIcon = 'heroicon-o-queue-list';
23+
protected static ?string $navigationIcon = 'untitledui-git-branch';
2424

25-
public static function getLabel(): string
25+
public static function getNavigationGroup(): ?string
2626
{
27-
return __('Channels');
27+
return __('Forum');
2828
}
2929

3030
public static function form(Form $form): Form

app/Filament/Resources/DiscussionResource.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ final class DiscussionResource extends Resource
1717
{
1818
protected static ?string $model = Discussion::class;
1919

20-
protected static ?string $navigationIcon = 'heroicon-o-chat-bubble-bottom-center-text';
20+
protected static ?string $navigationIcon = 'untitledui-message-chat-square';
21+
22+
public static function getNavigationGroup(): ?string
23+
{
24+
return __('Contenu');
25+
}
2126

2227
public static function table(Table $table): Table
2328
{

app/Filament/Resources/TagResource.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ final class TagResource extends Resource
1919
{
2020
protected static ?string $model = Tag::class;
2121

22-
protected static ?string $navigationIcon = 'heroicon-o-tag';
22+
protected static ?string $navigationIcon = 'untitledui-tag-03';
23+
24+
public static function getNavigationGroup(): ?string
25+
{
26+
return __('Contenu');
27+
}
2328

2429
public static function form(Form $form): Form
2530
{

app/Filament/Resources/UserResource.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ final class UserResource extends Resource
1717
{
1818
protected static ?string $model = User::class;
1919

20-
protected static ?string $navigationIcon = 'heroicon-o-user';
20+
protected static ?string $navigationIcon = 'untitledui-users-02';
21+
22+
public static function getNavigationGroup(): ?string
23+
{
24+
return __('Management');
25+
}
2126

2227
public static function table(Table $table): Table
2328
{

app/Providers/AppServiceProvider.php

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,13 @@
1010
use App\Models\Reply;
1111
use App\Models\Thread;
1212
use App\Models\User;
13-
use App\View\Composers\AuthUserComposer;
14-
use App\View\Composers\ChannelsComposer;
1513
use App\View\Composers\InactiveDiscussionsComposer;
16-
use App\View\Composers\ModeratorsComposer;
1714
use App\View\Composers\ProfileUsersComposer;
1815
use App\View\Composers\TopContributorsComposer;
19-
use App\View\Composers\TopMembersComposer;
2016
use Carbon\Carbon;
17+
use Filament\Support\Enums\MaxWidth;
18+
use Filament\Support\Facades\FilamentIcon;
19+
use Filament\Tables;
2120
use Illuminate\Database\Eloquent\Relations\Relation;
2221
use Illuminate\Support\Facades\Blade;
2322
use Illuminate\Support\Facades\View;
@@ -43,6 +42,26 @@ public function boot(): void
4342
$this->bootEloquentMorphs();
4443

4544
ReplyResource::withoutWrapping();
45+
46+
FilamentIcon::register([
47+
'panels::pages.dashboard.navigation-item' => 'untitledui-home-line',
48+
'actions::delete-action' => 'untitledui-trash-03',
49+
'actions::edit-action' => 'untitledui-edit-03',
50+
]);
51+
52+
Tables\Actions\CreateAction::configureUsing(
53+
fn (Tables\Actions\Action $action) => $action->iconButton()
54+
->modalWidth(MaxWidth::ExtraLarge)
55+
->slideOver()
56+
);
57+
58+
Tables\Actions\EditAction::configureUsing(
59+
fn (Tables\Actions\Action $action) => $action->iconButton()
60+
->modalWidth(MaxWidth::ExtraLarge)
61+
->slideOver()
62+
);
63+
64+
Tables\Actions\DeleteAction::configureUsing(fn (Tables\Actions\Action $action) => $action->icon('untitledui-trash-03'));
4665
}
4766

4867
public function registerBladeDirective(): void
@@ -64,13 +83,9 @@ public function bootMacros(): void
6483

6584
public function bootViewsComposer(): void
6685
{
67-
View::composer('forum._channels', ChannelsComposer::class);
68-
View::composer('forum._top-members', TopMembersComposer::class);
69-
View::composer('forum._moderators', ModeratorsComposer::class);
7086
View::composer('discussions._contributions', TopContributorsComposer::class);
7187
View::composer('discussions._contributions', InactiveDiscussionsComposer::class);
7288
View::composer('components.profile-users', ProfileUsersComposer::class);
73-
View::composer('*', AuthUserComposer::class);
7489
}
7590

7691
public function bootEloquentMorphs(): void

app/Providers/Filament/AdminPanelProvider.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ public function panel(Panel $panel): Panel
3333
->colors([
3434
'primary' => Color::Green,
3535
])
36-
->darkMode(false)
36+
->sidebarWidth('18.75rem')
37+
->viteTheme('resources/css/filament/admin/theme.css')
38+
->brandLogo(fn () => view('filament.brand'))
3739
->favicon(asset('images/favicons/favicon-32x32.png'))
3840
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
3941
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
@@ -51,6 +53,7 @@ public function panel(Panel $panel): Panel
5153
)
5254
->databaseNotifications()
5355
->databaseNotificationsPolling('3600s')
56+
->spa()
5457
->middleware([
5558
EncryptCookies::class,
5659
AddQueuedCookiesToResponse::class,

app/View/Composers/AuthUserComposer.php

Lines changed: 0 additions & 19 deletions
This file was deleted.

app/View/Composers/ChannelsComposer.php

Lines changed: 0 additions & 24 deletions
This file was deleted.
Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,54 @@
1-
@import '../../../../vendor/filament/filament/resources/css/theme.css';
1+
@import '/vendor/filament/filament/resources/css/theme.css';
22

33
@config './tailwind.config.js';
4+
5+
.fi-body {
6+
.fi-simple-header .fi-logo {
7+
@apply h-16 !important;
8+
> svg {
9+
@apply h-full;
10+
}
11+
}
12+
13+
&.fi-panel-admin {
14+
@apply bg-gray-50 dark:bg-gray-900;
15+
.fi-sidebar-header {
16+
@apply bg-transparent ring-0 ring-transparent lg:shadow-none;
17+
.fi-logo {
18+
@apply h-10 !important;
19+
> svg {
20+
@apply h-full;
21+
}
22+
}
23+
}
24+
25+
.fi-topbar {
26+
> nav {
27+
@apply shadow-none ring-0 ring-transparent bg-transparent;
28+
}
29+
}
30+
31+
.fi-sidebar-nav {
32+
@apply px-0;
33+
34+
.fi-sidebar-nav-groups {
35+
@apply px-2;
36+
}
37+
38+
.fi-sidebar-item {
39+
@apply border-l-4 border-transparent rounded-none hover:bg-gray-100/50 hover:border-gray-200 dark:hover:bg-gray-900 dark:hover:border-gray-700;
40+
&.fi-active {
41+
@apply border-primary-400 hover:border-primary-400;
42+
}
43+
}
44+
45+
.fi-sidebar-item-button, .fi-sidebar-group-button {
46+
@apply bg-transparent px-5;
47+
}
48+
}
49+
50+
.fi-main-ctn {
51+
@apply bg-transparent;
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)