Passed
Push — master ( 2d8943...988cde )
by Florian
03:21
created

AdminLte::buildMenu()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
c 2
b 0
f 0
nc 1
nop 0
dl 0
loc 14
ccs 4
cts 4
cp 1
crap 1
rs 10
1
<?php
2
3
namespace JeroenNoten\LaravelAdminLte;
4
5
use Illuminate\Contracts\Container\Container;
6
use Illuminate\Contracts\Events\Dispatcher;
7
use JeroenNoten\LaravelAdminLte\Events\BuildingMenu;
8
use JeroenNoten\LaravelAdminLte\Helpers\LayoutHelper;
9
use JeroenNoten\LaravelAdminLte\Helpers\MenuItemHelper;
10
use JeroenNoten\LaravelAdminLte\Menu\Builder;
11
12
class AdminLte
13
{
14
    /**
15
     * The array of menu items.
16
     *
17
     * @var array
18
     */
19
    protected $menu;
20
21
    /**
22
     * The array of menu filters. These filters will apply on each one of the
23
     * menu items in order to transforms they in some way.
24
     *
25
     * @var array
26
     */
27
    protected $filters;
28
29
    /**
30
     * The events dispatcher.
31
     *
32
     * @var Dispatcher
33
     */
34
    protected $events;
35
36
    /**
37
     * The application service container.
38
     *
39
     * @var Container
40
     */
41
    protected $container;
42
43
    /**
44
     * Map between a valid menu filter token and his respective filter method.
45
     * These filters are intended to get a specific set of menu items.
46
     *
47
     * @var array
48
     */
49
    protected $menuFilterMap;
50
51
    /**
52
     * Constructor.
53
     *
54
     * @param array $filters
55
     * @param Dispatcher $events
56
     * @param Container $container
57
     */
58 8
    public function __construct(array $filters, Dispatcher $events, Container $container)
59
    {
60 8
        $this->filters = $filters;
61 8
        $this->events = $events;
62 8
        $this->container = $container;
63
64
        // Fill the map of filters methods.
65
66
        $this->menuFilterMap = [
67 8
            'sidebar'      => [$this, 'sidebarFilter'],
68 8
            'navbar-left'  => [$this, 'navbarLeftFilter'],
69 8
            'navbar-right' => [$this, 'navbarRightFilter'],
70 8
            'navbar-user'  => [$this, 'navbarUserMenuFilter'],
71
        ];
72 8
    }
73
74
    /**
75
     * Get all the menu items, or a specific set of these.
76
     *
77
     * @param string $filterToken Token representing a subset of the menu items
78
     * @return array A set of menu items
79
     */
80 6
    public function menu($filterToken = null)
81
    {
82 6
        if (empty($this->menu)) {
83 6
            $this->menu = $this->buildMenu();
84
        }
85
86
        // Check for filter token.
87
88 6
        if (isset($this->menuFilterMap[$filterToken])) {
89 4
            return array_filter(
90 4
                $this->menu,
91 4
                $this->menuFilterMap[$filterToken]
92
            );
93
        }
94
95
        // No filter token provided, return the complete menu.
96
97 2
        return $this->menu;
98
    }
99
100
    /**
101
     * Build the menu.
102
     *
103
     * @return array The set of menu items
104
     */
105 6
    protected function buildMenu()
106
    {
107
        // Create the menu builder instance.
108
109 6
        $builder = new Builder($this->buildFilters());
110
111
        // Dispatch the BuildingMenu event. Listeners of this event will fill
112
        // the menu.
113
114 6
        $this->events->dispatch(new BuildingMenu($builder));
115
116
        // Return the set of menu items.
117
118 6
        return $builder->menu;
119
    }
120
121
    /**
122
     * Build the menu filters.
123
     *
124
     * @return array The set of filters that will apply on each menu item
125
     */
126 6
    protected function buildFilters()
127
    {
128 6
        return array_map([$this->container, 'make'], $this->filters);
129
    }
130
131
    /**
132
     * Filter method used to get the sidebar menu items.
133
     *
134
     * @param mixed $item A menu item
135
     * @return bool
136
     */
137 1
    private function sidebarFilter($item)
138
    {
139 1
        return MenuItemHelper::isSidebarItem($item);
140
    }
141
142
    /**
143
     * Filter method used to get the top navbar left menu items.
144
     *
145
     * @param mixed $item A menu item
146
     * @return bool
147
     */
148 1
    private function navbarLeftFilter($item)
149
    {
150 1
        if (LayoutHelper::isLayoutTopnavEnabled() && MenuItemHelper::isSidebarItem($item)) {
151 1
            return MenuItemHelper::isValidNavbarItem($item);
152
        }
153
154 1
        return MenuItemHelper::isNavbarLeftItem($item);
155
    }
156
157
    /**
158
     * Filter method used to get the top navbar right menu items.
159
     *
160
     * @param mixed $item A menu item
161
     * @return bool
162
     */
163 1
    private function navbarRightFilter($item)
164
    {
165 1
        return MenuItemHelper::isNavbarRightItem($item);
166
    }
167
168
    /**
169
     * Filter method used to get the navbar user menu items.
170
     *
171
     * @param mixed $item A menu item
172
     * @return bool
173
     */
174 1
    private function navbarUserMenuFilter($item)
175
    {
176 1
        return MenuItemHelper::isNavbarUserItem($item);
177
    }
178
}
179