Skip to content

Commit 00f083d

Browse files
committed
add publish & schedule actions
1 parent 007090b commit 00f083d

File tree

5 files changed

+97
-12
lines changed

5 files changed

+97
-12
lines changed

app/Filament/Resources/ArticleResource.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@
22

33
namespace App\Filament\Resources;
44

5+
use App\Filament\Resources\ArticleResource\Actions\PublishAction;
6+
use App\Filament\Resources\ArticleResource\Actions\ScheduleAction;
57
use App\Filament\Resources\ArticleResource\Pages;
68
use App\Models\Article;
7-
use Filament\Forms\Components\DateTimePicker;
89
use Filament\Forms\Components\MarkdownEditor;
910
use Filament\Forms\Components\Textarea;
1011
use Filament\Forms\Components\TextInput;
1112
use Filament\Forms\Form;
1213
use Filament\Forms\Set;
1314
use Filament\Resources\Resource;
1415
use Filament\Tables;
16+
use Filament\Tables\Actions\ActionGroup;
1517
use Filament\Tables\Columns\TextColumn;
1618
use Filament\Tables\Table;
1719
use Illuminate\Support\Str;
@@ -41,14 +43,6 @@ public static function form(Form $form): Form
4143
->unique(Article::class, 'slug', ignoreRecord: true)
4244
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state))),
4345

44-
DateTimePicker::make('published_at')
45-
->label('Published At')
46-
->displayFormat('M j, Y H:i')
47-
->seconds(false)
48-
->dehydrated()
49-
->reactive()
50-
->default(now()),
51-
5246
Textarea::make('excerpt')
5347
->required()
5448
->maxLength(400)
@@ -76,6 +70,7 @@ public static function table(Table $table): Table
7670
->label('Author')
7771
->searchable()
7872
->sortable(),
73+
7974
TextColumn::make('published_at')
8075
->dateTime('M j, Y H:i')
8176
->sortable()
@@ -86,8 +81,11 @@ public static function table(Table $table): Table
8681
//
8782
])
8883
->actions([
89-
Tables\Actions\EditAction::make()
90-
->url(fn ($record) => static::getUrl('edit', ['record' => $record->id])),
84+
ActionGroup::make([
85+
Tables\Actions\EditAction::make()->url(fn ($record) => static::getUrl('edit', ['record' => $record->id])),
86+
PublishAction::make('publish'),
87+
ScheduleAction::make('schedule'),
88+
]),
9189
])
9290
->bulkActions([
9391
Tables\Actions\BulkActionGroup::make([
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\Actions;
4+
5+
use App\Models\Article;
6+
use Filament\Tables\Actions\Action;
7+
8+
class PublishAction extends Action
9+
{
10+
protected function setUp(): void
11+
{
12+
$this
13+
->label('Publish')
14+
->icon('heroicon-o-newspaper')
15+
->action(fn (Article $article) => $article->publish())
16+
->visible(fn (Article $article) => ! $article->isPublished())
17+
->requiresConfirmation();
18+
}
19+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\ArticleResource\Actions;
4+
5+
use App\Models\Article;
6+
use Filament\Forms\Components\DateTimePicker;
7+
use Filament\Tables\Actions\Action;
8+
use Illuminate\Support\Carbon;
9+
10+
class ScheduleAction extends Action
11+
{
12+
protected function setUp(): void
13+
{
14+
$this
15+
->label('Schedule')
16+
->icon('heroicon-o-calendar-days')
17+
->visible(fn (Article $record) => ! $record->isPublished())
18+
->form(fn (Article $article) => [
19+
DateTimePicker::make('published_at')
20+
->label('Published At')
21+
->displayFormat('M j, Y H:i')
22+
->seconds(false)
23+
->default($article->published_at)
24+
->required(),
25+
])
26+
->action(function (Article $article, array $data) {
27+
$article->publish(Carbon::parse($data['published_at']));
28+
})
29+
->requiresConfirmation();
30+
}
31+
}

app/Http/Controllers/ShowBlogController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public function index()
1919

2020
public function show(Article $article)
2121
{
22-
abort_if($article->published_at->isFuture(), 404);
22+
abort_if(! $article->isPublished(), 404);
2323

2424
return view('article', [
2525
'article' => $article,

app/Models/Article.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Models;
44

5+
use DateTime;
56
use Illuminate\Contracts\Database\Eloquent\Builder;
67
use Illuminate\Database\Eloquent\Factories\HasFactory;
78
use Illuminate\Database\Eloquent\Model;
@@ -28,6 +29,11 @@ public function getRouteKeyName()
2829
return 'slug';
2930
}
3031

32+
/*
33+
|--------------------------------------------------------------------------
34+
| Scopes
35+
|--------------------------------------------------------------------------
36+
*/
3137
public function scopePublished(Builder $query): void
3238
{
3339
$query
@@ -36,11 +42,42 @@ public function scopePublished(Builder $query): void
3642
->where('published_at', '<=', now());
3743
}
3844

45+
/*
46+
|--------------------------------------------------------------------------
47+
| Relationships
48+
|--------------------------------------------------------------------------
49+
*/
3950
public function author(): BelongsTo
4051
{
4152
return $this->belongsTo(User::class, 'author_id');
4253
}
4354

55+
/*
56+
|--------------------------------------------------------------------------
57+
| Support
58+
|--------------------------------------------------------------------------
59+
*/
60+
public function isPublished(): bool
61+
{
62+
return $this->published_at && $this->published_at->isPast();
63+
}
64+
65+
public function publish(?DateTime $on = null)
66+
{
67+
if (! $on) {
68+
$on = now();
69+
}
70+
71+
$this->update([
72+
'published_at' => $on,
73+
]);
74+
}
75+
76+
/*
77+
|--------------------------------------------------------------------------
78+
| Listeners
79+
|--------------------------------------------------------------------------
80+
*/
4481
protected static function boot()
4582
{
4683
parent::boot();

0 commit comments

Comments
 (0)