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