xref: /template/strap/ComboStrap/Tooltip.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
14cadd4f8SNickeau<?php
24cadd4f8SNickeau
34cadd4f8SNickeau
44cadd4f8SNickeaunamespace ComboStrap;
54cadd4f8SNickeau
64cadd4f8SNickeau
704fd306cSNickeauuse syntax_plugin_combo_xmlinlinetag;
84cadd4f8SNickeauuse syntax_plugin_combo_link;
94cadd4f8SNickeauuse syntax_plugin_combo_tooltip;
104cadd4f8SNickeau
114cadd4f8SNickeauclass Tooltip
124cadd4f8SNickeau{
134cadd4f8SNickeau
144cadd4f8SNickeau
154cadd4f8SNickeau    public const TOOLTIP_ATTRIBUTE = "tooltip";
164cadd4f8SNickeau    public const CALLSTACK = "callstack";
174cadd4f8SNickeau    public const POSITION_ATTRIBUTE = "position";
184cadd4f8SNickeau
194cadd4f8SNickeau    public static function processTooltip(TagAttributes &$tagAttributes)
204cadd4f8SNickeau    {
214cadd4f8SNickeau
224cadd4f8SNickeau        $tooltip = $tagAttributes->getValueAndRemove(self::TOOLTIP_ATTRIBUTE);
234cadd4f8SNickeau        if ($tooltip === null) {
244cadd4f8SNickeau            return;
254cadd4f8SNickeau        }
264cadd4f8SNickeau
27eb76b75dSgerardnico        if (!is_array($tooltip)) {
28eb76b75dSgerardnico            LogUtility::msg("The tooltip value ($tooltip) is not an array.");
29eb76b75dSgerardnico            return;
30eb76b75dSgerardnico        }
31eb76b75dSgerardnico
324cadd4f8SNickeau        /**
334cadd4f8SNickeau         * Tooltip
344cadd4f8SNickeau         */
354cadd4f8SNickeau        $dataAttributeNamespace = Bootstrap::getDataNamespace();
364cadd4f8SNickeau
374cadd4f8SNickeau
384cadd4f8SNickeau        /**
394cadd4f8SNickeau         * Old tooltip syntax
404cadd4f8SNickeau         */
41*70bbd7f1Sgerardnico        $title = $tooltip[syntax_plugin_combo_tooltip::TEXT_ATTRIBUTE] ?? null;
424cadd4f8SNickeau        if ($title === null) {
434cadd4f8SNickeau
44*70bbd7f1Sgerardnico            $callStack = $tooltip[Tooltip::CALLSTACK] ?? null;
454cadd4f8SNickeau            if ($callStack !== null) {
464cadd4f8SNickeau                try {
474cadd4f8SNickeau                    $title = PluginUtility::renderInstructionsToXhtml($callStack);
4804fd306cSNickeau                } catch (ExceptionCompile $e) {
494cadd4f8SNickeau                    $title = LogUtility::wrapInRedForHtml("Error while rendering the tooltip. Error: {$e->getMessage()}");
504cadd4f8SNickeau                }
514cadd4f8SNickeau
524cadd4f8SNickeau                /**
534cadd4f8SNickeau                 * New Syntax
544cadd4f8SNickeau                 * (The new syntax add the attributes to the previous element
554cadd4f8SNickeau                 */
564cadd4f8SNickeau                $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-html", "true");
574cadd4f8SNickeau
584cadd4f8SNickeau            }
594cadd4f8SNickeau        }
604cadd4f8SNickeau
614cadd4f8SNickeau
624cadd4f8SNickeau        if (empty($title)) {
634cadd4f8SNickeau            $title = LogUtility::wrapInRedForHtml("The tooltip is empty");
644cadd4f8SNickeau        }
654cadd4f8SNickeau        $tagAttributes->addOutputAttributeValue("title", $title);
664cadd4f8SNickeau
674cadd4f8SNickeau        /**
684cadd4f8SNickeau         * Snippet
694cadd4f8SNickeau         */
704cadd4f8SNickeau        Tooltip::addToolTipSnippetIfNeeded();
714cadd4f8SNickeau        $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-toggle", "tooltip");
724cadd4f8SNickeau
734cadd4f8SNickeau        /**
744cadd4f8SNickeau         * Position
754cadd4f8SNickeau         */
76*70bbd7f1Sgerardnico        $position = $tooltip[Tooltip::POSITION_ATTRIBUTE] ?? null;
774cadd4f8SNickeau        if ($position === null) {
784cadd4f8SNickeau            $position = "top";
794cadd4f8SNickeau        }
80*70bbd7f1Sgerardnico        $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-placement", "{$position}");
814cadd4f8SNickeau
824cadd4f8SNickeau
834cadd4f8SNickeau        /**
844cadd4f8SNickeau         * Keyboard user and assistive technology users
854cadd4f8SNickeau         * If not button or link (ie span), add tabindex to make the element focusable
864cadd4f8SNickeau         * in order to see the tooltip
874cadd4f8SNickeau         * Not sure, if this is a good idea
884cadd4f8SNickeau         *
894cadd4f8SNickeau         * Arbitrary HTML elements (such as <span>s) can be made focusable by adding the tabindex="0" attribute
904cadd4f8SNickeau         */
914cadd4f8SNickeau        $logicalTag = $tagAttributes->getLogicalTag();
9204fd306cSNickeau        if (!in_array($logicalTag, [syntax_plugin_combo_link::TAG, ButtonTag::MARKUP_LONG])) {
934cadd4f8SNickeau            $tagAttributes->addOutputAttributeValue("tabindex", "0");
944cadd4f8SNickeau        }
954cadd4f8SNickeau
964cadd4f8SNickeau
974cadd4f8SNickeau    }
984cadd4f8SNickeau
994cadd4f8SNickeau    /**
1004cadd4f8SNickeau     * tooltip is used also in page protection
1014cadd4f8SNickeau     */
1024cadd4f8SNickeau    public
1034cadd4f8SNickeau    static function addToolTipSnippetIfNeeded()
1044cadd4f8SNickeau    {
10504fd306cSNickeau        $snippetSystem = SnippetSystem::getFromContext();
10604fd306cSNickeau        $snippetSystem->attachJavascriptFromComponentId(syntax_plugin_combo_tooltip::TAG);
10704fd306cSNickeau        $snippetSystem->attachCssInternalStyleSheet(syntax_plugin_combo_tooltip::TAG);
1084cadd4f8SNickeau    }
1094cadd4f8SNickeau}
110