Skip to content

Commit 486c09a

Browse files
committed
Added menu CRUD
1 parent 1c1a9d5 commit 486c09a

File tree

7 files changed

+737
-0
lines changed

7 files changed

+737
-0
lines changed
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Admin;
4+
5+
use App\Http\Controllers\Controller;
6+
use BalajiDharma\LaravelMenu\Models\Menu;
7+
use BalajiDharma\LaravelAdminCore\Requests\StoreMenuRequest;
8+
use BalajiDharma\LaravelAdminCore\Requests\UpdateMenuRequest;
9+
use Illuminate\Support\Facades\Auth;
10+
use Inertia\Inertia;
11+
12+
class MenuController extends Controller
13+
{
14+
public function __construct()
15+
{
16+
$this->middleware('can:menu list', ['only' => ['index']]);
17+
$this->middleware('can:menu create', ['only' => ['create', 'store']]);
18+
$this->middleware('can:menu edit', ['only' => ['edit', 'update']]);
19+
$this->middleware('can:menu delete', ['only' => ['destroy']]);
20+
}
21+
22+
/**
23+
* Display a listing of the resource.
24+
*
25+
* @return \Inertia\Response
26+
*/
27+
public function index()
28+
{
29+
$menus = (new Menu)->newQuery();
30+
31+
if (request()->has('search')) {
32+
$menus->where('name', 'Like', '%'.request()->input('search').'%');
33+
}
34+
35+
if (request()->query('sort')) {
36+
$attribute = request()->query('sort');
37+
$sort_order = 'ASC';
38+
if (strncmp($attribute, '-', 1) === 0) {
39+
$sort_order = 'DESC';
40+
$attribute = substr($attribute, 1);
41+
}
42+
$menus->orderBy($attribute, $sort_order);
43+
} else {
44+
$menus->latest();
45+
}
46+
47+
$menus = $menus->paginate(5)->onEachSide(2)->appends(request()->query());
48+
49+
return Inertia::render('Admin/Menu/Index', [
50+
'menus' => $menus,
51+
'filters' => request()->all('search'),
52+
'can' => [
53+
'create' => Auth::user()->can('menu create'),
54+
'edit' => Auth::user()->can('menu edit'),
55+
'delete' => Auth::user()->can('menu delete'),
56+
'manage' => Auth::user()->can('menu.item index'),
57+
]
58+
]);
59+
}
60+
61+
/**
62+
* Show the form for creating a new resource.
63+
*
64+
* @return \Inertia\Response
65+
*/
66+
public function create()
67+
{
68+
return Inertia::render('Admin/Menu/Create');
69+
}
70+
71+
/**
72+
* Store a newly created resource in storage.
73+
*
74+
* @param StoreMenuRequest $request
75+
* @return \Illuminate\Http\RedirectResponse
76+
*/
77+
public function store(StoreMenuRequest $request)
78+
{
79+
Menu::create([
80+
'name' => $request->name,
81+
'machine_name' => $request->machine_name,
82+
'description' => $request->description,
83+
]);
84+
85+
return redirect()->route('menu.index')
86+
->with('message', 'Menu created successfully.');
87+
}
88+
89+
/**
90+
* Show the form for editing the specified resource.
91+
*
92+
* @param \BalajiDharma\LaravelMenu\Models\Menu $menu
93+
* @return \Inertia\Response
94+
*/
95+
public function edit(Menu $menu)
96+
{
97+
return Inertia::render('Admin/Menu/Edit', [
98+
'menu' => $menu,
99+
]);
100+
}
101+
102+
/**
103+
* Update the specified resource in storage.
104+
*
105+
* @param UpdateMenuRequest $request
106+
* @param \BalajiDharma\LaravelMenu\Models\Menu $menu
107+
* @return \Illuminate\Http\RedirectResponse
108+
*/
109+
public function update(UpdateMenuRequest $request, Menu $menu)
110+
{
111+
$menu->update($request->all());
112+
113+
return redirect()->route('menu.index')
114+
->with('message', 'Menu updated successfully.');
115+
}
116+
117+
/**
118+
* Remove the specified resource from storage.
119+
*
120+
* @param \BalajiDharma\LaravelMenu\Models\Menu $menu
121+
* @return \Illuminate\Http\RedirectResponse
122+
*/
123+
public function destroy(Menu $menu)
124+
{
125+
$menu->delete();
126+
127+
return redirect()->route('menu.index')
128+
->with('message', __('Menu deleted successfully'));
129+
}
130+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Admin;
4+
5+
use App\Http\Controllers\Controller;
6+
use BalajiDharma\LaravelAdminCore\Requests\StoreMenuItemRequest;
7+
use BalajiDharma\LaravelAdminCore\Requests\UpdateMenuItemRequest;
8+
use BalajiDharma\LaravelMenu\Models\Menu;
9+
use BalajiDharma\LaravelMenu\Models\MenuItem;
10+
use Illuminate\Support\Facades\Auth;
11+
use Inertia\Inertia;
12+
13+
class MenuItemController extends Controller
14+
{
15+
public function __construct()
16+
{
17+
$this->middleware('can:menu.item list', ['only' => ['index', 'show']]);
18+
$this->middleware('can:menu.item create', ['only' => ['create', 'store']]);
19+
$this->middleware('can:menu.item edit', ['only' => ['edit', 'update']]);
20+
$this->middleware('can:menu.item delete', ['only' => ['destroy']]);
21+
}
22+
23+
/**
24+
* Display a listing of the resource.
25+
*
26+
* @return \Inertia\Response
27+
*/
28+
public function index(Menu $menu)
29+
{
30+
$items = (new MenuItem)->toTree($menu->id);
31+
32+
return Inertia::render('Admin/Menu/Item/Index', [
33+
'menu' => $menu,
34+
'items' => $items,
35+
'can' => [
36+
'create' => Auth::user()->can('menu.item create'),
37+
'edit' => Auth::user()->can('menu.item edit'),
38+
'delete' => Auth::user()->can('menu.item delete'),
39+
]
40+
]);
41+
}
42+
43+
/**
44+
* Show the form for creating a new resource.
45+
*
46+
* @return \Illuminate\View\View
47+
*/
48+
public function create(Menu $menu)
49+
{
50+
$item_options = MenuItem::selectOptions($menu->id);
51+
return view('admin.menu.item.create', compact('menu', 'item_options'));
52+
}
53+
54+
/**
55+
* Store a newly created resource in storage.
56+
*
57+
* @param StoreMenuItemRequest $request
58+
* @param \BalajiDharma\LaravelMenu\Models\Menu $menu
59+
* @return \Illuminate\Http\RedirectResponse
60+
*/
61+
public function store(StoreMenuItemRequest $request, Menu $menu)
62+
{
63+
$menu->menuItems()->create($request->all());
64+
65+
return redirect()->route('menu.item.index', $menu->id)
66+
->with('message', 'Menu created successfully.');
67+
}
68+
69+
/**
70+
* Show the form for editing the specified resource.
71+
*
72+
* @param \BalajiDharma\LaravelMenu\Models\Menu $menu
73+
* @return \Illuminate\View\View
74+
*/
75+
public function edit(Menu $menu, MenuItem $item)
76+
{
77+
$item_options = MenuItem::selectOptions($menu->id, $item->parent_id ?? $item->id);
78+
return view('admin.menu.item.edit', compact('menu', 'item', 'item_options'));
79+
}
80+
81+
/**
82+
* Update the specified resource in storage.
83+
*
84+
* @param UpdateMenuItemRequest $request
85+
* @param \BalajiDharma\LaravelMenu\Models\Menu $menu
86+
* @param \BalajiDharma\LaravelMenu\Models\MenuItem $item
87+
* @return \Illuminate\Http\RedirectResponse
88+
*/
89+
public function update(UpdateMenuItemRequest $request, Menu $menu, MenuItem $item)
90+
{
91+
$item->update($request->all());
92+
93+
return redirect()->route('menu.item.index', $menu->id)
94+
->with('message', 'Menu Item updated successfully.');
95+
}
96+
97+
/**
98+
* Remove the specified resource from storage.
99+
*
100+
* @param \BalajiDharma\LaravelMenu\Models\Menu $menu
101+
* @param \BalajiDharma\LaravelMenu\Models\MenuItem $menuItem
102+
* @return \Illuminate\Http\RedirectResponse
103+
*/
104+
public function destroy(Menu $menu, MenuItem $item)
105+
{
106+
$item->delete();
107+
108+
return redirect()->route('menu.item.index', $menu->id)
109+
->with('message', __('Menu deleted successfully'));
110+
}
111+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<script setup>
2+
import { Head, Link, useForm } from "@inertiajs/inertia-vue3"
3+
import {
4+
mdiMenu,
5+
mdiArrowLeftBoldOutline
6+
} from "@mdi/js"
7+
import LayoutAuthenticated from "@/Layouts/LayoutAuthenticated.vue"
8+
import SectionMain from "@/Components/SectionMain.vue"
9+
import SectionTitleLineWithButton from "@/Components/SectionTitleLineWithButton.vue"
10+
import CardBox from "@/Components/CardBox.vue"
11+
import FormField from '@/Components/FormField.vue'
12+
import FormControl from '@/Components/FormControl.vue'
13+
import BaseButton from '@/Components/BaseButton.vue'
14+
import BaseButtons from '@/Components/BaseButtons.vue'
15+
16+
const form = useForm({
17+
name: '',
18+
machine_name: '',
19+
description: ''
20+
21+
})
22+
</script>
23+
24+
<template>
25+
<LayoutAuthenticated>
26+
<Head title="Create menu" />
27+
<SectionMain>
28+
<SectionTitleLineWithButton
29+
:icon="mdiMenu"
30+
title="Add menu"
31+
main
32+
>
33+
<BaseButton
34+
:route-name="route('menu.index')"
35+
:icon="mdiArrowLeftBoldOutline"
36+
label="Back"
37+
color="white"
38+
rounded-full
39+
small
40+
/>
41+
</SectionTitleLineWithButton>
42+
<CardBox
43+
form
44+
@submit.prevent="form.post(route('menu.store'))"
45+
>
46+
<FormField
47+
label="Name"
48+
:class="{ 'text-red-400': form.errors.name }"
49+
>
50+
<FormControl
51+
v-model="form.name"
52+
type="text"
53+
placeholder="Enter Name"
54+
:error="form.errors.name"
55+
>
56+
<div class="text-red-400 text-sm" v-if="form.errors.name">
57+
{{ form.errors.name }}
58+
</div>
59+
</FormControl>
60+
</FormField>
61+
<FormField
62+
label="Machine Name"
63+
:class="{ 'text-red-400': form.errors.machine_name }"
64+
>
65+
<FormControl
66+
v-model="form.machine_name"
67+
type="text"
68+
placeholder="Enter Machine Name"
69+
:error="form.errors.name"
70+
>
71+
<div class="text-red-400 text-sm" v-if="form.errors.machine_name">
72+
{{ form.errors.machine_name }}
73+
</div>
74+
</FormControl>
75+
</FormField>
76+
<FormField
77+
label="Description"
78+
:class="{ 'text-red-400': form.errors.description }"
79+
>
80+
<FormControl
81+
v-model="form.description"
82+
type="text"
83+
placeholder="Enter Description"
84+
:error="form.errors.description"
85+
>
86+
<div class="text-red-400 text-sm" v-if="form.errors.description">
87+
{{ form.errors.description }}
88+
</div>
89+
</FormControl>
90+
</FormField>
91+
<template #footer>
92+
<BaseButtons>
93+
<BaseButton
94+
type="submit"
95+
color="info"
96+
label="Submit"
97+
:class="{ 'opacity-25': form.processing }"
98+
:disabled="form.processing"
99+
/>
100+
</BaseButtons>
101+
</template>
102+
</CardBox>
103+
</SectionMain>
104+
</LayoutAuthenticated>
105+
</template>

0 commit comments

Comments
 (0)