xref: /plugin/combo/ComboStrap/Tooltip.php (revision eb76b75d7865f643f9312f7a4991c98153124d05)
14cadd4f8SNickeau<?php
24cadd4f8SNickeau
34cadd4f8SNickeau
44cadd4f8SNickeaunamespace ComboStrap;
54cadd4f8SNickeau
64cadd4f8SNickeau
74cadd4f8SNickeauuse syntax_plugin_combo_button;
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
27*eb76b75dSgerardnico        if(!is_array($tooltip)){
28*eb76b75dSgerardnico            LogUtility::msg("The tooltip value ($tooltip) is not an array.");
29*eb76b75dSgerardnico            return;
30*eb76b75dSgerardnico        }
31*eb76b75dSgerardnico
324cadd4f8SNickeau        /**
334cadd4f8SNickeau         * Tooltip
344cadd4f8SNickeau         */
354cadd4f8SNickeau        $dataAttributeNamespace = Bootstrap::getDataNamespace();
364cadd4f8SNickeau
374cadd4f8SNickeau
384cadd4f8SNickeau        /**
394cadd4f8SNickeau         * Old tooltip syntax
404cadd4f8SNickeau         */
414cadd4f8SNickeau        $title = $tooltip[syntax_plugin_combo_tooltip::TEXT_ATTRIBUTE];
424cadd4f8SNickeau        if ($title === null) {
434cadd4f8SNickeau
444cadd4f8SNickeau            $callStack = $tooltip[Tooltip::CALLSTACK];
454cadd4f8SNickeau            if ($callStack !== null) {
464cadd4f8SNickeau                try {
474cadd4f8SNickeau                    $title = PluginUtility::renderInstructionsToXhtml($callStack);
484cadd4f8SNickeau                } catch (ExceptionCombo $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
634cadd4f8SNickeau
644cadd4f8SNickeau        if (empty($title)) {
654cadd4f8SNickeau            $title = LogUtility::wrapInRedForHtml("The tooltip is empty");
664cadd4f8SNickeau        }
674cadd4f8SNickeau        $tagAttributes->addOutputAttributeValue("title", $title);
684cadd4f8SNickeau
694cadd4f8SNickeau        /**
704cadd4f8SNickeau         * Snippet
714cadd4f8SNickeau         */
724cadd4f8SNickeau        Tooltip::addToolTipSnippetIfNeeded();
734cadd4f8SNickeau        $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-toggle", "tooltip");
744cadd4f8SNickeau
754cadd4f8SNickeau        /**
764cadd4f8SNickeau         * Position
774cadd4f8SNickeau         */
784cadd4f8SNickeau        $position = $tooltip[Tooltip::POSITION_ATTRIBUTE];
794cadd4f8SNickeau        if ($position === null) {
804cadd4f8SNickeau            $position = "top";
814cadd4f8SNickeau        }
824cadd4f8SNickeau        $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-placement", "${position}");
834cadd4f8SNickeau
844cadd4f8SNickeau
854cadd4f8SNickeau        /**
864cadd4f8SNickeau         * Keyboard user and assistive technology users
874cadd4f8SNickeau         * If not button or link (ie span), add tabindex to make the element focusable
884cadd4f8SNickeau         * in order to see the tooltip
894cadd4f8SNickeau         * Not sure, if this is a good idea
904cadd4f8SNickeau         *
914cadd4f8SNickeau         * Arbitrary HTML elements (such as <span>s) can be made focusable by adding the tabindex="0" attribute
924cadd4f8SNickeau         */
934cadd4f8SNickeau        $logicalTag = $tagAttributes->getLogicalTag();
944cadd4f8SNickeau        if (!in_array($logicalTag, [syntax_plugin_combo_link::TAG, syntax_plugin_combo_button::TAG])) {
954cadd4f8SNickeau            $tagAttributes->addOutputAttributeValue("tabindex", "0");
964cadd4f8SNickeau        }
974cadd4f8SNickeau
984cadd4f8SNickeau
994cadd4f8SNickeau    }
1004cadd4f8SNickeau
1014cadd4f8SNickeau    /**
1024cadd4f8SNickeau     * tooltip is used also in page protection
1034cadd4f8SNickeau     */
1044cadd4f8SNickeau    public
1054cadd4f8SNickeau    static function addToolTipSnippetIfNeeded()
1064cadd4f8SNickeau    {
1074cadd4f8SNickeau        PluginUtility::getSnippetManager()->attachInternalJavascriptForSlot(syntax_plugin_combo_tooltip::TAG);
1084cadd4f8SNickeau        PluginUtility::getSnippetManager()->attachCssInternalStyleSheetForSlot(syntax_plugin_combo_tooltip::TAG);
1094cadd4f8SNickeau    }
1104cadd4f8SNickeau}
111