Skip to content

Commit 76cf57d

Browse files
committed
Add lang switch to menu tree
1 parent ff6cdb9 commit 76cf57d

File tree

5 files changed

+70
-44
lines changed

5 files changed

+70
-44
lines changed

resources/views/filament/resources/menu-resource/pages/manage-menu-items.blade.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class="space-y-6"
1010
<!-- Tree Container -->
1111
<x-filament::section>
1212
<div class="min-h-[400px]">
13-
@if(count($this->getMenuItems()) === 0)
13+
@if($this->record->menuItems()->count() === 0)
1414
<!-- Empty State -->
1515
<div class="text-center py-12">
1616
<svg class="mx-auto h-12 w-12 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
@@ -26,11 +26,11 @@ class="space-y-6"
2626
@else
2727
<!-- Tree Items -->
2828
<div class="space-y-2" id="menu-items-container">
29-
@foreach($this->getMenuItems() as $item)
29+
@foreach($this->record->menuItems()->with(['children', 'linkable'])->whereNull('parent_id')->orderBy('_lft')->get() as $item)
3030
@livewire('filament-flexible-content-block-pages::menu-tree-item', [
3131
'item' => $item,
3232
'maxDepth' => $this->getMaxDepth()
33-
], key($item['id']))
33+
], key($item->id))
3434
@endforeach
3535
</div>
3636
@endif

resources/views/livewire/menu-tree-item.blade.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="menu-tree-item" data-item-id="{{ $item['id'] }}">
1+
<div class="menu-tree-item" data-item-id="{{ $item->id }}">
22
<div class="flex items-center p-4 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 group hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors {{ $depth > 0 ? 'ml-' . ($depth * 8) : '' }}">
33

44
@if($showActions)
@@ -29,8 +29,8 @@ class="mr-2 p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 trans
2929
<div class="flex-1 min-w-0">
3030
<div class="flex items-center justify-between">
3131
<div class="flex items-center space-x-3">
32-
@if(!empty($item['icon']))
33-
<span class="text-gray-500 text-lg">{!! $item['icon'] !!}</span>
32+
@if($item->icon)
33+
<span class="text-gray-500 text-lg">{!! $item->icon !!}</span>
3434
@endif
3535

3636
<div>
@@ -42,7 +42,7 @@ class="mr-2 p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 trans
4242
</p>
4343
</div>
4444

45-
@if(!($item['is_visible'] ?? true))
45+
@if(!$item->is_visible)
4646
<span class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300">
4747
{{ flexiblePagesTrans('menu_items.status.hidden') }}
4848
</span>
@@ -66,14 +66,14 @@ class="mr-2 p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 trans
6666

6767
<!-- Children -->
6868
@if($this->hasChildren() && $isExpanded)
69-
<div class="space-y-2 mt-2" wire:key="children-{{ $item['id'] }}">
70-
@foreach($item['children'] as $child)
69+
<div class="space-y-2 mt-2" wire:key="children-{{ $item->id }}">
70+
@foreach($item->children as $child)
7171
@livewire('filament-flexible-content-block-pages::menu-tree-item', [
7272
'item' => $child,
7373
'depth' => $depth + 1,
7474
'maxDepth' => $maxDepth,
7575
'showActions' => $showActions
76-
], key($child['id']))
76+
], key($child->id))
7777
@endforeach
7878
</div>
7979
@endif

src/Filament/Form/Forms/MenuItemForm.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Statikbe\FilamentFlexibleContentBlockPages\Filament\Form\Fields\Types\RouteMenuItemType;
1414
use Statikbe\FilamentFlexibleContentBlockPages\Filament\Form\Fields\Types\UrlMenuItemType;
1515
use Statikbe\FilamentFlexibleContentBlockPages\Models\Contracts\HasMenuLabel;
16+
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\Concerns\HasTranslatableHint;
1617
use Statikbe\FilamentFlexibleContentBlocks\FilamentFlexibleBlocksConfig;
1718

1819
class MenuItemForm
@@ -83,13 +84,18 @@ protected static function getLinkTypeField(): Select
8384

8485
protected static function getLabelField(): TextInput
8586
{
86-
return TextInput::make(static::FIELD_LABEL)
87+
$field = new class extends TextInput {
88+
use HasTranslatableHint;
89+
};
90+
91+
return $field::make(static::FIELD_LABEL)
8792
->label(flexiblePagesTrans('menu_items.form.label_lbl'))
8893
->required(fn (Get $get): bool => ! $get(static::FIELD_USE_MODEL_TITLE))
8994
->visible(fn (Get $get): bool => ! $get(static::FIELD_USE_MODEL_TITLE))
9095
->maxLength(255)
9196
->helperText(flexiblePagesTrans('menu_items.form.label_help'))
92-
->live();
97+
->live()
98+
->addsTranslatableHint();
9399
}
94100

95101
protected static function getUseModelTitleField(): Toggle

src/Livewire/MenuTreeItem.php

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,19 @@
55
use Filament\Actions\Action;
66
use Filament\Actions\Concerns\InteractsWithActions;
77
use Filament\Actions\Contracts\HasActions;
8+
use Filament\Actions\LocaleSwitcher;
89
use Filament\Forms\Concerns\InteractsWithForms;
910
use Filament\Forms\Contracts\HasForms;
1011
use Livewire\Component;
12+
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
1113
use Statikbe\FilamentFlexibleContentBlockPages\Filament\Form\Forms\MenuItemForm;
1214

1315
class MenuTreeItem extends Component implements HasActions, HasForms
1416
{
1517
use InteractsWithActions;
1618
use InteractsWithForms;
1719

18-
public array $item;
20+
public $item; // MenuItem model
1921

2022
public int $depth = 0;
2123

@@ -25,9 +27,16 @@ class MenuTreeItem extends Component implements HasActions, HasForms
2527

2628
public bool $isExpanded = true;
2729

28-
public function mount(array $item, int $depth = 0, int $maxDepth = 2, bool $showActions = true): void
30+
public function mount($item, int $depth = 0, int $maxDepth = 2, bool $showActions = true): void
2931
{
30-
$this->item = $item;
32+
// Convert array to model if needed
33+
if (is_array($item)) {
34+
$menuItemModel = FilamentFlexibleContentBlockPages::config()->getMenuItemModel();
35+
$this->item = $menuItemModel::with('linkable')->find($item['id']);
36+
} else {
37+
$this->item = $item;
38+
}
39+
3140
$this->depth = $depth;
3241
$this->maxDepth = $maxDepth;
3342
$this->showActions = $showActions;
@@ -46,30 +55,26 @@ public function canHaveChildren(): bool
4655

4756
public function hasChildren(): bool
4857
{
49-
return ! empty($this->item['children']);
58+
return $this->item->children()->exists();
5059
}
5160

5261
public function getItemDisplayLabel(): string
5362
{
54-
if (($this->item['use_model_title'] ?? false) && ! empty($this->item['linkable'])) {
55-
return $this->item['linkable']['title'] ?? $this->item['label'] ?? flexiblePagesTrans('menu_items.status.no_label');
56-
}
57-
58-
return $this->item['label'] ?? flexiblePagesTrans('menu_items.status.no_label');
63+
return $this->item->getDisplayLabel();
5964
}
6065

6166
public function getItemTypeLabel(): string
6267
{
63-
if (! empty($this->item['linkable_type']) && ! empty($this->item['linkable'])) {
64-
return flexiblePagesTrans('menu_items.tree.linked_to').' '.class_basename($this->item['linkable_type']);
68+
if ($this->item->linkable_type && $this->item->linkable) {
69+
return flexiblePagesTrans('menu_items.tree.linked_to') . ' ' . class_basename($this->item->linkable_type);
6570
}
6671

67-
if (! empty($this->item['url'])) {
68-
return flexiblePagesTrans('menu_items.tree.external_url').': '.$this->item['url'];
72+
if ($this->item->url) {
73+
return flexiblePagesTrans('menu_items.tree.external_url') . ': ' . $this->item->url;
6974
}
7075

71-
if (! empty($this->item['route'])) {
72-
return flexiblePagesTrans('menu_items.tree.route').': '.$this->item['route'];
76+
if ($this->item->route) {
77+
return flexiblePagesTrans('menu_items.tree.route') . ': ' . $this->item->route;
7378
}
7479

7580
return flexiblePagesTrans('menu_items.tree.no_link');
@@ -80,42 +85,48 @@ public function addChildAction(): Action
8085
return Action::make('addChild')
8186
->form(MenuItemForm::getSchema())
8287
->fillForm([
83-
'parent_id' => $this->item['id'],
88+
'parent_id' => $this->item->id,
8489
'is_visible' => true,
8590
'target' => '_self',
8691
])
8792
->action(function (array $data): void {
88-
$data['parent_id'] = $this->item['id'];
93+
$data['parent_id'] = $this->item->id;
8994
$this->createMenuItem($data);
9095
})
9196
->modalHeading(flexiblePagesTrans('menu_items.tree.add_child'))
9297
->modalSubmitActionLabel(__('Create'))
9398
->modalWidth('2xl')
94-
->slideOver();
99+
->slideOver()
100+
->extraModalFooterActions([
101+
LocaleSwitcher::make(),
102+
]);
95103
}
96104

97105
public function editAction(): Action
98106
{
99107
return Action::make('edit')
100108
->form(MenuItemForm::getSchema())
101109
->fillForm([
102-
'link_type' => $this->item['link_type'],
103-
'label' => $this->item['label'],
104-
'use_model_title' => $this->item['use_model_title'],
105-
'url' => $this->item['url'],
106-
'route' => $this->item['route'],
107-
'linkable_id' => $this->item['linkable_id'],
108-
'target' => $this->item['target'] ?? '_self',
109-
'icon' => $this->item['icon'],
110-
'is_visible' => $this->item['is_visible'],
110+
'link_type' => $this->item->link_type,
111+
'label' => $this->item->label,
112+
'use_model_title' => $this->item->use_model_title,
113+
'url' => $this->item->url,
114+
'route' => $this->item->route,
115+
'linkable_id' => $this->item->linkable_id,
116+
'target' => $this->item->target ?? '_self',
117+
'icon' => $this->item->icon,
118+
'is_visible' => $this->item->is_visible,
111119
])
112120
->action(function (array $data): void {
113-
$this->updateMenuItem($this->item['id'], $data);
121+
$this->updateMenuItem($this->item->id, $data);
114122
})
115123
->modalHeading(flexiblePagesTrans('menu_items.tree.edit'))
116124
->modalSubmitActionLabel(__('Update'))
117125
->modalWidth('2xl')
118-
->slideOver();
126+
->slideOver()
127+
->extraModalFooterActions([
128+
LocaleSwitcher::make(),
129+
]);
119130
}
120131

121132
public function deleteAction(): Action
@@ -127,7 +138,7 @@ public function deleteAction(): Action
127138
->modalSubmitActionLabel(flexiblePagesTrans('menu_items.tree.delete'))
128139
->color('danger')
129140
->action(function (): void {
130-
$this->deleteMenuItem($this->item['id']);
141+
$this->deleteMenuItem($this->item->id);
131142
});
132143
}
133144

src/Resources/MenuResource/Pages/ManageMenuItems.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
use Filament\Actions\Action;
77
use Filament\Actions\Concerns\InteractsWithActions;
88
use Filament\Actions\Contracts\HasActions;
9+
use Filament\Actions\LocaleSwitcher;
910
use Filament\Forms\Concerns\InteractsWithForms;
1011
use Filament\Forms\Contracts\HasForms;
1112
use Filament\Forms\Get;
1213
use Filament\Notifications\Notification;
1314
use Filament\Resources\Pages\Page;
15+
use Filament\Resources\Pages\Concerns\Translatable;
1416
use Illuminate\Support\Facades\Schema;
1517
use Livewire\Attributes\On;
1618
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
@@ -21,6 +23,7 @@ class ManageMenuItems extends Page implements HasActions, HasForms
2123
{
2224
use InteractsWithActions;
2325
use InteractsWithForms;
26+
use Translatable;
2427

2528
protected static string $resource = MenuResource::class;
2629

@@ -112,7 +115,10 @@ protected function getHeaderActions(): array
112115
})
113116
->modalSubmitActionLabel(__('Create'))
114117
->modalWidth('2xl')
115-
->slideOver(),
118+
->slideOver()
119+
->extraModalFooterActions([
120+
LocaleSwitcher::make(),
121+
]),
116122
];
117123
}
118124

@@ -160,7 +166,10 @@ public function editMenuItemAction(): Action
160166
->modalHeading(flexiblePagesTrans('menu_items.tree.edit'))
161167
->modalSubmitActionLabel(__('Update'))
162168
->modalWidth('2xl')
163-
->slideOver();
169+
->slideOver()
170+
->extraModalFooterActions([
171+
LocaleSwitcher::make(),
172+
]);
164173
}
165174

166175
public function deleteMenuItemAction(): Action

0 commit comments

Comments
 (0)