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; namespace App\Filament\Pages;
use App\Enums\RoleEnum;
use BezhanSalleh\FilamentShield\Traits\HasPageShield;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\DatePicker;
use Filament\Pages\Dashboard as BaseDashboard; use Filament\Pages\Dashboard as BaseDashboard;
@ -12,7 +14,7 @@
class Dashboard extends BaseDashboard class Dashboard extends BaseDashboard
{ {
use HasFiltersForm; use HasFiltersForm, HasPageShield;
public function filtersForm(Schema $schema): Schema public function filtersForm(Schema $schema): Schema
{ {
@ -33,7 +35,8 @@ public function filtersForm(Schema $schema): Schema
->displayFormat('l, d F Y'), ->displayFormat('l, d F Y'),
]) ])
->columns(2) ->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\Enums\CooperationStatus;
use App\Models\Cooperation; use App\Models\Cooperation;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
class CooperationStatusChart extends ChartWidget class CooperationStatusChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Status Kerjasama'; protected ?string $heading = 'Status Kerjasama';

View File

@ -4,12 +4,14 @@
use App\Models\IssueManagement; use App\Models\IssueManagement;
use App\Models\Location; use App\Models\Location;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class IssueLocationChart extends ChartWidget class IssueLocationChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Sebaran Isu Berdasarkan Wilayah'; protected ?string $heading = 'Sebaran Isu Berdasarkan Wilayah';

View File

@ -4,13 +4,15 @@
use App\Models\Journalist; use App\Models\Journalist;
use App\Models\PartnerMedia; use App\Models\PartnerMedia;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
use Filament\Widgets\StatsOverviewWidget as BaseWidget; use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat; use Filament\Widgets\StatsOverviewWidget\Stat;
class JournalistMetricsStats extends BaseWidget class JournalistMetricsStats extends BaseWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected static ?int $sort = 7; protected static ?int $sort = 7;

View File

@ -3,13 +3,15 @@
namespace App\Filament\Widgets; namespace App\Filament\Widgets;
use App\Models\Journalist; use App\Models\Journalist;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Carbon\Carbon; use Carbon\Carbon;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class JournalistRegistrationChart extends ChartWidget class JournalistRegistrationChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Tren Pertambahan Jurnalis'; protected ?string $heading = 'Tren Pertambahan Jurnalis';

View File

@ -3,11 +3,13 @@
namespace App\Filament\Widgets; namespace App\Filament\Widgets;
use App\Models\Journalist; use App\Models\Journalist;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
class JournalistUkwChart extends ChartWidget class JournalistUkwChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Status Sertifikasi UKW Jurnalis'; protected ?string $heading = 'Status Sertifikasi UKW Jurnalis';

View File

@ -4,11 +4,13 @@
use App\Enums\MediaClassification; use App\Enums\MediaClassification;
use App\Models\PartnerMedia; use App\Models\PartnerMedia;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
class MediaClassificationChart extends ChartWidget class MediaClassificationChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Klasifikasi Media'; protected ?string $heading = 'Klasifikasi Media';

View File

@ -4,12 +4,14 @@
use App\Enums\ApprovalStatus; use App\Enums\ApprovalStatus;
use App\Models\PartnerMedia; use App\Models\PartnerMedia;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class MediaCooperationRankingChart extends ChartWidget class MediaCooperationRankingChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Ranking Media (Kerjasama Disetujui)'; protected ?string $heading = 'Ranking Media (Kerjasama Disetujui)';

View File

@ -3,13 +3,15 @@
namespace App\Filament\Widgets; namespace App\Filament\Widgets;
use App\Models\PartnerMedia; use App\Models\PartnerMedia;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Carbon\Carbon; use Carbon\Carbon;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class MediaRegistrationChart extends ChartWidget class MediaRegistrationChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Tren Pendaftaran Media'; protected ?string $heading = 'Tren Pendaftaran Media';

View File

@ -4,11 +4,13 @@
use App\Enums\MediaType; use App\Enums\MediaType;
use App\Models\PartnerMedia; use App\Models\PartnerMedia;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
class MediaTypeChart extends ChartWidget class MediaTypeChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Distribusi Jenis Media'; protected ?string $heading = 'Distribusi Jenis Media';

View File

@ -8,13 +8,15 @@
use App\Models\PartnerMedia; use App\Models\PartnerMedia;
use App\Models\VerificationRequest; use App\Models\VerificationRequest;
use App\Models\Visitor; use App\Models\Visitor;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
use Filament\Widgets\StatsOverviewWidget as BaseWidget; use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat; use Filament\Widgets\StatsOverviewWidget\Stat;
class OverviewStats extends BaseWidget class OverviewStats extends BaseWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected static ?int $sort = 1; protected static ?int $sort = 1;

View File

@ -3,11 +3,13 @@
namespace App\Filament\Widgets; namespace App\Filament\Widgets;
use App\Models\News; use App\Models\News;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
class PopularNewsChart extends ChartWidget class PopularNewsChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Berita Terpopuler'; protected ?string $heading = 'Berita Terpopuler';

View File

@ -3,13 +3,15 @@
namespace App\Filament\Widgets; namespace App\Filament\Widgets;
use App\Models\Report; use App\Models\Report;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Carbon\Carbon; use Carbon\Carbon;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class TaskRealizationChart extends ChartWidget class TaskRealizationChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Realisasi Penugasan (Laporan)'; protected ?string $heading = 'Realisasi Penugasan (Laporan)';

View File

@ -3,11 +3,13 @@
namespace App\Filament\Widgets; namespace App\Filament\Widgets;
use App\Models\PartnerMedia; use App\Models\PartnerMedia;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
class TopMediaJournalistChart extends ChartWidget class TopMediaJournalistChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Top Media Berdasarkan Jumlah Jurnalis'; protected ?string $heading = 'Top Media Berdasarkan Jumlah Jurnalis';

View File

@ -4,13 +4,15 @@
use App\Enums\VerificationStatus; use App\Enums\VerificationStatus;
use App\Models\VerificationRequest; use App\Models\VerificationRequest;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Carbon\Carbon; use Carbon\Carbon;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class VerificationPerformanceChart extends ChartWidget class VerificationPerformanceChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Performa Verifikasi (Approved vs Rejected)'; protected ?string $heading = 'Performa Verifikasi (Approved vs Rejected)';

View File

@ -3,13 +3,15 @@
namespace App\Filament\Widgets; namespace App\Filament\Widgets;
use App\Models\Visitor; use App\Models\Visitor;
use BezhanSalleh\FilamentShield\Traits\HasWidgetShield;
use Carbon\Carbon; use Carbon\Carbon;
use Filament\Widgets\ChartWidget; use Filament\Widgets\ChartWidget;
use Filament\Widgets\Concerns\InteractsWithPageFilters;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class VisitorTrafficChart extends ChartWidget class VisitorTrafficChart extends ChartWidget
{ {
use \Filament\Widgets\Concerns\InteractsWithPageFilters; use HasWidgetShield, InteractsWithPageFilters;
protected ?string $heading = 'Traffic Pengunjung'; protected ?string $heading = 'Traffic Pengunjung';

View File

@ -37,7 +37,7 @@ protected function casts(): array
public function canAccessPanel(Panel $panel): bool public function canAccessPanel(Panel $panel): bool
{ {
return true; return $this->is_active === IsActive::ACTIVE;
} }
#[Scope] #[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\PanelProvider;
use Filament\Support\Colors\Color; use Filament\Support\Colors\Color;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Filament\Widgets\AccountWidget;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Cookie\Middleware\EncryptCookies; use Illuminate\Cookie\Middleware\EncryptCookies;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
@ -68,7 +69,9 @@ public function panel(Panel $panel): Panel
Dashboard::class, Dashboard::class,
]) ])
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\Filament\Widgets') ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\Filament\Widgets')
->widgets([]) ->widgets([
AccountWidget::class,
])
->middleware([ ->middleware([
EncryptCookies::class, EncryptCookies::class,
AddQueuedCookiesToResponse::class, AddQueuedCookiesToResponse::class,

View File

@ -18,94 +18,8 @@ public function run(): void
"name": "Developer", "name": "Developer",
"guard_name": "web", "guard_name": "web",
"permissions": [ "permissions": [
"ViewAny:Role", "View:AdminVerification",
"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",
"ViewAny:Announcement", "ViewAny:Announcement",
"View:Announcement", "View:Announcement",
"Create:Announcement", "Create:Announcement",
@ -117,89 +31,19 @@ public function run(): void
"RestoreAny:Announcement", "RestoreAny:Announcement",
"Replicate:Announcement", "Replicate:Announcement",
"Reorder:Announcement", "Reorder:Announcement",
"ViewAny:ContentRecap",
"View:ContentRecap", "ViewAny:Category",
"Create:ContentRecap", "View:Category",
"Update:ContentRecap", "Create:Category",
"Delete:ContentRecap", "Update:Category",
"Restore:ContentRecap", "Delete:Category",
"ForceDelete:ContentRecap", "Restore:Category",
"ForceDeleteAny:ContentRecap", "ForceDelete:Category",
"RestoreAny:ContentRecap", "ForceDeleteAny:Category",
"Replicate:ContentRecap", "RestoreAny:Category",
"Reorder:ContentRecap", "Replicate:Category",
"ViewAny:Cooperation", "Reorder:Category",
"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:Classification", "ViewAny:Classification",
"View:Classification", "View:Classification",
"Create:Classification", "Create:Classification",
@ -211,72 +55,19 @@ public function run(): void
"RestoreAny:Classification", "RestoreAny:Classification",
"Replicate:Classification", "Replicate:Classification",
"Reorder:Classification", "Reorder:Classification",
"ViewAny:Department",
"View:Department", "ViewAny:Contact",
"Create:Department", "View:Contact",
"Update:Department", "Create:Contact",
"Delete:Department", "Update:Contact",
"Restore:Department", "Delete:Contact",
"ForceDelete:Department", "Restore:Contact",
"ForceDeleteAny:Department", "ForceDelete:Contact",
"RestoreAny:Department", "ForceDeleteAny:Contact",
"Replicate:Department", "RestoreAny:Contact",
"Reorder:Department", "Replicate:Contact",
"ViewAny:Location", "Reorder:Contact",
"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:ContentRecap", "ViewAny:ContentRecap",
"View:ContentRecap", "View:ContentRecap",
"Create:ContentRecap", "Create:ContentRecap",
@ -288,6 +79,7 @@ public function run(): void
"RestoreAny:ContentRecap", "RestoreAny:ContentRecap",
"Replicate:ContentRecap", "Replicate:ContentRecap",
"Reorder:ContentRecap", "Reorder:ContentRecap",
"ViewAny:Cooperation", "ViewAny:Cooperation",
"View:Cooperation", "View:Cooperation",
"Create:Cooperation", "Create:Cooperation",
@ -299,6 +91,37 @@ public function run(): void
"RestoreAny:Cooperation", "RestoreAny:Cooperation",
"Replicate:Cooperation", "Replicate:Cooperation",
"Reorder: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", "ViewAny:IssueManagement",
"View:IssueManagement", "View:IssueManagement",
"Create:IssueManagement", "Create:IssueManagement",
@ -310,6 +133,35 @@ public function run(): void
"RestoreAny:IssueManagement", "RestoreAny:IssueManagement",
"Replicate:IssueManagement", "Replicate:IssueManagement",
"Reorder: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", "ViewAny:MediaMonitoring",
"View:MediaMonitoring", "View:MediaMonitoring",
"Create:MediaMonitoring", "Create:MediaMonitoring",
@ -321,45 +173,11 @@ public function run(): void
"RestoreAny:MediaMonitoring", "RestoreAny:MediaMonitoring",
"Replicate:MediaMonitoring", "Replicate:MediaMonitoring",
"Reorder:MediaMonitoring", "Reorder:MediaMonitoring",
"ViewAny:News",
"View:News", "View:MediaRegistrationChart",
"Create:News",
"Update:News", "View:MediaTypeChart",
"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",
"ViewAny:News", "ViewAny:News",
"View:News", "View:News",
"Create:News", "Create:News",
@ -371,33 +189,98 @@ public function run(): void
"RestoreAny:News", "RestoreAny:News",
"Replicate:News", "Replicate:News",
"Reorder: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", "ViewAny:SubClassification",
"View:SubClassification", "View:SubClassification",
"ViewAny:Location", "Create:SubClassification",
"View:Location", "Update:SubClassification",
"Delete:SubClassification",
"Restore:SubClassification",
"ForceDelete:SubClassification",
"ForceDeleteAny:SubClassification",
"RestoreAny:SubClassification",
"Replicate:SubClassification",
"Reorder:SubClassification",
"ViewAny:SubLocation", "ViewAny:SubLocation",
"View:SubLocation", "View:SubLocation",
"ViewAny:Department", "Create:SubLocation",
"View:Department" "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", "guard_name": "web",
"permissions": [ "permissions": [
"ViewAny:ContentRecap", "View:AdminVerification",
"View:ContentRecap",
"Create:ContentRecap",
"Update:ContentRecap",
"Delete:ContentRecap",
"Restore:ContentRecap",
"ForceDelete:ContentRecap",
"ForceDeleteAny:ContentRecap",
"RestoreAny:ContentRecap",
"Replicate:ContentRecap",
"Reorder:ContentRecap",
"ViewAny:Announcement", "ViewAny:Announcement",
"View:Announcement", "View:Announcement",
"Create:Announcement", "Create:Announcement",
@ -409,14 +292,371 @@ public function run(): void
"RestoreAny:Announcement", "RestoreAny:Announcement",
"Replicate:Announcement", "Replicate:Announcement",
"Reorder: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", "ViewAny:Classification",
"View: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", "ViewAny:SubClassification",
"View: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", "ViewAny:Theme",
"View: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", "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", "ForceDeleteAny:Cooperation",
"RestoreAny:Cooperation", "RestoreAny:Cooperation",
"Replicate:Cooperation", "Replicate:Cooperation",
"Reorder:Cooperation" "Reorder:Cooperation",
"View:Dashboard"
] ]
}, },
{ {
"name": "Perusahaan", "name": "Perusahaan",
"guard_name": "web", "guard_name": "web",
"permissions": [ "permissions": [
"View:Company", "ViewAny:Announcement",
"View:Media", "View:Announcement",
"View:Verification", "Create:Announcement",
"Update:Announcement",
"Delete:Announcement",
"Restore:Announcement",
"ForceDelete:Announcement",
"ForceDeleteAny:Announcement",
"RestoreAny:Announcement",
"Replicate:Announcement",
"Reorder:Announcement",
"ViewAny:Cooperation", "ViewAny:Cooperation",
"View:Cooperation", "View:Cooperation",
"Create:Cooperation", "Create:Cooperation",
@ -454,17 +705,32 @@ public function run(): void
"RestoreAny:Cooperation", "RestoreAny:Cooperation",
"Replicate:Cooperation", "Replicate:Cooperation",
"Reorder:Cooperation", "Reorder:Cooperation",
"ViewAny:Journalist",
"View:Journalist", "View:Company",
"Create:Journalist",
"Update:Journalist", "View:Dashboard",
"Delete:Journalist",
"Restore:Journalist", "ViewAny:DataChangeRequest",
"ForceDelete:Journalist", "View:DataChangeRequest",
"ForceDeleteAny:Journalist", "Create:DataChangeRequest",
"RestoreAny:Journalist", "Update:DataChangeRequest",
"Replicate:Journalist", "Delete:DataChangeRequest",
"Reorder:Journalist" "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"
] ]
} }
] ]