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"; 374cadd4f8SNickeau const CANONICAL = "breadcrumb"; 3837748cd8SNickeau 3904fd306cSNickeau public function __construct() 4004fd306cSNickeau { 4104fd306cSNickeau /** 4204fd306cSNickeau * Making popover active 4304fd306cSNickeau */ 4404fd306cSNickeau $snippetManager = PluginUtility::getSnippetManager(); 4504fd306cSNickeau $snippetManager 4604fd306cSNickeau ->addPopoverLibrary() 4704fd306cSNickeau ->attachJavascriptFromComponentId(HistoricalBreadcrumbMenuItem::HISTORICAL_BREADCRUMB_NAME); 4804fd306cSNickeau 4904fd306cSNickeau /** 5004fd306cSNickeau * Css 5104fd306cSNickeau */ 5204fd306cSNickeau $snippetManager->attachCssInternalStylesheet(HistoricalBreadcrumbMenuItem::HISTORICAL_BREADCRUMB_NAME); 5304fd306cSNickeau 5404fd306cSNickeau parent::__construct(); 5504fd306cSNickeau 5604fd306cSNickeau } 5704fd306cSNickeau 5837748cd8SNickeau 5937748cd8SNickeau /** 6037748cd8SNickeau * 6137748cd8SNickeau * @return string 6237748cd8SNickeau */ 6304fd306cSNickeau public function getLabel(): string 6437748cd8SNickeau { 6537748cd8SNickeau return self::RECENT_PAGES_VISITED; 6637748cd8SNickeau } 6737748cd8SNickeau 68c3437056SNickeau public function getLinkAttributes($classprefix = 'menuitem '): array 6937748cd8SNickeau { 7037748cd8SNickeau 7137748cd8SNickeau $linkAttributes = parent::getLinkAttributes($classprefix); 7237748cd8SNickeau $linkAttributes['href'] = "#"; 7337748cd8SNickeau $dataAttributeNamespace = Bootstrap::getDataNamespace(); 7437748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-toggle"] = "popover"; 7504fd306cSNickeau $linkAttributes["data{$dataAttributeNamespace}-placement"] = "left"; 7637748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-html"] = "true"; 7737748cd8SNickeau global $lang; 7837748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-title"] = $lang['breadcrumb']; 7937748cd8SNickeau 8037748cd8SNickeau 81c3437056SNickeau $pages = breadcrumbs(); 82c3437056SNickeau if (sizeof($pages) === 0) { 83c3437056SNickeau // happens when there is no history 84c3437056SNickeau return $linkAttributes; 85c3437056SNickeau } 86c3437056SNickeau $pages = array_reverse($pages); 8737748cd8SNickeau 8837748cd8SNickeau /** 8937748cd8SNickeau * All page should be shown, 9037748cd8SNickeau * also the actual 9137748cd8SNickeau * because when the user is going 9237748cd8SNickeau * in admin mode, it's an easy way to get back 9337748cd8SNickeau */ 9437748cd8SNickeau $actualPageId = array_keys($pages)[0]; 9537748cd8SNickeau $actualPageName = array_shift($pages); 9637748cd8SNickeau $html = $this->createLink($actualPageId, $actualPageName, self::HISTORICAL_BREADCRUMB_NAME . "-home"); 9737748cd8SNickeau 9837748cd8SNickeau $html .= '<ol>' . PHP_EOL; 9937748cd8SNickeau foreach ($pages as $id => $name) { 10037748cd8SNickeau 10137748cd8SNickeau $html .= '<li>'; 10237748cd8SNickeau $html .= $this->createLink($id, $name); 10337748cd8SNickeau $html .= '</li>' . PHP_EOL; 10437748cd8SNickeau 10537748cd8SNickeau } 10637748cd8SNickeau $html .= '</ol>' . PHP_EOL; 10737748cd8SNickeau $html .= '</nav>' . PHP_EOL; 108c3437056SNickeau 109c3437056SNickeau 11037748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-content"] = $html; 11137748cd8SNickeau 112*3ffa7219SNico // https://github.com/ComboStrap/combo/issues/109 113*3ffa7219SNico // Don't use the dismiss, happens before a link navigation 114*3ffa7219SNico // preventing links to work 115*3ffa7219SNico // $linkAttributes["data{$dataAttributeNamespace}-trigger"] = "focus"; 11637748cd8SNickeau 11737748cd8SNickeau // See for the tabindex 11837748cd8SNickeau // https://getbootstrap.com/docs/5.1/components/popovers/#dismiss-on-next-click 11937748cd8SNickeau $linkAttributes['tabindex'] = "0"; 12037748cd8SNickeau 12104fd306cSNickeau $linkAttributes["data{$dataAttributeNamespace}-custom-class"] = "historical-breadcrumb"; 12237748cd8SNickeau return $linkAttributes; 12304fd306cSNickeau 12437748cd8SNickeau } 12537748cd8SNickeau 12604fd306cSNickeau public function getTitle(): string 12737748cd8SNickeau { 12837748cd8SNickeau /** 12937748cd8SNickeau * The title (unfortunately) is deleted from the anchor 13037748cd8SNickeau * and is used as header in the popover 13137748cd8SNickeau */ 13237748cd8SNickeau return self::RECENT_PAGES_VISITED; 13337748cd8SNickeau } 13437748cd8SNickeau 13504fd306cSNickeau public function getSvg(): string 13637748cd8SNickeau { 13737748cd8SNickeau /** @var string icon file */ 13804fd306cSNickeau return DirectoryLayout::getComboImagesDirectory()->resolve('history.svg')->toAbsoluteId(); 13937748cd8SNickeau } 14037748cd8SNickeau 14137748cd8SNickeau /** 14237748cd8SNickeau * @param $id 14337748cd8SNickeau * @param $name 14437748cd8SNickeau * @param null $class 14537748cd8SNickeau * @return string 14637748cd8SNickeau */ 147c3437056SNickeau public function createLink($id, $name, $class = null): string 14837748cd8SNickeau { 14904fd306cSNickeau $page = MarkupPath::createMarkupFromId($id); 15037748cd8SNickeau if ($name == "start") { 15137748cd8SNickeau $name = "Home Page"; 15237748cd8SNickeau } else { 153c3437056SNickeau $name = $page->getTitleOrDefault(); 15437748cd8SNickeau } 15537748cd8SNickeau 1564cadd4f8SNickeau try { 15704fd306cSNickeau $attributes = LinkMarkup::createFromPageIdOrPath($id)->toAttributes(self::CANONICAL); 15804fd306cSNickeau } catch (ExceptionCompile $e) { 1594cadd4f8SNickeau return LogUtility::wrapInRedForHtml("Error on breadcrumb markup ref. Message: {$e->getMessage()}"); 1604cadd4f8SNickeau } 1614cadd4f8SNickeau if ($class !== null) { 1624cadd4f8SNickeau $attributes->addClassName($class); 1634cadd4f8SNickeau } 1644cadd4f8SNickeau 1654cadd4f8SNickeau return $attributes->toHtmlEnterTag("a") . $name . "</a>"; 16637748cd8SNickeau } 16737748cd8SNickeau 16837748cd8SNickeau 16937748cd8SNickeau} 170