xref: /template/strap/ComboStrap/Tooltip.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
1*4cadd4f8SNickeau<?php
2*4cadd4f8SNickeau
3*4cadd4f8SNickeau
4*4cadd4f8SNickeaunamespace ComboStrap;
5*4cadd4f8SNickeau
6*4cadd4f8SNickeau
7*4cadd4f8SNickeauuse syntax_plugin_combo_button;
8*4cadd4f8SNickeauuse syntax_plugin_combo_link;
9*4cadd4f8SNickeauuse syntax_plugin_combo_tooltip;
10*4cadd4f8SNickeau
11*4cadd4f8SNickeauclass Tooltip
12*4cadd4f8SNickeau{
13*4cadd4f8SNickeau
14*4cadd4f8SNickeau
15*4cadd4f8SNickeau    public const TOOLTIP_ATTRIBUTE = "tooltip";
16*4cadd4f8SNickeau    public const CALLSTACK = "callstack";
17*4cadd4f8SNickeau    public const POSITION_ATTRIBUTE = "position";
18*4cadd4f8SNickeau
19*4cadd4f8SNickeau    public static function processTooltip(TagAttributes &$tagAttributes)
20*4cadd4f8SNickeau    {
21*4cadd4f8SNickeau
22*4cadd4f8SNickeau        $tooltip = $tagAttributes->getValueAndRemove(self::TOOLTIP_ATTRIBUTE);
23*4cadd4f8SNickeau        if ($tooltip === null) {
24*4cadd4f8SNickeau            return;
25*4cadd4f8SNickeau        }
26*4cadd4f8SNickeau
27*4cadd4f8SNickeau        /**
28*4cadd4f8SNickeau         * Tooltip
29*4cadd4f8SNickeau         */
30*4cadd4f8SNickeau        $dataAttributeNamespace = Bootstrap::getDataNamespace();
31*4cadd4f8SNickeau
32*4cadd4f8SNickeau
33*4cadd4f8SNickeau        /**
34*4cadd4f8SNickeau         * Old tooltip syntax
35*4cadd4f8SNickeau         */
36*4cadd4f8SNickeau        $title = $tooltip[syntax_plugin_combo_tooltip::TEXT_ATTRIBUTE];
37*4cadd4f8SNickeau        if ($title === null) {
38*4cadd4f8SNickeau
39*4cadd4f8SNickeau            $callStack = $tooltip[Tooltip::CALLSTACK];
40*4cadd4f8SNickeau            if ($callStack !== null) {
41*4cadd4f8SNickeau                try {
42*4cadd4f8SNickeau                    $title = PluginUtility::renderInstructionsToXhtml($callStack);
43*4cadd4f8SNickeau                } catch (ExceptionCombo $e) {
44*4cadd4f8SNickeau                    $title = LogUtility::wrapInRedForHtml("Error while rendering the tooltip. Error: {$e->getMessage()}");
45*4cadd4f8SNickeau                }
46*4cadd4f8SNickeau
47*4cadd4f8SNickeau                /**
48*4cadd4f8SNickeau                 * New Syntax
49*4cadd4f8SNickeau                 * (The new syntax add the attributes to the previous element
50*4cadd4f8SNickeau                 */
51*4cadd4f8SNickeau                $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-html", "true");
52*4cadd4f8SNickeau
53*4cadd4f8SNickeau            }
54*4cadd4f8SNickeau        }
55*4cadd4f8SNickeau
56*4cadd4f8SNickeau
57*4cadd4f8SNickeau
58*4cadd4f8SNickeau
59*4cadd4f8SNickeau        if (empty($title)) {
60*4cadd4f8SNickeau            $title = LogUtility::wrapInRedForHtml("The tooltip is empty");
61*4cadd4f8SNickeau        }
62*4cadd4f8SNickeau        $tagAttributes->addOutputAttributeValue("title", $title);
63*4cadd4f8SNickeau
64*4cadd4f8SNickeau        /**
65*4cadd4f8SNickeau         * Snippet
66*4cadd4f8SNickeau         */
67*4cadd4f8SNickeau        Tooltip::addToolTipSnippetIfNeeded();
68*4cadd4f8SNickeau        $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-toggle", "tooltip");
69*4cadd4f8SNickeau
70*4cadd4f8SNickeau        /**
71*4cadd4f8SNickeau         * Position
72*4cadd4f8SNickeau         */
73*4cadd4f8SNickeau        $position = $tooltip[Tooltip::POSITION_ATTRIBUTE];
74*4cadd4f8SNickeau        if ($position === null) {
75*4cadd4f8SNickeau            $position = "top";
76*4cadd4f8SNickeau        }
77*4cadd4f8SNickeau        $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-placement", "${position}");
78*4cadd4f8SNickeau
79*4cadd4f8SNickeau
80*4cadd4f8SNickeau        /**
81*4cadd4f8SNickeau         * Keyboard user and assistive technology users
82*4cadd4f8SNickeau         * If not button or link (ie span), add tabindex to make the element focusable
83*4cadd4f8SNickeau         * in order to see the tooltip
84*4cadd4f8SNickeau         * Not sure, if this is a good idea
85*4cadd4f8SNickeau         *
86*4cadd4f8SNickeau         * Arbitrary HTML elements (such as <span>s) can be made focusable by adding the tabindex="0" attribute
87*4cadd4f8SNickeau         */
88*4cadd4f8SNickeau        $logicalTag = $tagAttributes->getLogicalTag();
89*4cadd4f8SNickeau        if (!in_array($logicalTag, [syntax_plugin_combo_link::TAG, syntax_plugin_combo_button::TAG])) {
90*4cadd4f8SNickeau            $tagAttributes->addOutputAttributeValue("tabindex", "0");
91*4cadd4f8SNickeau        }
92*4cadd4f8SNickeau
93*4cadd4f8SNickeau
94*4cadd4f8SNickeau    }
95*4cadd4f8SNickeau
96*4cadd4f8SNickeau    /**
97*4cadd4f8SNickeau     * tooltip is used also in page protection
98*4cadd4f8SNickeau     */
99*4cadd4f8SNickeau    public
100*4cadd4f8SNickeau    static function addToolTipSnippetIfNeeded()
101*4cadd4f8SNickeau    {
102*4cadd4f8SNickeau        PluginUtility::getSnippetManager()->attachInternalJavascriptForSlot(syntax_plugin_combo_tooltip::TAG);
103*4cadd4f8SNickeau        PluginUtility::getSnippetManager()->attachCssInternalStyleSheetForSlot(syntax_plugin_combo_tooltip::TAG);
104*4cadd4f8SNickeau    }
105*4cadd4f8SNickeau}
106