From 15135d64d744c81d6db0f3eb109f85b2d4dd3df2 Mon Sep 17 00:00:00 2001 From: jitendra Date: Wed, 12 Dec 2018 16:26:20 +0530 Subject: [PATCH] Fixed menu sort issue --- .../src/Providers/AdminServiceProvider.php | 7 ++- packages/Webkul/Ui/src/Menu.php | 53 +++++++++++++++++-- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php b/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php index a50aabcf4..ad7c9eb53 100644 --- a/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php +++ b/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php @@ -68,23 +68,22 @@ class AdminServiceProvider extends ServiceProvider $menu = current(Event::fire('admin.menu.create')); $keys = explode('.', $menu->currentKey); + $subMenus = $tabs = []; if (count($keys) > 1) { $subMenus = [ 'items' => $menu->sortItems(array_get($menu->items, current($keys) . '.children')), - 'current' => $menu->current, - 'currentKey' => $menu->currentKey ]; if (count($keys) > 2) { $tabs = [ 'items' => $menu->sortItems(array_get($menu->items, implode('.children.', array_slice($keys, 0, 2)) . '.children')), - 'current' => $menu->current, - 'currentKey' => $menu->currentKey ]; } } + $menu->items = $menu->sortItems($menu->items); + $view->with('menu', $menu)->with('subMenus', $subMenus)->with('tabs', $tabs); }); } diff --git a/packages/Webkul/Ui/src/Menu.php b/packages/Webkul/Ui/src/Menu.php index 9370f168e..0adb381de 100644 --- a/packages/Webkul/Ui/src/Menu.php +++ b/packages/Webkul/Ui/src/Menu.php @@ -26,7 +26,6 @@ class Menu { public static function create($callback) { $menu = new Menu(); $callback($menu); - $menu->sortItems($menu->items); return $menu; } @@ -58,7 +57,7 @@ class Menu { } $children = str_replace('.', '.children.', $key); - array_set($this->items, $children, $item); + $this->array_set($this->items, $children, $item); } /** @@ -67,9 +66,12 @@ class Menu { * @return void */ public function sortItems($items) { - if(!$items) { - return; + foreach ($items as &$item) { + if(count($item['children'])) { + $item['children'] = $this->sortItems($item['children']); + } } + usort($items, function($a, $b) { if ($a['sort'] == $b['sort']) { return 0; @@ -81,6 +83,49 @@ class Menu { return $items; } + public function array_set(&$array, $key, $value) + { + if (is_null($key)) { + return $array = $value; + } + + $keys = explode('.', $key); + $count = count($keys); + + while (count($keys) > 1) { + $key = array_shift($keys); + + if (! isset($array[$key]) || ! is_array($array[$key])) { + $array[$key] = []; + } + + $array = &$array[$key]; + } + + $finalKey = array_shift($keys); + if(isset($array[$finalKey])) { + $array[$finalKey] = $this->arrayMerge($array[$finalKey], $value); + } else { + $array[$finalKey] = $value; + } + + return $array; + } + + protected function arrayMerge(array &$array1, array &$array2) + { + $merged = $array1; + foreach ($array2 as $key => &$value) { + if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) { + $merged[$key] = $this->arrayMerge($merged[$key], $value); + } else { + $merged[$key] = $value; + } + } + + return $merged; + } + /** * Method to find the active links *