Search by

escalated-dev / escalated-filament

MatthewGross

Filament admin panel integration for the Escalated support ticket system

Package info

github.com/escalated-dev/escalated-filament

pkg:composer/escalated-dev/escalated-filament

Statistics

Installs: 5 241

Dependents: 0

Suggesters: 0

Stars: 5

Open Issues: 0


README

العربية • Deutsch • English • Español • Français • Italiano • 日本語 • 한국어 • Nederlands • Polski • Português (BR) • Русский • Türkçe • 简体中文

Escalated for Filament

Latest Version on Packagist Total Downloads Tests Laravel Filament License: MIT Views

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/escalated frontend 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, use escalated-laravel directly 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_actions config appear automatically as header actions (dispatching TicketCustomActionTriggered)
  • 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_newsletters is 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 agent
  • ChangeStatusAction — Change ticket status
  • ChangePriorityAction — Change ticket priority
  • ApplyMacroAction — Apply a macro to a ticket
  • FollowTicketAction — Toggle following a ticket
  • PinReplyAction — 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:

  1. App-level overrides (lang/vendor/escalated/{locale}/{group}.php)
  2. The central escalated-dev/locale Composer package — single source of truth across all framework plugins
  3. This plugin's bundled fallback strings under resources/lang/ (namespaced as escalated-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

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.