aymanalhattami/filament-context-menu
Composer 安装命令:
composer require aymanalhattami/filament-context-menu
包简介
context menu (right click menu) for filament
关键字:
README 文档
README
Add a context menu (right click menu) for resource pages, custom pages and table cells of Filament Admin Panel.
- It uses Filament Actions to set menu actions.
- It supports dark and light modes.
- It supports left-to-right and right-to-left direction.
- You can set a divider between menu actions.
- It supports resource pages and custom pages.
- You can set a context menu for table cells.
- Three actions are available for usage in the page context menu:
AymanAlhattami\FilamentContextMenu\Actions\RefreshActionto refresh the page.AymanAlhattami\FilamentContextMenu\Actions\GoBackActionto go back to the previous page.AymanAlhattami\FilamentContextMenu\Actions\GoForwardto go back to the forward page.
Demo project | Youtube video | Laravel Daily (Povilas Korop) Video
Note:
For Filament 5.x
For Filament 4.x
For Filament 3.x
Installation
Version 1 for Filament version 3 | Version 2 for Filament version 4 | Version 3 for Filament version 5
You can install the package via Composer:
composer require aymanalhattami/filament-context-menu
Usage 1: resource pages and custom pages
- Add the trait
AymanAlhattami\FilamentContextMenu\PageHasContextMenuto the page you want to add the context menu. - Then, define a
getContextMenuActionsmethod inside the page, the method should return an array of Filament Actions
use App\Filament\Resources\UserResource\Pages\CreateUser; use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Actions\Action; use Filament\Resources\Pages\ListRecords; class ListUsers extends ListRecords { use PageHasContextMenu; public function getContextMenuActions(): array { return [ Action::make('Create user') ->url(CreateUser::getUrl()) ]; } // }
Divider
You can use AymanAlhattami\FilamentContextMenu\ContextMenuDivider to set divider between menu actions
use App\Filament\Resources\UserResource\Pages\CreateUser; use App\Filament\Resources\UserResource\Pages\TrashedUsers; use AymanAlhattami\FilamentContextMenu\ContextMenuDivider; use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Actions\Action; use Filament\Resources\Pages\ListRecords; class ListUsers extends ListRecords { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ Action::make('Create user') ->url(CreateUser::getUrl()), ContextMenuDivider::make(), Action::make('Trashed user') ->url(TrashedUsers::getUrl()), ]; } // }
Create Action
You can use Filament\Actions\CreateAction, visit filament create action for more information.
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ListRecords; use Filament\Actions\CreateAction; class ListUsers extends ListRecords { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ CreateAction::make() ->model(App\Models\User::class) ->form([ TextInput::make('name') ->required(), // ... ]) ]; } // }
Edit Action
You can use Filament\Actions\EditAction, visit filament edit action for more information.
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ViewRecord; use Filament\Actions\EditAction; class ViewUser extends ViewRecord { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ EditAction::make() ->record($this->user) ->form([ TextInput::make('name') ->required(), // ... ]) ]; } // }
View Action
You can use Filament\Actions\ViewAction, visit filament view action for more information.
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\EditRecord; use Filament\Actions\ViewAction; class EditUser extends EditRecord { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ ViewAction::make() ->record($this->user) ->form([ TextInput::make('name') ->required(), // ... ]) ]; } // }
Delete Action
You can use Filament\Actions\DeleteAction, visit filament delete action for more information.
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ViewRecord; use Filament\Actions\DeleteAction; class ViewUser extends ViewRecord { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ DeleteAction::make() ->record($this->user) ]; } // }
Replicate Action
You can use Filament\Actions\ReplicateAction, visit filament replicate action for more information.
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ViewRecord; use Filament\Actions\ReplicateAction; class ViewUser extends ViewRecord { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ ReplicateAction::make() ->record($this->user) ]; } // }
Force Delete Action
You can use Filament\Actions\ForceDeleteAction, visit filament force delete action for more information.
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ViewRecord; use Filament\Actions\ForceDeleteAction; class ViewUser extends ViewRecord { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ ForceDeleteAction::make() ->record($this->user) ]; } // }
Restore Action
You can use Filament\Actions\RestoreAction, visit filament restore action for more information.
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ListRecords; use Filament\Actions\RestoreAction; class ListUsers extends ListRecords { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ RestoreAction::make() ->record($this->user) ]; } // }
Import Action
You can use Filament\Actions\ImportAction, visit filament import action for more information.
use App\Filament\Imports\UserImporter; use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ListRecords; use Filament\Actions\ImportAction; class ListUsers extends ListRecords { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ ImportAction::make() ->importer(UserImporter::class) ]; } // }
Export Action
You can use Filament\Actions\ExportAction, visit filament export action for more information.
use App\Filament\Exports\UserExporter; use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ListRecords; use Filament\Actions\ExportAction; class ListUsers extends ListRecords { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ ExportAction::make() ->exporter(UserExporter::class) ]; } // }
Example: action with modal
You can use filament action with modal
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ViewRecord; use Filament\Actions\Action; class ViewUser extends ViewRecord { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ Action::make('Quick edit user') ->form([ \Filament\Forms\Components\Grid::make(2) ->schema([ TextInput::make('name'), TextInput::make('email'), ]) ]) ->action(function($data){ $this->getRecord()->update([ 'name' => $data['name'], 'email' => $data['email'], ]); }) ]; } // }
Example: refresh, go back and go forward actions
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ViewRecord; use AymanAlhattami\FilamentContextMenu\Actions\{ RefreshAction, GoBackAction, GoForwardAction}; class ViewUser extends ViewRecord { use PageHasContextMenu; // public static function getContextMenuActions(): array { return [ RefreshAction::make(), GoBackAction::make(), GoForwardAction::make() ]; } // }
Enable / Disable context menu in resource pages and custom pages
Method 1: To globally enable or disable the context menu, you need to define an env variable called CONTEXT_MENU_ENABLED and to set the value to true or false.
Method 2: You can also define a static variable called public static bool $contextMenuEnabled in the page and set the value to true or false;
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ViewRecord; class ViewUser extends ViewRecord { use PageHasContextMenu; # enable / disable context menu public static bool $contextMenuEnabled = true; // public static function getContextMenuActions(): array { return []; } // }
Method 3: define a static method called isContextMenuEnabled in the page
use AymanAlhattami\FilamentContextMenu\Traits\PageHasContextMenu; use Filament\Resources\Pages\ViewRecord; class ViewUser extends ViewRecord { use PageHasContextMenu; public static function isContextMenuEnabled(): bool { return true; } // public static function getContextMenuActions(): array { return []; } // }
Usage 2: table cells
To add a context menu to the table cell, you can use the following columns:
AymanAlhattami\FilamentContextMenu\Columns\ContextMenuTextColumn; AymanAlhattami\FilamentContextMenu\Columns\ContextMenuCheckboxColumn; AymanAlhattami\FilamentContextMenu\Columns\ContextMenuSelectColumn; AymanAlhattami\FilamentContextMenu\Columns\ContextMenuColorColumn; AymanAlhattami\FilamentContextMenu\Columns\ContextMenuIconColumn; AymanAlhattami\FilamentContextMenu\Columns\ContextMenuImageColumn; AymanAlhattami\FilamentContextMenu\Columns\ContextMenuTextInputColumn; AymanAlhattami\FilamentContextMenu\Columns\ContextMenuToggleColumn;
use Filament\Tables\Table; use Filament\Actions\Action; use AymanAlhattami\FilamentContextMenu\Columns\ContextMenuTextColumn; use App\Filament\Resources\UserResource\Pages\{ ViewUser, EditUser }; // public static function table(Table $table): Table { return $table ->columns([ ContextMenuTextColumn::make('id') ->searchable() ->contextMenuActions(fn (Model $record) => [ Action::make('View user') ->url(ViewUser::getUrl(['record' => $record])) ->link() ->icon('heroicon-o-user'), ]), ContextMenuTextColumn::make('name') ->searchable() ->contextMenuActions(fn (Model $record) => [ Action::make('View user') ->url(Pages\ViewUser::getUrl(['record' => $record])) ->link() ->icon('heroicon-o-user'), Action::make('Edit user') ->url(Pages\EditUser::getUrl(['record' => $record])) ->link() ->icon('heroicon-o-pencil'), ]) , , ]) }
Use AymanAlhattami\FilamentContextMenu\ContextMenuDivider to set a divider between menu actions.
enable / disable table cell context menu
Use ->contextMenuEnabled() method to enable/disable the context menu for the table cell.
// public static function table(Table $table): Table { return $table ->columns([ ContextMenuTextColumn::make('id') ->contextMenuEnabled(false) ->contextMenuActions(fn (Model $record) => [ Action::make('View user') ->url(ViewUser::getUrl(['record' => $record])) ->link() ->icon('heroicon-o-user'), ]), //
Note
For action to have a nice style, use ->link() method of the action, more information
public static function getContextMenuActions(): array { return [ Action::make('Create user') ->url(CreateUser::getUrl()) ->link() ]; }
Testing
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
License
The MIT License (MIT). Please see License File for more information.
aymanalhattami/filament-context-menu 适用场景与选型建议
aymanalhattami/filament-context-menu 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 39.47k 次下载、GitHub Stars 达 99, 最近一次更新时间为 2024 年 04 月 27 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「laravel」 「context menu」 「filament」 「ayman alhattami」 「filament_context_menu」 「filament admin panel」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 aymanalhattami/filament-context-menu 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 aymanalhattami/filament-context-menu 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 aymanalhattami/filament-context-menu 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Behat Context for testing Symfony Api
Context support (request, session and application scope) for n2n framework.
A Symfony extension to get active class base on current bundle/controller/action
Standalone CLI that generates codebase context (JSON + Markdown) for AI agents.
A library providing abstract implementations of various persistence layers based on JSON API relational resource concepts.
Extends JSON format with custom keys containing additional constraints.
统计信息
- 总下载量: 39.47k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 99
- 点击次数: 28
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2024-04-27