From 8162af842f21ab707e37ec46fefd232261ca06e6 Mon Sep 17 00:00:00 2001 From: SEB Fotografie - soeren Date: Tue, 9 Sep 2025 21:22:07 +0200 Subject: [PATCH] feat: Enhance Filament Widgets --- app/Filament/Widgets/EventsActiveToday.php | 27 ++++++++++---------- app/Filament/Widgets/RecentPhotosTable.php | 23 +++++++++-------- app/Filament/Widgets/TopTenantsByUploads.php | 23 ++++++++--------- 3 files changed, 36 insertions(+), 37 deletions(-) diff --git a/app/Filament/Widgets/EventsActiveToday.php b/app/Filament/Widgets/EventsActiveToday.php index d83546f..fa41140 100644 --- a/app/Filament/Widgets/EventsActiveToday.php +++ b/app/Filament/Widgets/EventsActiveToday.php @@ -4,8 +4,8 @@ namespace App\Filament\Widgets; use Filament\Tables; use Filament\Widgets\TableWidget as BaseWidget; -use Illuminate\Support\Facades\DB; use Illuminate\Support\Carbon; +use App\Models\Event; class EventsActiveToday extends BaseWidget { @@ -15,20 +15,19 @@ class EventsActiveToday extends BaseWidget public function table(Tables\Table $table): Tables\Table { $today = Carbon::today()->toDateString(); - $query = DB::table('events as e') - ->leftJoin('photos as p', function ($join) use ($today) { - $join->on('p.event_id', '=', 'e.id') - ->whereRaw("date(p.created_at) = ?", [$today]); - }) - ->where('e.is_active', 1) - ->whereDate('e.date', '<=', $today) - ->selectRaw('e.id, e.slug, e.name, e.date, COUNT(p.id) as uploads_today') - ->groupBy('e.id', 'e.slug', 'e.name', 'e.date') - ->orderBy('e.date', 'desc') - ->limit(10); - return $table - ->query($query) + ->query( + Event::query() + ->where('is_active', true) + ->whereDate('date', '<=', $today) + ->withCount([ + 'photos as uploads_today' => function ($q) use ($today) { + $q->whereDate('created_at', $today); + }, + ]) + ->orderByDesc('date') + ->limit(10) + ) ->columns([ Tables\Columns\TextColumn::make('id')->label('#')->width('60px'), Tables\Columns\TextColumn::make('slug')->label('Slug')->searchable(), diff --git a/app/Filament/Widgets/RecentPhotosTable.php b/app/Filament/Widgets/RecentPhotosTable.php index 85d3b5f..1024649 100644 --- a/app/Filament/Widgets/RecentPhotosTable.php +++ b/app/Filament/Widgets/RecentPhotosTable.php @@ -4,7 +4,8 @@ namespace App\Filament\Widgets; use Filament\Tables; use Filament\Widgets\TableWidget as BaseWidget; -use Illuminate\Support\Facades\DB; +use App\Models\Photo; +use Filament\Actions; class RecentPhotosTable extends BaseWidget { @@ -13,10 +14,12 @@ class RecentPhotosTable extends BaseWidget public function table(Tables\Table $table): Tables\Table { - $query = DB::table('photos')->orderByDesc('created_at')->limit(10); - return $table - ->query($query) + ->query( + Photo::query() + ->orderByDesc('created_at') + ->limit(10) + ) ->columns([ Tables\Columns\ImageColumn::make('thumbnail_path')->label('Thumb')->circular(), Tables\Columns\TextColumn::make('id')->label('#'), @@ -25,14 +28,14 @@ class RecentPhotosTable extends BaseWidget Tables\Columns\TextColumn::make('created_at')->since(), ]) ->actions([ - Tables\Actions\Action::make('feature') + Actions\Action::make('feature') ->label('Feature') - ->visible(fn($record) => ! (bool)($record->is_featured ?? 0)) - ->action(fn($record) => DB::table('photos')->where('id', $record->id)->update(['is_featured' => 1, 'updated_at' => now()])), - Tables\Actions\Action::make('unfeature') + ->visible(fn(Photo $record) => ! (bool)($record->is_featured ?? 0)) + ->action(fn(Photo $record) => $record->update(['is_featured' => 1])), + Actions\Action::make('unfeature') ->label('Unfeature') - ->visible(fn($record) => (bool)($record->is_featured ?? 0)) - ->action(fn($record) => DB::table('photos')->where('id', $record->id)->update(['is_featured' => 0, 'updated_at' => now()])), + ->visible(fn(Photo $record) => (bool)($record->is_featured ?? 0)) + ->action(fn(Photo $record) => $record->update(['is_featured' => 0])), ]) ->paginated(false); } diff --git a/app/Filament/Widgets/TopTenantsByUploads.php b/app/Filament/Widgets/TopTenantsByUploads.php index 48ebddf..cf2a0ab 100644 --- a/app/Filament/Widgets/TopTenantsByUploads.php +++ b/app/Filament/Widgets/TopTenantsByUploads.php @@ -4,7 +4,7 @@ namespace App\Filament\Widgets; use Filament\Tables; use Filament\Widgets\TableWidget as BaseWidget; -use Illuminate\Support\Facades\DB; +use App\Models\Tenant; class TopTenantsByUploads extends BaseWidget { @@ -13,20 +13,17 @@ class TopTenantsByUploads extends BaseWidget public function table(Tables\Table $table): Tables\Table { - $query = DB::table('photos as p') - ->join('events as e', 'e.id', '=', 'p.event_id') - ->join('tenants as t', 't.id', '=', 'e.tenant_id') - ->selectRaw('t.id as tenant_id, t.name as tenant_name, COUNT(p.id) as uploads') - ->groupBy('t.id', 't.name') - ->orderByDesc('uploads') - ->limit(5); - return $table - ->query($query) + ->query( + Tenant::query() + ->withCount('photos') + ->orderByDesc('photos_count') + ->limit(5) + ) ->columns([ - Tables\Columns\TextColumn::make('tenant_id')->label('#')->width('60px'), - Tables\Columns\TextColumn::make('tenant_name')->label('Tenant')->searchable(), - Tables\Columns\TextColumn::make('uploads')->label('Uploads')->numeric(), + Tables\Columns\TextColumn::make('id')->label('#')->width('60px'), + Tables\Columns\TextColumn::make('name')->label('Tenant')->searchable(), + Tables\Columns\TextColumn::make('photos_count')->label('Uploads')->numeric(), ]) ->paginated(false); }