Skip to content

Commit

Permalink
Issue #3038953 by kavya_akhil: link without submenu, Issue #3038954 b…
Browse files Browse the repository at this point in the history
…y wla_g: allow all trees closed by default
  • Loading branch information
bisw committed Jun 29, 2019
1 parent e68463b commit aa27c94
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 21 deletions.
2 changes: 2 additions & 0 deletions accordion_menus.libraries.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@ accordion_menus_widget:
js:
js/accordion_menus.js: {}
dependencies:
- core/drupal
- core/jquery
- core/drupalSettings
- core/jquery.ui.accordion
25 changes: 20 additions & 5 deletions js/accordion_menus.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
(function ($) {
$(document).ready(function () {
$('.accordion_menus_block_container').accordion({header: 'h2.accordion-title', autoHeight: false});
});
})(jQuery);
(function ($, Drupal, drupalSettings) {
'use strict';

Drupal.behaviors.accordionMenus = {
attach: function (context, settings) {
// Get data from server.
var accordionMenus = drupalSettings.accordion_menus;
var closedByDefault = accordionMenus.accordion_closed;

// Set auto height.
$('.accordion_menus_block_container').accordion({header: 'h2.accordion-title', autoHeight: true});

// Make collapsible by default.
$.each(closedByDefault, function(i, val) {
$('.accordion_menus_block_container.' + val).accordion({ header: 'h2.accordion-title', collapsible: true, active: false });
});
}
};

})(jQuery, Drupal, drupalSettings);
25 changes: 24 additions & 1 deletion src/Form/AccordionMenusConfigForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,31 @@ public function buildForm(array $form, FormStateInterface $form_state) {
'#type' => 'checkboxes',
'#title' => $this->t('Accondion Menus'),
'#options' => $menus,
'#description' => $this->t('Select each menu to make them accordion menu independently.'),
'#description' => $this->t('Select menu to make them accordion menu.'),
'#default_value' => !empty($config->get('accordion_menus')) ? $config->get('accordion_menus') : [],
];

$form['accordion_advanced'] = [
'#type' => 'details',
'#title' => t('Advanced settings'),
'#open' => FALSE,
];

$form['accordion_advanced']['accordion_menus_no_submenus'] = [
'#type' => 'checkboxes',
'#title' => $this->t('Accondion without sub menu item'),
'#options' => $menus,
'#description' => $this->t('Menus which have no sub menu item, will show also in accordion menu.'),
'#default_value' => !empty($config->get('accordion_menus_no_submenus')) ? $config->get('accordion_menus_no_submenus') : [],
];
$form['accordion_advanced']['accordion_menus_default_closed'] = [
'#type' => 'checkboxes',
'#title' => $this->t('Accondion menu closed by default'),
'#options' => $menus,
'#description' => $this->t('Allow all trees closed at beginning.'),
'#default_value' => !empty($config->get('accordion_menus_default_closed')) ? $config->get('accordion_menus_default_closed') : [],
];

return parent::buildForm($form, $form_state);
}

Expand All @@ -57,6 +78,8 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
// Retrieve the configuration and Set the submitted configuration setting.
$this->configFactory->getEditable(static::SETTINGS)
->set('accordion_menus', $form_state->getValue('accordion_menus'))
->set('accordion_menus_no_submenus', $form_state->getValue('accordion_menus_no_submenus'))
->set('accordion_menus_default_closed', $form_state->getValue('accordion_menus_default_closed'))
->save();

parent::submitForm($form, $form_state);
Expand Down
65 changes: 52 additions & 13 deletions src/Plugin/Block/AccordionMenusBlock.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Drupal\Core\Link;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Menu\MenuLinkTreeInterface;
use Drupal\Core\Access\AccessResultInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

Expand Down Expand Up @@ -60,31 +61,56 @@ public static function create(ContainerInterface $container, array $configuratio
* {@inheritdoc}
*/
public function build() {
$elements = [];
$items = [];
$menu_name = $this->getDerivativeId();
$parameters = $this->menuTree->getCurrentRouteMenuTreeParameters($menu_name);
$parameters->setMinDepth(0)->onlyEnabledLinks();

$tree = $this->menuTree->load($menu_name, $parameters);
$manipulators = [
['callable' => 'menu.default_tree_manipulators:checkAccess'],
['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'],
];

$tree = $this->menuTree->load($menu_name, $parameters);
$tree = $this->menuTree->transform($tree, $manipulators);

foreach ($tree as $key => $menu_item) {
if ($menu_item->hasChildren) {
$elements[$key] = [
'content' => $this->generateSubMenuTree($menu_item->subtree),
'title' => $menu_item->link->getTitle(),
// Get accordion configuration.
$config = \Drupal::config('accordion_menus.settings');
$closed_by_default = array_filter($config->get('accordion_menus_default_closed'));
$no_submenu = $config->get('accordion_menus_no_submenus');
$without_submenu = in_array($menu_name, $no_submenu, TRUE) ? TRUE : FALSE;

foreach ($tree as $key => $item) {
$link = $item->link;

// Only render accessible links.
if ($this->isAccordionMenusLinkInaccessible($item)) {
continue;
}

if ($item->subtree) {
$items[$key] = [
'content' => $this->generateSubMenuTree($item->subtree),
'title' => $link->getTitle(),
];
} elseif ($without_submenu) {
$items[$key] = [
'content' => [
'#theme' => 'item_list',
'#items' => [Link::fromTextAndUrl($link->getTitle(), $link->getUrlObject())],
],
'title' => $link->getTitle(),
];
}
}

return [
'#theme' => 'accordian_menus_block',
'#elements' => $elements,
'#attached' => ['library' => ['accordion_menus/accordion_menus_widget']],
'#elements' => ['menu_name' => $menu_name, 'items' => $items],
'#attached' => [
'library' => ['accordion_menus/accordion_menus_widget'],
'drupalSettings' => ['accordion_menus' => ['accordion_closed' => $closed_by_default]],
],
];
}

Expand All @@ -93,11 +119,13 @@ public function build() {
*/
public function generateSubMenuTree($sub_menus) {
$items = [];
foreach ($sub_menus as $sub_menu) {
// If menu element disabled skip this branch.
if ($sub_menu->link->isEnabled()) {
$items[] = Link::fromTextAndUrl($sub_menu->link->getTitle(), $sub_menu->link->getUrlObject());
foreach ($sub_menus as $sub_item) {
// Only render accessible links.
if ($this->isAccordionMenusLinkInaccessible($sub_item)) {
continue;
}

$items[] = Link::fromTextAndUrl($sub_item->link->getTitle(), $sub_item->link->getUrlObject());
}

return [
Expand All @@ -106,4 +134,15 @@ public function generateSubMenuTree($sub_menus) {
];
}

public function isAccordionMenusLinkInaccessible($item) {
if (!$item->link->isEnabled()
|| ($item->access !== NULL && !$item->access instanceof AccessResultInterface)
|| ($item->access instanceof AccessResultInterface && !$item->access->isAllowed())) {
return TRUE;
}

return FALSE;
}


}
4 changes: 2 additions & 2 deletions templates/accordian-menus-block.html.twig
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<div class="accordion_menus_block_container">
{% for element in elements %}
<div class="accordion_menus_block_container {{ elements.menu_name }}">
{% for element in elements.items %}
<h2 class="accordion-title">
<a href="#">{{ element.title }}</a>
</h2>
Expand Down

0 comments on commit aa27c94

Please sign in to comment.