Skip to content

Commit 961329e

Browse files
committed
Added Route, Controller, Middleware
1 parent 6a93804 commit 961329e

File tree

8 files changed

+222
-6
lines changed

8 files changed

+222
-6
lines changed

database/migrations/2019_08_27_165403_create_menu_items_table.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ public function up()
2222
$table->string('target')->default('_self');
2323
$table->integer('parent_id')->unsigned()->nullable();
2424
$table->integer('order')->unsigned()->default(0);
25+
$table->string('route')->nullable();
26+
$table->text('params')->nullable();
27+
$table->string('controller')->nullable();
28+
$table->string('middleware')->nullable();
2529
$table->string('icon')->nullable();
2630
$table->string('custom_class')->nullable();
2731
$table->timestamps();

publishable/assets/js/app.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

resources/assets/js/components/MenuBuilder.vue

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@
7878
id: '',
7979
title: '',
8080
url: '',
81+
route: '',
82+
params: '',
83+
paramItems: [],
84+
controller: '',
85+
middleware: '',
8186
target: '_self',
8287
parent_id: '',
8388
custom_class: '',
@@ -133,10 +138,12 @@
133138
let url = this.prefix+'/menu/item';
134139
let self = this;
135140
141+
this.prepareParams()
142+
136143
axios({
137144
method: 'post',
138145
url: url,
139-
data: item,
146+
data: this.item,
140147
responseType: 'json',
141148
})
142149
.then(res => {
@@ -170,6 +177,8 @@
170177
self.item.apply_child_as_parent = parseInt(self.settings.apply_child_as_parent);
171178
self.childrens = res.data.childrens;
172179
self.parents = res.data.parents;
180+
181+
this.setUpParams()
173182
}
174183
})
175184
.catch(err => console.log(err));
@@ -179,10 +188,12 @@
179188
var self = this;
180189
var url = this.prefix+'/menu/item';
181190
191+
this.prepareParams()
192+
182193
axios({
183194
method: 'put',
184195
url: url,
185-
data: item,
196+
data: this.item,
186197
})
187198
.then(res => {
188199
if( res.data.success == true ) {
@@ -257,11 +268,33 @@
257268
})
258269
.catch(err => console.log(err));
259270
},
271+
prepareParams: function(){
272+
let params = {};
273+
for(let paramItem of this.item.paramItems) {
274+
if(paramItem.key.length > 0) {
275+
params[paramItem.key] = paramItem.value
276+
}
277+
}
278+
this.item.params = JSON.stringify(params);
279+
},
280+
setUpParams: function(){
281+
this.item.paramItems = []
282+
let params = JSON.parse(this.item.params);
283+
for(let param in params) {
284+
console.log(param);
285+
this.item.paramItems.push({key:param,value: params[param]})
286+
}
287+
},
260288
resetForm: function(){
261289
this.item.menu_id = this.menu.id;
262290
this.item.id = '';
263291
this.item.title = '';
264292
this.item.url = '';
293+
this.item.route = '';
294+
this.item.params = '';
295+
this.item.paramItems = [];
296+
this.item.controller = '';
297+
this.item.middleware = '';
265298
this.item.target = '_self';
266299
this.item.parent_id = '';
267300
this.item.icon = '';

resources/assets/js/components/MenuItemModals.vue

Lines changed: 126 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,54 @@
1717
<input type="text" name="url" class="form-control input-field" id="add_menu_item_url" v-model="item.url">
1818
<label for="add_menu_item_url" class="cs-label">URL</label>
1919
</div>
20+
<div class="form-group">
21+
<input type="text" name="route" class="form-control input-field" id="add_menu_item_route" v-model="item.route">
22+
<label for="add_menu_item_route" class="cs-label">Route</label>
23+
</div>
24+
<div class="form-group">
25+
<button class="btn btn-info edit-info btn-block d-flex" type="button">
26+
<span class="text-left mr-auto">Params</span>
27+
<span
28+
class="text-right ml-auto"
29+
data-target="#addParams"
30+
data-toggle="collapse"
31+
aria-expanded="false"
32+
aria-controls="addParams"
33+
@click="showCollapse = !showCollapse ">
34+
{{ showCollapse ? 'hide' : 'open' }}
35+
</span>
36+
</button>
37+
<div class="collapse" id="addParams">
38+
<div class="card card-body" style="padding-left: 0px; padding-right: 0px">
39+
<div class="param-field">
40+
<div v-for="(paramItem, index) in item.paramItems" :key="index" class="form-group row">
41+
<div class="col-md-5">
42+
<input type="text" class="form-control input-field" id="param_key" v-model="paramItem.key">
43+
<label for="param_key" class="cs-label">Key</label>
44+
</div>
45+
<div class="col-md-5">
46+
<input type="text" class="form-control input-field" id="param_value" v-model="paramItem.value">
47+
<label for="param_value" class="cs-label">Value</label>
48+
</div>
49+
<div class="col-md-2">
50+
<button type="button" class="btn btn-danger" @click="removeParam(index)"><i class="fa fa-trash"></i></button>
51+
</div>
52+
</div>
53+
</div>
54+
<div class="pl-3">
55+
<button type="button" class="btn btn-success" value="Add Param" @click="addParam">Add Param</button>
56+
</div>
57+
</div>
58+
</div>
59+
</div>
60+
<div class="form-group">
61+
<input type="text" name="controller" class="form-control input-field" id="add_menu_item_controller" v-model="item.controller">
62+
<label for="add_menu_item_controller" class="cs-label">Controller</label>
63+
</div>
64+
<div class="form-group">
65+
<input type="text" class="form-control input-field" id="add_menu_item_controller" v-model="item.middleware">
66+
<label for="add_menu_item_controller" class="cs-label">Permission (Middleware)</label>
67+
</div>
2068
<div class="form-group">
2169
<select name="target" id="add_menu_item_target" v-model="item.target" class="form-control input-field mb-2 ">
2270
<option value="_self">Same Tab</option>
@@ -65,6 +113,54 @@
65113
<input type="text" name="url" class="form-control input-field " v-model="item.url" />
66114
<label for="url" class="cs-label">URL</label>
67115
</div>
116+
<div class="form-group">
117+
<input type="text" name="route" class="form-control input-field" id="add_menu_item_route" v-model="item.route">
118+
<label for="add_menu_item_route" class="cs-label">Route</label>
119+
</div>
120+
<div class="form-group">
121+
<button class="btn btn-info edit-info btn-block d-flex" type="button">
122+
<span class="text-left mr-auto">Params</span>
123+
<span
124+
class="text-right ml-auto"
125+
data-target="#updateParams"
126+
data-toggle="collapse"
127+
aria-expanded="false"
128+
aria-controls="updateParams"
129+
@click="showCollapse = !showCollapse ">
130+
{{ showCollapse ? 'hide' : 'open' }}
131+
</span>
132+
</button>
133+
<div class="collapse" id="updateParams">
134+
<div class="card card-body my-0 px-0">
135+
<div class="param-field">
136+
<div v-for="(paramItem, index) in item.paramItems" :key="index" class="form-group row">
137+
<div class="col-md-5">
138+
<input type="text" class="form-control input-field" id="param_key" v-model="paramItem.key">
139+
<label for="param_key" class="cs-label">Key</label>
140+
</div>
141+
<div class="col-md-5">
142+
<input type="text" class="form-control input-field" id="param_value" v-model="paramItem.value">
143+
<label for="param_value" class="cs-label">Value</label>
144+
</div>
145+
<div class="col-md-2">
146+
<button type="button" class="btn btn-danger" @click="removeParam(index)"><i class="fa fa-trash"></i></button>
147+
</div>
148+
</div>
149+
</div>
150+
<div class="pl-3">
151+
<button type="button" class="btn btn-success" value="Add Param" @click="addParam">Add Param</button>
152+
</div>
153+
</div>
154+
</div>
155+
</div>
156+
<div class="form-group">
157+
<input type="text" name="controller" class="form-control input-field" id="add_menu_item_controller" v-model="item.controller">
158+
<label for="add_menu_item_controller" class="cs-label">Controller</label>
159+
</div>
160+
<div class="form-group">
161+
<input type="text" class="form-control input-field" id="add_menu_item_controller" v-model="item.middleware">
162+
<label for="add_menu_item_controller" class="cs-label">Permission (Middleware)</label>
163+
</div>
68164
<div class="form-group">
69165
<select name="target" id="edit_menu_item_target" class="form-control input-field " v-model="item.target">
70166
<option class="red" value="_self">Same Tab</option>
@@ -174,6 +270,35 @@
174270
addMenuItem: Function,
175271
addMenuSetting: Function,
176272
},
177-
name: 'menu-item-modals'
273+
name: 'menu-item-modals',
274+
data(){
275+
return {
276+
showCollapse : false
277+
}
278+
},
279+
methods: {
280+
addParam: function(){
281+
let paramItems = [...this.item.paramItems];
282+
Vue.delete(this.item, 'paramItems');
283+
paramItems.push({key:'',value: ''});
284+
this.item.paramItems = paramItems;
285+
},
286+
removeParam(index) {
287+
console.log(index);
288+
let paramItems = [...this.item.paramItems];
289+
paramItems.splice(index, 1);
290+
Vue.delete(this.item, 'paramItems');
291+
this.item.paramItems = paramItems;
292+
},
293+
}
178294
}
179295
</script>
296+
297+
<style scoped="scoped">
298+
.modal-dialog {
299+
max-width: 700px;
300+
}
301+
.btn.btn-info {
302+
box-shadow: none;
303+
}
304+
</style>

resources/views/menus/recursive.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
<li data-id="{{$menu->id}}" class="menu_item">
3-
<a href="{{ ($menu->url != '') ? $menu->url : '#' }}">
3+
<a href="{{ menu_url($menu) }}">
44
<span class="menu-icon"></span>{!! $menu->icon !!}
55
<span class="menu-title">{{ $menu->title }}</span>
66
</a>

routes/menu.php

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

3-
Route::group(['namespace' => config('menu.controller_namespace')], function () {
3+
use CodexShaper\Menu\Models\MenuItem;
4+
5+
Route::group([
6+
'prefix' => config('menu.prefix'),
7+
'namespace' => config('menu.controller_namespace')
8+
], function () {
49
Route::get('menus', 'MenuController@index');
510
Route::get('menu/builder/{id}', 'MenuItemController@showMenuItems')->name('menu.builder');
611

@@ -31,3 +36,22 @@
3136
Route::post('menu/item/settings', 'MenuItemController@storeSettings');
3237
Route::get('menu/item/settings/{menu_id}', 'MenuItemController@getSettings');
3338
});
39+
40+
$menuItems = MenuItem::all();
41+
42+
foreach ($menuItems as $menuItem) {
43+
44+
if($menuItem->url != null) {
45+
$controller = $menuItem->controller ?? '\CodexShaper\Menu\Http\Controllers\MenuItemController@setRoute';
46+
47+
if($menuItem->route && !$menuItem->middleware) {
48+
Route::get($menuItem->url, $controller)->name($menuItem->route);
49+
}else if($menuItem->middleware && !$menuItem->route){
50+
Route::get($menuItem->url, $controller)->middleware($menuItem->middleware);
51+
}else if($menuItem->route && $menuItem->middleware) {
52+
Route::get($menuItem->url, $controller)->name($menuItem->route)->middleware(explode(',', $menuItem->middleware));
53+
}else if(!$menuItem->route && !$menuItem->middleware) {
54+
Route::get($menuItem->url, $controller);
55+
}
56+
}
57+
}

src/Helpers/helpers.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,23 @@ function menu_settings($menu_id)
2121
}
2222
}
2323

24+
if(!function_exists('menu_url')) {
25+
function menu_url($menu) {
26+
$url = $menu->url ?? '#';
27+
if($menu->route) {
28+
$route = $menu->route;
29+
$params = json_decode( $menu->params, true );
30+
if(is_array($params) && count($params) > 0) {
31+
$url = route($menu->route, $params);
32+
}else {
33+
$url = route($menu->route);
34+
}
35+
}
36+
37+
return url($url);
38+
}
39+
}
40+
2441
if (!function_exists('menu')) {
2542
function menu($name)
2643
{

src/Http/Controllers/MenuItemController.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ public function store(Request $request)
163163
$menuItem->title = $request->title;
164164
$menuItem->slug = Str::slug($request->title);
165165
$menuItem->url = $request->url;
166+
$menuItem->route = $request->route;
167+
$menuItem->params = $request->params;
168+
$menuItem->controller = $request->controller;
169+
$menuItem->middleware = $request->middleware;
166170
$menuItem->target = $request->target;
167171
$menuItem->parent_id = $parent_id;
168172
$menuItem->order = $order + 1;
@@ -225,6 +229,10 @@ public function update(Request $request)
225229
$menuItem->title = $request->title;
226230
$menuItem->slug = Str::slug($request->title);
227231
$menuItem->url = $request->url;
232+
$menuItem->route = $request->route;
233+
$menuItem->params = $request->params;
234+
$menuItem->controller = $request->controller;
235+
$menuItem->middleware = $request->middleware;
228236
$menuItem->target = $request->target;
229237
$menuItem->parent_id = $parent_id;
230238
$menuItem->icon = $request->icon;
@@ -581,4 +589,9 @@ public function getSettings(Request $request)
581589

582590
return response()->json(['success' => false]);
583591
}
592+
593+
public function setRoute(Request $request)
594+
{
595+
return "Set your own controller";
596+
}
584597
}

0 commit comments

Comments
 (0)