Skip to content
This repository was archived by the owner on Jan 3, 2023. It is now read-only.

Commit 9819f95

Browse files
committed
add menu page order & remove
Update README.md menu comp cleanup small update for nav trait add urlRouteCheck()
1 parent 1379587 commit 9819f95

23 files changed

+227
-78
lines changed

README.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
> - Menu Nested Set
1010
> - https://github.com/gazsp/baum
1111
12+
- Javascript
13+
+ [Vue](https://vuejs.org/)
14+
+ [jQuery](https://jquery.com/)
15+
+ [vue-sortable](https://github.com/sagalbot/vue-sortable/pull/17#issuecomment-260562645)
16+
1217
## Installation
1318

1419
- `composer require ctf0/simple-menu`
@@ -31,8 +36,6 @@
3136
- for simpleMenu [Wiki](https://github.com/ctf0/simple-menu/wiki/Publish)
3237
- also check the **Dependencies** packages pages for "config/options/migrations".
3338

34-
- check `resources/assets/vendor/SimpleMenu` and add the **component & styles** to your build system.
35-
3639
## Config
3740
**config/simpleMenu.php**
3841
```php
@@ -91,4 +94,3 @@ return [
9194
# ToDo
9295

9396
* [ ] Menu Pages Hierarchy "nesting" Creation.
94-
* [ ] Clear cache through pivot table events.

src/Controllers/Admin/MenusController.php

+51-9
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44

55
use App\Http\Controllers\Controller;
66
use ctf0\SimpleMenu\Models\Menu;
7+
use ctf0\SimpleMenu\Models\Page;
78
use Illuminate\Http\Request;
9+
use Illuminate\Support\Facades\DB;
810

911
class MenusController extends Controller
1012
{
1113
/**
12-
* Display a listing of Permission.
14+
* Display a listing of Menu.
1315
*
1416
* @return \Illuminate\Http\Response
1517
*/
@@ -21,7 +23,7 @@ public function index()
2123
}
2224

2325
/**
24-
* Show the form for creating new Permission.
26+
* Show the form for creating new Menu.
2527
*
2628
* @return \Illuminate\Http\Response
2729
*/
@@ -31,7 +33,7 @@ public function create()
3133
}
3234

3335
/**
34-
* Store a newly created Permission in storage.
36+
* Store a newly created Menu in storage.
3537
*
3638
* @param \App\Http\Requests\StoreMenusRequest $request
3739
*
@@ -49,21 +51,21 @@ public function store(Request $request)
4951
}
5052

5153
/**
52-
* Show the form for editing Permission.
54+
* Show the form for editing Menu.
5355
*
5456
* @param int $id
5557
*
5658
* @return \Illuminate\Http\Response
5759
*/
5860
public function edit($id)
5961
{
60-
$menu = Menu::findOrFail($id);
62+
$menu = Menu::findOrFail($id);
6163

6264
return view('SimpleMenu::pages.'.config('simpleMenu.framework').'.menus.edit', compact('menu'));
6365
}
6466

6567
/**
66-
* Update Permission in storage.
68+
* Update Menu in storage.
6769
*
6870
* @param \App\Http\Requests\UpdateMenusRequest $request
6971
* @param int $id
@@ -76,13 +78,21 @@ public function update(Request $request, $id)
7678
'name' => 'required|unique:menus,name,'.$id,
7779
]);
7880

79-
Menu::findOrFail($id)->update($request->all());
81+
// update menu pages order
82+
foreach (json_decode($request->saveList) as $item) {
83+
DB::table('menu_page')->where('page_id', $item->id)->update(['order'=>$item->order]);
84+
}
8085

81-
return redirect()->route('admin.menus.index');
86+
Menu::findOrFail($id)->update($request->except('saveList'));
87+
88+
// todo
89+
// page nest list
90+
91+
return back();
8292
}
8393

8494
/**
85-
* Remove Permission from storage.
95+
* Remove Menu from storage.
8696
*
8797
* @param int $id
8898
*
@@ -94,4 +104,36 @@ public function destroy($id)
94104

95105
return redirect()->route('admin.menus.index');
96106
}
107+
108+
/* helpers */
109+
110+
/**
111+
* remove page from menu with ajax.
112+
*
113+
* @param [type] $id [description]
114+
* @param Request $request [description]
115+
*
116+
* @return [type] [description]
117+
*/
118+
public function removePage($id, Request $request)
119+
{
120+
if (Menu::find($id)->pages()->detach($request->page_id)) {
121+
Menu::find($id)->touch();
122+
return response()->json(['done'=>true]);
123+
}
124+
}
125+
126+
/**
127+
* get all menu pages for sorting with vuejs.
128+
*
129+
* @param Menu $id [description]
130+
*
131+
* @return [type] [description]
132+
*/
133+
public function getPages(Menu $id)
134+
{
135+
$pages = $id->pages()->orderBy('pivot_order', 'asc')->where('url->'.app()->getLocale(), '!=', '')->get();
136+
137+
return response()->json(['data' => $pages]);
138+
}
97139
}

src/Controllers/Admin/PagesController.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ public function destroy($id)
131131
protected function storeValidation($request)
132132
{
133133
$validator = Validator::make($request->all(), [
134-
'route_name' => 'required|unique:pages,route_name',
135134
'template' => 'required_without:action',
135+
'route_name' => 'required|unique:pages,route_name',
136136
'roles' => 'required',
137137
'permissions' => 'required',
138138
]);
@@ -167,8 +167,8 @@ protected function storeValidation($request)
167167
protected function updateValidation($request, $id)
168168
{
169169
$validator = Validator::make($request->all(), [
170-
'route_name' => 'required|unique:pages,route_name,'.$id,
171170
'template' => 'required_without:action',
171+
'route_name' => 'required|unique:pages,route_name,'.$id,
172172
'roles' => 'required',
173173
'permissions' => 'required',
174174
]);

src/Models/Menu.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ class Menu extends Model
1414

1515
public function pages()
1616
{
17-
return $this->belongsToMany(Page::class);
17+
return $this->belongsToMany(Page::class)->withPivot('order');
1818
}
1919
}

src/Observers/MenuObserver.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
class MenuObserver
1010
{
1111
/**
12-
* Listen to the User saved event.
12+
* Listen to the Menu saved event.
1313
*/
1414
public function saved(Menu $menu)
1515
{
1616
return $this->cleanData($menu);
1717
}
1818

1919
/**
20-
* Listen to the User deleting event.
20+
* Listen to the Menu deleting event.
2121
*/
2222
public function deleted(Menu $menu)
2323
{
@@ -34,7 +34,7 @@ public function deleted(Menu $menu)
3434
protected function cleanData($menu)
3535
{
3636
foreach (array_keys(LaravelLocalization::getSupportedLocales()) as $code) {
37-
return Cache::forget("{$menu->name}Menu-{$code}Pages");
37+
Cache::forget("{$menu->name}Menu-{$code}Pages");
3838
}
3939
}
4040
}

src/Observers/PageObserver.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
class PageObserver
1212
{
1313
/**
14-
* Listen to the User saved event.
14+
* Listen to the Page saved event.
1515
*/
1616
public function saved(Page $page)
1717
{
1818
return $this->cleanData($page);
1919
}
2020

2121
/**
22-
* Listen to the User deleting event.
22+
* Listen to the Page deleted event.
2323
*/
2424
public function deleted(Page $page)
2525
{
@@ -46,11 +46,11 @@ protected function cleanData($page)
4646
foreach (array_keys(LaravelLocalization::getSupportedLocales()) as $code) {
4747
// clear menu cache
4848
Menu::get()->pluck('name')->each(function ($item) use ($code) {
49-
return Cache::forget("{$item}Menu-{$code}Pages");
49+
Cache::forget("{$item}Menu-{$code}Pages");
5050
});
5151

5252
// clear page cache
53-
return Cache::forget("$code-$route_name");
53+
Cache::forget("$code-$route_name");
5454
}
5555
}
5656
}

src/Traits/MenusTrait.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function viewComp($name)
5151
public function query($name)
5252
{
5353
Cache::rememberForever("{$name}Menu-".app()->getLocale().'Pages', function () use ($name) {
54-
return app(Menu::class)->where('name', $name)->first()->pages()->where('url->'.app()->getLocale(), '!=', '')->get();
54+
return app(Menu::class)->where('name', $name)->first()->pages()->orderBy('pivot_order', 'asc')->where('url->'.app()->getLocale(), '!=', '')->get();
5555
});
5656

5757
return cache("{$name}Menu-".app()->getLocale().'Pages');

src/Traits/NavigationTrait.php

+8-10
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public function getRoute($crntRouteName, array $params = null)
5959
if ($params) {
6060
foreach ($params as $key => $value) {
6161
if ($crntRouteName == $key) {
62-
session([$crntRouteName => $value]);
62+
session([$key => $value]);
6363

6464
// fix link not being 'is-active' when "hideDefaultLocaleInURL => true"
6565
if (LaravelLocalization::hideDefaultLocaleInURL() && $code == LaravelLocalization::getDefaultLocale()) {
@@ -69,16 +69,13 @@ public function getRoute($crntRouteName, array $params = null)
6969
}
7070

7171
$this->urlRoute = $finalUrl;
72-
7372
return $finalUrl;
7473
}
7574
}
7675
}
7776

78-
$finalUrl = route($crntRouteName);
79-
$this->urlRoute = $finalUrl;
80-
81-
return $finalUrl;
77+
$this->urlRoute = route($crntRouteName);
78+
return $this->urlRoute;
8279
}
8380

8481
/**
@@ -91,6 +88,11 @@ public function urlRoute()
9188
return $this->urlRoute;
9289
}
9390

91+
public function urlRouteCheck()
92+
{
93+
return request()->url() == $this->urlRoute;
94+
}
95+
9496
public function getRouteData($name)
9597
{
9698
return cache(LaravelLocalization::getCurrentLocale().'-'.$name);
@@ -116,11 +118,9 @@ protected function routeLink($name, $code)
116118
switch (config('simpleMenu.unFoundLocalizedRoute')) {
117119
case 'home':
118120
return '/';
119-
120121
break;
121122
case 'error':
122123
return '404';
123-
124124
break;
125125
}
126126
}
@@ -147,13 +147,11 @@ public function render($pages, $classes = null, $params = null)
147147
$ul = config('simpleMenu.listClasses.ul');
148148
$li = config('simpleMenu.listClasses.li');
149149
$a = config('simpleMenu.listClasses.a');
150-
151150
break;
152151
default:
153152
$ul = array_get($classes, 'ul');
154153
$li = array_get($classes, 'li');
155154
$a = array_get($classes, 'a');
156-
157155
break;
158156
}
159157

src/database/migrations/2017_03_01_232836_create_menu_page_table.php

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public function up()
1616
$table->foreign('menu_id')->references('id')->on('menus')->onDelete('cascade');
1717
$table->integer('page_id')->unsigned()->index();
1818
$table->foreign('page_id')->references('id')->on('pages')->onDelete('cascade');
19+
20+
$table->integer('order')->nullable();
1921
});
2022
}
2123

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<template></template>
2+
3+
<script>
4+
import Sortable from 'vue-sortable'
5+
Vue.use(Sortable)
6+
7+
export default {
8+
props: ['DelRoute', 'PagesRoute'],
9+
data() {
10+
return {
11+
list: [],
12+
saveList: []
13+
};
14+
},
15+
created() {
16+
$.ajaxSetup({
17+
cache: false,
18+
headers: {
19+
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
20+
}
21+
});
22+
23+
this.getPages();
24+
},
25+
methods: {
26+
onUpdate(event) {
27+
this.list.splice(event.newIndex, 0, (this.list.splice(event.oldIndex, 1)[0]))
28+
},
29+
getPages(){
30+
$.get(this.PagesRoute, (res) => {
31+
this.list = res.data;
32+
});
33+
},
34+
deleteItem(item){
35+
$.post(this.DelRoute,{
36+
page_id: item.id,
37+
}, (res) => {
38+
if (res.done) {
39+
this.list.splice(this.list.indexOf(item), 1)
40+
}
41+
});
42+
}
43+
},
44+
watch: {
45+
list(val) {
46+
this.saveList = []
47+
48+
val.map((item) => {
49+
return this.saveList.push({
50+
id: item.id,
51+
order: this.list.indexOf(item) + 1
52+
})
53+
})
54+
}
55+
},
56+
}
57+
</script>

src/resources/assets/sass/style.scss

+6
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,9 @@
3333
.mce-path {
3434
display: none !important;
3535
}
36+
37+
// nest
38+
.menu-item {
39+
padding: 0.5em;
40+
margin-bottom: 0.5em !important;
41+
}

src/resources/lang/en/messages.php

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
'fields' => [
2020
'title' => 'Title',
2121
'roles' => 'Roles',
22+
'menus' => 'Menus',
2223
'permissions' => 'Permissions',
2324
],
2425
],

0 commit comments

Comments
 (0)