escalated-dev/escalated-filament
A Filament v3 admin panel plugin for the Escalated support ticket system. Manage tickets, departments, SLA policies, escalation rules, and macros from your existing Filament panel, powered by escalated-laravel.
escalated-laravel first. This plugin release requires escalated-dev/escalated-laravel ^1.9.0; follow that package's upgrading notes (frontend 0.12, migrations, private attachments, verified guest access, requester-only inbound email replies, tenant staff seats) before touching the panel package.php artisan optimize:clear).escalated-agent and escalated-admin. If you use custom names, pass them to the plugin; otherwise define the defaults in a service provider and grant them to your support staff.Support\PanelAccess / Support\StaffSeat — they are the authoritative answer to "why can't this user see the panel?"Minimal gate wiring:
// AuthServiceProvider::boot()
Gate::define('escalated-agent', fn (User $user) => $user->hasRole('support'));
Gate::define('escalated-admin', fn (User $user) => $user->hasRole('support-admin'));
// Panel provider
->plugin(
EscalatedPlugin::make()
->agentGate('escalated-agent')
->adminGate('escalated-admin')
)
Grant through your existing role/permission system. Keep the gate names thin and delegate to whatever you already use (Spatie permissions, Bouncer, custom flags) so the panel and the rest of your app stay in sync.
Treat the two gates as tiers. Agent gate covers tickets, canned responses and the support dashboard; admin gate covers everything else. A user with only the agent gate should never be given admin-gate roles "just in case" — they will see no admin navigation and get 403s on direct URLs.
Layer policies on top, not instead of. Existing escalated-laravel model policies still apply on top of the gates. Use policies for per-record rules (for example, an agent may only edit their own canned responses), and the gates for coarser "can this person be in the panel at all" decisions.
Tenant mode requires a seat in the current account. With escalated-laravel tenancy enabled, passing the global gate is not enough: StaffAccess checks the host gate plus TenantResolver::isAgent/isAdmin for the current tenant. Make sure your tenant provisioning flow creates a staff seat, otherwise users silently disappear from the API token owner picker and skill agent picker.
Test access the same way your users hit it. Use actingAs($agent)->get(TicketResource::getUrl()) and assert 200/403, plus assertDontSee for the navigation. Exercise Gate::forUser($user)->allows('escalated-admin') in isolation before blaming the panel.
Audit before you deploy. Iterate over every user who can currently sign in to the panel and log which gate they pass. Anyone passing neither will lose access at upgrade time — this is the single most important pre-flight check.
Customise by extension, not by editing vendor code. Override resources/pages in your app namespace, keep gate names configurable at the plugin level, and bind or decorate StaffAccess if your tenancy model differs.
Gate::before super-admin bypasses. A global Gate::before returning true for super admins will happily grant both escalated gates and defeat the point — confirm that is intentional.Support\PanelAccess resolves the names — check it when debugging.false policy is still a denial. Debug both layers separately.escalated-laravel 1.9 upgrade (migrations, private attachments disk/visibility, frontend 0.12) will leave you with a broken or half-migrated panel.ViewErrorBag now matches 4.4 as well as 4.3. If tests fail unexpectedly after a dependency bump, re-run the patch script before debugging your own code.How can I help you explore Laravel packages today?