From df2ca9247a770495e278130d51bf626a6d73efb2 Mon Sep 17 00:00:00 2001 From: Purvesh Date: Sat, 10 Aug 2019 10:57:15 +1200 Subject: [PATCH] updated menu builder --- resources/components/cms/menu/MenuSave.vue | 8 ++- resources/lang/en/cms.php | 1 + resources/views/cms/menu/_fields.blade.php | 17 ++++- resources/views/cms/menu/create.blade.php | 3 +- resources/views/cms/menu/edit.blade.php | 1 + src/Cms/Controllers/MenuGroupController.php | 9 ++- .../Contracts/MenuGroupModelInterface.php | 8 +++ src/Database/Models/Menu.php | 10 +++ .../Repository/MenuGroupRepository.php | 21 ++++++ src/Menu/MenuBuilder.php | 70 +++++++++---------- src/Menu/MenuItem.php | 42 +++++++++-- src/Support/Providers/MenuProvider.php | 44 ++++++++---- src/System/ViewComposers/LayoutComposer.php | 2 +- 13 files changed, 178 insertions(+), 58 deletions(-) diff --git a/resources/components/cms/menu/MenuSave.vue b/resources/components/cms/menu/MenuSave.vue index c3ece487c..8e9a1c820 100644 --- a/resources/components/cms/menu/MenuSave.vue +++ b/resources/components/cms/menu/MenuSave.vue @@ -2,10 +2,11 @@ import isNil from 'lodash/isNil'; export default { - props: ['propCategories', 'baseUrl', 'propMenus', 'menuGroup'], + props: ['propCategories', 'baseUrl', 'propMenus', 'menuGroup', 'propFrontMenus'], data () { return { categories: [], + frontMenus: [], selected: null, menus: [], form: this.$form.createForm(this), @@ -49,6 +50,11 @@ export default { if (!isNil(this.propCategories)) { this.propCategories.forEach(ele => this.categories.push(ele)); } + if (!isNil(this.propFrontMenus)) { + Object.keys(this.propFrontMenus).forEach(key => { + this.frontMenus.push(this.propFrontMenus[key]) + }); + } if (!isNil(this.propMenus)) { this.propMenus.forEach(ele => this.menus.push(ele)); } diff --git a/resources/lang/en/cms.php b/resources/lang/en/cms.php index 381000773..7b9460c5c 100644 --- a/resources/lang/en/cms.php +++ b/resources/lang/en/cms.php @@ -40,6 +40,7 @@ 'identifier' => 'Menu Group Identifier', 'builder' => 'Menu Builder', 'category_list' => 'Categories', + 'frontmenu_list' => 'Front Menus', 'create' => [ 'title' => 'Menu Builder' ] diff --git a/resources/views/cms/menu/_fields.blade.php b/resources/views/cms/menu/_fields.blade.php index 57ad79ee1..88a68b595 100644 --- a/resources/views/cms/menu/_fields.blade.php +++ b/resources/views/cms/menu/_fields.blade.php @@ -49,7 +49,6 @@ -

{{ __('avored::cms.menu.category_list') }}

+ +

{{ __('avored::cms.menu.frontmenu_list') }}

+

{{ __('avored::cms.menu.create.title') }}

diff --git a/resources/views/cms/menu/create.blade.php b/resources/views/cms/menu/create.blade.php index 07b28a5d5..91f145376 100644 --- a/resources/views/cms/menu/create.blade.php +++ b/resources/views/cms/menu/create.blade.php @@ -11,7 +11,8 @@ @section('content') - diff --git a/resources/views/cms/menu/edit.blade.php b/resources/views/cms/menu/edit.blade.php index edbefecb5..65dacb91c 100644 --- a/resources/views/cms/menu/edit.blade.php +++ b/resources/views/cms/menu/edit.blade.php @@ -13,6 +13,7 @@ categoryRepository->getCategoryOptionForMenuBuilder(); - + $frontMenus = MenuFacade::frontMenus(); + return view('avored::cms.menu.create') + ->with('frontMenus', $frontMenus) ->with('categories', $categories); } @@ -93,8 +96,11 @@ public function store(MenuRequest $request) public function edit(MenuGroup $menuGroup) { $categories = $this->categoryRepository->getCategoryOptionForMenuBuilder(); + $frontMenus = MenuFacade::frontMenus(); + return view('avored::cms.menu.edit') ->with('categories', $categories) + ->with('frontMenus', $frontMenus) ->with('menuGroup', $menuGroup); } @@ -107,6 +113,7 @@ public function edit(MenuGroup $menuGroup) */ public function update(MenuRequest $request, MenuGroup $menuGroup) { + $menuGroup->menus()->delete(); $menuGroup->update($request->all()); $menus = json_decode($request->get('menu_json')); diff --git a/src/Database/Contracts/MenuGroupModelInterface.php b/src/Database/Contracts/MenuGroupModelInterface.php index 22cd863a7..7aa1eeed0 100644 --- a/src/Database/Contracts/MenuGroupModelInterface.php +++ b/src/Database/Contracts/MenuGroupModelInterface.php @@ -4,6 +4,7 @@ use AvoRed\Framework\Database\Models\MenuGroup; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Support\Collection as SupportCollection; interface MenuGroupModelInterface { @@ -21,6 +22,13 @@ public function create(array $data) : MenuGroup; */ public function find(int $id) : MenuGroup; + /** + * Get Menus Resource from data store + * @param string $identifier + * @return \AvoRed\Framework\Database\Models\MenuGroup $menuGroup + */ + public function getTreeByIdentifier(string $identifier) : SupportCollection; + /** * Delete MenuGroup Resource from a database * @param int $id diff --git a/src/Database/Models/Menu.php b/src/Database/Models/Menu.php index 077e8236f..b18e25b9c 100644 --- a/src/Database/Models/Menu.php +++ b/src/Database/Models/Menu.php @@ -11,4 +11,14 @@ class Menu extends Model * @var array */ protected $fillable = ['name', 'url', 'sort_order', 'menu_group_id', 'parent_id']; + + + /** + * Menu has many sub menus + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function submenus() + { + return $this->hasMany(self::class, 'parent_id'); + } } diff --git a/src/Database/Repository/MenuGroupRepository.php b/src/Database/Repository/MenuGroupRepository.php index b0dea5c93..6ee426a76 100644 --- a/src/Database/Repository/MenuGroupRepository.php +++ b/src/Database/Repository/MenuGroupRepository.php @@ -5,6 +5,7 @@ use AvoRed\Framework\Database\Models\MenuGroup; use AvoRed\Framework\Database\Contracts\MenuGroupModelInterface; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Support\Collection as SupportCollection; class MenuGroupRepository implements MenuGroupModelInterface { @@ -38,6 +39,26 @@ public function delete(int $id): int return MenuGroup::destroy($id); } + /** + * Find MenuGroup Resource from data store + * @param string $identifier + * @return \AvoRed\Framework\Database\Models\MenuGroup $menuGroup + */ + public function getTreeByIdentifier(string $identifier) : SupportCollection + { + $menus = collect(); + $menuGroup = MenuGroup::whereIdentifier($identifier)->first(); + + + $modelMenus = $menuGroup->menus()->whereNull('parent_id')->get(); + foreach ($modelMenus as $modelMenu) { + $modelMenu->submenus; + $menus->push($modelMenu); + } + + return $menus; + } + /** * Get all the categories from the connected database * @return \Illuminate\Database\Eloquent\Collection $menuGroups diff --git a/src/Menu/MenuBuilder.php b/src/Menu/MenuBuilder.php index 6e8394e47..13556968b 100644 --- a/src/Menu/MenuBuilder.php +++ b/src/Menu/MenuBuilder.php @@ -2,6 +2,7 @@ namespace AvoRed\Framework\Menu; use Illuminate\Support\Collection; +use stdClass; class MenuBuilder { @@ -11,24 +12,12 @@ class MenuBuilder */ protected $collection; - /** - * Admin Menu Collection. - * @var \Illuminate\Support\Collection - */ - protected $adminCollection; - /** - * Admin Menu Flag. - * @var bool - */ - protected $admin = false; - /** * Construct for the menu builder */ public function __construct() { $this->collection = Collection::make([]); - $this->adminCollection = Collection::make([]); } /** @@ -41,36 +30,36 @@ public function make($key, callable $callable) { $menu = new MenuItem($callable); $menu->key($key); - if ($this->admin) { - $this->adminCollection->put($key, $menu); - } else { - $this->collection->put($key, $menu); - } + $this->collection->put($key, $menu); + return $this; } /** - * Make a admin flag true. - * @return self + * Return Menu Object. + * @var string + * @return \AvoRed\Framework\Menu\Menu */ - public function admin() + public function get($key) { - $this->admin = true; - - return $this; + return $this->collection->get($key); } /** - * Return Menu Object. - * @var string - * @return \AvoRed\Framework\Menu\Menu + * Return all available Menu in Menu. + * @param void + * @return \Illuminate\Support\Collection */ - public function get($key) + public function all($admin = false) { - if ($this->admin) { - return $this->adminCollection->get($key); + if ($admin) { + return $this->collection->filter(function ($item) { + return $item->type() === MenuItem::ADMIN; + }); } else { - return $this->collection->get($key); + return $this->collection->filter(function ($item) { + return $item->type() === MenuItem::FRONT; + }); } } @@ -79,12 +68,23 @@ public function get($key) * @param void * @return \Illuminate\Support\Collection */ - public function all() + public function frontMenus() { - if ($this->admin) { - return $this->adminCollection->all(); - } else { - return $this->collection->all(); + $frontMenus = collect(); + + $i = 1; + foreach ($this->collection as $item) { + if ($item->type() === MenuItem::FRONT) { + $menu = new stdClass; + $menu->id = $i; + $menu->name = $item->label; + $menu->url = route($item->route(), $item->params()); + $menu->submenus = $item->submenus ?? []; + $frontMenus->push($menu); + $i++; + } } + + return $frontMenus; } } diff --git a/src/Menu/MenuItem.php b/src/Menu/MenuItem.php index 482ac487e..fc6ea3e1e 100644 --- a/src/Menu/MenuItem.php +++ b/src/Menu/MenuItem.php @@ -5,35 +5,52 @@ class MenuItem implements MenuInterface { + /** + * Constant Front + * @var string FRONT + */ + const FRONT = "front"; + + /** + * Constant Admin + * @var string ADMIN + */ + const ADMIN = "admin"; + /** * @var string $label */ - protected $label; + public $label; + + /** + * @var string $type + */ + public $type; /** * @var string $icon */ - protected $icon; + public $icon; /** * @var array $attributes */ - protected $attributes; + public $attributes; /** * @var string $key */ - protected $key; + public $key; /** * @var string $params */ - protected $params; + public $params; /** * @var string $routeName */ - protected $routeName; + public $routeName; /** * AvoRed Front Menu Construct method. @@ -57,6 +74,19 @@ public function label($label = null) return trans($this->label); } + /** + * Get/Set Admin Menu Type. + * @return mixed + */ + public function type($type = null) + { + if (null !== $type) { + $this->type = $type; + return $this; + } + return $this->type; + } + /** * Get/Set Admin Menu Identifier. * @return \AvoRed\Framework\Menu\Menu|string diff --git a/src/Support/Providers/MenuProvider.php b/src/Support/Providers/MenuProvider.php index e3cfbca29..84daf4045 100644 --- a/src/Support/Providers/MenuProvider.php +++ b/src/Support/Providers/MenuProvider.php @@ -63,48 +63,56 @@ public function provides() */ public function registerAdminMenu() { - Menu::admin()->make('catalog', function (MenuItem $menu) { + Menu::make('catalog', function (MenuItem $menu) { $menu->label('avored::system.admin_menus.catalog') + ->type(MenuItem::ADMIN) ->icon('shop') ->route('#'); }); - $catalogMenu = Menu::admin()->get('catalog'); + $catalogMenu = Menu::get('catalog'); $catalogMenu->subMenu('product', function (MenuItem $menu) { $menu->key('product') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.product') ->route('admin.product.index'); }); $catalogMenu->subMenu('category', function (MenuItem $menu) { $menu->key('category') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.category') ->route('admin.category.index'); }); $catalogMenu->subMenu('property', function (MenuItem $menu) { $menu->key('property') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.property') ->route('admin.property.index'); }); $catalogMenu->subMenu('attribute', function (MenuItem $menu) { $menu->key('attribute') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.attribute') ->route('admin.attribute.index'); }); - Menu::admin()->make('cms', function (MenuItem $menu) { + Menu::make('cms', function (MenuItem $menu) { $menu->label('avored::system.admin_menus.cms') + ->type(MenuItem::ADMIN) ->icon('solution') ->route('#'); }); - $cmsMenu = Menu::admin()->get('cms'); + $cmsMenu = Menu::get('cms'); $cmsMenu->subMenu('menu-group', function (MenuItem $menu) { $menu->key('menu-group') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.menu') ->route('admin.menu-group.index'); }); $cmsMenu->subMenu('page', function (MenuItem $menu) { $menu->key('page') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.page') ->route('admin.page.index'); }); @@ -116,53 +124,61 @@ public function registerAdminMenu() ->route('admin.menu.index'); }); */ - Menu::admin()->make('order', function (MenuItem $menu) { + Menu::make('order', function (MenuItem $menu) { $menu->label('avored::system.admin_menus.order') ->icon('gold') + ->type(MenuItem::ADMIN) ->route('#'); }); - $orderMenu = Menu::admin()->get('order'); + $orderMenu = Menu::get('order'); $orderMenu->subMenu('order', function (MenuItem $menu) { $menu->key('order') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.order') ->route('admin.order.index'); }); $orderMenu->subMenu('order-status', function (MenuItem $menu) { $menu->key('order-status') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.order-status') ->route('admin.order-status.index'); }); - Menu::admin()->make('user', function (MenuItem $menu) { + Menu::make('user', function (MenuItem $menu) { $menu->label('avored::system.admin_menus.user') - ->icon('user') - ->route('#'); + ->type(MenuItem::ADMIN) + ->icon('user') + ->route('#'); }); - $userGroupMenu = Menu::admin()->get('user'); + $userGroupMenu = Menu::get('user'); $userGroupMenu->subMenu('user_group', function (MenuItem $menu) { $menu->key('user_group') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.user-group') ->route('admin.user-group.index'); }); - Menu::admin()->make('system', function (MenuItem $menu) { + Menu::make('system', function (MenuItem $menu) { $menu->label('avored::system.admin_menus.system') + ->type(MenuItem::ADMIN) ->icon('setting') ->route('#'); }); - $systemMenu = Menu::admin()->get('system'); + $systemMenu = Menu::get('system'); $systemMenu->subMenu('configuration', function (MenuItem $menu) { $menu->key('configuration') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.configuration') ->route('admin.configuration.index'); }); $systemMenu->subMenu('admin-user', function (MenuItem $menu) { $menu->key('admin-user') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.admin-user') ->route('admin.admin-user.index'); }); @@ -180,22 +196,26 @@ public function registerAdminMenu() $systemMenu->subMenu('currency', function (MenuItem $menu) { $menu->key('currency') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.currency') ->route('admin.currency.index'); }); $systemMenu->subMenu('state', function (MenuItem $menu) { $menu->key('state') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.state') ->route('admin.state.index'); }); $systemMenu->subMenu('role', function (MenuItem $menu) { $menu->key('role') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.role') ->route('admin.role.index'); }); $systemMenu->subMenu('language', function (MenuItem $menu) { $menu->key('language') + ->type(MenuItem::ADMIN) ->label('avored::system.admin_menus.language') ->route('admin.language.index'); }); diff --git a/src/System/ViewComposers/LayoutComposer.php b/src/System/ViewComposers/LayoutComposer.php index fc638e845..e0a9a1697 100644 --- a/src/System/ViewComposers/LayoutComposer.php +++ b/src/System/ViewComposers/LayoutComposer.php @@ -15,7 +15,7 @@ class LayoutComposer */ public function compose(View $view) { - $adminMenus = Menu::admin()->all(); + $adminMenus = Menu::all($admin = true); $view->with('adminMenus', $adminMenus); } }