diff --git a/packages/panels/docs/06-navigation.md b/packages/panels/docs/06-navigation.md index 3efad6efcb..3730d7742c 100644 --- a/packages/panels/docs/06-navigation.md +++ b/packages/panels/docs/06-navigation.md @@ -486,6 +486,18 @@ MenuItem::make() ->hidden(fn (): bool => ! auth()->user()->can('viewAny', Payment::class)) ``` +### Sending a `POST` HTTP request from a user menu item + +You can send a `POST` HTTP request from a user menu item by passing a URL to the `postAction()` method: + +```php +use Filament\Navigation\MenuItem; + +MenuItem::make() + ->label('Lock session') + ->postAction(fn (): string => route('lock-session')) +``` + ## Disabling breadcrumbs The default layout will show breadcrumbs to indicate the location of the current page within the hierarchy of the app. diff --git a/packages/panels/docs/11-tenancy.md b/packages/panels/docs/11-tenancy.md index 9c23a614e2..7c41371367 100644 --- a/packages/panels/docs/11-tenancy.md +++ b/packages/panels/docs/11-tenancy.md @@ -435,6 +435,18 @@ MenuItem::make() ->hidden(fn (): bool => ! auth()->user()->can('manage-team')) ``` +### Sending a `POST` HTTP request from a tenant menu item + +You can send a `POST` HTTP request from a tenant menu item by passing a URL to the `postAction()` method: + +```php +use Filament\Navigation\MenuItem; + +MenuItem::make() + ->label('Lock session') + ->postAction(fn (): string => route('lock-session')) +``` + ### Hiding the tenant menu You can hide the tenant menu by using the `tenantMenu(false)` diff --git a/packages/panels/resources/views/components/tenant-menu.blade.php b/packages/panels/resources/views/components/tenant-menu.blade.php index 8d3dd02753..e8f2d3ebfb 100644 --- a/packages/panels/resources/views/components/tenant-menu.blade.php +++ b/packages/panels/resources/views/components/tenant-menu.blade.php @@ -116,12 +116,18 @@ @if (count($items)) @foreach ($items as $item) + @php + $itemPostAction = $item->getPostAction(); + @endphp + {{ $item->getLabel() }} diff --git a/packages/panels/resources/views/components/user-menu.blade.php b/packages/panels/resources/views/components/user-menu.blade.php index f28518e402..a14456121e 100644 --- a/packages/panels/resources/views/components/user-menu.blade.php +++ b/packages/panels/resources/views/components/user-menu.blade.php @@ -67,12 +67,18 @@ @foreach ($items as $key => $item) + @php + $itemPostAction = $item->getPostAction(); + @endphp + {{ $item->getLabel() }} diff --git a/packages/panels/src/Navigation/MenuItem.php b/packages/panels/src/Navigation/MenuItem.php index bb16def4b6..20ccc2c130 100644 --- a/packages/panels/src/Navigation/MenuItem.php +++ b/packages/panels/src/Navigation/MenuItem.php @@ -8,6 +8,8 @@ use Laravel\SerializableClosure\Serializers\Native; class MenuItem extends Component { + protected string | Closure | null $postAction = null; + /** * @var string | array{50: string, 100: string, 200: string, 300: string, 400: string, 500: string, 600: string, 700: string, 800: string, 900: string, 950: string} | Closure | null */ @@ -78,6 +80,13 @@ class MenuItem extends Component return $this; } + public function postAction(string | Closure | null $action): static + { + $this->postAction = $action; + + return $this; + } + public function openUrlInNewTab(bool | Closure $condition = true): static { $this->shouldOpenUrlInNewTab = $condition; @@ -141,6 +150,11 @@ class MenuItem extends Component return $this->evaluate($this->url); } + public function getPostAction(): ?string + { + return $this->evaluate($this->postAction); + } + public function shouldOpenUrlInNewTab(): bool { return (bool) $this->evaluate($this->shouldOpenUrlInNewTab);