Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 43 additions & 22 deletions app/Filament/Resources/PostResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,18 @@
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables\Actions\BulkActionGroup;
use Filament\Tables\Actions\DeleteBulkAction;
use Filament\Tables\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Table;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\SelectFilter;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Validation\Rules\Unique;

final class PostResource extends Resource
{
Expand All @@ -37,53 +41,70 @@ public static function form(Form $form): Form
->maxLength(self::INPUT_MAX_LENGTH),
TextInput::make('slug')
->required()
->maxLength(self::INPUT_MAX_LENGTH),
TextInput::make('legacy_id')
->numeric(),
->maxLength(self::INPUT_MAX_LENGTH)
->unique(Post::class, 'slug', ignoreRecord: true, modifyRuleUsing: fn(Unique $rule) => $rule->where('is_published', true)),
Textarea::make('body')
->required()
->columnSpanFull(),
Textarea::make('more_inside')
->columnSpanFull(),
TextInput::make('state')
->required()
->maxLength(self::INPUT_MAX_LENGTH),
Select::make('subsite_id')
->relationship('subsite', 'name')
->required(),
Select::make('user_id')
->relationship('user', 'name')
->searchable()
->preload()
->required(),
TextInput::make('uuid')
->label('UUID')
->maxLength(36),
DateTimePicker::make('published_at'),
Toggle::make('is_published')
->required(),
Toggle::make('is_current')
->required(),
TextInput::make('publisher_type')
->maxLength(self::INPUT_MAX_LENGTH),
TextInput::make('publisher_id')
->numeric(),
]);
}

public static function getEloquentQuery(): Builder
{
return Post::current();
}

public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('title')
->searchable(),
->searchable()
->sortable()
->limit(50),
TextColumn::make('slug')
->searchable()
->toggleable(isToggledHiddenByDefault: true),
IconColumn::make('is_published')
->boolean()
->label('Published')
->sortable(),
TextColumn::make('subsite.name')
->numeric()
->label('Subsite')
->sortable(),
TextColumn::make('user.name')
->numeric()
->label('Author')
->searchable()
->sortable(),
TextColumn::make('published_at')
->dateTime()
->sortable()
->toggleable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
Filter::make('hide_drafts')
->label('Hide drafts')
->baseQuery(fn(Builder $query): Builder => $query->withoutDrafts())
->default(false),
SelectFilter::make('subsite_id')
->relationship('subsite', 'name')
->searchable()
->preload(),
])
->actions([
EditAction::make(),
Expand Down
23 changes: 23 additions & 0 deletions app/Filament/Resources/PostResource/Pages/EditPost.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
namespace App\Filament\Resources\PostResource\Pages;

use App\Filament\Resources\PostResource;
use App\Models\Post;
use Filament\Actions\Action;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;

Expand All @@ -16,6 +18,27 @@ protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
Action::make('publish')
->label('Publish')
->visible(fn(Post $record) => $record->is_published === false)
->action(function (Post $record) {
$record->setLive();
$record->save();
})
->after(function () {
$this->refreshFormData(['is_published', 'published_at']);
}),
Action::make('unpublish')
->label('Unpublish')
->visible(fn(Post $record) => $record->is_published === true)
->action(function (Post $record) {
$record->is_published = false;
$record->save();
})
->after(function () {
$this->refreshFormData(['is_published', 'published_at']);
}),

];
}
}
11 changes: 10 additions & 1 deletion app/Filament/Resources/SnippetResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
use App\Filament\Resources\SnippetsResource\Pages\ListSnippets;
use App\Models\Snippet;
use Filament\Forms\Form;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Tables\Actions\BulkActionGroup;
use Filament\Tables\Actions\DeleteBulkAction;
Expand All @@ -21,11 +23,18 @@ final class SnippetResource extends Resource
protected static ?string $model = Snippet::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';

public const int INPUT_MAX_LENGTH = 255;

public static function form(Form $form): Form
{
return $form
->schema([
//
TextInput::make('title')
->required()
->maxLength(self::INPUT_MAX_LENGTH),
RichEditor::make('body')
->required()
->columnSpanFull(),
]);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

use App\Filament\Resources\SnippetResource;
use Filament\Resources\Pages\EditRecord;
use Filament\Tables\Actions\DeleteAction;
use Filament\Actions\DeleteAction;

final class EditSnippets extends EditRecord
{
Expand Down
2 changes: 0 additions & 2 deletions app/Livewire/Contact/ContactMessageForm.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
<?php

declare(strict_types=1);

namespace App\Livewire\Contact;
Expand Down
6 changes: 3 additions & 3 deletions app/Models/Comment.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,17 +85,17 @@ public function scopeSearch(Builder $query, string $keyword): Builder

// Relationships

public function bookmarks(): int
public function bookmarkCount(): int
{
return Bookmark::count($this);
}

public function favorites(): int
public function favoriteCount(): int
{
return Favorite::count($this);
}

public function flags(): int
public function flagCount(): int
{
return Flag::count($this);
}
Expand Down
16 changes: 12 additions & 4 deletions app/Models/Post.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace App\Models;

use App\Enums\PostStateEnum;
use App\Presenters\PostPresenter;
use Coderflex\LaravelPresenter\Concerns\CanPresent;
use Coderflex\LaravelPresenter\Concerns\UsesPresenters;
Expand Down Expand Up @@ -71,7 +72,10 @@ final class Post extends BaseModel implements CanPresent, HasMedia
'user_id',
'published_at',
'is_published',
'state',
'slug',
'is_current',
'publisher_type',
'publisher_id',
];

protected static array $marks = [
Expand All @@ -84,6 +88,10 @@ final class Post extends BaseModel implements CanPresent, HasMedia
'default' => PostPresenter::class,
];

protected $attributes = [
'state' => PostStateEnum::Draft->value,
];

public function toSearchableArray(): array
{
return array_merge($this->toArray(), [
Expand Down Expand Up @@ -135,17 +143,17 @@ public function comments(): HasMany
return $this->hasMany(Comment::class);
}

public function bookmarks(): int
public function bookmarkCount(): int
{
return Bookmark::count($this);
}

public function favorites(): int
public function favoriteCount(): int
{
return Favorite::count($this);
}

public function flags(): int
public function flagCount(): int
{
return Flag::count($this);
}
Expand Down
5 changes: 3 additions & 2 deletions app/Policies/PostPolicy.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace App\Policies;

use App\Enums\RoleNameEnum;
use App\Models\User;
use App\Models\Post;
use Illuminate\Auth\Access\HandlesAuthorization;
Expand All @@ -19,7 +20,7 @@ public function viewAny(): bool

public function view(User $user, Post $post): bool
{
if ($user->hasRole(['admin']) || $post->user_id === $user->id) {
if ($user->hasRole([RoleNameEnum::MODERATOR->value]) || $post->user_id === $user->id) {
return true;
}

Expand All @@ -34,7 +35,7 @@ public function create(User $user): bool

public function update(User $user, Post $post): bool
{
if ($user->hasRole(['admin']) || $post->user_id === $user->id) {
if ($user->hasRole([RoleNameEnum::MODERATOR->value]) || $post->user_id === $user->id) {
return true;
}

Expand Down
3 changes: 3 additions & 0 deletions app/Providers/AppServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ public function boot(): void
Model::shouldBeStrict();

Relation::morphMap([
'admin_notes' => 'App\Models\AdminNote',
'comments' => 'App\Models\Comment',
'posts' => 'App\Models\Post',
'snippets' => 'App\Models\Snippet',
'users' => 'App\Models\User',
]);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
// Drop the existing unique constraint on slug
$table->dropUnique(['slug']);
});

// Uses IF(is_published = 1, 1, NULL) so only published records enforce uniqueness.
DB::statement('CREATE UNIQUE INDEX posts_slug_published_unique ON posts (slug, (IF(is_published = 1, 1, NULL)))');
}

public function down(): void
{
// Drop the functional unique index
DB::statement('DROP INDEX posts_slug_published_unique ON posts');

Schema::table('posts', function (Blueprint $table) {
// Restore the original unique constraint
$table->unique('slug');
});
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

@include('comments.partials.comment-footer', [
'comment' => $comment,
'favoritesCount' => $comment->favorites()->count(),
'flagsCount' => $comment->flags()->count(),
'favoritesCount' => $comment->favoriteCount(),
'flagsCount' => $comment->flagCount(),
'flagReasons' => $flagReasons,
])
</article>
Expand Down
2 changes: 1 addition & 1 deletion resources/views/posts/show.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
@include('posts.partials.post-show-footer', [
'post' => $post,
'commentsCount' => $post->comments()->count(),
'favoritesCount' => $post->favorites(),
'favoritesCount' => $post->favoriteCount(),
])
</article>

Expand Down