Skip to content

Commit df21326

Browse files
committed
Alert when page linked to menu item is deleted: refactored to separate action classes
1 parent 5d4c22d commit df21326

File tree

4 files changed

+93
-55
lines changed

4 files changed

+93
-55
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace Statikbe\FilamentFlexibleContentBlockPages\Actions;
4+
5+
use Filament\Actions\Action;
6+
use Filament\Notifications\Notification;
7+
use Filament\Tables\Actions\DeleteBulkAction;
8+
use Illuminate\Database\Eloquent\Collection;
9+
use Illuminate\Database\Eloquent\Model;
10+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Contracts\HasMenuLabel;
11+
use Statikbe\FilamentFlexibleContentBlockPages\Models\MenuItem;
12+
13+
/**
14+
* Bulk delete action with extra check to see if the model is linked to a menu item.
15+
*/
16+
class LinkedToMenuItemBulkDeleteAction extends DeleteBulkAction
17+
{
18+
public function setUp(): void
19+
{
20+
parent::setUp();
21+
22+
$this->action(function (Collection $records, Action $action) {
23+
$usedInMenu = false;
24+
foreach ($records as $record) {
25+
/** @var Model&HasMenuLabel $record */
26+
// Prevent deletion if the page is referenced by a menu item
27+
/** @var ?MenuItem $menuItem */
28+
$menuItem = $record->menuItem;
29+
30+
if ($menuItem) {
31+
$usedInMenu = true;
32+
33+
Notification::make()
34+
->title(flexiblePagesTrans('pages.notifications.used_in_menu', [
35+
'menu' => $menuItem->menu->name,
36+
'menu_item' => $menuItem->getDisplayLabel(),
37+
]))
38+
->danger()
39+
->send();
40+
}
41+
}
42+
43+
if (! $usedInMenu) {
44+
$this->process(static fn (Collection $records) => $records->each(fn (Model&HasMenuLabel $record) => $record->delete()));
45+
$action->success();
46+
}
47+
});
48+
}
49+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace Statikbe\FilamentFlexibleContentBlockPages\Actions;
4+
5+
use Filament\Actions\DeleteAction;
6+
use Filament\Notifications\Notification;
7+
use Illuminate\Database\Eloquent\Model;
8+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Contracts\HasMenuLabel;
9+
use Statikbe\FilamentFlexibleContentBlockPages\Models\MenuItem;
10+
11+
/**
12+
* Delete action with extra check to see if the model is linked to a menu item.
13+
*/
14+
class LinkedToMenuItemDeleteAction extends DeleteAction
15+
{
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
$this->action(function (Model&HasMenuLabel $record, $action) {
21+
// Prevent deletion if the page is referenced by a menu item
22+
/** @var ?MenuItem $menuItem */
23+
$menuItem = $record->menuItem;
24+
25+
if ($menuItem) {
26+
Notification::make()
27+
->title(flexiblePagesTrans('pages.notifications.used_in_menu', [
28+
'menu' => $menuItem->menu->name,
29+
'menu_item' => $menuItem->getDisplayLabel(),
30+
]))
31+
->danger()
32+
->send();
33+
} else {
34+
$record->delete();
35+
$action->success();
36+
}
37+
});
38+
}
39+
}

src/Resources/PageResource.php

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,17 @@
22

33
namespace Statikbe\FilamentFlexibleContentBlockPages\Resources;
44

5-
use Filament\Actions\Action;
65
use Filament\Forms\Components\Grid;
76
use Filament\Forms\Components\Tabs;
87
use Filament\Forms\Components\Tabs\Tab;
98
use Filament\Forms\Form;
10-
use Filament\Notifications\Notification;
119
use Filament\Resources\Concerns\Translatable;
1210
use Filament\Resources\Resource;
13-
use Filament\Tables\Actions\DeleteBulkAction;
1411
use Filament\Tables\Actions\EditAction;
1512
use Filament\Tables\Columns\TextColumn;
1613
use Filament\Tables\Table;
17-
use Illuminate\Database\Eloquent\Collection;
14+
use Statikbe\FilamentFlexibleContentBlockPages\Actions\LinkedToMenuItemBulkDeleteAction;
1815
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
19-
use Statikbe\FilamentFlexibleContentBlockPages\Models\MenuItem;
20-
use Statikbe\FilamentFlexibleContentBlockPages\Models\Page;
2116
use Statikbe\FilamentFlexibleContentBlockPages\Resources\PageResource\Pages\CreatePage;
2217
use Statikbe\FilamentFlexibleContentBlockPages\Resources\PageResource\Pages\EditPage;
2318
use Statikbe\FilamentFlexibleContentBlockPages\Resources\PageResource\Pages\ListPages;
@@ -199,32 +194,7 @@ public static function table(Table $table): Table
199194
ViewAction::make(),
200195
])
201196
->bulkActions([
202-
DeleteBulkAction::make()
203-
->action(function (Collection $records, Action $action) {
204-
$usedInMenu = false;
205-
foreach ($records as $record) {
206-
// Prevent deletion if the page is referenced by a menu item
207-
/** @var ?MenuItem $menuItem */
208-
$menuItem = $record->menuItem();
209-
210-
if ($menuItem) {
211-
$usedInMenu = true;
212-
213-
Notification::make()
214-
->title(flexiblePagesTrans('pages.notifications.used_in_menu', [
215-
'menu' => $menuItem->menu->name,
216-
'menu_item' => $menuItem->getDisplayLabel(),
217-
]))
218-
->danger()
219-
->send();
220-
}
221-
}
222-
223-
if (! $usedInMenu) {
224-
$this->process(static fn (Collection $records) => $records->each(fn (Page $record) => $record->delete()));
225-
$action->success();
226-
}
227-
}),
197+
LinkedToMenuItemBulkDeleteAction::make(),
228198
])
229199
->recordUrl(
230200
fn ($record): string => static::getUrl('edit', ['record' => $record])

src/Resources/PageResource/Pages/EditPage.php

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
namespace Statikbe\FilamentFlexibleContentBlockPages\Resources\PageResource\Pages;
44

5-
use Filament\Actions\DeleteAction;
6-
use Filament\Notifications\Notification;
75
use Filament\Resources\Pages\EditRecord;
6+
use Statikbe\FilamentFlexibleContentBlockPages\Actions\LinkedToMenuItemDeleteAction;
87
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
98
use Statikbe\FilamentFlexibleContentBlockPages\FilamentFlexibleContentBlockPagesConfig;
10-
use Statikbe\FilamentFlexibleContentBlockPages\Models\MenuItem;
119
use Statikbe\FilamentFlexibleContentBlockPages\Models\Page;
1210
use Statikbe\FilamentFlexibleContentBlocks\Filament\Actions\FlexibleLocaleSwitcher;
1311
use Statikbe\FilamentFlexibleContentBlocks\Filament\Pages\EditRecord\Concerns\TranslatableWithMedia;
@@ -27,26 +25,8 @@ protected function getActions(): array
2725
return [
2826
CopyContentBlocksToLocalesAction::make(),
2927
FlexibleLocaleSwitcher::make(),
30-
DeleteAction::make()
31-
->visible(fn (Page $record) => $record->isDeletable())
32-
->action(function (Page $record, $action) {
33-
// Prevent deletion if the page is referenced by a menu item
34-
/** @var ?MenuItem $menuItem */
35-
$menuItem = $record->menuItem();
36-
37-
if ($menuItem) {
38-
Notification::make()
39-
->title(flexiblePagesTrans('pages.notifications.used_in_menu', [
40-
'menu' => $menuItem->menu->name,
41-
'menu_item' => $menuItem->getDisplayLabel(),
42-
]))
43-
->danger()
44-
->send();
45-
} else {
46-
$record->delete();
47-
$action->success();
48-
}
49-
}),
28+
LinkedToMenuItemDeleteAction::make()
29+
->visible(fn (Page $record) => $record->isDeletable()),
5030
];
5131
}
5232

0 commit comments

Comments
 (0)