escalated-dev / escalated-filament
Filament admin panel integration for the Escalated support ticket system
Package info
github.com/escalated-dev/escalated-filament
pkg:composer/escalated-dev/escalated-filament
Requires
- php: ^8.2
- escalated-dev/escalated-laravel: ^1.9.0
- escalated-dev/locale: ^0.1
- filament/filament: ^4.0 || ^5.0
Requires (Dev)
- laravel/pint: ^1.29
- orchestra/testbench: ^9.0|^10.0|^11.0
- pestphp/pest: ^2.0|^3.0|^4.0
- pestphp/pest-plugin-laravel: ^2.0|^3.0|^4.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
- dev-main
- v1.4.0
- v1.3.0
- v1.2.1
- v1.2.0
- v1.1.0
- v1.0.0
- v0.5.7
- v0.5.6
- v0.5.5
- v0.5.4
- v0.5.3
- 0.5.1
- 0.5.0
- 0.4.0
- dev-feat/configurable-ticket-access
- dev-release/v1.4.0
- dev-docs/translated-readme-access-control
- dev-fix/enforce-panel-gates
- dev-fix/staff-access-seats
- dev-docs/packagist-badge
- dev-fix/issue-35-satisfaction-widget-key
- dev-feat/newsletter-panel
- dev-ci/workflow-permissions
- dev-feat/ticket-subjects
- dev-feat/custom-ticket-actions
- dev-feat/newsletter-system
- dev-fix/postgres-minutes-diff
- dev-feat/respect-ui-config
- dev-feat/side-conversations
This package is auto-updated.
Last update: 2026-10-14 00:48:14 UTC
README
العربية • Deutsch • English • Español • Français • Italiano • 日本語 • 한국어 • Nederlands • Polski • Português (BR) • Русский • Türkçe • 简体中文
Escalated for Filament
A Filament admin panel plugin for the Escalated support ticket system. Manage tickets, departments, SLA policies, escalation rules, macros, and more — all from within your existing Filament admin panel.
escalated.dev — Learn more, view demos, and compare Cloud vs Self-Hosted options.
How It Works
Escalated for Filament is a Filament plugin wrapper around escalated-laravel. It does not duplicate any business logic. Instead, it provides Filament Resources, Pages, Widgets, and Actions that call the same services, models, and events from the core Laravel package. This means:
- All ticket lifecycle logic, SLA calculations, and escalation rules come from
escalated-laravel - Database tables, migrations, and configuration are managed by the core package
- Events, notifications, and webhooks fire exactly as they would from the Inertia UI
- You get a native Filament experience without maintaining a separate codebase
Note: This package uses Filament's native Livewire + Blade components (tables, forms, info lists, actions, widgets) rather than the custom Vue 3 + Inertia.js UI from the
@escalated-dev/escalatedfrontend package. The core functionality is the same — same models, services, database, and business logic — but the UI look-and-feel follows Filament's design system. Some interactions may differ slightly (e.g., Filament modals vs. inline forms, Filament table filters vs. custom filter components). If you need pixel-perfect parity with the Inertia frontend, useescalated-laraveldirectly with the shared Vue components instead.
Requirements
- PHP 8.2+
- Laravel 11 or 12
- Filament 3.x, 4.x, or 5.x
- escalated-dev/escalated-laravel ^0.5
Version Compatibility
| escalated-filament | Filament | Laravel | PHP |
|---|---|---|---|
| 0.5.x | 3.x, 4.x, 5.x | 11, 12 | 8.2+ |
Installation
1. Install the packages
composer require escalated-dev/escalated-laravel escalated-dev/escalated-filament
If you already have escalated-laravel installed, just add the Filament plugin:
composer require escalated-dev/escalated-filament
2. Run the Escalated installer (if not already done)
php artisan escalated:install php artisan migrate
3. Define authorization gates
In a service provider (e.g., AppServiceProvider):
use Illuminate\Support\Facades\Gate; Gate::define('escalated-admin', fn ($user) => $user->is_admin); Gate::define('escalated-agent', fn ($user) => $user->is_agent || $user->is_admin);
4. Register the plugin in your Filament panel
use Escalated\Filament\EscalatedFilamentPlugin; public function panel(Panel $panel): Panel { return $panel // ... ->plugin( EscalatedFilamentPlugin::make() ->navigationGroup('Support') ->agentGate('escalated-agent') ->adminGate('escalated-admin') ); }
You're live. Visit your Filament panel — a Support navigation group will appear with all ticket management resources.
Features
Resources
- TicketResource — Full ticket management with list, view, and create pages
- Filterable by status, priority, department, agent, tags, SLA
- Quick filter tabs: All, My Tickets, Unassigned, Urgent, SLA Breaching
- Bulk actions: Assign, Change Status, Change Priority, Add Tags, Close, Delete
- View page with conversation thread, sidebar details, SLA info, satisfaction rating
- Header actions: Reply, Note, Assign, Status, Priority, Follow, Macro, Resolve, Close, Reopen
- Custom ticket actions: host-defined buttons registered via the core package's
ticket_actionsconfig appear automatically as header actions (dispatchingTicketCustomActionTriggered)
- DepartmentResource — CRUD for support departments with agent assignment
- TagResource — CRUD for ticket tags with color picker
- SlaPolicyResource — SLA policy management with per-priority response/resolution times
- EscalationRuleResource — Condition/action builder for automatic escalation rules
- CannedResponseResource — Pre-written response templates with categories
- MacroResource — Multi-action automation macros with reorderable steps
- NewsletterResource (optional) — Compose admin newsletters with Markdown body, target list, theme, and scheduled send. Hidden from the navigation when
escalated.enable_newslettersis false. - NewsletterListResource (optional) — Manage static / dynamic recipient lists for newsletters.
- NewsletterTemplateResource (optional) — Reusable Markdown templates with a theme and default subject.
Dashboard Widgets
- TicketStatsOverview — Key metrics: My Open, Unassigned, Total Open, SLA Breached, Resolved Today, CSAT
- TicketsByStatusChart — Doughnut chart of ticket distribution by status
- TicketsByPriorityChart — Bar chart of open tickets by priority
- CsatOverviewWidget — Customer satisfaction metrics: Average Rating, Total Ratings, Satisfaction Rate
- RecentTicketsWidget — Table of the 5 most recent tickets
- SlaBreachWidget — Table of tickets with breached SLA targets
Pages
- Dashboard — Support dashboard with all widgets
- Reports — Date-range analytics with stats, department breakdown, and timeline
- Settings — Admin settings for reference prefix, guest tickets, auto-close, attachment limits
Relation Managers
- RepliesRelationManager — Reply thread with internal notes, pinning, and canned response insertion
- ActivitiesRelationManager — Read-only audit log of all ticket activities
- FollowersRelationManager — Manage ticket followers
Reusable Actions
AssignTicketAction— Assign a ticket to an agentChangeStatusAction— Change ticket statusChangePriorityAction— Change ticket priorityApplyMacroAction— Apply a macro to a ticketFollowTicketAction— Toggle following a ticketPinReplyAction— Pin/unpin internal notes
Custom Livewire Components
- TicketConversation — Full conversation thread with reply composer, canned response insertion, and note pinning
- SatisfactionRating — Display customer satisfaction rating with star visualization
Configuration
The plugin is configured through method chaining on the plugin instance:
EscalatedFilamentPlugin::make() ->navigationGroup('Support') // Navigation group label (default: 'Support') ->agentGate('escalated-agent') // Gate for agent access (default: 'escalated-agent') ->adminGate('escalated-admin') // Gate for admin access (default: 'escalated-admin')
Access control
Your panel's canAccessPanel() decides who can sign in to the panel. The two gates decide what they can use once inside, mirroring the escalated-laravel routes:
| Surface | Required |
|---|---|
| Tickets, canned responses, the support dashboard and its widgets | agent gate or admin gate |
| Everything else: departments, tags, SLA policies, escalation rules, macros, automations, webhooks, API tokens, roles, statuses, skills, custom fields, business hours, KB articles and categories, audit log, newsletters, reports, and every settings page | admin gate |
A panel user who passes neither gate gets a 403 on every Escalated page, and the navigation items are hidden. Model policies shipped by escalated-laravel (for example, private canned responses stay editable only by their author) still apply on top. In tenant mode the user also needs a staff seat in the current account, whichever gate names you configure.
All other configuration (SLA, hosting modes, notifications, etc.) is managed by the core escalated-laravel package in config/escalated.php. See the escalated-laravel README for full configuration reference.
Publishing Views
php artisan vendor:publish --tag=escalated-filament-views
Internationalization
UI strings shown in this plugin's Filament resources, pages, and widgets resolve through the standard Escalated translation chain. The chain is configured in the underlying escalated-laravel package and reads, in order:
- App-level overrides (
lang/vendor/escalated/{locale}/{group}.php) - The central
escalated-dev/localeComposer package — single source of truth across all framework plugins - This plugin's bundled fallback strings under
resources/lang/(namespaced asescalated-filament::*)
The central package is pulled in as an explicit dependency so that even if you only install escalated-filament without the rest of the stack the shared keys resolve correctly. To override a Filament-specific string in your application, publish:
php artisan vendor:publish --tag=escalated-filament-lang
then edit the files under lang/vendor/escalated-filament/{locale}/.
Screenshots
Coming soon.
Also Available For
- Escalated for Laravel — Laravel Composer package
- Escalated for Rails — Ruby on Rails engine
- Escalated for Django — Django reusable app
- Escalated for AdonisJS — AdonisJS v6 package
- Escalated for Filament — Filament admin panel plugin (you are here)
- Shared Frontend — Vue 3 + Inertia.js UI components
Same architecture, same ticket system — native Filament experience for Laravel admin panels.
License
MIT - Copyright (c) Escalated.dev. See LICENSE.
Optional ticket access and routing
Requires Laravel backend 1.9.1 or later and its additive migrations. Configure
only the options your installation needs in the published config/escalated.php:
visibility = department, accounts.enabled, accounts.scope_agents, and
sla.targeted. All remain off by default (visibility is all). Account
resolution uses the backend TicketAccountResolver implemented by the host.
With restrictions enabled, custom panel gates also require the backend's staff
seat (or admin seat for administration). If your custom gates define those
roles, set the backend authorization.agent_gate and authorization.admin_gate
to the matching names. A panel-only gate cannot bypass backend visibility.
Lists, search, reports, widgets and bulk actions inherit the current agent's ticket boundary. Conversation and relation-manager requests recheck the parent ticket after membership changes. Assignment choices include only eligible agents, and creation validates the assignee again. Admins retain access within their tenant. Department-restricted agents cannot see tickets without a department.
Ticket creation includes a ticket-type field. The escalation-rule editor supports ticket-type conditions and a complete account type/ID pair. Automation conditions accept the same fields through their JSON editor. When targeted SLAs are enabled, the SLA form offers department and type targets. Requester account resolution and SLA selection use Laravel's ticket lifecycle. Moving departments preserves the attached SLA and its clock; explicit reselection is a host decision.