Skip to content

Commit 813fb90

Browse files
authored
Merge pull request #38 from balajidharma/1.x-Changes
Added role check for menu items
2 parents 66c0e9a + 6cb0414 commit 813fb90

File tree

7 files changed

+73
-24
lines changed

7 files changed

+73
-24
lines changed

app/Http/Controllers/Admin/MenuItemController.php

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Http\Controllers\Admin;
44

55
use App\Http\Controllers\Controller;
6+
use App\Models\Role;
67
use BalajiDharma\LaravelAdminCore\Requests\StoreMenuItemRequest;
78
use BalajiDharma\LaravelAdminCore\Requests\UpdateMenuItemRequest;
89
use BalajiDharma\LaravelMenu\Models\Menu;
@@ -47,12 +48,10 @@ public function index(Menu $menu)
4748
*/
4849
public function create(Menu $menu)
4950
{
50-
$item_options = MenuItem::selectOptions($menu->id, null, true);
51+
$itemOptions = MenuItem::selectOptions($menu->id, null, true);
52+
$roles = Role::all()->pluck('name', 'id');
5153

52-
return Inertia::render('Admin/Menu/Item/Create', [
53-
'menu' => $menu,
54-
'item_options' => $item_options,
55-
]);
54+
return Inertia::render('Admin/Menu/Item/Create', compact('menu', 'itemOptions', 'roles'));
5655
}
5756

5857
/**
@@ -62,7 +61,10 @@ public function create(Menu $menu)
6261
*/
6362
public function store(StoreMenuItemRequest $request, Menu $menu)
6463
{
65-
$menu->menuItems()->create($request->all());
64+
$menu->menuItems()->create($request->except(['roles']));
65+
66+
$roles = $request->roles ?? [];
67+
$menu->assignRole($roles);
6668

6769
return redirect()->route('admin.menu.item.index', $menu->id)
6870
->with('message', 'Menu created successfully.');
@@ -75,13 +77,11 @@ public function store(StoreMenuItemRequest $request, Menu $menu)
7577
*/
7678
public function edit(Menu $menu, MenuItem $item)
7779
{
78-
$item_options = MenuItem::selectOptions($menu->id, $item->parent_id ?? $item->id);
80+
$itemOptions = MenuItem::selectOptions($menu->id, $item->parent_id ?? $item->id);
81+
$roles = Role::all()->pluck('name', 'id');
82+
$itemHasRoles = array_column(json_decode($item->roles, true), 'id');
7983

80-
return Inertia::render('Admin/Menu/Item/Edit', [
81-
'menu' => $menu,
82-
'item' => $item,
83-
'item_options' => $item_options,
84-
]);
84+
return Inertia::render('Admin/Menu/Item/Edit', compact('menu', 'item', 'itemOptions', 'roles', 'itemHasRoles'));
8585
}
8686

8787
/**
@@ -91,7 +91,10 @@ public function edit(Menu $menu, MenuItem $item)
9191
*/
9292
public function update(UpdateMenuItemRequest $request, Menu $menu, MenuItem $item)
9393
{
94-
$item->update($request->all());
94+
$item->update($request->except(['roles']));
95+
96+
$roles = $request->roles ?? [];
97+
$item->syncRoles($roles);
9598

9699
return redirect()->route('admin.menu.item.index', $menu->id)
97100
->with('message', 'Menu Item updated successfully.');

app/Http/Middleware/HandleInertiaRequests.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public function share(Request $request)
4646
'message' => fn () => $request->session()->get('message'),
4747
],
4848
'navigation' => [
49-
'menu' => Menu::getMenuTree('admin'),
49+
'menu' => Menu::getMenuTree('admin', false, true),
5050
],
5151
]);
5252
}

resources/js/Components/AsideMenuItem.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const componentClass = computed(() => (
3838
]
3939
))
4040
41-
const hasDropdown = computed(() => props.item.children)
41+
const hasDropdown = computed(() => props.item.children && props.item.children.length)
4242
4343
const menuClick = event => {
4444
emit('menu-click', event, props.item)

resources/js/Layouts/Authenticated.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ const showingNavigationDropdown = ref(false);
7979
<BreezeResponsiveNavLink :href="route('dashboard')" :active="route().current('dashboard')">
8080
Dashboard
8181
</BreezeResponsiveNavLink>
82-
<BreezeResponsiveNavLink :href="route('permission.index')" :active="route().current('permission.index')">
82+
<BreezeResponsiveNavLink :href="route('admin.permission.index')" :active="route().current('admin.permission.index')">
8383
Permissions
8484
</BreezeResponsiveNavLink>
8585
</div>

resources/js/Pages/Admin/Menu/Create.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const form = useForm({
3131
main
3232
>
3333
<BaseButton
34-
:route-name="route('menu.index')"
34+
:route-name="route('admin.menu.index')"
3535
:icon="mdiArrowLeftBoldOutline"
3636
label="Back"
3737
color="white"
@@ -41,7 +41,7 @@ const form = useForm({
4141
</SectionTitleLineWithButton>
4242
<CardBox
4343
form
44-
@submit.prevent="form.post(route('menu.store'))"
44+
@submit.prevent="form.post(route('admin.menu.store'))"
4545
>
4646
<FormField
4747
label="Name"

resources/js/Pages/Admin/Menu/Item/Create.vue

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,18 @@ import FormControl from '@/Components/FormControl.vue'
1313
import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue'
1414
import BaseButton from '@/Components/BaseButton.vue'
1515
import BaseButtons from '@/Components/BaseButtons.vue'
16+
import BaseDivider from '@/Components/BaseDivider.vue'
1617
1718
const props = defineProps({
1819
menu: {
1920
type: Object,
2021
default: () => ({}),
2122
},
22-
item_options: {
23+
itemOptions: {
24+
type: Object,
25+
default: () => ({}),
26+
},
27+
roles: {
2328
type: Object,
2429
default: () => ({}),
2530
},
@@ -31,7 +36,8 @@ const form = useForm({
3136
description: '',
3237
enabled: true,
3338
parent_id: '',
34-
weight: ''
39+
weight: '',
40+
roles: []
3541
})
3642
3743
</script>
@@ -121,7 +127,7 @@ const form = useForm({
121127
type="select"
122128
placeholder="--ROOT--"
123129
:error="form.errors.parent_id"
124-
:options="item_options"
130+
:options="itemOptions"
125131
>
126132
<div class="text-red-400 text-sm" v-if="form.errors.parent_id">
127133
{{ form.errors.parent_id }}
@@ -146,6 +152,21 @@ const form = useForm({
146152
</div>
147153
</FormControl>
148154
</FormField>
155+
156+
<BaseDivider />
157+
158+
<FormField
159+
label="Roles"
160+
wrap-body
161+
>
162+
<FormCheckRadioGroup
163+
v-model="form.roles"
164+
name="roles"
165+
is-column
166+
:options="props.roles"
167+
/>
168+
</FormField>
169+
149170
<template #footer>
150171
<BaseButtons>
151172
<BaseButton

resources/js/Pages/Admin/Menu/Item/Edit.vue

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import FormControl from '@/Components/FormControl.vue'
1313
import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue'
1414
import BaseButton from '@/Components/BaseButton.vue'
1515
import BaseButtons from '@/Components/BaseButtons.vue'
16+
import BaseDivider from '@/Components/BaseDivider.vue'
1617
1718
const props = defineProps({
1819
menu: {
@@ -23,7 +24,15 @@ const props = defineProps({
2324
type: Object,
2425
default: () => ({}),
2526
},
26-
item_options: {
27+
itemOptions: {
28+
type: Object,
29+
default: () => ({}),
30+
},
31+
roles: {
32+
type: Object,
33+
default: () => ({}),
34+
},
35+
itemHasRoles: {
2736
type: Object,
2837
default: () => ({}),
2938
},
@@ -37,7 +46,8 @@ const form = useForm({
3746
description: props.item.description,
3847
enabled: props.item.enabled,
3948
parent_id: props.item.parent_id,
40-
weight: props.item.weight
49+
weight: props.item.weight,
50+
roles: props.itemHasRoles
4151
})
4252
</script>
4353

@@ -126,7 +136,7 @@ const form = useForm({
126136
type="select"
127137
placeholder="--ROOT--"
128138
:error="form.errors.parent_id"
129-
:options="item_options"
139+
:options="itemOptions"
130140
>
131141
<div class="text-red-400 text-sm" v-if="form.errors.parent_id">
132142
{{ form.errors.parent_id }}
@@ -151,6 +161,21 @@ const form = useForm({
151161
</div>
152162
</FormControl>
153163
</FormField>
164+
165+
<BaseDivider />
166+
167+
<FormField
168+
label="Roles"
169+
wrap-body
170+
>
171+
<FormCheckRadioGroup
172+
v-model="form.roles"
173+
name="roles"
174+
is-column
175+
:options="props.roles"
176+
/>
177+
</FormField>
178+
154179
<template #footer>
155180
<BaseButtons>
156181
<BaseButton

0 commit comments

Comments
 (0)