Skip to content

Commit 8d7de5a

Browse files
authored
Merge pull request #16 from TappNetwork/stats
Add stat widgets
2 parents 98c487c + 9f364cd commit 8d7de5a

6 files changed

Lines changed: 149 additions & 0 deletions

File tree

src/Filament/Resources/Admin/ForumPostResource.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Tapp\FilamentForum\Filament\Resources\Admin\ForumPostResource\Schemas\ForumPostForm;
1414
use Tapp\FilamentForum\Filament\Resources\Admin\ForumPostResource\Schemas\ForumPostInfolist;
1515
use Tapp\FilamentForum\Filament\Resources\Admin\ForumPostResource\Tables\ForumPostsTable;
16+
use Tapp\FilamentForum\Filament\Resources\Admin\ForumPostResource\Widgets\ForumPostStats;
1617
use Tapp\FilamentForum\Models\ForumPost;
1718

1819
class ForumPostResource extends Resource
@@ -72,6 +73,13 @@ public static function getRelations(): array
7273
];
7374
}
7475

76+
public static function getWidgets(): array
77+
{
78+
return [
79+
ForumPostStats::class,
80+
];
81+
}
82+
7583
public static function getPages(): array
7684
{
7785
return [

src/Filament/Resources/Admin/ForumPostResource/Pages/ListForumPosts.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
namespace Tapp\FilamentForum\Filament\Resources\Admin\ForumPostResource\Pages;
44

55
use Filament\Actions\CreateAction;
6+
use Filament\Pages\Concerns\ExposesTableToWidgets;
67
use Filament\Resources\Pages\ListRecords;
78
use Tapp\FilamentForum\Filament\Resources\Admin\ForumPostResource;
9+
use Tapp\FilamentForum\Filament\Resources\Admin\ForumPostResource\Widgets\ForumPostStats;
810

911
class ListForumPosts extends ListRecords
1012
{
13+
use ExposesTableToWidgets;
14+
1115
protected static string $resource = ForumPostResource::class;
1216

1317
protected function getHeaderActions(): array
@@ -16,4 +20,11 @@ protected function getHeaderActions(): array
1620
CreateAction::make(),
1721
];
1822
}
23+
24+
protected function getHeaderWidgets(): array
25+
{
26+
return [
27+
ForumPostStats::class,
28+
];
29+
}
1930
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace Tapp\FilamentForum\Filament\Resources\Admin\ForumPostResource\Widgets;
4+
5+
use Filament\Widgets\Concerns\InteractsWithPageTable;
6+
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
7+
use Filament\Widgets\StatsOverviewWidget\Stat;
8+
use Illuminate\Support\Facades\DB;
9+
use Tapp\FilamentForum\Filament\Resources\Admin\ForumPostResource\Pages\ListForumPosts;
10+
use Tapp\FilamentForum\Models\ForumComment;
11+
12+
class ForumPostStats extends BaseWidget
13+
{
14+
use InteractsWithPageTable;
15+
16+
protected static bool $isLazy = false;
17+
18+
protected ?string $pollingInterval = null;
19+
20+
protected function getTablePage(): string
21+
{
22+
return ListForumPosts::class;
23+
}
24+
25+
protected function getStats(): array
26+
{
27+
$query = $this->getPageTableQuery();
28+
29+
$postIds = (clone $query)->pluck('forum_posts.id');
30+
31+
$totalPosts = (clone $query)->count();
32+
33+
$totalFavorited = DB::table('favorite_forum_post')
34+
->whereIn('forum_post_id', $postIds)
35+
->distinct('forum_post_id')
36+
->count('forum_post_id');
37+
38+
$totalComments = ForumComment::query()
39+
->whereIn('forum_post_id', $postIds)
40+
->count();
41+
42+
return [
43+
Stat::make(__('Posts'), number_format($totalPosts))
44+
->description(__('Total forum posts'))
45+
->descriptionIcon('heroicon-m-chat-bubble-left-right')
46+
->color('primary'),
47+
Stat::make(__('Favorited'), number_format($totalFavorited))
48+
->description(__('Posts with favorites'))
49+
->descriptionIcon('heroicon-m-heart')
50+
->color('danger'),
51+
Stat::make(__('Comments'), number_format($totalComments))
52+
->description(__('Total comments'))
53+
->descriptionIcon('heroicon-m-chat-bubble-bottom-center-text')
54+
->color('success'),
55+
];
56+
}
57+
}

src/Filament/Resources/Admin/ForumResource.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Tapp\FilamentForum\Filament\Resources\Admin\ForumResource\Pages\ListForums;
1212
use Tapp\FilamentForum\Filament\Resources\Admin\ForumResource\Schemas\ForumForm;
1313
use Tapp\FilamentForum\Filament\Resources\Admin\ForumResource\Tables\ForumsTable;
14+
use Tapp\FilamentForum\Filament\Resources\Admin\ForumResource\Widgets\ForumStats;
1415
use Tapp\FilamentForum\Models\Forum;
1516
use Tapp\FilamentForum\RelationManagers\ForumUsersRelationManager;
1617

@@ -66,6 +67,13 @@ public static function getRelations(): array
6667
];
6768
}
6869

70+
public static function getWidgets(): array
71+
{
72+
return [
73+
ForumStats::class,
74+
];
75+
}
76+
6977
public static function getPages(): array
7078
{
7179
return [

src/Filament/Resources/Admin/ForumResource/Pages/ListForums.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
namespace Tapp\FilamentForum\Filament\Resources\Admin\ForumResource\Pages;
44

55
use Filament\Actions\CreateAction;
6+
use Filament\Pages\Concerns\ExposesTableToWidgets;
67
use Filament\Resources\Pages\ListRecords;
78
use Tapp\FilamentForum\Filament\Resources\Admin\ForumResource;
9+
use Tapp\FilamentForum\Filament\Resources\Admin\ForumResource\Widgets\ForumStats;
810

911
class ListForums extends ListRecords
1012
{
13+
use ExposesTableToWidgets;
14+
1115
protected static string $resource = ForumResource::class;
1216

1317
protected function getHeaderActions(): array
@@ -16,4 +20,11 @@ protected function getHeaderActions(): array
1620
CreateAction::make(),
1721
];
1822
}
23+
24+
protected function getHeaderWidgets(): array
25+
{
26+
return [
27+
ForumStats::class,
28+
];
29+
}
1930
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
namespace Tapp\FilamentForum\Filament\Resources\Admin\ForumResource\Widgets;
4+
5+
use Filament\Widgets\Concerns\InteractsWithPageTable;
6+
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
7+
use Filament\Widgets\StatsOverviewWidget\Stat;
8+
use Illuminate\Support\Facades\DB;
9+
use Tapp\FilamentForum\Filament\Resources\Admin\ForumResource\Pages\ListForums;
10+
11+
class ForumStats extends BaseWidget
12+
{
13+
use InteractsWithPageTable;
14+
15+
protected static bool $isLazy = false;
16+
17+
protected ?string $pollingInterval = null;
18+
19+
protected function getTablePage(): string
20+
{
21+
return ListForums::class;
22+
}
23+
24+
protected function getStats(): array
25+
{
26+
$query = $this->getPageTableQuery();
27+
28+
$forumIds = (clone $query)->pluck('forums.id');
29+
30+
$totalForums = (clone $query)->count();
31+
32+
$totalMembers = DB::table('forum_user')
33+
->whereIn('forum_id', $forumIds)
34+
->distinct('user_id')
35+
->count('user_id');
36+
37+
$hiddenForums = (clone $query)->where('is_hidden', true)->count();
38+
39+
return [
40+
Stat::make(__('Forums'), number_format($totalForums))
41+
->description(__('Total discussion boards'))
42+
->descriptionIcon('heroicon-m-rectangle-stack')
43+
->color('primary'),
44+
Stat::make(__('Members'), number_format($totalMembers))
45+
->description(__('Unique members assigned'))
46+
->descriptionIcon('heroicon-m-user-group')
47+
->color('success'),
48+
Stat::make(__('Hidden'), number_format($hiddenForums))
49+
->description(__('Private forums'))
50+
->descriptionIcon('heroicon-m-eye-slash')
51+
->color('warning'),
52+
];
53+
}
54+
}

0 commit comments

Comments
 (0)