A support ticket management system built with Filament and Livewire, featuring a real-time status workflow sidebar embedded in the resource edit page — with transition rules, priority levels, and a full audit trail of every status change.
This project showcases how you can build a support ticket management system with a real-time status workflow sidebar embedded directly inside a Filament resource edit page using Livewire.
Within this system, you will find:
git clone.env.example file to .env and edit database credentials therecomposer installphp artisan key:generatephp artisan storage:linkphp artisan migrate --seed (it has some seeded data for your testing)npm ci and npm run build/admin and log in with credentials [email protected] and password to manage companies.
The project uses a standard Filament TicketResource for CRUD. The interesting part is the status workflow — each ticket moves through a defined set of statuses, and transitions are enforced by the TicketStatus enum. The sidebar Livewire component sits alongside the edit form, handling all status changes in real time.
The TicketStatus enum defines which transitions are valid from each state. It implements HasLabel and HasColor so Filament renders colored badges automatically.
app/Enums/TicketStatus.php
enum TicketStatus: string implements HasColor, HasLabel{ case Open = 'open'; case InProgress = 'in_progress'; case AwaitingReply = 'awaiting_reply'; case Resolved = 'resolved'; case Closed = 'closed'; case Cancelled = 'cancelled'; public function nextAllowedStatuses(): array { return match ($this) { self::Open => [self::InProgress, self::Cancelled], self::InProgress => [self::AwaitingReply, self::Resolved, self::Cancelled], self::AwaitingReply => [self::InProgress, self::Resolved, self::Cancelled], self::Resolved => [self::Closed], self::Closed, self::Cancelled => [], }; }}
The key points:
Closed and Cancelled return empty arrays, making them true terminal states with no further actions availablegetColor() returns Filament-compatible color strings (blue, amber, purple, etc.) reused by both the table badge columns and the sidebar status cardThe sidebar is a Livewire component embedded directly in the Filament edit page. A single transitionTo() method validates the transition, writes the audit record, and updates the ticket.