137748cd8SNickeau<?php 237748cd8SNickeau/** 337748cd8SNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved. 437748cd8SNickeau * 537748cd8SNickeau * This source code is licensed under the GPL license found in the 637748cd8SNickeau * COPYING file in the root directory of this source tree. 737748cd8SNickeau * 837748cd8SNickeau * @license GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html) 937748cd8SNickeau * @author ComboStrap <support@combostrap.com> 1037748cd8SNickeau * 1137748cd8SNickeau */ 1237748cd8SNickeau 1337748cd8SNickeaunamespace ComboStrap; 1437748cd8SNickeau 1537748cd8SNickeau 1637748cd8SNickeauuse dokuwiki\Menu\Item\AbstractItem; 1737748cd8SNickeau 1837748cd8SNickeau/** 1937748cd8SNickeau * Class MenuItem 2037748cd8SNickeau * * 2137748cd8SNickeau * @package ComboStrap 2237748cd8SNickeau * 2337748cd8SNickeau * To be able to debug, disable the trigger data attribute 2437748cd8SNickeau * The popover will stay on the page 2537748cd8SNickeau */ 2637748cd8SNickeauclass HistoricalBreadcrumbMenuItem extends AbstractItem 2737748cd8SNickeau{ 2837748cd8SNickeau 2937748cd8SNickeau 3037748cd8SNickeau const RECENT_PAGES_VISITED = "Recent Pages Visited"; 3137748cd8SNickeau 3237748cd8SNickeau /** 3337748cd8SNickeau * This unique name should not be in the {@link \action_plugin_combo_historicalbreadcrumb} 3437748cd8SNickeau * to avoid circular reference 3537748cd8SNickeau */ 3637748cd8SNickeau const HISTORICAL_BREADCRUMB_NAME = "historical-breadcrumb"; 3737748cd8SNickeau 3837748cd8SNickeau 3937748cd8SNickeau /** 4037748cd8SNickeau * 4137748cd8SNickeau * @return string 4237748cd8SNickeau */ 4337748cd8SNickeau public function getLabel() 4437748cd8SNickeau { 4537748cd8SNickeau return self::RECENT_PAGES_VISITED; 4637748cd8SNickeau } 4737748cd8SNickeau 48*c3437056SNickeau public function getLinkAttributes($classprefix = 'menuitem '): array 4937748cd8SNickeau { 5037748cd8SNickeau 5137748cd8SNickeau $linkAttributes = parent::getLinkAttributes($classprefix); 5237748cd8SNickeau $linkAttributes['href'] = "#"; 5337748cd8SNickeau $dataAttributeNamespace = Bootstrap::getDataNamespace(); 5437748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-toggle"] = "popover"; 5537748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-html"] = "true"; 5637748cd8SNickeau global $lang; 5737748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-title"] = $lang['breadcrumb']; 5837748cd8SNickeau 5937748cd8SNickeau 60*c3437056SNickeau $pages = breadcrumbs(); 61*c3437056SNickeau if (sizeof($pages) === 0) { 62*c3437056SNickeau // happens when there is no history 63*c3437056SNickeau return $linkAttributes; 64*c3437056SNickeau } 65*c3437056SNickeau $pages = array_reverse($pages); 6637748cd8SNickeau 6737748cd8SNickeau /** 6837748cd8SNickeau * All page should be shown, 6937748cd8SNickeau * also the actual 7037748cd8SNickeau * because when the user is going 7137748cd8SNickeau * in admin mode, it's an easy way to get back 7237748cd8SNickeau */ 7337748cd8SNickeau $actualPageId = array_keys($pages)[0]; 7437748cd8SNickeau $actualPageName = array_shift($pages); 7537748cd8SNickeau $html = $this->createLink($actualPageId, $actualPageName, self::HISTORICAL_BREADCRUMB_NAME . "-home"); 7637748cd8SNickeau 7737748cd8SNickeau $html .= '<ol>' . PHP_EOL; 7837748cd8SNickeau foreach ($pages as $id => $name) { 7937748cd8SNickeau 8037748cd8SNickeau $html .= '<li>'; 8137748cd8SNickeau $html .= $this->createLink($id, $name); 8237748cd8SNickeau $html .= '</li>' . PHP_EOL; 8337748cd8SNickeau 8437748cd8SNickeau } 8537748cd8SNickeau $html .= '</ol>' . PHP_EOL; 8637748cd8SNickeau $html .= '</nav>' . PHP_EOL; 87*c3437056SNickeau 88*c3437056SNickeau 8937748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-content"] = $html; 9037748cd8SNickeau 9137748cd8SNickeau // Dismiss on next click 9237748cd8SNickeau // To debug, just comment this line 9337748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-trigger"] = "focus"; 9437748cd8SNickeau 9537748cd8SNickeau // See for the tabindex 9637748cd8SNickeau // https://getbootstrap.com/docs/5.1/components/popovers/#dismiss-on-next-click 9737748cd8SNickeau $linkAttributes['tabindex'] = "0"; 9837748cd8SNickeau 9937748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}custom-class"] = "historical-breadcrumb"; 10037748cd8SNickeau return $linkAttributes; 10137748cd8SNickeau } 10237748cd8SNickeau 10337748cd8SNickeau public function getTitle() 10437748cd8SNickeau { 10537748cd8SNickeau /** 10637748cd8SNickeau * The title (unfortunately) is deleted from the anchor 10737748cd8SNickeau * and is used as header in the popover 10837748cd8SNickeau */ 10937748cd8SNickeau return self::RECENT_PAGES_VISITED; 11037748cd8SNickeau } 11137748cd8SNickeau 11237748cd8SNickeau public function getSvg() 11337748cd8SNickeau { 11437748cd8SNickeau /** @var string icon file */ 11537748cd8SNickeau return Resources::getImagesDirectory() . '/history.svg'; 11637748cd8SNickeau } 11737748cd8SNickeau 11837748cd8SNickeau /** 11937748cd8SNickeau * @param $id 12037748cd8SNickeau * @param $name 12137748cd8SNickeau * @param null $class 12237748cd8SNickeau * @return string 12337748cd8SNickeau */ 124*c3437056SNickeau public function createLink($id, $name, $class = null): string 12537748cd8SNickeau { 12637748cd8SNickeau $page = Page::createPageFromId($id); 12737748cd8SNickeau if ($name == "start") { 12837748cd8SNickeau $name = "Home Page"; 12937748cd8SNickeau } else { 130*c3437056SNickeau $name = $page->getTitleOrDefault(); 13137748cd8SNickeau } 13237748cd8SNickeau $tagAttributes = null; 13337748cd8SNickeau if ($class != null) { 13437748cd8SNickeau $tagAttributes = TagAttributes::createEmpty(); 13537748cd8SNickeau $tagAttributes->addClassName($class); 13637748cd8SNickeau } 13737748cd8SNickeau $link = LinkUtility::createFromPageId($id, $tagAttributes); 13837748cd8SNickeau 13937748cd8SNickeau return $link->renderOpenTag() . $name . $link->renderClosingTag(); 14037748cd8SNickeau } 14137748cd8SNickeau 14237748cd8SNickeau 14337748cd8SNickeau} 144