xref: /template/strap/ComboStrap/HistoricalBreadcrumbMenuItem.php (revision 3ffa7219b3517087a95f60724d1c7fc6bb0e8573)
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