From 98d30a80e6008406854198686812898df9c744da Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 29 Jan 2026 15:05:26 +0700 Subject: [PATCH] feat: Implement granular access control and permissions for Filament widgets, pages, and data change requests using Filament Shield and a new policy. --- app/Filament/Pages/Dashboard.php | 7 +- .../Widgets/CooperationStatusChart.php | 4 +- app/Filament/Widgets/IssueLocationChart.php | 4 +- .../Widgets/JournalistMetricsStats.php | 4 +- .../Widgets/JournalistRegistrationChart.php | 4 +- app/Filament/Widgets/JournalistUkwChart.php | 4 +- .../Widgets/MediaClassificationChart.php | 4 +- .../Widgets/MediaCooperationRankingChart.php | 4 +- .../Widgets/MediaRegistrationChart.php | 4 +- app/Filament/Widgets/MediaTypeChart.php | 4 +- app/Filament/Widgets/OverviewStats.php | 4 +- app/Filament/Widgets/PopularNewsChart.php | 4 +- app/Filament/Widgets/TaskRealizationChart.php | 4 +- .../Widgets/TopMediaJournalistChart.php | 4 +- .../Widgets/VerificationPerformanceChart.php | 4 +- app/Filament/Widgets/VisitorTrafficChart.php | 4 +- app/Models/User.php | 2 +- app/Policies/DataChangeRequestPolicy.php | 69 ++ .../Filament/DashboardPanelProvider.php | 5 +- database/seeders/ShieldSeeder.php | 886 ++++++++++++------ 20 files changed, 700 insertions(+), 329 deletions(-) create mode 100644 app/Policies/DataChangeRequestPolicy.php diff --git a/app/Filament/Pages/Dashboard.php b/app/Filament/Pages/Dashboard.php index 4a8ea26..e7ce723 100644 --- a/app/Filament/Pages/Dashboard.php +++ b/app/Filament/Pages/Dashboard.php @@ -2,6 +2,8 @@ namespace App\Filament\Pages; +use App\Enums\RoleEnum; +use BezhanSalleh\FilamentShield\Traits\HasPageShield; use Filament\Actions\Action; use Filament\Forms\Components\DatePicker; use Filament\Pages\Dashboard as BaseDashboard; @@ -12,7 +14,7 @@ class Dashboard extends BaseDashboard { - use HasFiltersForm; + use HasFiltersForm, HasPageShield; public function filtersForm(Schema $schema): Schema { @@ -33,7 +35,8 @@ public function filtersForm(Schema $schema): Schema ->displayFormat('l, d F Y'), ]) ->columns(2) - ->columnSpanFull(), + ->columnSpanFull() + ->visible(fn () => auth()->user()->hasRole(RoleEnum::DEVELOPER->value) || auth()->user()->hasRole(RoleEnum::ADMINISTRATOR->value)), ]); } diff --git a/app/Filament/Widgets/CooperationStatusChart.php b/app/Filament/Widgets/CooperationStatusChart.php index cde5e95..ba4dbf6 100644 --- a/app/Filament/Widgets/CooperationStatusChart.php +++ b/app/Filament/Widgets/CooperationStatusChart.php @@ -4,11 +4,13 @@ use App\Enums\CooperationStatus; use App\Models\Cooperation; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; class CooperationStatusChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Status Kerjasama'; diff --git a/app/Filament/Widgets/IssueLocationChart.php b/app/Filament/Widgets/IssueLocationChart.php index 4c21ff8..0eae5bd 100644 --- a/app/Filament/Widgets/IssueLocationChart.php +++ b/app/Filament/Widgets/IssueLocationChart.php @@ -4,12 +4,14 @@ use App\Models\IssueManagement; use App\Models\Location; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; use Illuminate\Support\Facades\DB; class IssueLocationChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Sebaran Isu Berdasarkan Wilayah'; diff --git a/app/Filament/Widgets/JournalistMetricsStats.php b/app/Filament/Widgets/JournalistMetricsStats.php index 3e4f864..c499490 100644 --- a/app/Filament/Widgets/JournalistMetricsStats.php +++ b/app/Filament/Widgets/JournalistMetricsStats.php @@ -4,13 +4,15 @@ use App\Models\Journalist; use App\Models\PartnerMedia; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Support\Icons\Heroicon; +use Filament\Widgets\Concerns\InteractsWithPageFilters; use Filament\Widgets\StatsOverviewWidget as BaseWidget; use Filament\Widgets\StatsOverviewWidget\Stat; class JournalistMetricsStats extends BaseWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected static ?int $sort = 7; diff --git a/app/Filament/Widgets/JournalistRegistrationChart.php b/app/Filament/Widgets/JournalistRegistrationChart.php index 34fb0f7..291c54a 100644 --- a/app/Filament/Widgets/JournalistRegistrationChart.php +++ b/app/Filament/Widgets/JournalistRegistrationChart.php @@ -3,13 +3,15 @@ namespace App\Filament\Widgets; use App\Models\Journalist; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Carbon\Carbon; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; use Illuminate\Support\Facades\DB; class JournalistRegistrationChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Tren Pertambahan Jurnalis'; diff --git a/app/Filament/Widgets/JournalistUkwChart.php b/app/Filament/Widgets/JournalistUkwChart.php index b239bb9..d2aa899 100644 --- a/app/Filament/Widgets/JournalistUkwChart.php +++ b/app/Filament/Widgets/JournalistUkwChart.php @@ -3,11 +3,13 @@ namespace App\Filament\Widgets; use App\Models\Journalist; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; class JournalistUkwChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Status Sertifikasi UKW Jurnalis'; diff --git a/app/Filament/Widgets/MediaClassificationChart.php b/app/Filament/Widgets/MediaClassificationChart.php index 2a90070..7614852 100644 --- a/app/Filament/Widgets/MediaClassificationChart.php +++ b/app/Filament/Widgets/MediaClassificationChart.php @@ -4,11 +4,13 @@ use App\Enums\MediaClassification; use App\Models\PartnerMedia; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; class MediaClassificationChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Klasifikasi Media'; diff --git a/app/Filament/Widgets/MediaCooperationRankingChart.php b/app/Filament/Widgets/MediaCooperationRankingChart.php index e5a6ba3..79270b3 100644 --- a/app/Filament/Widgets/MediaCooperationRankingChart.php +++ b/app/Filament/Widgets/MediaCooperationRankingChart.php @@ -4,12 +4,14 @@ use App\Enums\ApprovalStatus; use App\Models\PartnerMedia; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; use Illuminate\Support\Facades\DB; class MediaCooperationRankingChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Ranking Media (Kerjasama Disetujui)'; diff --git a/app/Filament/Widgets/MediaRegistrationChart.php b/app/Filament/Widgets/MediaRegistrationChart.php index aa207b2..a418555 100644 --- a/app/Filament/Widgets/MediaRegistrationChart.php +++ b/app/Filament/Widgets/MediaRegistrationChart.php @@ -3,13 +3,15 @@ namespace App\Filament\Widgets; use App\Models\PartnerMedia; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Carbon\Carbon; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; use Illuminate\Support\Facades\DB; class MediaRegistrationChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Tren Pendaftaran Media'; diff --git a/app/Filament/Widgets/MediaTypeChart.php b/app/Filament/Widgets/MediaTypeChart.php index a55ceed..81b5769 100644 --- a/app/Filament/Widgets/MediaTypeChart.php +++ b/app/Filament/Widgets/MediaTypeChart.php @@ -4,11 +4,13 @@ use App\Enums\MediaType; use App\Models\PartnerMedia; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; class MediaTypeChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Distribusi Jenis Media'; diff --git a/app/Filament/Widgets/OverviewStats.php b/app/Filament/Widgets/OverviewStats.php index fb0d8be..4d964db 100644 --- a/app/Filament/Widgets/OverviewStats.php +++ b/app/Filament/Widgets/OverviewStats.php @@ -8,13 +8,15 @@ use App\Models\PartnerMedia; use App\Models\VerificationRequest; use App\Models\Visitor; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Support\Icons\Heroicon; +use Filament\Widgets\Concerns\InteractsWithPageFilters; use Filament\Widgets\StatsOverviewWidget as BaseWidget; use Filament\Widgets\StatsOverviewWidget\Stat; class OverviewStats extends BaseWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected static ?int $sort = 1; diff --git a/app/Filament/Widgets/PopularNewsChart.php b/app/Filament/Widgets/PopularNewsChart.php index 53ea34e..49ca8ef 100644 --- a/app/Filament/Widgets/PopularNewsChart.php +++ b/app/Filament/Widgets/PopularNewsChart.php @@ -3,11 +3,13 @@ namespace App\Filament\Widgets; use App\Models\News; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; class PopularNewsChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Berita Terpopuler'; diff --git a/app/Filament/Widgets/TaskRealizationChart.php b/app/Filament/Widgets/TaskRealizationChart.php index f9b2a19..353dc76 100644 --- a/app/Filament/Widgets/TaskRealizationChart.php +++ b/app/Filament/Widgets/TaskRealizationChart.php @@ -3,13 +3,15 @@ namespace App\Filament\Widgets; use App\Models\Report; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Carbon\Carbon; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; use Illuminate\Support\Facades\DB; class TaskRealizationChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Realisasi Penugasan (Laporan)'; diff --git a/app/Filament/Widgets/TopMediaJournalistChart.php b/app/Filament/Widgets/TopMediaJournalistChart.php index e133627..2c0484a 100644 --- a/app/Filament/Widgets/TopMediaJournalistChart.php +++ b/app/Filament/Widgets/TopMediaJournalistChart.php @@ -3,11 +3,13 @@ namespace App\Filament\Widgets; use App\Models\PartnerMedia; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; class TopMediaJournalistChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Top Media Berdasarkan Jumlah Jurnalis'; diff --git a/app/Filament/Widgets/VerificationPerformanceChart.php b/app/Filament/Widgets/VerificationPerformanceChart.php index 4485f99..cfbffd7 100644 --- a/app/Filament/Widgets/VerificationPerformanceChart.php +++ b/app/Filament/Widgets/VerificationPerformanceChart.php @@ -4,13 +4,15 @@ use App\Enums\VerificationStatus; use App\Models\VerificationRequest; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Carbon\Carbon; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; use Illuminate\Support\Facades\DB; class VerificationPerformanceChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Performa Verifikasi (Approved vs Rejected)'; diff --git a/app/Filament/Widgets/VisitorTrafficChart.php b/app/Filament/Widgets/VisitorTrafficChart.php index 823645c..265cf0a 100644 --- a/app/Filament/Widgets/VisitorTrafficChart.php +++ b/app/Filament/Widgets/VisitorTrafficChart.php @@ -3,13 +3,15 @@ namespace App\Filament\Widgets; use App\Models\Visitor; +use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Carbon\Carbon; use Filament\Widgets\ChartWidget; +use Filament\Widgets\Concerns\InteractsWithPageFilters; use Illuminate\Support\Facades\DB; class VisitorTrafficChart extends ChartWidget { - use \Filament\Widgets\Concerns\InteractsWithPageFilters; + use HasWidgetShield, InteractsWithPageFilters; protected ?string $heading = 'Traffic Pengunjung'; diff --git a/app/Models/User.php b/app/Models/User.php index fda02ba..edbbdf5 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -37,7 +37,7 @@ protected function casts(): array public function canAccessPanel(Panel $panel): bool { - return true; + return $this->is_active === IsActive::ACTIVE; } #[Scope] diff --git a/app/Policies/DataChangeRequestPolicy.php b/app/Policies/DataChangeRequestPolicy.php new file mode 100644 index 0000000..2dfd1c9 --- /dev/null +++ b/app/Policies/DataChangeRequestPolicy.php @@ -0,0 +1,69 @@ +can('ViewAny:DataChangeRequest'); + } + + public function view(AuthUser $authUser, DataChangeRequest $dataChangeRequest): bool + { + return $authUser->can('View:DataChangeRequest'); + } + + public function create(AuthUser $authUser): bool + { + return $authUser->can('Create:DataChangeRequest'); + } + + public function update(AuthUser $authUser, DataChangeRequest $dataChangeRequest): bool + { + return $authUser->can('Update:DataChangeRequest'); + } + + public function delete(AuthUser $authUser, DataChangeRequest $dataChangeRequest): bool + { + return $authUser->can('Delete:DataChangeRequest'); + } + + public function restore(AuthUser $authUser, DataChangeRequest $dataChangeRequest): bool + { + return $authUser->can('Restore:DataChangeRequest'); + } + + public function forceDelete(AuthUser $authUser, DataChangeRequest $dataChangeRequest): bool + { + return $authUser->can('ForceDelete:DataChangeRequest'); + } + + public function forceDeleteAny(AuthUser $authUser): bool + { + return $authUser->can('ForceDeleteAny:DataChangeRequest'); + } + + public function restoreAny(AuthUser $authUser): bool + { + return $authUser->can('RestoreAny:DataChangeRequest'); + } + + public function replicate(AuthUser $authUser, DataChangeRequest $dataChangeRequest): bool + { + return $authUser->can('Replicate:DataChangeRequest'); + } + + public function reorder(AuthUser $authUser): bool + { + return $authUser->can('Reorder:DataChangeRequest'); + } +} diff --git a/app/Providers/Filament/DashboardPanelProvider.php b/app/Providers/Filament/DashboardPanelProvider.php index 0d452e3..1a999bb 100644 --- a/app/Providers/Filament/DashboardPanelProvider.php +++ b/app/Providers/Filament/DashboardPanelProvider.php @@ -16,6 +16,7 @@ use Filament\PanelProvider; use Filament\Support\Colors\Color; use Filament\Support\Enums\Width; +use Filament\Widgets\AccountWidget; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; @@ -68,7 +69,9 @@ public function panel(Panel $panel): Panel Dashboard::class, ]) ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\Filament\Widgets') - ->widgets([]) + ->widgets([ + AccountWidget::class, + ]) ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, diff --git a/database/seeders/ShieldSeeder.php b/database/seeders/ShieldSeeder.php index c789bf2..573aa06 100644 --- a/database/seeders/ShieldSeeder.php +++ b/database/seeders/ShieldSeeder.php @@ -18,94 +18,8 @@ public function run(): void "name": "Developer", "guard_name": "web", "permissions": [ - "ViewAny:Role", - "View:Role", - "Create:Role", - "Update:Role", - "Delete:Role", - "Restore:Role", - "ForceDelete:Role", - "ForceDeleteAny:Role", - "RestoreAny:Role", - "Replicate:Role", - "Reorder:Role", - "ViewAny:Theme", - "View:Theme", - "Create:Theme", - "Update:Theme", - "Delete:Theme", - "Restore:Theme", - "ForceDelete:Theme", - "ForceDeleteAny:Theme", - "RestoreAny:Theme", - "Replicate:Theme", - "Reorder:Theme", - "ViewAny:Classification", - "View:Classification", - "Create:Classification", - "Update:Classification", - "Delete:Classification", - "Restore:Classification", - "ForceDelete:Classification", - "ForceDeleteAny:Classification", - "RestoreAny:Classification", - "Replicate:Classification", - "Reorder:Classification", - "ViewAny:Department", - "View:Department", - "Create:Department", - "Update:Department", - "Delete:Department", - "Restore:Department", - "ForceDelete:Department", - "ForceDeleteAny:Department", - "RestoreAny:Department", - "Replicate:Department", - "Reorder:Department", - "ViewAny:Location", - "View:Location", - "Create:Location", - "Update:Location", - "Delete:Location", - "Restore:Location", - "ForceDelete:Location", - "ForceDeleteAny:Location", - "RestoreAny:Location", - "Replicate:Location", - "Reorder:Location", - "ViewAny:SubClassification", - "View:SubClassification", - "Create:SubClassification", - "Update:SubClassification", - "Delete:SubClassification", - "Restore:SubClassification", - "ForceDelete:SubClassification", - "ForceDeleteAny:SubClassification", - "RestoreAny:SubClassification", - "Replicate:SubClassification", - "Reorder:SubClassification", - "ViewAny:SubLocation", - "View:SubLocation", - "Create:SubLocation", - "Update:SubLocation", - "Delete:SubLocation", - "Restore:SubLocation", - "ForceDelete:SubLocation", - "ForceDeleteAny:SubLocation", - "RestoreAny:SubLocation", - "Replicate:SubLocation", - "Reorder:SubLocation", - "ViewAny:User", - "View:User", - "Create:User", - "Update:User", - "Delete:User", - "Restore:User", - "ForceDelete:User", - "ForceDeleteAny:User", - "RestoreAny:User", - "Replicate:User", - "Reorder:User", + "View:AdminVerification", + "ViewAny:Announcement", "View:Announcement", "Create:Announcement", @@ -117,89 +31,19 @@ public function run(): void "RestoreAny:Announcement", "Replicate:Announcement", "Reorder:Announcement", - "ViewAny:ContentRecap", - "View:ContentRecap", - "Create:ContentRecap", - "Update:ContentRecap", - "Delete:ContentRecap", - "Restore:ContentRecap", - "ForceDelete:ContentRecap", - "ForceDeleteAny:ContentRecap", - "RestoreAny:ContentRecap", - "Replicate:ContentRecap", - "Reorder:ContentRecap", - "ViewAny:Cooperation", - "View:Cooperation", - "Create:Cooperation", - "Update:Cooperation", - "Delete:Cooperation", - "Restore:Cooperation", - "ForceDelete:Cooperation", - "ForceDeleteAny:Cooperation", - "RestoreAny:Cooperation", - "Replicate:Cooperation", - "Reorder:Cooperation", - "ViewAny:IssueManagement", - "View:IssueManagement", - "Create:IssueManagement", - "Update:IssueManagement", - "Delete:IssueManagement", - "Restore:IssueManagement", - "ForceDelete:IssueManagement", - "ForceDeleteAny:IssueManagement", - "RestoreAny:IssueManagement", - "Replicate:IssueManagement", - "Reorder:IssueManagement", - "ViewAny:MediaMonitoring", - "View:MediaMonitoring", - "Create:MediaMonitoring", - "Update:MediaMonitoring", - "Delete:MediaMonitoring", - "Restore:MediaMonitoring", - "ForceDelete:MediaMonitoring", - "ForceDeleteAny:MediaMonitoring", - "RestoreAny:MediaMonitoring", - "Replicate:MediaMonitoring", - "Reorder:MediaMonitoring", - "ViewAny:News", - "View:News", - "Create:News", - "Update:News", - "Delete:News", - "Restore:News", - "ForceDelete:News", - "ForceDeleteAny:News", - "RestoreAny:News", - "Replicate:News", - "Reorder:News" - ] - }, - { - "name": "Administrator", - "guard_name": "web", - "permissions": [ - "ViewAny:Role", - "View:Role", - "Create:Role", - "Update:Role", - "Delete:Role", - "Restore:Role", - "ForceDelete:Role", - "ForceDeleteAny:Role", - "RestoreAny:Role", - "Replicate:Role", - "Reorder:Role", - "ViewAny:Theme", - "View:Theme", - "Create:Theme", - "Update:Theme", - "Delete:Theme", - "Restore:Theme", - "ForceDelete:Theme", - "ForceDeleteAny:Theme", - "RestoreAny:Theme", - "Replicate:Theme", - "Reorder:Theme", + + "ViewAny:Category", + "View:Category", + "Create:Category", + "Update:Category", + "Delete:Category", + "Restore:Category", + "ForceDelete:Category", + "ForceDeleteAny:Category", + "RestoreAny:Category", + "Replicate:Category", + "Reorder:Category", + "ViewAny:Classification", "View:Classification", "Create:Classification", @@ -211,72 +55,19 @@ public function run(): void "RestoreAny:Classification", "Replicate:Classification", "Reorder:Classification", - "ViewAny:Department", - "View:Department", - "Create:Department", - "Update:Department", - "Delete:Department", - "Restore:Department", - "ForceDelete:Department", - "ForceDeleteAny:Department", - "RestoreAny:Department", - "Replicate:Department", - "Reorder:Department", - "ViewAny:Location", - "View:Location", - "Create:Location", - "Update:Location", - "Delete:Location", - "Restore:Location", - "ForceDelete:Location", - "ForceDeleteAny:Location", - "RestoreAny:Location", - "Replicate:Location", - "Reorder:Location", - "ViewAny:SubClassification", - "View:SubClassification", - "Create:SubClassification", - "Update:SubClassification", - "Delete:SubClassification", - "Restore:SubClassification", - "ForceDelete:SubClassification", - "ForceDeleteAny:SubClassification", - "RestoreAny:SubClassification", - "Replicate:SubClassification", - "Reorder:SubClassification", - "ViewAny:SubLocation", - "View:SubLocation", - "Create:SubLocation", - "Update:SubLocation", - "Delete:SubLocation", - "Restore:SubLocation", - "ForceDelete:SubLocation", - "ForceDeleteAny:SubLocation", - "RestoreAny:SubLocation", - "Replicate:SubLocation", - "Reorder:SubLocation", - "ViewAny:User", - "View:User", - "Create:User", - "Update:User", - "Delete:User", - "Restore:User", - "ForceDelete:User", - "ForceDeleteAny:User", - "RestoreAny:User", - "Replicate:User", - "Reorder:User", - "ViewAny:Announcement", - "View:Announcement", - "Create:Announcement", - "Update:Announcement", - "Delete:Announcement", - "Restore:Announcement", - "ForceDelete:Announcement", - "ForceDeleteAny:Announcement", - "RestoreAny:Announcement", - "Replicate:Announcement", - "Reorder:Announcement", + + "ViewAny:Contact", + "View:Contact", + "Create:Contact", + "Update:Contact", + "Delete:Contact", + "Restore:Contact", + "ForceDelete:Contact", + "ForceDeleteAny:Contact", + "RestoreAny:Contact", + "Replicate:Contact", + "Reorder:Contact", + "ViewAny:ContentRecap", "View:ContentRecap", "Create:ContentRecap", @@ -288,6 +79,7 @@ public function run(): void "RestoreAny:ContentRecap", "Replicate:ContentRecap", "Reorder:ContentRecap", + "ViewAny:Cooperation", "View:Cooperation", "Create:Cooperation", @@ -299,6 +91,37 @@ public function run(): void "RestoreAny:Cooperation", "Replicate:Cooperation", "Reorder:Cooperation", + + "View:CooperationStatusChart", + + "View:Dashboard", + + "ViewAny:DataChangeRequest", + "View:DataChangeRequest", + "Create:DataChangeRequest", + "Update:DataChangeRequest", + "Delete:DataChangeRequest", + "Restore:DataChangeRequest", + "ForceDelete:DataChangeRequest", + "ForceDeleteAny:DataChangeRequest", + "RestoreAny:DataChangeRequest", + "Replicate:DataChangeRequest", + "Reorder:DataChangeRequest", + + "ViewAny:Department", + "View:Department", + "Create:Department", + "Update:Department", + "Delete:Department", + "Restore:Department", + "ForceDelete:Department", + "ForceDeleteAny:Department", + "RestoreAny:Department", + "Replicate:Department", + "Reorder:Department", + + "View:IssueLocationChart", + "ViewAny:IssueManagement", "View:IssueManagement", "Create:IssueManagement", @@ -310,6 +133,35 @@ public function run(): void "RestoreAny:IssueManagement", "Replicate:IssueManagement", "Reorder:IssueManagement", + + "View:JournalistMetricsStats", + + "View:JournalistRegistrationChart", + + "View:JournalistUkwChart", + + "ViewAny:Location", + "View:Location", + "Create:Location", + "Update:Location", + "Delete:Location", + "Restore:Location", + "ForceDelete:Location", + "ForceDeleteAny:Location", + "RestoreAny:Location", + "Replicate:Location", + "Reorder:Location", + + "View:ManageGeneralSettings", + + "View:ManageSeoSettings", + + "View:ManageSocialMediaSettings", + + "View:MediaClassificationChart", + + "View:MediaCooperationRankingChart", + "ViewAny:MediaMonitoring", "View:MediaMonitoring", "Create:MediaMonitoring", @@ -321,45 +173,11 @@ public function run(): void "RestoreAny:MediaMonitoring", "Replicate:MediaMonitoring", "Reorder:MediaMonitoring", - "ViewAny:News", - "View:News", - "Create:News", - "Update:News", - "Delete:News", - "Restore:News", - "ForceDelete:News", - "ForceDeleteAny:News", - "RestoreAny:News", - "Replicate:News", - "Reorder:News" - ] - }, - { - "name": "Admin Monitoring", - "guard_name": "web", - "permissions": [ - "ViewAny:MediaMonitoring", - "View:MediaMonitoring", - "Create:MediaMonitoring", - "Update:MediaMonitoring", - "Delete:MediaMonitoring", - "Restore:MediaMonitoring", - "ForceDelete:MediaMonitoring", - "ForceDeleteAny:MediaMonitoring", - "RestoreAny:MediaMonitoring", - "Replicate:MediaMonitoring", - "Reorder:MediaMonitoring", - "ViewAny:IssueManagement", - "View:IssueManagement", - "Create:IssueManagement", - "Update:IssueManagement", - "Delete:IssueManagement", - "Restore:IssueManagement", - "ForceDelete:IssueManagement", - "ForceDeleteAny:IssueManagement", - "RestoreAny:IssueManagement", - "Replicate:IssueManagement", - "Reorder:IssueManagement", + + "View:MediaRegistrationChart", + + "View:MediaTypeChart", + "ViewAny:News", "View:News", "Create:News", @@ -371,33 +189,98 @@ public function run(): void "RestoreAny:News", "Replicate:News", "Reorder:News", - "ViewAny:Classification", - "View:Classification", + + "View:OverviewStats", + + "View:PopularNewsChart", + + "ViewAny:Role", + "View:Role", + "Create:Role", + "Update:Role", + "Delete:Role", + "Restore:Role", + "ForceDelete:Role", + "ForceDeleteAny:Role", + "RestoreAny:Role", + "Replicate:Role", + "Reorder:Role", + "ViewAny:SubClassification", "View:SubClassification", - "ViewAny:Location", - "View:Location", + "Create:SubClassification", + "Update:SubClassification", + "Delete:SubClassification", + "Restore:SubClassification", + "ForceDelete:SubClassification", + "ForceDeleteAny:SubClassification", + "RestoreAny:SubClassification", + "Replicate:SubClassification", + "Reorder:SubClassification", + "ViewAny:SubLocation", "View:SubLocation", - "ViewAny:Department", - "View:Department" + "Create:SubLocation", + "Update:SubLocation", + "Delete:SubLocation", + "Restore:SubLocation", + "ForceDelete:SubLocation", + "ForceDeleteAny:SubLocation", + "RestoreAny:SubLocation", + "Replicate:SubLocation", + "Reorder:SubLocation", + + "View:TaskRealizationChart", + + "ViewAny:Theme", + "View:Theme", + "Create:Theme", + "Update:Theme", + "Delete:Theme", + "Restore:Theme", + "ForceDelete:Theme", + "ForceDeleteAny:Theme", + "RestoreAny:Theme", + "Replicate:Theme", + "Reorder:Theme", + + "View:TopMediaJournalistChart", + + "ViewAny:User", + "View:User", + "Create:User", + "Update:User", + "Delete:User", + "Restore:User", + "ForceDelete:User", + "ForceDeleteAny:User", + "RestoreAny:User", + "Replicate:User", + "Reorder:User", + + "View:VerificationPerformanceChart", + + "ViewAny:Visitor", + "View:Visitor", + "Create:Visitor", + "Update:Visitor", + "Delete:Visitor", + "Restore:Visitor", + "ForceDelete:Visitor", + "ForceDeleteAny:Visitor", + "RestoreAny:Visitor", + "Replicate:Visitor", + "Reorder:Visitor", + + "View:VisitorTrafficChart" ] }, { - "name": "Admin Konten", + "name": "Administrator", "guard_name": "web", "permissions": [ - "ViewAny:ContentRecap", - "View:ContentRecap", - "Create:ContentRecap", - "Update:ContentRecap", - "Delete:ContentRecap", - "Restore:ContentRecap", - "ForceDelete:ContentRecap", - "ForceDeleteAny:ContentRecap", - "RestoreAny:ContentRecap", - "Replicate:ContentRecap", - "Reorder:ContentRecap", + "View:AdminVerification", + "ViewAny:Announcement", "View:Announcement", "Create:Announcement", @@ -409,14 +292,371 @@ public function run(): void "RestoreAny:Announcement", "Replicate:Announcement", "Reorder:Announcement", + + "ViewAny:Category", + "View:Category", + "Create:Category", + "Update:Category", + "Delete:Category", + "Restore:Category", + "ForceDelete:Category", + "ForceDeleteAny:Category", + "RestoreAny:Category", + "Replicate:Category", + "Reorder:Category", + "ViewAny:Classification", "View:Classification", + "Create:Classification", + "Update:Classification", + "Delete:Classification", + "Restore:Classification", + "ForceDelete:Classification", + "ForceDeleteAny:Classification", + "RestoreAny:Classification", + "Replicate:Classification", + "Reorder:Classification", + + "ViewAny:Contact", + "View:Contact", + "Create:Contact", + "Update:Contact", + "Delete:Contact", + "Restore:Contact", + "ForceDelete:Contact", + "ForceDeleteAny:Contact", + "RestoreAny:Contact", + "Replicate:Contact", + "Reorder:Contact", + + "ViewAny:ContentRecap", + "View:ContentRecap", + "Create:ContentRecap", + "Update:ContentRecap", + "Delete:ContentRecap", + "Restore:ContentRecap", + "ForceDelete:ContentRecap", + "ForceDeleteAny:ContentRecap", + "RestoreAny:ContentRecap", + "Replicate:ContentRecap", + "Reorder:ContentRecap", + + "ViewAny:Cooperation", + "View:Cooperation", + "Create:Cooperation", + "Update:Cooperation", + "Delete:Cooperation", + "Restore:Cooperation", + "ForceDelete:Cooperation", + "ForceDeleteAny:Cooperation", + "RestoreAny:Cooperation", + "Replicate:Cooperation", + "Reorder:Cooperation", + + "View:CooperationStatusChart", + + "View:Dashboard", + + "ViewAny:DataChangeRequest", + "View:DataChangeRequest", + "Create:DataChangeRequest", + "Update:DataChangeRequest", + "Delete:DataChangeRequest", + "Restore:DataChangeRequest", + "ForceDelete:DataChangeRequest", + "ForceDeleteAny:DataChangeRequest", + "RestoreAny:DataChangeRequest", + "Replicate:DataChangeRequest", + "Reorder:DataChangeRequest", + + "ViewAny:Department", + "View:Department", + "Create:Department", + "Update:Department", + "Delete:Department", + "Restore:Department", + "ForceDelete:Department", + "ForceDeleteAny:Department", + "RestoreAny:Department", + "Replicate:Department", + "Reorder:Department", + + "View:IssueLocationChart", + + "ViewAny:IssueManagement", + "View:IssueManagement", + "Create:IssueManagement", + "Update:IssueManagement", + "Delete:IssueManagement", + "Restore:IssueManagement", + "ForceDelete:IssueManagement", + "ForceDeleteAny:IssueManagement", + "RestoreAny:IssueManagement", + "Replicate:IssueManagement", + "Reorder:IssueManagement", + + "View:JournalistMetricsStats", + + "View:JournalistRegistrationChart", + + "View:JournalistUkwChart", + + "ViewAny:Location", + "View:Location", + "Create:Location", + "Update:Location", + "Delete:Location", + "Restore:Location", + "ForceDelete:Location", + "ForceDeleteAny:Location", + "RestoreAny:Location", + "Replicate:Location", + "Reorder:Location", + + "View:ManageGeneralSettings", + + "View:ManageSeoSettings", + + "View:ManageSocialMediaSettings", + + "View:MediaClassificationChart", + + "View:MediaCooperationRankingChart", + + "ViewAny:MediaMonitoring", + "View:MediaMonitoring", + "Create:MediaMonitoring", + "Update:MediaMonitoring", + "Delete:MediaMonitoring", + "Restore:MediaMonitoring", + "ForceDelete:MediaMonitoring", + "ForceDeleteAny:MediaMonitoring", + "RestoreAny:MediaMonitoring", + "Replicate:MediaMonitoring", + "Reorder:MediaMonitoring", + + "View:MediaRegistrationChart", + + "View:MediaTypeChart", + + "ViewAny:News", + "View:News", + "Create:News", + "Update:News", + "Delete:News", + "Restore:News", + "ForceDelete:News", + "ForceDeleteAny:News", + "RestoreAny:News", + "Replicate:News", + "Reorder:News", + + "View:OverviewStats", + + "View:PopularNewsChart", + "ViewAny:SubClassification", "View:SubClassification", + "Create:SubClassification", + "Update:SubClassification", + "Delete:SubClassification", + "Restore:SubClassification", + "ForceDelete:SubClassification", + "ForceDeleteAny:SubClassification", + "RestoreAny:SubClassification", + "Replicate:SubClassification", + "Reorder:SubClassification", + + "ViewAny:SubLocation", + "View:SubLocation", + "Create:SubLocation", + "Update:SubLocation", + "Delete:SubLocation", + "Restore:SubLocation", + "ForceDelete:SubLocation", + "ForceDeleteAny:SubLocation", + "RestoreAny:SubLocation", + "Replicate:SubLocation", + "Reorder:SubLocation", + + "View:TaskRealizationChart", + "ViewAny:Theme", "View:Theme", + "Create:Theme", + "Update:Theme", + "Delete:Theme", + "Restore:Theme", + "ForceDelete:Theme", + "ForceDeleteAny:Theme", + "RestoreAny:Theme", + "Replicate:Theme", + "Reorder:Theme", + + "View:TopMediaJournalistChart", + + "ViewAny:User", + "View:User", + "Create:User", + "Update:User", + "Delete:User", + "Restore:User", + "ForceDelete:User", + "ForceDeleteAny:User", + "RestoreAny:User", + "Replicate:User", + "Reorder:User", + + "View:VerificationPerformanceChart", + + "ViewAny:Visitor", + "View:Visitor", + "Create:Visitor", + "Update:Visitor", + "Delete:Visitor", + "Restore:Visitor", + "ForceDelete:Visitor", + "ForceDeleteAny:Visitor", + "RestoreAny:Visitor", + "Replicate:Visitor", + "Reorder:Visitor", + + "View:VisitorTrafficChart" + ] + }, + { + "name": "Admin Monitoring", + "guard_name": "web", + "permissions": [ + "View:Dashboard", + + "ViewAny:IssueManagement", + "View:IssueManagement", + "Create:IssueManagement", + "Update:IssueManagement", + "Delete:IssueManagement", + "Restore:IssueManagement", + "ForceDelete:IssueManagement", + "ForceDeleteAny:IssueManagement", + "RestoreAny:IssueManagement", + "Replicate:IssueManagement", + "Reorder:IssueManagement", + + "ViewAny:MediaMonitoring", + "View:MediaMonitoring", + "Create:MediaMonitoring", + "Update:MediaMonitoring", + "Delete:MediaMonitoring", + "Restore:MediaMonitoring", + "ForceDelete:MediaMonitoring", + "ForceDeleteAny:MediaMonitoring", + "RestoreAny:MediaMonitoring", + "Replicate:MediaMonitoring", + "Reorder:MediaMonitoring", + + "ViewAny:SubClassification", + "View:SubClassification", + "Create:SubClassification", + "Update:SubClassification", + "Delete:SubClassification", + "Restore:SubClassification", + "ForceDelete:SubClassification", + "ForceDeleteAny:SubClassification", + "RestoreAny:SubClassification", + "Replicate:SubClassification", + "Reorder:SubClassification", + + "ViewAny:SubLocation", + "View:SubLocation", + "Create:SubLocation", + "Update:SubLocation", + "Delete:SubLocation", + "Restore:SubLocation", + "ForceDelete:SubLocation", + "ForceDeleteAny:SubLocation", + "RestoreAny:SubLocation", + "Replicate:SubLocation", + "Reorder:SubLocation", + + "ViewAny:Theme", + "View:Theme", + "Create:Theme", + "Update:Theme", + "Delete:Theme", + "Restore:Theme", + "ForceDelete:Theme", + "ForceDeleteAny:Theme", + "RestoreAny:Theme", + "Replicate:Theme", + "Reorder:Theme", + + "ViewAny:Visitor", + "View:Visitor", + "Create:Visitor", + "Update:Visitor", + "Delete:Visitor", + "Restore:Visitor", + "ForceDelete:Visitor", + "ForceDeleteAny:Visitor", + "RestoreAny:Visitor", + "Replicate:Visitor", + "Reorder:Visitor" + ] + }, + { + "name": "Admin Konten", + "guard_name": "web", + "permissions": [ + "ViewAny:Category", + + "View:Category", + "Create:Category", + "Update:Category", + "Delete:Category", + "Restore:Category", + "ForceDelete:Category", + "ForceDeleteAny:Category", + "RestoreAny:Category", + "Replicate:Category", + "Reorder:Category", + + "ViewAny:Classification", + "View:Classification", + "Create:Classification", + "Update:Classification", + "Delete:Classification", + "Restore:Classification", + "ForceDelete:Classification", + "ForceDeleteAny:Classification", + "RestoreAny:Classification", + "Replicate:Classification", + "Reorder:Classification", + + "ViewAny:ContentRecap", + "View:ContentRecap", + "Create:ContentRecap", + "Update:ContentRecap", + "Delete:ContentRecap", + "Restore:ContentRecap", + "ForceDelete:ContentRecap", + "ForceDeleteAny:ContentRecap", + "RestoreAny:ContentRecap", + "Replicate:ContentRecap", + "Reorder:ContentRecap", + + "View:Dashboard", + "ViewAny:News", - "View:News" + "View:News", + "Create:News", + "Update:News", + "Delete:News", + "Restore:News", + "ForceDelete:News", + "ForceDeleteAny:News", + "RestoreAny:News", + "Replicate:News", + "Reorder:News" ] }, { @@ -433,16 +673,27 @@ public function run(): void "ForceDeleteAny:Cooperation", "RestoreAny:Cooperation", "Replicate:Cooperation", - "Reorder:Cooperation" + "Reorder:Cooperation", + + "View:Dashboard" ] }, { "name": "Perusahaan", "guard_name": "web", "permissions": [ - "View:Company", - "View:Media", - "View:Verification", + "ViewAny:Announcement", + "View:Announcement", + "Create:Announcement", + "Update:Announcement", + "Delete:Announcement", + "Restore:Announcement", + "ForceDelete:Announcement", + "ForceDeleteAny:Announcement", + "RestoreAny:Announcement", + "Replicate:Announcement", + "Reorder:Announcement", + "ViewAny:Cooperation", "View:Cooperation", "Create:Cooperation", @@ -454,17 +705,32 @@ public function run(): void "RestoreAny:Cooperation", "Replicate:Cooperation", "Reorder:Cooperation", - "ViewAny:Journalist", - "View:Journalist", - "Create:Journalist", - "Update:Journalist", - "Delete:Journalist", - "Restore:Journalist", - "ForceDelete:Journalist", - "ForceDeleteAny:Journalist", - "RestoreAny:Journalist", - "Replicate:Journalist", - "Reorder:Journalist" + + "View:Company", + + "View:Dashboard", + + "ViewAny:DataChangeRequest", + "View:DataChangeRequest", + "Create:DataChangeRequest", + "Update:DataChangeRequest", + "Delete:DataChangeRequest", + "Restore:DataChangeRequest", + "ForceDelete:DataChangeRequest", + "ForceDeleteAny:DataChangeRequest", + "RestoreAny:DataChangeRequest", + "Replicate:DataChangeRequest", + "Reorder:DataChangeRequest", + + "ViewAny:Journalits", + "View:Journalits", + "Create:Journalits", + "Update:Journalits", + "Delete:Journalits", + + "View:Media", + + "View:Verification" ] } ]