feat: Implement granular access control and permissions for Filament widgets, pages, and data change requests using Filament Shield and a new policy.

This commit is contained in:
Yoga Pangestu 2026-01-29 15:05:26 +07:00
parent a281e092bb
commit 98d30a80e6
20 changed files with 700 additions and 329 deletions

View File

@ -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)),
]);
}

View File

@ -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';

View File

@ -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';

View File

@ -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;

View File

@ -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';

View File

@ -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';

View File

@ -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';

View File

@ -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)';

View File

@ -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';

View File

@ -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';

View File

@ -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;

View File

@ -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';

View File

@ -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)';

View File

@ -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';

View File

@ -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)';

View File

@ -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';

View File

@ -37,7 +37,7 @@ protected function casts(): array
public function canAccessPanel(Panel $panel): bool
{
return true;
return $this->is_active === IsActive::ACTIVE;
}
#[Scope]

View File

@ -0,0 +1,69 @@
<?php
declare(strict_types=1);
namespace App\Policies;
use App\Models\DataChangeRequest;
use Illuminate\Auth\Access\HandlesAuthorization;
use Illuminate\Foundation\Auth\User as AuthUser;
class DataChangeRequestPolicy
{
use HandlesAuthorization;
public function viewAny(AuthUser $authUser): bool
{
return $authUser->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');
}
}

View File

@ -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,

View File

@ -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"
]
}
]