Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
MainMenuDirector
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 3
42
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getMenuData
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
 buildMenu
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2/**
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 * http://www.gnu.org/copyleft/gpl.html
17 *
18 * @file
19 */
20namespace MediaWiki\Minerva\Menu\Main;
21
22/**
23 * Director responsible for building Main Menu
24 */
25final class MainMenuDirector {
26
27    private IMainMenuBuilder $builder;
28    private ?array $menuData = null;
29
30    /**
31     * Director responsible for Main Menu building
32     *
33     * @param IMainMenuBuilder $builder
34     */
35    public function __construct( IMainMenuBuilder $builder ) {
36        $this->builder = $builder;
37    }
38
39    /**
40     * Returns a data representation of the main menus
41     *
42     * @param array $contentNavUrls result of buildContentNavigationUrls
43     * @param array $sidebar
44     * @return array
45     */
46    public function getMenuData( array $contentNavUrls, array $sidebar ): array {
47        if ( $this->menuData === null ) {
48            $this->menuData = $this->buildMenu(
49                $contentNavUrls,
50                $sidebar
51            );
52        }
53        return $this->menuData;
54    }
55
56    /**
57     * Build the menu data array that can be passed to views/javascript
58     *
59     * @param array $contentNavUrls
60     * @param array $sidebar
61     * @return array
62     */
63    private function buildMenu( array $contentNavUrls, array $sidebar ): array {
64        $builder = $this->builder;
65        $menuData = [
66            'items' => [
67                'groups' => [],
68                'sitelinks' => $builder->getSiteLinks()->getEntries()
69            ]
70        ];
71
72        $groups = [
73            // sidebar comes from MediaWiki:Sidebar so we can't assume it doesn't exist.
74            $builder->getDiscoveryGroup( $sidebar['navigation'] ?? [] ),
75            $builder->getInteractionToolsGroup(),
76            $builder->getPersonalToolsGroup( $contentNavUrls['user-menu'] ),
77            $builder->getSettingsGroup(),
78            $builder->getDonateGroup(),
79        ];
80        foreach ( $groups as $group ) {
81            if ( $group->hasEntries() ) {
82                $menuData['items']['groups'][] = $group->serialize();
83            }
84        }
85        return $menuData;
86    }
87}