diff --git a/Modules/Administration/Http/Controllers/DashboardController.php b/Modules/Administration/Http/Controllers/DashboardController.php index 2a9765e..89b4e5d 100644 --- a/Modules/Administration/Http/Controllers/DashboardController.php +++ b/Modules/Administration/Http/Controllers/DashboardController.php @@ -4,6 +4,8 @@ namespace Modules\Administration\Http\Controllers; use App\Http\Controllers\Controller; use App\Models\User; +use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Pagination\Paginator; use Illuminate\Support\Facades\Schema; use Modules\Audit\Models\AuditLog; use Modules\Media\Models\Media; @@ -18,21 +20,63 @@ final class DashboardController extends Controller 'roleCount' => Schema::hasTable('roles') ? Role::count() : 0, 'mediaCount' => Schema::hasTable('media') ? Media::count() : 0, 'auditCount' => Schema::hasTable('audit_logs') ? AuditLog::count() : 0, - 'recentAudit' => Schema::hasTable('audit_logs') ? AuditLog::query()->latest('created_at')->limit(8)->get() : collect(), + 'recentAudit' => $this->recentAudit(), 'modules' => $this->modules(), ]); } - private function modules(): array + private function recentAudit(): LengthAwarePaginator + { + if (! Schema::hasTable('audit_logs')) { + return new LengthAwarePaginator( + items: [], + total: 0, + perPage: 8, + currentPage: Paginator::resolveCurrentPage('audit_page'), + options: [ + 'path' => request()->url(), + 'pageName' => 'audit_page', + ], + ); + } + + return AuditLog::query() + ->latest('created_at') + ->paginate(8, ['*'], 'audit_page') + ->withQueryString(); + } + + private function modules(): LengthAwarePaginator { $statuses = json_decode((string) file_get_contents(base_path('modules_statuses.json')), true) ?: []; $modules = []; + foreach (glob(base_path('Modules/*/module.json')) ?: [] as $manifest) { $data = json_decode((string) file_get_contents($manifest), true) ?: []; $name = $data['name'] ?? basename(dirname($manifest)); - $modules[] = ['name' => $name, 'version' => $data['version'] ?? '1.0.0', 'enabled' => (bool) ($statuses[$name] ?? false)]; + + $modules[] = [ + 'name' => $name, + 'version' => $data['version'] ?? '1.0.0', + 'enabled' => (bool) ($statuses[$name] ?? false), + ]; } - usort($modules, fn ($a, $b) => strcasecmp($a['name'], $b['name'])); - return $modules; + + usort($modules, fn (array $a, array $b): int => strcasecmp($a['name'], $b['name'])); + + $pageName = 'modules_page'; + $perPage = 8; + $currentPage = Paginator::resolveCurrentPage($pageName); + + return (new LengthAwarePaginator( + items: array_slice($modules, ($currentPage - 1) * $perPage, $perPage), + total: count($modules), + perPage: $perPage, + currentPage: $currentPage, + options: [ + 'path' => request()->url(), + 'pageName' => $pageName, + ], + ))->withQueryString(); } } diff --git a/resources/themes/admin/views/dashboard.blade.php b/resources/themes/admin/views/dashboard.blade.php index 5ccf417..330ff77 100644 --- a/resources/themes/admin/views/dashboard.blade.php +++ b/resources/themes/admin/views/dashboard.blade.php @@ -1,60 +1,76 @@ -
-
-

Dashboard

-

Platform health and recent activity.

-
+
+ -
- @foreach([ - ['Users', $userCount, 'users'], - ['Roles', $roleCount, 'shield-check'], - ['Media', $mediaCount, 'photo'], - ['Audit events', $auditCount, 'clipboard-document-list'], - ] as [$label, $count, $icon]) -
- -
{{ $count }}
-
{{ $label }}
-
- @endforeach -
+
+
+

Dashboard

+

Platform health and recent activity.

+
-
-
-
- Modules -
-
- @foreach($modules as $module) -
-
-
{{ $module['name'] }}
-
v{{ $module['version'] }}
+
+ @foreach([ + ['Users', $userCount, 'users'], + ['Roles', $roleCount, 'shield-check'], + ['Media', $mediaCount, 'photo'], + ['Audit events', $auditCount, 'clipboard-document-list'], + ] as [$label, $count, $icon]) +
+ +
{{ $count }}
+
{{ $label }}
+
+ @endforeach +
+ +
+
+
+ Modules +
+
+ @forelse($modules as $module) +
+
+
{{ $module['name'] }}
+
v{{ $module['version'] }}
+
+ + {{ $module['enabled'] ? 'Enabled' : 'Disabled' }} +
- - {{ $module['enabled'] ? 'Enabled' : 'Disabled' }} - + @empty +
No modules found.
+ @endforelse +
+ @if($modules->hasPages()) +
+ {{ $modules->onEachSide(1)->links() }}
- @endforeach -
-
+ @endif + -
-
- Recent audit activity -
-
- @forelse($recentAudit as $log) -
-
{{ $log->event }}
-
{{ optional($log->created_at)->diffForHumans() }}
+
+
+ Recent audit activity +
+
+ @forelse($recentAudit as $log) +
+
{{ $log->event }}
+
{{ optional($log->created_at)->diffForHumans() }}
+
+ @empty +
No audit events yet.
+ @endforelse +
+ @if($recentAudit->hasPages()) +
+ {{ $recentAudit->onEachSide(1)->links() }}
- @empty -
No audit events yet.
- @endforelse -
-
+ @endif + +
diff --git a/resources/themes/common/views/components/layouts/app/sidebar.blade.php b/resources/themes/common/views/components/layouts/app/sidebar.blade.php index 1643215..364dd92 100644 --- a/resources/themes/common/views/components/layouts/app/sidebar.blade.php +++ b/resources/themes/common/views/components/layouts/app/sidebar.blade.php @@ -3,49 +3,123 @@ @include('stylist-theme-common::partials.head') - - - -{{ __('Security Centre') }} - - -{{ __('Commerce') }} -{{ __('CRM') }} -{{ __('Newsletter') }} -{{ __('Events') }} -{{ __('Careers') }} -{{ __('Locations') }} - - -{{ __('Blog') }} -{{ __('News') }} -{{ __('Categories') }} -{{ __('Tags') }} -{{ __('Authors') }} -{{ __('Comments') }} - - -{{ __('Pages') }} -{{ __('Menus') }} -{{ __('Redirects') }} -{{ __('Forms') }} -{{ __('Documents') }} -{{ __('Banners') }} -{{ __('FAQ') }} -{{ __('Team') }} -{{ __('Testimonials') }} - -{{ __('Enterprise Services') }}{{ __('Sites') }}{{ __('Dashboard') }} -{{ __('API & Webhooks') }}{{ __('Developer Tools') }} -{{ __('AI Platform') }} -{{ __('Automation') }} -{{ __('Review Queue') }} -{{ __('Users') }}{{ __('Roles & Permissions') }}{{ __('Media') }}{{ __('Search') }} -{{ __('Localisation') }}{{ __('SEO') }}{{ __('Settings') }}{{ __('Modules') }}{{ __('Audit Log') }} -{{ __('Cloud & DevOps') }} - -
{{ auth()->user()->name }}{{ auth()->user()->email }}
{{ __('Settings') }}
@csrf{{ __('Log out') }}
+ + + + + + + + {{ __('Dashboard') }} + {{ __('Enterprise Services') }} + {{ __('Sites') }} + + + + {{ __('Blog') }} + {{ __('News') }} + {{ __('Categories') }} + {{ __('Tags') }} + {{ __('Authors') }} + {{ __('Comments') }} + + + + {{ __('Pages') }} + {{ __('Menus') }} + {{ __('Redirects') }} + {{ __('Forms') }} + {{ __('Documents') }} + {{ __('Banners') }} + {{ __('FAQ') }} + {{ __('Team') }} + {{ __('Testimonials') }} + + + + {{ __('Commerce') }} + {{ __('CRM') }} + {{ __('Newsletter') }} + {{ __('Events') }} + {{ __('Careers') }} + {{ __('Locations') }} + + + + {{ __('Users') }} + {{ __('Roles & Permissions') }} + {{ __('Media') }} + {{ __('Search') }} + + + + {{ __('Review Queue') }} + {{ __('Automation') }} + {{ __('AI Platform') }} + + + + {{ __('Security Centre') }} + + + + {{ __('API & Webhooks') }} + {{ __('Developer Tools') }} + + + + {{ __('Localisation') }} + {{ __('SEO') }} + {{ __('Settings') }} + {{ __('Modules') }} + {{ __('Audit Log') }} + + + + {{ __('Cloud & DevOps') }} + + + + +