Right Click by Chris Jones
CommunityAdd native-feeling right-click menus to Filament table rows. Trigger regular Filament actions for single records, or show a separate bulk menu when users right-click selected rows. Actions stay server-enforced, so modals, authorization, validation, redirects, and notifications still work through Filament.
Author:
Chris Jones
Package health
Automated checks of this plugin's Composer package
15 checks
- Passed: GitHub Actions pinned to SHA
- Skipped: GitLab CI includes pinned to SHA
- Passed: Open security advisories
- Passed: Dependabot PR responsiveness — No open Dependabot PRs.
- Skipped: Renovate MR responsiveness
- Warning: Dependabot or Renovate configured — Updater does not cover the JavaScript ecosystem, which has a committed lockfile.
- Passed: Dependency update cooldown configured
- Passed: Provides a security policy
- Passed: Abandoned or archived — No consulted source marks the package abandoned (packagist, github).
- Passed: Commit and release recency — Active: last commit 0 days ago; last release 49 days ago.
-
Passed:
composer.lock not committed by library
—
composer.lockis absent from the released dist archive. - Passed: Dist archive is lean
-
Passed:
Current Laravel version supported
—
Package dependencies resolve together with current Laravel
13.0. -
Passed:
Current PHP version supported
—
Constraint
^8.2supports current PHP8.5. - Skipped: Current Symfony version supported
filament/
namespace. Review the source and install at your own risk. Found
malware or an unresolved security issue the author won't
address?
Report it
.
Documentation
- Installation
- Usage
- Screenshot
- Behavior
- Static menu, server-enforced actions
- Asset loading
- Bulk actions
- Compatibility
- More Filament plugins by Leek
Right-click table row and Flowforge card menus for Filament panels.
This package adds a static right-click menu to Filament table records and, when Flowforge is installed, Kanban board cards. Menu items trigger native Filament actions, so action modals, confirmation, authorization, validation, notifications, redirects, and server-side disabled/hidden checks remain owned by Filament.
#Installation
composer require leek/filament-right-click
php artisan filament:assets
Register the plugin on the panels that should support right-click menus:
use Leek\FilamentRightClick\FilamentRightClickPlugin;
$panel
->plugin(FilamentRightClickPlugin::make());
#Usage
Use contextMenuActions() for single-record row menu items and contextMenuBulkActions() for selected-record menu items:
use Filament\Actions\Action;
use Filament\Actions\BulkAction;
use Filament\Actions\DeleteAction;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
use Leek\FilamentRightClick\Menu\ContextMenuItem;
use Leek\FilamentRightClick\Menu\ContextMenuSection;
use Leek\FilamentRightClick\Menu\ContextMenuSeparator;
public static function table(Table $table): Table
{
return $table
->columns([
// ...
])
->contextMenuActions([
ContextMenuSection::make([
ContextMenuItem::for(
Action::make('archive')
->requiresConfirmation()
->action(fn ($record) => $record->archive()),
)
->label('Archive')
->icon(Heroicon::ArchiveBox)
->color('warning'),
])->label('Manage'),
ContextMenuSeparator::make(),
ContextMenuItem::for(DeleteAction::make())
->label('Delete')
->icon(Heroicon::Trash)
->color('danger'),
])
->contextMenuBulkActions([
ContextMenuItem::forBulkAction(
BulkAction::make('archiveSelected')
->label('Archive Selected')
->requiresConfirmation()
->action(fn ($records) => $records->each->archive()),
)
->icon(Heroicon::ArchiveBox)
->color('warning'),
]);
}
The wrapped actions are registered as table actions, but they are not rendered in the normal row action column. On click, the package calls Filament's table action mounting path for the row record key.
Bulk actions are registered as table bulk actions without rendering in the normal bulk action dropdown. When the right-clicked row is already selected, the bulk menu uses the current Filament selection, including select-all-across-pages state. When the right-clicked row is not selected, the single-record menu opens instead.
#Hiding entries per row
The menu is one payload per table, so an entry cannot evaluate ->visible() for the record under the cursor. Tell the entry which row action it mirrors instead — the browser hides it on rows that do not render that action (hidden for the record, not authorized), because Filament keys every rendered action by name:
->recordActions([
Action::make('viewManual')
->visible(fn (Equipment $record): bool => filled($record->manual))
->url(fn (Equipment $record): string => $record->manualUrl()),
])
->contextMenuActions([
ContextMenuItem::for(
Action::make('contextViewManual')
->url(fn (Equipment $record): string => $record->manualUrl())
)
->label('Open manual')
->mirrors('viewManual'),
])
Separators left dangling by hidden entries are dropped, and a section or submenu whose entries are all hidden disappears with them.
#Flowforge cards
If relaticle/flowforge is installed, the plugin also registers a contextMenuCardActions() macro on Flowforge boards:
use Filament\Actions\Action;
use Filament\Support\Icons\Heroicon;
use Leek\FilamentRightClick\Menu\ContextMenuItem;
use Relaticle\Flowforge\Board;
public function board(Board $board): Board
{
return $board
->query(Task::query())
->columns([
// ...
])
->recordActions([
// Visible card actions...
])
->contextMenuCardActions([
ContextMenuItem::for(
Action::make('viewTask')
->label('View Task')
->action(fn ($record) => $this->viewTask($record)),
)
->icon(Heroicon::Eye),
ContextMenuItem::for(
Action::make('archiveTask')
->requiresConfirmation()
->action(fn ($record) => $record->archive()),
)
->label('Archive')
->icon(Heroicon::ArchiveBox)
->color('warning'),
]);
}
Flowforge card context actions are registered with Filament's action cache, but they are not added to Flowforge's visible card action group. On click, the package calls Flowforge's native card action mounting path with the card's recordKey.
#Nested submenus
Use ContextMenuSubmenu for Linear-style flyouts. The parent row is not an action — it only opens a child menu. Nested leaf items still mount the same Filament action paths as top-level items. Submenus may nest further submenus, sections, separators, and items.
use Filament\Actions\Action;
use Filament\Support\Icons\Heroicon;
use Leek\FilamentRightClick\Menu\ContextMenuItem;
use Leek\FilamentRightClick\Menu\ContextMenuSeparator;
use Leek\FilamentRightClick\Menu\ContextMenuSubmenu;
->contextMenuCardActions([
ContextMenuSubmenu::make([
ContextMenuItem::for(Action::make('setStatusTodo')->action(...))
->label('Todo')
->icon(Heroicon::CircleStack),
ContextMenuItem::for(Action::make('setStatusDone')->action(...))
->label('Done')
->icon(Heroicon::CheckCircle),
])
->label('Status')
->icon(Heroicon::Flag),
ContextMenuSubmenu::make([
ContextMenuItem::for(Action::make('setPriorityHigh')->action(...))
->label('High')
->color('warning'),
ContextMenuItem::for(Action::make('setPriorityLow')->action(...))
->label('Low'),
])
->label('Priority')
->icon(Heroicon::Signal),
ContextMenuSeparator::make(),
ContextMenuItem::for(Action::make('assign')->action(...))
->label('Assign')
->icon(Heroicon::UserPlus),
]);
Keyboard: ArrowRight / Enter opens a submenu, ArrowLeft / Escape closes it, arrow keys move within the active panel. Pointer: hover or click the parent row to open the flyout; leaving parent + flyout closes it.
ContextMenuSection remains an inline labeled group (children render in the same panel). Prefer ContextMenuSubmenu when the option list should stay off the root menu until requested.
#Trigger a workflow (Filament Workflow Engine)
Because context menu items wrap native Filament actions, any action works — including the TriggerWorkflowAction shipped by Filament Workflow Engine. If leek/filament-workflows is installed, drop it into a row menu to let users run a manual workflow against the right-clicked record:
use Filament\Support\Icons\Heroicon;
use Leek\FilamentRightClick\Menu\ContextMenuItem;
use Leek\FilamentWorkflows\Filament\Actions\TriggerWorkflowAction;
->contextMenuActions([
ContextMenuItem::for(
TriggerWorkflowAction::make(),
)
->label('Run Workflow')
->icon(Heroicon::Play),
]);
The action opens Workflow Engine's own modal, filtered to manual workflows configured for that record's model, and queues the run — all authorization, rate limiting, and notifications stay owned by the Workflow Engine. No wiring is required beyond installing both packages.
#Screenshot
#Behavior
- Right-click opens the menu anywhere on a table row except existing interactive controls.
- The browser context menu is only suppressed for rows in tables with configured right-click actions.
ContextMenukeyboard key andShift+F10open the menu for the focused or last-hovered row.Escapecloses the menu, arrow keys move through items, andEnter/Spacetrigger the focused item.- Touch and long-press gestures are intentionally not included in v1.
#Static menu, server-enforced actions
The menu label, icon, and color are static metadata on ContextMenuItem. The underlying Filament action still decides whether the operation can run for the specific record.
If a right-click item points to an action that is hidden, disabled, or unauthorized for a row, Filament will refuse to mount it. The menu closes and no client-side policy decision is made.
#Asset loading
Assets are registered as loadedOnRequest() and are requested only by tables that use contextMenuActions() or contextMenuBulkActions().
If you publish or bundle assets in your own build pipeline, keep the DOM contract intact:
- table root record menu:
data-filament-right-click-record-config - table root bulk menu:
data-filament-right-click-bulk-config - legacy table root record menu:
data-filament-right-click-config - Flowforge board card menu:
data-filament-right-click-flowforge-card-config - row key source: Filament's native row
wire:key - Flowforge card key source:
data-card-id - record action call:
mountTableAction(actionName, recordKey) - Flowforge card action call:
mountAction(actionName, [], { recordKey }) - bulk action call: synchronize Filament's selected table record properties, then mount the bulk action
#Bulk actions
Use contextMenuBulkActions() with ContextMenuItem::forBulkAction() or pass a BulkAction directly:
use Filament\Actions\BulkAction;
use Leek\FilamentRightClick\Menu\ContextMenuItem;
$table->contextMenuBulkActions([
ContextMenuItem::forBulkAction(
BulkAction::make('deleteSelected')
->label('Delete Selected')
->requiresConfirmation()
->action(fn ($records) => $records->each->delete()),
)
->color('danger'),
]);
Bulk actions are still server-enforced by Filament. Hidden, disabled, and unauthorized actions will not mount.
#Compatibility
This package requires Filament 5.6.4 or later. For Filament v4, install the 1.x line: composer require leek/filament-right-click:^1.5.
Flowforge support is optional and is registered only when Relaticle\Flowforge\Board exists.
Record actions use Filament's table action mounting path. Bulk actions use the newer unified mountAction() path when available and fall back to Filament's table bulk action compatibility method.
#More Filament plugins by Leek
Premium
- Filament UI Plus — Enhanced UI components: dual sub-navigation, animated sidebar, horizontal-scroll tables, loading bar, and more.
- Filament Workflow Engine — Automated workflows with a visual builder, triggers/actions, async execution, and audit logging.
- Filament Decision Tables — Business rules engine with spreadsheet-style decision tables.
Free & open source
- Filament Header Filters — Inline filters attached to table column headers.
- Filament Subtenant Scope — Second-level tenancy scoping via a topnav dropdown.
- Filament DiceBear — DiceBear avatar provider with 31 styles.
The author
Web Application Architect and Developer with a passion for helping businesses make sense of web-based technology and its numerous applications.
From the same author
DiceBear Avatars
DiceBear avatar provider for Filament panels with 31 avatar styles, disk caching, and per-model customization.
Author:
Chris Jones
Header Filters
Inline header filters for Filament tables. Attach any BaseFilter to a column header — select dropdowns, date pickers, min/max ranges, custom multi-field schemas — as a richer alternative to searchable(isIndividual: true).
Author:
Chris Jones
Subtenant Scope
Second-level tenancy scope (service area, region, location) for Filament panels — topnav dropdown that scopes Eloquent queries globally.
Author:
Chris Jones
Decision Tables (Rules Engine)
A visual rules engine for Filament v4 that lets users create and manage complex decision logic - no code required.
Author:
Chris Jones
Featured Plugins
A selection of plugins curated by the Filament team
Soft Theme
A theme that gives panels a warm, approachable look with rounded shapes, gentle colors, and serif headings.
Filament
Advanced Tables (formerly Filter Sets)
Supercharge your tables with powerful features like user-customizable views, quick filters, multi-column sorting, advanced table searching, convenient view management, and more. Compatible with Resource Panel Tables, Relation Managers, Table Widgets, and Table Builder!
Kenneth Sese
Custom Dashboards
Let your users build and share their own dashboards with a drag-and-drop interface. Define your data sources in PHP and let them do the rest.
Filament