Skip to content

Commit 7810124

Browse files
committed
Alert when page linked to menu item is deleted.
1 parent 029b1ec commit 7810124

File tree

9 files changed

+116
-8
lines changed

9 files changed

+116
-8
lines changed

README.md

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,28 @@ You can publish and run the migrations with:
5050

5151
```bash
5252
php artisan vendor:publish --tag="filament-flexible-content-block-pages-migrations"
53+
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"
5354
php artisan migrate
5455
```
5556

56-
Configure the Filament tailwind styling by adding these view paths to `tailwind.config.js`:
57+
Configure the Filament tailwind styling of the frontend by adding these view paths to `content` array of `tailwind.config.js`:
5758

58-
```php
59+
```javascript
5960
content: [
6061
...
6162
'./vendor/solution-forest/filament-tree/resources/**/*.blade.php',
6263
'./vendor/statikbe/laravel-filament-flexible-content-block-pages/**/*.blade.php',
64+
'./vendor/statikbe/laravel-filament-flexible-content-blocks/**/*.blade.php',
65+
'./config/filament-flexible-content-blocks.php',
66+
]
67+
```
68+
69+
In the tailwind config of your filament back-end, add the following lines to the `content` array:
70+
71+
```javascript
72+
content: [
73+
...
74+
'./config/filament-flexible-content-blocks.php',
6375
]
6476
```
6577

@@ -164,13 +176,16 @@ To make your models available in the menu builder, add them to the configuration
164176
],
165177
```
166178

167-
Your models should implement the `HasMenuLabel` contract:
179+
Your models should implement the `[HasMenuLabel](src/Models/Contracts/HasMenuLabel.php)` contract and the [HasTitleMenuLabelTrait](src/Models/Concerns/HasTitleMenuLabelTrait.php) trait:
168180

169181
```php
170182
use Statikbe\FilamentFlexibleContentBlockPages\Models\Contracts\HasMenuLabel;
183+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Concerns\HasMenuItemTrait;
171184

172185
class Product extends Model implements HasMenuLabel
173186
{
187+
use HasMenuItemTrait;
188+
174189
public function getMenuLabel(?string $locale = null): string
175190
{
176191
return $this->getTranslation('name', $locale ?? app()->getLocale());
@@ -382,6 +397,7 @@ menu:
382397

383398
page:
384399
- make table searchable, columns orderable, test global search
400+
- laravel scout
385401

386402
release:
387403
- policies:

resources/lang/nl/filament-flexible-content-block-pages.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
'table' => [
1717
'created_at_col' => 'Aangemaakt op',
1818
],
19+
'notifications' => [
20+
'used_in_menu' => 'Deze pagina wordt in het ":menu" menu gebruikt, in item :menu_item. Gelieve eerst het menu aan te passen en dan deze pagina opnieuw te verwijderen.',
21+
],
1922
],
2023
'redirects' => [
2124
'redirects_lbl' => 'redirect',
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Statikbe\FilamentFlexibleContentBlockPages\Models\Concerns;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Database\Eloquent\Relations\MorphOne;
7+
use Statikbe\FilamentFlexibleContentBlockPages\Models\MenuItem;
8+
9+
/**
10+
* @property ?MenuItem $menuItem
11+
*
12+
* @mixin Model
13+
*/
14+
trait HasMenuItemTrait
15+
{
16+
public function menuItem(): MorphOne
17+
{
18+
return $this->morphOne(MenuItem::class, 'linkable', 'linkable_type', 'linkable_id');
19+
}
20+
}

src/Models/Concerns/HasTitleMenuLabelTrait.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
trait HasTitleMenuLabelTrait
66
{
7+
use HasMenuItemTrait;
8+
79
/**
810
* Get the display label for menu items.
911
* This implementation uses the 'title' field with locale support.

src/Models/Contracts/HasMenuLabel.php

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

33
namespace Statikbe\FilamentFlexibleContentBlockPages\Models\Contracts;
44

5+
use Illuminate\Database\Eloquent\Relations\MorphOne;
6+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Concerns\HasMenuItemTrait;
7+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Concerns\HasTitleMenuLabelTrait;
8+
use Statikbe\FilamentFlexibleContentBlockPages\Models\MenuItem;
59
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\Linkable;
610

11+
/**
12+
* @see HasMenuItemTrait for implementation
13+
* @see HasTitleMenuLabelTrait for implementation
14+
*
15+
* @property ?MenuItem $menuItem
16+
*/
717
interface HasMenuLabel extends Linkable
818
{
19+
/**
20+
* Sets the menu item morph relationship.
21+
*
22+
* @see HasMenuItemTrait for a convenient implementation.
23+
*/
24+
public function menuItem(): MorphOne;
25+
926
/**
1027
* Get the display label for menu items.
1128
* This method should return a translatable field value or fallback text.

src/Models/Page.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@
3434
/**
3535
* @property bool $is_undeletable
3636
*/
37-
class Page extends Model implements HasCode, HasContentBlocks, HasHeroImageAttributes, HasIntroAttribute, HasMedia, HasMediaAttributes, HasMenuLabel, HasOverviewAttributes, HasPageAttributes, HasParent, HasSEOAttributes, HasHeroCallToActionsAttribute
37+
class Page extends Model implements HasCode, HasContentBlocks, HasHeroCallToActionsAttribute, HasHeroImageAttributes, HasIntroAttribute, HasMedia, HasMediaAttributes, HasMenuLabel, HasOverviewAttributes, HasPageAttributes, HasParent, HasSEOAttributes
3838
{
3939
use HasAuthorAttributeTrait;
4040
use HasCodeTrait;
4141
use HasDefaultContentBlocksTrait;
4242
use HasFactory;
43+
use HasHeroCallToActionsTrait;
4344
use HasParentTrait;
4445
use HasTitleMenuLabelTrait;
4546
use HasTranslatedContentBlocksTrait;
@@ -49,7 +50,6 @@ class Page extends Model implements HasCode, HasContentBlocks, HasHeroImageAttri
4950
use HasTranslatedPageAttributesTrait;
5051
use HasTranslatedSEOAttributesTrait;
5152
use HasTranslatedSlugAttributeTrait;
52-
use HasHeroCallToActionsTrait;
5353

5454
const HOME_PAGE = 'HOME';
5555

src/Models/Settings.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public static function setting(string $settingField, ?string $locale = null): st
9090
static::CACHE_TAG_SETTINGS,
9191
$cacheKey,
9292
function () use ($settingField) {
93-
$setting = static::getSettings()->getAttribute($settingField);
93+
$setting = static::getSettings()?->getAttribute($settingField);
9494

9595
// replace text params in settings if it is a text field (based on $translatable fields):
9696
if (in_array($settingField, app(static::class)->translatable)) {

src/Resources/PageResource.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@
22

33
namespace Statikbe\FilamentFlexibleContentBlockPages\Resources;
44

5+
use Filament\Actions\Action;
56
use Filament\Forms\Components\Grid;
67
use Filament\Forms\Components\Tabs;
78
use Filament\Forms\Components\Tabs\Tab;
89
use Filament\Forms\Form;
10+
use Filament\Notifications\Notification;
911
use Filament\Resources\Concerns\Translatable;
1012
use Filament\Resources\Resource;
1113
use Filament\Tables\Actions\DeleteBulkAction;
1214
use Filament\Tables\Actions\EditAction;
1315
use Filament\Tables\Columns\TextColumn;
1416
use Filament\Tables\Table;
17+
use Illuminate\Database\Eloquent\Collection;
1518
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
19+
use Statikbe\FilamentFlexibleContentBlockPages\Models\MenuItem;
20+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Page;
1621
use Statikbe\FilamentFlexibleContentBlockPages\Resources\PageResource\Pages\CreatePage;
1722
use Statikbe\FilamentFlexibleContentBlockPages\Resources\PageResource\Pages\EditPage;
1823
use Statikbe\FilamentFlexibleContentBlockPages\Resources\PageResource\Pages\ListPages;
@@ -194,7 +199,32 @@ public static function table(Table $table): Table
194199
ViewAction::make(),
195200
])
196201
->bulkActions([
197-
DeleteBulkAction::make(),
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+
}),
198228
])
199229
->recordUrl(
200230
fn ($record): string => static::getUrl('edit', ['record' => $record])

src/Resources/PageResource/Pages/EditPage.php

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
namespace Statikbe\FilamentFlexibleContentBlockPages\Resources\PageResource\Pages;
44

55
use Filament\Actions\DeleteAction;
6+
use Filament\Notifications\Notification;
67
use Filament\Resources\Pages\EditRecord;
78
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
89
use Statikbe\FilamentFlexibleContentBlockPages\FilamentFlexibleContentBlockPagesConfig;
10+
use Statikbe\FilamentFlexibleContentBlockPages\Models\MenuItem;
911
use Statikbe\FilamentFlexibleContentBlockPages\Models\Page;
1012
use Statikbe\FilamentFlexibleContentBlocks\Filament\Actions\FlexibleLocaleSwitcher;
1113
use Statikbe\FilamentFlexibleContentBlocks\Filament\Pages\EditRecord\Concerns\TranslatableWithMedia;
@@ -26,7 +28,25 @@ protected function getActions(): array
2628
CopyContentBlocksToLocalesAction::make(),
2729
FlexibleLocaleSwitcher::make(),
2830
DeleteAction::make()
29-
->visible(fn (Page $record) => $record->isDeletable()),
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+
}),
3050
];
3151
}
3252

0 commit comments

Comments
 (0)