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"; 37*4cadd4f8SNickeau const CANONICAL = "breadcrumb"; 3837748cd8SNickeau 3937748cd8SNickeau 4037748cd8SNickeau /** 4137748cd8SNickeau * 4237748cd8SNickeau * @return string 4337748cd8SNickeau */ 4437748cd8SNickeau public function getLabel() 4537748cd8SNickeau { 4637748cd8SNickeau return self::RECENT_PAGES_VISITED; 4737748cd8SNickeau } 4837748cd8SNickeau 49c3437056SNickeau public function getLinkAttributes($classprefix = 'menuitem '): array 5037748cd8SNickeau { 5137748cd8SNickeau 5237748cd8SNickeau $linkAttributes = parent::getLinkAttributes($classprefix); 5337748cd8SNickeau $linkAttributes['href'] = "#"; 5437748cd8SNickeau $dataAttributeNamespace = Bootstrap::getDataNamespace(); 5537748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-toggle"] = "popover"; 5637748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-html"] = "true"; 5737748cd8SNickeau global $lang; 5837748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-title"] = $lang['breadcrumb']; 5937748cd8SNickeau 6037748cd8SNickeau 61c3437056SNickeau $pages = breadcrumbs(); 62c3437056SNickeau if (sizeof($pages) === 0) { 63c3437056SNickeau // happens when there is no history 64c3437056SNickeau return $linkAttributes; 65c3437056SNickeau } 66c3437056SNickeau $pages = array_reverse($pages); 6737748cd8SNickeau 6837748cd8SNickeau /** 6937748cd8SNickeau * All page should be shown, 7037748cd8SNickeau * also the actual 7137748cd8SNickeau * because when the user is going 7237748cd8SNickeau * in admin mode, it's an easy way to get back 7337748cd8SNickeau */ 7437748cd8SNickeau $actualPageId = array_keys($pages)[0]; 7537748cd8SNickeau $actualPageName = array_shift($pages); 7637748cd8SNickeau $html = $this->createLink($actualPageId, $actualPageName, self::HISTORICAL_BREADCRUMB_NAME . "-home"); 7737748cd8SNickeau 7837748cd8SNickeau $html .= '<ol>' . PHP_EOL; 7937748cd8SNickeau foreach ($pages as $id => $name) { 8037748cd8SNickeau 8137748cd8SNickeau $html .= '<li>'; 8237748cd8SNickeau $html .= $this->createLink($id, $name); 8337748cd8SNickeau $html .= '</li>' . PHP_EOL; 8437748cd8SNickeau 8537748cd8SNickeau } 8637748cd8SNickeau $html .= '</ol>' . PHP_EOL; 8737748cd8SNickeau $html .= '</nav>' . PHP_EOL; 88c3437056SNickeau 89c3437056SNickeau 9037748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-content"] = $html; 9137748cd8SNickeau 9237748cd8SNickeau // Dismiss on next click 9337748cd8SNickeau // To debug, just comment this line 9437748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}-trigger"] = "focus"; 9537748cd8SNickeau 9637748cd8SNickeau // See for the tabindex 9737748cd8SNickeau // https://getbootstrap.com/docs/5.1/components/popovers/#dismiss-on-next-click 9837748cd8SNickeau $linkAttributes['tabindex'] = "0"; 9937748cd8SNickeau 10037748cd8SNickeau $linkAttributes["data{$dataAttributeNamespace}custom-class"] = "historical-breadcrumb"; 10137748cd8SNickeau return $linkAttributes; 10237748cd8SNickeau } 10337748cd8SNickeau 10437748cd8SNickeau public function getTitle() 10537748cd8SNickeau { 10637748cd8SNickeau /** 10737748cd8SNickeau * The title (unfortunately) is deleted from the anchor 10837748cd8SNickeau * and is used as header in the popover 10937748cd8SNickeau */ 11037748cd8SNickeau return self::RECENT_PAGES_VISITED; 11137748cd8SNickeau } 11237748cd8SNickeau 11337748cd8SNickeau public function getSvg() 11437748cd8SNickeau { 11537748cd8SNickeau /** @var string icon file */ 116*4cadd4f8SNickeau return Site::getComboImagesDirectory()->resolve('history.svg')->toString(); 11737748cd8SNickeau } 11837748cd8SNickeau 11937748cd8SNickeau /** 12037748cd8SNickeau * @param $id 12137748cd8SNickeau * @param $name 12237748cd8SNickeau * @param null $class 12337748cd8SNickeau * @return string 12437748cd8SNickeau */ 125c3437056SNickeau public function createLink($id, $name, $class = null): string 12637748cd8SNickeau { 12737748cd8SNickeau $page = Page::createPageFromId($id); 12837748cd8SNickeau if ($name == "start") { 12937748cd8SNickeau $name = "Home Page"; 13037748cd8SNickeau } else { 131c3437056SNickeau $name = $page->getTitleOrDefault(); 13237748cd8SNickeau } 13337748cd8SNickeau 134*4cadd4f8SNickeau try { 135*4cadd4f8SNickeau $attributes = MarkupRef::createFromPageId($id)->toAttributes(self::CANONICAL); 136*4cadd4f8SNickeau } catch (ExceptionCombo $e) { 137*4cadd4f8SNickeau return LogUtility::wrapInRedForHtml("Error on breadcrumb markup ref. Message: {$e->getMessage()}"); 138*4cadd4f8SNickeau } 139*4cadd4f8SNickeau if($class!==null){ 140*4cadd4f8SNickeau $attributes->addClassName($class); 141*4cadd4f8SNickeau } 142*4cadd4f8SNickeau 143*4cadd4f8SNickeau return $attributes->toHtmlEnterTag("a") . $name . "</a>"; 14437748cd8SNickeau } 14537748cd8SNickeau 14637748cd8SNickeau 14737748cd8SNickeau} 148