mediawiki-skins-MinervaNeue/includes/Menu/PageActions/PageActionsDirector.php

110 lines
3.4 KiB
PHP
Raw Permalink Normal View History

PageActions menu should use Builder pattern The PageActions menu shouldn't be built inside SkinMinerva class. All menus should be build in similar way so it's easier to understand how different parts of the system work. This will allow us to easily track different menu elements/move elements between different menus. Additionally we should allow extensions/3rd party to modify both the toolbar and overflow menus. Changes: - Removed PageActions logic from SkinMinerva class - introduced new PageActions/Director to build page actions menu - introduced Builders for toolbar, and different types of overflow menu - because Overflow menu elements require the BaseTemplate::data['nav_urls] array, instead building all links, pass the array when building PageActions menu. Code for getting menu entries had to be rewritten (use $navUrls array instead of $this->tpl['nav_urls']; - ServiceWirings file contains logic on what to pass to PageActions/Director class (which builders) - PageActionsMenuEntry setTitle() and setNodeID() returns $this so we can use method chaining. Only a syntax sugar. - if AMC is not available/Overflow menu is disabled via config, system will pass EmptyOverflowBuilder. System will not add "show more" icon to toolbar menu when $overflowBuilder returns empty set of options. - both ToolbarBulder and OverflowMenuBuilders (except EmptyOverflowBuilder) will run 'MobileMenu' hook. Extensions should listen to hook, and inject it's own menu entries at their leisure. Required follow-ups: - SkinMinerva provides isAllowedAction() method which is used both in the skin code and in Toolbar builder. We should extract that method into separate service - SkinMinerva provides getHistoryUrl() method which is used both in the skin code and in Toolbar builder. We should provide MinervaUrls service that knows how to build custom mobile URLs. Bug: T221792 Change-Id: Ie08c4b61cea60c3a42fbf796a39360feea22bc33
2019-05-23 22:34:10 +00:00
<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
namespace MediaWiki\Minerva\Menu\PageActions;
use MessageLocalizer;
/**
* Director responsible for building Page Actions menu.
* This class is stateless.
*/
final class PageActionsDirector {
private ToolbarBuilder $toolbarBuilder;
private IOverflowBuilder $overflowBuilder;
private MessageLocalizer $messageLocalizer;
PageActions menu should use Builder pattern The PageActions menu shouldn't be built inside SkinMinerva class. All menus should be build in similar way so it's easier to understand how different parts of the system work. This will allow us to easily track different menu elements/move elements between different menus. Additionally we should allow extensions/3rd party to modify both the toolbar and overflow menus. Changes: - Removed PageActions logic from SkinMinerva class - introduced new PageActions/Director to build page actions menu - introduced Builders for toolbar, and different types of overflow menu - because Overflow menu elements require the BaseTemplate::data['nav_urls] array, instead building all links, pass the array when building PageActions menu. Code for getting menu entries had to be rewritten (use $navUrls array instead of $this->tpl['nav_urls']; - ServiceWirings file contains logic on what to pass to PageActions/Director class (which builders) - PageActionsMenuEntry setTitle() and setNodeID() returns $this so we can use method chaining. Only a syntax sugar. - if AMC is not available/Overflow menu is disabled via config, system will pass EmptyOverflowBuilder. System will not add "show more" icon to toolbar menu when $overflowBuilder returns empty set of options. - both ToolbarBulder and OverflowMenuBuilders (except EmptyOverflowBuilder) will run 'MobileMenu' hook. Extensions should listen to hook, and inject it's own menu entries at their leisure. Required follow-ups: - SkinMinerva provides isAllowedAction() method which is used both in the skin code and in Toolbar builder. We should extract that method into separate service - SkinMinerva provides getHistoryUrl() method which is used both in the skin code and in Toolbar builder. We should provide MinervaUrls service that knows how to build custom mobile URLs. Bug: T221792 Change-Id: Ie08c4b61cea60c3a42fbf796a39360feea22bc33
2019-05-23 22:34:10 +00:00
/**
* Director responsible for Page Actions menu building
*
* @param ToolbarBuilder $toolbarBuilder
PageActions menu should use Builder pattern The PageActions menu shouldn't be built inside SkinMinerva class. All menus should be build in similar way so it's easier to understand how different parts of the system work. This will allow us to easily track different menu elements/move elements between different menus. Additionally we should allow extensions/3rd party to modify both the toolbar and overflow menus. Changes: - Removed PageActions logic from SkinMinerva class - introduced new PageActions/Director to build page actions menu - introduced Builders for toolbar, and different types of overflow menu - because Overflow menu elements require the BaseTemplate::data['nav_urls] array, instead building all links, pass the array when building PageActions menu. Code for getting menu entries had to be rewritten (use $navUrls array instead of $this->tpl['nav_urls']; - ServiceWirings file contains logic on what to pass to PageActions/Director class (which builders) - PageActionsMenuEntry setTitle() and setNodeID() returns $this so we can use method chaining. Only a syntax sugar. - if AMC is not available/Overflow menu is disabled via config, system will pass EmptyOverflowBuilder. System will not add "show more" icon to toolbar menu when $overflowBuilder returns empty set of options. - both ToolbarBulder and OverflowMenuBuilders (except EmptyOverflowBuilder) will run 'MobileMenu' hook. Extensions should listen to hook, and inject it's own menu entries at their leisure. Required follow-ups: - SkinMinerva provides isAllowedAction() method which is used both in the skin code and in Toolbar builder. We should extract that method into separate service - SkinMinerva provides getHistoryUrl() method which is used both in the skin code and in Toolbar builder. We should provide MinervaUrls service that knows how to build custom mobile URLs. Bug: T221792 Change-Id: Ie08c4b61cea60c3a42fbf796a39360feea22bc33
2019-05-23 22:34:10 +00:00
* @param IOverflowBuilder $overflowBuilder The overflow menu builder
* @param MessageLocalizer $messageLocalizer Message localizer used to translate texts
*/
public function __construct(
ToolbarBuilder $toolbarBuilder,
IOverflowBuilder $overflowBuilder,
MessageLocalizer $messageLocalizer
) {
PageActions menu should use Builder pattern The PageActions menu shouldn't be built inside SkinMinerva class. All menus should be build in similar way so it's easier to understand how different parts of the system work. This will allow us to easily track different menu elements/move elements between different menus. Additionally we should allow extensions/3rd party to modify both the toolbar and overflow menus. Changes: - Removed PageActions logic from SkinMinerva class - introduced new PageActions/Director to build page actions menu - introduced Builders for toolbar, and different types of overflow menu - because Overflow menu elements require the BaseTemplate::data['nav_urls] array, instead building all links, pass the array when building PageActions menu. Code for getting menu entries had to be rewritten (use $navUrls array instead of $this->tpl['nav_urls']; - ServiceWirings file contains logic on what to pass to PageActions/Director class (which builders) - PageActionsMenuEntry setTitle() and setNodeID() returns $this so we can use method chaining. Only a syntax sugar. - if AMC is not available/Overflow menu is disabled via config, system will pass EmptyOverflowBuilder. System will not add "show more" icon to toolbar menu when $overflowBuilder returns empty set of options. - both ToolbarBulder and OverflowMenuBuilders (except EmptyOverflowBuilder) will run 'MobileMenu' hook. Extensions should listen to hook, and inject it's own menu entries at their leisure. Required follow-ups: - SkinMinerva provides isAllowedAction() method which is used both in the skin code and in Toolbar builder. We should extract that method into separate service - SkinMinerva provides getHistoryUrl() method which is used both in the skin code and in Toolbar builder. We should provide MinervaUrls service that knows how to build custom mobile URLs. Bug: T221792 Change-Id: Ie08c4b61cea60c3a42fbf796a39360feea22bc33
2019-05-23 22:34:10 +00:00
$this->toolbarBuilder = $toolbarBuilder;
$this->overflowBuilder = $overflowBuilder;
$this->messageLocalizer = $messageLocalizer;
}
/**
* Build the menu data array that can be passed to views/javascript
* @param array $toolbox An array of common toolbox items from the sidebar menu
* @param array $actions An array of actions usually bucketed under the more menu
* @param array $views An array of actions usually bucketed under the view menu
PageActions menu should use Builder pattern The PageActions menu shouldn't be built inside SkinMinerva class. All menus should be build in similar way so it's easier to understand how different parts of the system work. This will allow us to easily track different menu elements/move elements between different menus. Additionally we should allow extensions/3rd party to modify both the toolbar and overflow menus. Changes: - Removed PageActions logic from SkinMinerva class - introduced new PageActions/Director to build page actions menu - introduced Builders for toolbar, and different types of overflow menu - because Overflow menu elements require the BaseTemplate::data['nav_urls] array, instead building all links, pass the array when building PageActions menu. Code for getting menu entries had to be rewritten (use $navUrls array instead of $this->tpl['nav_urls']; - ServiceWirings file contains logic on what to pass to PageActions/Director class (which builders) - PageActionsMenuEntry setTitle() and setNodeID() returns $this so we can use method chaining. Only a syntax sugar. - if AMC is not available/Overflow menu is disabled via config, system will pass EmptyOverflowBuilder. System will not add "show more" icon to toolbar menu when $overflowBuilder returns empty set of options. - both ToolbarBulder and OverflowMenuBuilders (except EmptyOverflowBuilder) will run 'MobileMenu' hook. Extensions should listen to hook, and inject it's own menu entries at their leisure. Required follow-ups: - SkinMinerva provides isAllowedAction() method which is used both in the skin code and in Toolbar builder. We should extract that method into separate service - SkinMinerva provides getHistoryUrl() method which is used both in the skin code and in Toolbar builder. We should provide MinervaUrls service that knows how to build custom mobile URLs. Bug: T221792 Change-Id: Ie08c4b61cea60c3a42fbf796a39360feea22bc33
2019-05-23 22:34:10 +00:00
* @return array
*/
public function buildMenu( array $toolbox, array $actions, array $views ): array {
$toolbar = $this->toolbarBuilder->getGroup( $actions, $views );
$overflowMenu = $this->overflowBuilder->getGroup( $toolbox, $actions );
PageActions menu should use Builder pattern The PageActions menu shouldn't be built inside SkinMinerva class. All menus should be build in similar way so it's easier to understand how different parts of the system work. This will allow us to easily track different menu elements/move elements between different menus. Additionally we should allow extensions/3rd party to modify both the toolbar and overflow menus. Changes: - Removed PageActions logic from SkinMinerva class - introduced new PageActions/Director to build page actions menu - introduced Builders for toolbar, and different types of overflow menu - because Overflow menu elements require the BaseTemplate::data['nav_urls] array, instead building all links, pass the array when building PageActions menu. Code for getting menu entries had to be rewritten (use $navUrls array instead of $this->tpl['nav_urls']; - ServiceWirings file contains logic on what to pass to PageActions/Director class (which builders) - PageActionsMenuEntry setTitle() and setNodeID() returns $this so we can use method chaining. Only a syntax sugar. - if AMC is not available/Overflow menu is disabled via config, system will pass EmptyOverflowBuilder. System will not add "show more" icon to toolbar menu when $overflowBuilder returns empty set of options. - both ToolbarBulder and OverflowMenuBuilders (except EmptyOverflowBuilder) will run 'MobileMenu' hook. Extensions should listen to hook, and inject it's own menu entries at their leisure. Required follow-ups: - SkinMinerva provides isAllowedAction() method which is used both in the skin code and in Toolbar builder. We should extract that method into separate service - SkinMinerva provides getHistoryUrl() method which is used both in the skin code and in Toolbar builder. We should provide MinervaUrls service that knows how to build custom mobile URLs. Bug: T221792 Change-Id: Ie08c4b61cea60c3a42fbf796a39360feea22bc33
2019-05-23 22:34:10 +00:00
$menu = [
'toolbar' => $toolbar->getEntries()
];
if ( $overflowMenu->hasEntries() ) {
// See includes/Skins/ToggleList.
$toggleID = 'page-actions-overflow-toggle';
$checkboxID = 'page-actions-overflow-checkbox';
PageActions menu should use Builder pattern The PageActions menu shouldn't be built inside SkinMinerva class. All menus should be build in similar way so it's easier to understand how different parts of the system work. This will allow us to easily track different menu elements/move elements between different menus. Additionally we should allow extensions/3rd party to modify both the toolbar and overflow menus. Changes: - Removed PageActions logic from SkinMinerva class - introduced new PageActions/Director to build page actions menu - introduced Builders for toolbar, and different types of overflow menu - because Overflow menu elements require the BaseTemplate::data['nav_urls] array, instead building all links, pass the array when building PageActions menu. Code for getting menu entries had to be rewritten (use $navUrls array instead of $this->tpl['nav_urls']; - ServiceWirings file contains logic on what to pass to PageActions/Director class (which builders) - PageActionsMenuEntry setTitle() and setNodeID() returns $this so we can use method chaining. Only a syntax sugar. - if AMC is not available/Overflow menu is disabled via config, system will pass EmptyOverflowBuilder. System will not add "show more" icon to toolbar menu when $overflowBuilder returns empty set of options. - both ToolbarBulder and OverflowMenuBuilders (except EmptyOverflowBuilder) will run 'MobileMenu' hook. Extensions should listen to hook, and inject it's own menu entries at their leisure. Required follow-ups: - SkinMinerva provides isAllowedAction() method which is used both in the skin code and in Toolbar builder. We should extract that method into separate service - SkinMinerva provides getHistoryUrl() method which is used both in the skin code and in Toolbar builder. We should provide MinervaUrls service that knows how to build custom mobile URLs. Bug: T221792 Change-Id: Ie08c4b61cea60c3a42fbf796a39360feea22bc33
2019-05-23 22:34:10 +00:00
$menu[ 'overflowMenu' ] = [
'item-id' => 'page-actions-overflow',
'checkboxID' => $checkboxID,
'toggleID' => $toggleID,
'data-btn' => [
'tag-name' => 'label',
'data-icon' => [
'icon' => 'ellipsis',
],
'classes' => 'toggle-list__toggle',
'array-attributes' => [
[
'key' => 'id',
'value' => $toggleID,
],
[
'key' => 'for',
'value' => $checkboxID,
],
[
'key' => 'aria-hidden',
'value' => 'true'
],
[
'key' => 'data-event-name',
'value' => 'ui.overflowmenu',
],
],
// class = toggle-list__toggle {{toggleClass}}
// data-event-name="{{analyticsEventName}}">
'label' => $this->messageLocalizer->msg( 'minerva-page-actions-overflow' ),
],
'listID' => $overflowMenu->getId(),
'listClass' => 'page-actions-overflow-list toggle-list__list--drop-down',
'items' => $overflowMenu->getEntries()
PageActions menu should use Builder pattern The PageActions menu shouldn't be built inside SkinMinerva class. All menus should be build in similar way so it's easier to understand how different parts of the system work. This will allow us to easily track different menu elements/move elements between different menus. Additionally we should allow extensions/3rd party to modify both the toolbar and overflow menus. Changes: - Removed PageActions logic from SkinMinerva class - introduced new PageActions/Director to build page actions menu - introduced Builders for toolbar, and different types of overflow menu - because Overflow menu elements require the BaseTemplate::data['nav_urls] array, instead building all links, pass the array when building PageActions menu. Code for getting menu entries had to be rewritten (use $navUrls array instead of $this->tpl['nav_urls']; - ServiceWirings file contains logic on what to pass to PageActions/Director class (which builders) - PageActionsMenuEntry setTitle() and setNodeID() returns $this so we can use method chaining. Only a syntax sugar. - if AMC is not available/Overflow menu is disabled via config, system will pass EmptyOverflowBuilder. System will not add "show more" icon to toolbar menu when $overflowBuilder returns empty set of options. - both ToolbarBulder and OverflowMenuBuilders (except EmptyOverflowBuilder) will run 'MobileMenu' hook. Extensions should listen to hook, and inject it's own menu entries at their leisure. Required follow-ups: - SkinMinerva provides isAllowedAction() method which is used both in the skin code and in Toolbar builder. We should extract that method into separate service - SkinMinerva provides getHistoryUrl() method which is used both in the skin code and in Toolbar builder. We should provide MinervaUrls service that knows how to build custom mobile URLs. Bug: T221792 Change-Id: Ie08c4b61cea60c3a42fbf796a39360feea22bc33
2019-05-23 22:34:10 +00:00
];
}
return $menu;
}
}