xref: /plugin/combo/ComboStrap/SlotManagerMenuItem.php (revision 3ffa7219b3517087a95f60724d1c7fc6bb0e8573)
104fd306cSNickeau<?php
204fd306cSNickeau/**
304fd306cSNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved.
404fd306cSNickeau *
504fd306cSNickeau * This source code is licensed under the GPL license found in the
604fd306cSNickeau * COPYING  file in the root directory of this source tree.
704fd306cSNickeau *
804fd306cSNickeau * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
904fd306cSNickeau * @author   ComboStrap <support@combostrap.com>
1004fd306cSNickeau *
1104fd306cSNickeau */
1204fd306cSNickeau
1304fd306cSNickeaunamespace ComboStrap;
1404fd306cSNickeau
1504fd306cSNickeauuse ComboStrap\TagAttribute\StyleAttribute;
1604fd306cSNickeauuse ComboStrap\Web\UrlEndpoint;
1704fd306cSNickeauuse dokuwiki\Menu\Item\AbstractItem;
1804fd306cSNickeau
1904fd306cSNickeau/**
2004fd306cSNickeau * Class MenuItem
2104fd306cSNickeau * @package ComboStrap
2204fd306cSNickeau *
2304fd306cSNickeau */
2404fd306cSNickeauclass SlotManagerMenuItem extends AbstractItem
2504fd306cSNickeau{
2604fd306cSNickeau
2704fd306cSNickeau    const CANONICAL = "slot:manager";
2804fd306cSNickeau    const TAG = "slot-manager";
2904fd306cSNickeau
3004fd306cSNickeau    const EDIT_ACTION = "Edit";
3104fd306cSNickeau    const CREATE_ACTION = "Create";
3204fd306cSNickeau
3304fd306cSNickeau    private static function getClass(): string
3404fd306cSNickeau    {
3504fd306cSNickeau        return StyleAttribute::addComboStrapSuffix(self::TAG);
3604fd306cSNickeau    }
3704fd306cSNickeau
3804fd306cSNickeau
3904fd306cSNickeau    /**
4004fd306cSNickeau     *
4104fd306cSNickeau     * @return string
4204fd306cSNickeau     */
4304fd306cSNickeau    public function getLabel(): string
4404fd306cSNickeau    {
4504fd306cSNickeau        return "Manage the slots";
4604fd306cSNickeau    }
4704fd306cSNickeau
4804fd306cSNickeau    public function getLinkAttributes($classprefix = 'menuitem '): array
4904fd306cSNickeau    {
5004fd306cSNickeau
5104fd306cSNickeau        $snippetManager = PluginUtility::getSnippetManager()->addPopoverLibrary();
5204fd306cSNickeau        $snippetManager->attachJavascriptFromComponentId(self::TAG);
5304fd306cSNickeau
5404fd306cSNickeau        $linkAttributes = parent::getLinkAttributes($classprefix);
5504fd306cSNickeau        /**
5604fd306cSNickeau         * A class and not an id
5704fd306cSNickeau         * because a menu item can be found twice on
5804fd306cSNickeau         * a page (For instance if you want to display it in a layout at a
5904fd306cSNickeau         * breakpoint and at another in another breakpoint
6004fd306cSNickeau         */
6104fd306cSNickeau        $linkAttributes['class'] = self::getClass();
6204fd306cSNickeau        $linkAttributes['href'] = "#";
6304fd306cSNickeau        $dataAttributeNamespace = Bootstrap::getDataNamespace();
6404fd306cSNickeau        $linkAttributes["data{$dataAttributeNamespace}-toggle"] = "popover";
6504fd306cSNickeau        $linkAttributes["data{$dataAttributeNamespace}-html"] = "true";
6604fd306cSNickeau        $linkAttributes["data{$dataAttributeNamespace}-title"] = "Slot Manager";
6704fd306cSNickeau
6804fd306cSNickeau        /**
6904fd306cSNickeau         * TODO: right when rtl language
7004fd306cSNickeau         */
7104fd306cSNickeau        $linkAttributes["data{$dataAttributeNamespace}-placement"] = "left";
7204fd306cSNickeau
7304fd306cSNickeau        // encoding happens
7404fd306cSNickeau        $linkAttributes["data{$dataAttributeNamespace}-content"] = $this->createHtml();
7504fd306cSNickeau
76*3ffa7219SNico        // https://github.com/ComboStrap/combo/issues/109
77*3ffa7219SNico        // Don't use the dismiss, happens before a link navigation
78*3ffa7219SNico        // preventing links to work
79*3ffa7219SNico        // $linkAttributes["data{$dataAttributeNamespace}-trigger"] = "focus";
8004fd306cSNickeau
8104fd306cSNickeau        // See for the tabindex
8204fd306cSNickeau        // https://getbootstrap.com/docs/5.1/components/popovers/#dismiss-on-next-click
8304fd306cSNickeau        $linkAttributes['tabindex'] = "0";
8404fd306cSNickeau
8504fd306cSNickeau        return $linkAttributes;
8604fd306cSNickeau
8704fd306cSNickeau
8804fd306cSNickeau    }
8904fd306cSNickeau
9004fd306cSNickeau    public function getTitle(): string
9104fd306cSNickeau    {
9204fd306cSNickeau        return "Slot Manager";
9304fd306cSNickeau    }
9404fd306cSNickeau
9504fd306cSNickeau    public function getSvg(): string
9604fd306cSNickeau    {
9704fd306cSNickeau        /** @var string icon file */
9804fd306cSNickeau        return DirectoryLayout::getComboImagesDirectory()->resolve('entypo-text-document-inverted.svg')->toAbsoluteId();
9904fd306cSNickeau    }
10004fd306cSNickeau
10104fd306cSNickeau    public function createHtml(): string
10204fd306cSNickeau    {
10304fd306cSNickeau        $requestedPath = WikiPath::getContextPath();
10404fd306cSNickeau        $url = UrlEndpoint::createComboStrapUrl()->setPath("/" . self::TAG);
10504fd306cSNickeau        $html = "<p>Edit and/or create the <a href=\"{$url->toHtmlString()}\">slots</a> of the page</p>";
10604fd306cSNickeau        foreach (SlotSystem::getSlotNames() as $secondarySlot) {
10704fd306cSNickeau
10804fd306cSNickeau            $label = $secondarySlot;
10904fd306cSNickeau            switch ($secondarySlot) {
11004fd306cSNickeau                case SlotSystem::getSidebarName():
11104fd306cSNickeau                    $label = "Page Sidebar";
11204fd306cSNickeau                    break;
11304fd306cSNickeau                case SlotSystem::getMainHeaderSlotName():
11404fd306cSNickeau                    $label = "Content Header";
11504fd306cSNickeau                    break;
11604fd306cSNickeau                case SlotSystem::getMainFooterSlotName():
11704fd306cSNickeau                    $label = "Content Footer";
11804fd306cSNickeau                    break;
11904fd306cSNickeau                case SlotSystem::getPageFooterSlotName():
12004fd306cSNickeau                    $label = "Page Footer";
12104fd306cSNickeau                    break;
12204fd306cSNickeau                case SlotSystem::getPageHeaderSlotName():
12304fd306cSNickeau                    $label = "Page Header";
12404fd306cSNickeau                    break;
12504fd306cSNickeau            }
12604fd306cSNickeau            $html .= "<p class='mb-0 mt-1'><strong>$label</strong></p>";
12704fd306cSNickeau            $html .= "<table>";
12804fd306cSNickeau
12904fd306cSNickeau            $parentPath = $requestedPath;
13004fd306cSNickeau            while (true) {
13104fd306cSNickeau                try {
13204fd306cSNickeau                    $parentPath = $parentPath->getParent();
13304fd306cSNickeau                } catch (ExceptionNotFound $e) {
13404fd306cSNickeau                    break;
13504fd306cSNickeau                }
13604fd306cSNickeau                $secondaryPath = $parentPath->resolveId($secondarySlot);
13704fd306cSNickeau
13804fd306cSNickeau                $secondaryPage = MarkupPath::createPageFromAbsoluteId($secondaryPath->toAbsoluteId());
13904fd306cSNickeau                $class = StyleAttribute::addComboStrapSuffix(\syntax_plugin_combo_link::TAG);
14004fd306cSNickeau                if (FileSystems::exists($secondaryPath)) {
14104fd306cSNickeau                    $action = self::EDIT_ACTION;
14204fd306cSNickeau                    $style = '';
14304fd306cSNickeau                } else {
14404fd306cSNickeau                    $action = self::CREATE_ACTION;
14504fd306cSNickeau                    $style = ' style="color:rgba(0,0,0,0.65)"';
14604fd306cSNickeau                }
14704fd306cSNickeau                $url = UrlEndpoint::createDokuUrl()
14804fd306cSNickeau                    ->addQueryParameter(DokuwikiId::DOKUWIKI_ID_ATTRIBUTE, $secondaryPage->getWikiId())
14904fd306cSNickeau                    ->addQueryParameter("do", "edit");
15004fd306cSNickeau
15104fd306cSNickeau                $html .= "<tr><td class='pe-2'>$action</td><td><a href=\"{$url->toHtmlString()}\" class=\"$class\"$style>{$secondaryPath->toAbsoluteId()}</a></td></tr>";
15204fd306cSNickeau
15304fd306cSNickeau                if ($action === self::EDIT_ACTION) {
15404fd306cSNickeau                    break;
15504fd306cSNickeau                }
15604fd306cSNickeau
15704fd306cSNickeau            }
15804fd306cSNickeau            $html .= "</table>";
15904fd306cSNickeau
16004fd306cSNickeau        };
16104fd306cSNickeau
16204fd306cSNickeau
16304fd306cSNickeau        return $html;
16404fd306cSNickeau
16504fd306cSNickeau    }
16604fd306cSNickeau
16704fd306cSNickeau
16804fd306cSNickeau}
169