Skip to content

Commit 0788930

Browse files
committed
refactor: improve menu system UX and code organization
- Rename MenuItemField to MenuItemForm for better clarity - Move MenuItemForm to Forms namespace for better organization - Replace all manual redirects with Livewire event dispatching - Convert custom event notifications to Filament Notifications - Remove deprecated getMenuTheme() method from config - Add redirect to list view after saving menus Improvements: * MenuItemField → MenuItemForm reflects actual purpose as form builder * Eliminated jarring page reloads in menu item CRUD operations * Consistent notification system using Filament's native patterns * Smoother user experience with reactive UI updates * Better code organization with proper namespacing
1 parent 36c2811 commit 0788930

File tree

2 files changed

+106
-85
lines changed

2 files changed

+106
-85
lines changed

src/Filament/Form/Fields/MenuItemField.php renamed to src/Filament/Form/Forms/MenuItemForm.php

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace Statikbe\FilamentFlexibleContentBlockPages\Filament\Form\Fields;
3+
namespace Statikbe\FilamentFlexibleContentBlockPages\Filament\Form\Forms;
44

55
use Filament\Forms\Components\Grid;
66
use Filament\Forms\Components\Hidden;
@@ -14,7 +14,7 @@
1414
use Statikbe\FilamentFlexibleContentBlockPages\Filament\Form\Fields\Types\UrlMenuItemType;
1515
use Statikbe\FilamentFlexibleContentBlockPages\Models\Contracts\HasMenuLabel;
1616

17-
class MenuItemField
17+
class MenuItemForm
1818
{
1919
const FIELD_LINK_TYPE = 'link_type';
2020

@@ -36,36 +36,38 @@ class MenuItemField
3636

3737
protected static ?array $types = null;
3838

39-
public static function create(): Grid
39+
public static function getSchema(): array
4040
{
41-
return Grid::make(2)->schema([
42-
// Basic Information Section
43-
Grid::make(1)->schema([
44-
static::getLinkTypeField(),
45-
static::getLabelField(),
46-
static::getUseModelTitleField(),
47-
])->columnSpan(1),
48-
49-
// Link Configuration Section
50-
Grid::make(1)->schema([
51-
static::getLinkableField(),
52-
static::getUrlField(),
53-
static::getRouteField(),
54-
])->columnSpan(1),
55-
56-
// Additional Options Section
41+
return [
5742
Grid::make(2)->schema([
58-
static::getTargetField(),
59-
static::getIconField(),
60-
static::getVisibilityField(),
61-
])->columnSpan(2),
62-
63-
// Hidden fields for nested set
64-
Hidden::make('menu_id'),
65-
Hidden::make('parent_id'),
66-
Hidden::make('_lft'),
67-
Hidden::make('_rgt'),
68-
]);
43+
// Basic Information Section
44+
Grid::make(1)->schema([
45+
static::getLinkTypeField(),
46+
static::getLabelField(),
47+
static::getUseModelTitleField(),
48+
])->columnSpan(1),
49+
50+
// Link Configuration Section
51+
Grid::make(1)->schema([
52+
static::getLinkableField(),
53+
static::getUrlField(),
54+
static::getRouteField(),
55+
])->columnSpan(1),
56+
57+
// Additional Options Section
58+
Grid::make(2)->schema([
59+
static::getTargetField(),
60+
static::getIconField(),
61+
static::getVisibilityField(),
62+
])->columnSpan(2),
63+
64+
// Hidden fields for nested set
65+
Hidden::make('menu_id'),
66+
Hidden::make('parent_id'),
67+
Hidden::make('_lft'),
68+
Hidden::make('_rgt'),
69+
]),
70+
];
6971
}
7072

7173
protected static function getLinkTypeField(): Select

src/Resources/MenuResource/Pages/ManageMenuItems.php

Lines changed: 74 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use Filament\Resources\Pages\Page;
1414
use Illuminate\Support\Facades\Schema;
1515
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
16-
use Statikbe\FilamentFlexibleContentBlockPages\Filament\Form\Fields\MenuItemField;
16+
use Statikbe\FilamentFlexibleContentBlockPages\Filament\Form\Forms\MenuItemForm;
1717
use Statikbe\FilamentFlexibleContentBlockPages\Resources\MenuResource;
1818

1919
class ManageMenuItems extends Page implements HasActions, HasForms
@@ -139,7 +139,7 @@ public function editMenuItemAction(): Action
139139

140140
protected function getMenuItemFormSchema(): array
141141
{
142-
return MenuItemField::create()->getSchema();
142+
return MenuItemForm::getSchema();
143143
}
144144

145145
public function deleteMenuItem(int $itemId): void
@@ -148,9 +148,10 @@ public function deleteMenuItem(int $itemId): void
148148
$item = $this->getMenuItemSecurely($itemId);
149149

150150
if (! $item) {
151-
$this->dispatch('show-error', [
152-
'message' => flexiblePagesTrans('menu_items.errors.item_not_found'),
153-
]);
151+
Notification::make()
152+
->title(flexiblePagesTrans('menu_items.errors.item_not_found'))
153+
->danger()
154+
->send();
154155

155156
return;
156157
}
@@ -169,16 +170,19 @@ public function deleteMenuItem(int $itemId): void
169170
$item->delete();
170171

171172
$this->dispatch('menu-items-updated');
172-
$this->dispatch('show-success', [
173-
'message' => flexiblePagesTrans('menu_items.messages.item_deleted'),
174-
]);
173+
174+
Notification::make()
175+
->title(flexiblePagesTrans('menu_items.messages.item_deleted'))
176+
->success()
177+
->send();
175178

176179
} catch (Exception $e) {
177-
$this->dispatch('show-error', [
178-
'message' => flexiblePagesTrans('menu_items.errors.delete_failed', [
180+
Notification::make()
181+
->title(flexiblePagesTrans('menu_items.errors.delete_failed', [
179182
'error' => $e->getMessage(),
180-
]),
181-
]);
183+
]))
184+
->danger()
185+
->send();
182186
}
183187
}
184188

@@ -192,21 +196,25 @@ public function confirmDeleteWithChildren(int $itemId): void
192196
$item->delete();
193197

194198
$this->dispatch('menu-items-updated');
195-
$this->dispatch('show-success', [
196-
'message' => flexiblePagesTrans('menu_items.messages.item_and_children_deleted'),
197-
]);
199+
200+
Notification::make()
201+
->title(flexiblePagesTrans('menu_items.messages.item_and_children_deleted'))
202+
->success()
203+
->send();
198204
} else {
199-
$this->dispatch('show-error', [
200-
'message' => flexiblePagesTrans('menu_items.errors.item_not_found'),
201-
]);
205+
Notification::make()
206+
->title(flexiblePagesTrans('menu_items.errors.item_not_found'))
207+
->danger()
208+
->send();
202209
}
203210

204211
} catch (Exception $e) {
205-
$this->dispatch('show-error', [
206-
'message' => flexiblePagesTrans('menu_items.errors.delete_failed', [
212+
Notification::make()
213+
->title(flexiblePagesTrans('menu_items.errors.delete_failed', [
207214
'error' => $e->getMessage(),
208-
]),
209-
]);
215+
]))
216+
->danger()
217+
->send();
210218
}
211219
}
212220

@@ -217,9 +225,10 @@ public function reorderMenuItems(array $orderedItems): void
217225
->getMenuItemModel();
218226

219227
if (empty($orderedItems)) {
220-
$this->dispatch('show-error', [
221-
'message' => flexiblePagesTrans('menu_items.errors.no_items_to_reorder'),
222-
]);
228+
Notification::make()
229+
->title(flexiblePagesTrans('menu_items.errors.no_items_to_reorder'))
230+
->danger()
231+
->send();
223232

224233
return;
225234
}
@@ -231,9 +240,10 @@ public function reorderMenuItems(array $orderedItems): void
231240
->count();
232241

233242
if ($validItems !== count($itemIds)) {
234-
$this->dispatch('show-error', [
235-
'message' => flexiblePagesTrans('menu_items.errors.invalid_items_in_reorder'),
236-
]);
243+
Notification::make()
244+
->title(flexiblePagesTrans('menu_items.errors.invalid_items_in_reorder'))
245+
->danger()
246+
->send();
237247

238248
return;
239249
}
@@ -242,16 +252,19 @@ public function reorderMenuItems(array $orderedItems): void
242252
$this->processNestedSetReorder($orderedItems);
243253

244254
$this->dispatch('menu-items-updated');
245-
$this->dispatch('show-success', [
246-
'message' => flexiblePagesTrans('menu_items.messages.items_reordered'),
247-
]);
255+
256+
Notification::make()
257+
->title(flexiblePagesTrans('menu_items.messages.items_reordered'))
258+
->success()
259+
->send();
248260

249261
} catch (Exception $e) {
250-
$this->dispatch('show-error', [
251-
'message' => flexiblePagesTrans('menu_items.errors.reorder_failed', [
262+
Notification::make()
263+
->title(flexiblePagesTrans('menu_items.errors.reorder_failed', [
252264
'error' => $e->getMessage(),
253-
]),
254-
]);
265+
]))
266+
->danger()
267+
->send();
255268
}
256269
}
257270

@@ -389,28 +402,31 @@ public function moveMenuItem(int $itemId, ?int $newParentId = null, ?int $afterI
389402
try {
390403
$item = $this->getMenuItemSecurely($itemId);
391404
if (! $item) {
392-
$this->dispatch('show-error', [
393-
'message' => flexiblePagesTrans('menu_items.errors.item_not_found'),
394-
]);
405+
Notification::make()
406+
->title(flexiblePagesTrans('menu_items.errors.item_not_found'))
407+
->danger()
408+
->send();
395409

396410
return;
397411
}
398412

399413
// Validate depth constraints
400414
if (! $this->validateMenuDepth($itemId, $newParentId)) {
401-
$this->dispatch('show-error', [
402-
'message' => flexiblePagesTrans('menu_items.errors.max_depth_exceeded'),
403-
]);
415+
Notification::make()
416+
->title(flexiblePagesTrans('menu_items.errors.max_depth_exceeded'))
417+
->danger()
418+
->send();
404419

405420
return;
406421
}
407422

408423
if ($newParentId) {
409424
$parent = $this->getMenuItemSecurely($newParentId);
410425
if (! $parent) {
411-
$this->dispatch('show-error', [
412-
'message' => flexiblePagesTrans('menu_items.errors.parent_not_found'),
413-
]);
426+
Notification::make()
427+
->title(flexiblePagesTrans('menu_items.errors.parent_not_found'))
428+
->danger()
429+
->send();
414430

415431
return;
416432
}
@@ -440,16 +456,19 @@ public function moveMenuItem(int $itemId, ?int $newParentId = null, ?int $afterI
440456
}
441457

442458
$this->dispatch('menu-items-updated');
443-
$this->dispatch('show-success', [
444-
'message' => flexiblePagesTrans('menu_items.messages.item_moved'),
445-
]);
459+
460+
Notification::make()
461+
->title(flexiblePagesTrans('menu_items.messages.item_moved'))
462+
->success()
463+
->send();
446464

447465
} catch (Exception $e) {
448-
$this->dispatch('show-error', [
449-
'message' => flexiblePagesTrans('menu_items.errors.move_failed', [
466+
Notification::make()
467+
->title(flexiblePagesTrans('menu_items.errors.move_failed', [
450468
'error' => $e->getMessage(),
451-
]),
452-
]);
469+
]))
470+
->danger()
471+
->send();
453472
}
454473
}
455474

@@ -627,8 +646,8 @@ public function createMenuItem(array $data): void
627646
->success()
628647
->send();
629648

630-
// Redirect to refresh the page data
631-
redirect()->to($this->getUrl());
649+
// Refresh the menu items tree view
650+
$this->dispatch('menu-items-updated');
632651

633652
} catch (Exception $e) {
634653
Notification::make()
@@ -676,8 +695,8 @@ public function updateMenuItem(int $itemId, array $data): void
676695
->success()
677696
->send();
678697

679-
// Redirect to refresh the page data
680-
redirect()->to($this->getUrl());
698+
// Refresh the menu items tree view
699+
$this->dispatch('menu-items-updated');
681700

682701
} catch (Exception $e) {
683702
Notification::make()

0 commit comments

Comments
 (0)