Skip to content

Commit 16efe6e

Browse files
Feature/lar 69 setup filament 3 (#214)
2 parents 04bd121 + c6e47ae commit 16efe6e

File tree

101 files changed

+1764
-4027
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+1764
-4027
lines changed

app/Actions/Article/CreateArticleAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public function execute(CreateArticleData $articleData): Article
1717
if ($articleData->published_at) {
1818
$articleData->published_at = new Carbon(
1919
time: $articleData->published_at,
20-
tz: config('app.timezone')
20+
timezone: config('app.timezone')
2121
);
2222
}
2323

app/Console/Commands/PostArticleToTwitter.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ public function handle(AnonymousNotifiable $notifiable): void
1919
{
2020
if ($article = Article::nextForSharing()) {
2121
$notifiable->notify(new PostArticleToTwitterNotification($article));
22-
22+
2323
$article->markAsShared();
2424
}
2525
}
26-
}
26+
}

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: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,51 +8,57 @@
88
use App\Models\Channel;
99
use Filament\Forms;
1010
use Filament\Forms\Form;
11+
use Filament\Resources\Concerns\Translatable;
1112
use Filament\Resources\Resource;
12-
use Filament\Support\Enums\MaxWidth;
1313
use Filament\Tables;
14-
use Filament\Tables\Actions\ActionGroup;
1514
use Filament\Tables\Table;
1615
use Illuminate\Database\Eloquent\Builder;
1716
use Illuminate\Support\Str;
1817

1918
final class ChannelResource extends Resource
2019
{
20+
use Translatable;
21+
2122
protected static ?string $model = Channel::class;
2223

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

25-
public static function getLabel(): string
26+
public static function getNavigationGroup(): ?string
2627
{
27-
return __('Channels');
28+
return __('Forum');
2829
}
2930

3031
public static function form(Form $form): Form
3132
{
3233
return $form
3334
->schema([
34-
Forms\Components\Section::make()
35-
->schema([
36-
Forms\Components\TextInput::make('name')
37-
->required()
38-
->live(onBlur: true)
39-
->afterStateUpdated(function (string $operation, $state, Forms\Set $set): void {
40-
$set('slug', Str::slug($state));
41-
}),
42-
Forms\Components\TextInput::make('slug')
43-
->readOnly()
44-
->helperText(__('Cette valeur est générée dynamiquement en fonction du Name.')),
45-
Forms\Components\Select::make('parent_id')
46-
->relationship('parent', 'name', fn (Builder $query) => $query->whereNull('parent_id'))
47-
->default(null),
48-
Forms\Components\TextInput::make('color')
49-
->maxLength(255)
50-
->type('color'),
51-
Forms\Components\Textarea::make('description.fr')
52-
->label('Description')
53-
->columnSpanFull(),
54-
])
55-
->columnSpan(['lg' => 2]),
35+
Forms\Components\TextInput::make('name')
36+
->required()
37+
->live(onBlur: true)
38+
->afterStateUpdated(fn ($state, Forms\Set $set) => $set('slug', Str::slug($state)))
39+
->columnSpanFull(),
40+
Forms\Components\TextInput::make('slug')
41+
->readOnly()
42+
->required()
43+
->columnSpanFull(),
44+
Forms\Components\Select::make('parent_id')
45+
->relationship(
46+
name: 'parent',
47+
titleAttribute: 'name',
48+
modifyQueryUsing: fn (Builder $query) => $query->whereNull('parent_id')
49+
)
50+
->live()
51+
->default(null)
52+
->columnSpanFull(),
53+
Forms\Components\ColorPicker::make('color')
54+
->label('Couleur')
55+
->hex()
56+
->live()
57+
->columnSpanFull()
58+
->required(fn (Forms\Get $get): bool => $get('parent_id') === null),
59+
Forms\Components\Textarea::make('description')
60+
->rows(4)
61+
->columnSpanFull(),
5662
]);
5763
}
5864

@@ -61,37 +67,34 @@ public static function table(Table $table): Table
6167
return $table
6268
->columns([
6369
Tables\Columns\TextColumn::make('name')
64-
->searchable(),
65-
Tables\Columns\TextColumn::make('slug')
70+
->label('Nom')
6671
->searchable(),
6772
Tables\Columns\TextColumn::make('parent.name')
68-
->numeric()
73+
->label('Parent')
74+
->placeholder('N/A')
6975
->sortable(),
7076
Tables\Columns\TextColumn::make('thread_number')
71-
->label('Nombre de thead')
77+
->label('Nombre de sujets')
7278
->getStateUsing(fn ($record) => $record->threads()->count()),
73-
Tables\Columns\TextColumn::make('color')
74-
->searchable(),
79+
Tables\Columns\ColorColumn::make('color')
80+
->label('Couleur')
81+
->placeholder('N/A'),
7582
Tables\Columns\TextColumn::make('created_at')
76-
->dateTime()
83+
->label('Date')
84+
->date()
7785
->sortable()
7886
->toggleable(isToggledHiddenByDefault: true),
7987
])
8088
->filters([
8189

8290
])
8391
->actions([
84-
ActionGroup::make([
85-
Tables\Actions\DeleteAction::make(),
86-
Tables\Actions\EditAction::make()
87-
->slideOver()
88-
->modalWidth(MaxWidth::Large),
89-
]),
92+
Tables\Actions\EditAction::make(),
93+
Tables\Actions\DeleteAction::make()
94+
->iconButton(),
9095
])
9196
->bulkActions([
92-
Tables\Actions\BulkActionGroup::make([
93-
Tables\Actions\DeleteBulkAction::make(),
94-
]),
97+
Tables\Actions\DeleteBulkAction::make(),
9598
]);
9699
}
97100

app/Filament/Resources/ChannelResource/Pages/ListChannels.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@
1111

1212
final class ListChannels extends ListRecords
1313
{
14+
use ListRecords\Concerns\Translatable;
15+
1416
protected static string $resource = ChannelResource::class;
1517

1618
protected function getHeaderActions(): array
1719
{
1820
return [
21+
Actions\LocaleSwitcher::make(),
1922
Actions\CreateAction::make()
2023
->slideOver()
2124
->modalWidth(MaxWidth::Large),

0 commit comments

Comments
 (0)