xref: /plugin/combo/ComboStrap/TagAttribute/Toggle.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau
4*04fd306cSNickeaunamespace ComboStrap\TagAttribute;
5*04fd306cSNickeau
6*04fd306cSNickeau
7*04fd306cSNickeauuse ComboStrap\Bootstrap;
8*04fd306cSNickeauuse ComboStrap\ConditionalValue;
9*04fd306cSNickeauuse ComboStrap\ExceptionBadSyntax;
10*04fd306cSNickeauuse ComboStrap\LogUtility;
11*04fd306cSNickeauuse ComboStrap\PluginUtility;
12*04fd306cSNickeauuse ComboStrap\TagAttributes;
13*04fd306cSNickeau
14*04fd306cSNickeauclass Toggle
15*04fd306cSNickeau{
16*04fd306cSNickeau
17*04fd306cSNickeau    /**
18*04fd306cSNickeau     * An indicator attribute that tells if the target element is collapsed or not (accordion)
19*04fd306cSNickeau     */
20*04fd306cSNickeau    const COLLAPSED = "collapsed";
21*04fd306cSNickeau    const TOGGLE_STATE = "toggle-state";
22*04fd306cSNickeau    const TOGGLE_STATE_NONE = "none";
23*04fd306cSNickeau    const TOGGLE_STATE_EXPANDED = "expanded";
24*04fd306cSNickeau    const TOGGLE_STATE_COLLAPSED = "collapsed";
25*04fd306cSNickeau    const CANONICAL = "toggle";
26*04fd306cSNickeau
27*04fd306cSNickeau
28*04fd306cSNickeau    /**
29*04fd306cSNickeau     * The collapse attribute are the same
30*04fd306cSNickeau     * for all component except a link
31*04fd306cSNickeau     * @param TagAttributes $attributes
32*04fd306cSNickeau     *
33*04fd306cSNickeau     */
34*04fd306cSNickeau    public
35*04fd306cSNickeau    static function processToggle(TagAttributes $attributes)
36*04fd306cSNickeau    {
37*04fd306cSNickeau
38*04fd306cSNickeau
39*04fd306cSNickeau        /**
40*04fd306cSNickeau         * Toggle state
41*04fd306cSNickeau         */
42*04fd306cSNickeau        $value = $attributes->getValueAndRemove(self::TOGGLE_STATE);
43*04fd306cSNickeau        if ($value !== null) {
44*04fd306cSNickeau            if ($value === self::TOGGLE_STATE_NONE) {
45*04fd306cSNickeau                return;
46*04fd306cSNickeau            }
47*04fd306cSNickeau            $values = explode(" ", $value);
48*04fd306cSNickeau            foreach ($values as $value) {
49*04fd306cSNickeau                if (empty($value)) {
50*04fd306cSNickeau                    continue;
51*04fd306cSNickeau                }
52*04fd306cSNickeau                switch ($value) {
53*04fd306cSNickeau                    case self::TOGGLE_STATE_EXPANDED:
54*04fd306cSNickeau                        $attributes->addClassName("collapse show");
55*04fd306cSNickeau                        break;
56*04fd306cSNickeau                    case self::TOGGLE_STATE_COLLAPSED:
57*04fd306cSNickeau                        $attributes->addClassName("collapse");
58*04fd306cSNickeau                        break;
59*04fd306cSNickeau                    default:
60*04fd306cSNickeau                        /**
61*04fd306cSNickeau                         * It may be a conditional breakpoint collapse
62*04fd306cSNickeau                         */
63*04fd306cSNickeau                        try {
64*04fd306cSNickeau                            $conditionalValue = ConditionalValue::createFrom($value);
65*04fd306cSNickeau                        } catch (ExceptionBadSyntax $e) {
66*04fd306cSNickeau                            LogUtility::msg("The toggle state ($value) is invalid. It should be (expanded, collapsed or breakpoint-expanded)", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
67*04fd306cSNickeau                            continue 2;
68*04fd306cSNickeau                        }
69*04fd306cSNickeau
70*04fd306cSNickeau                        $toggleStateValue = $conditionalValue->getValue();
71*04fd306cSNickeau                        if ($toggleStateValue !== self::TOGGLE_STATE_EXPANDED) {
72*04fd306cSNickeau                            LogUtility::msg("The toggle breakpoint ($value) supports only `expanded` as value, not $toggleStateValue.", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
73*04fd306cSNickeau                            continue 2;
74*04fd306cSNickeau                        }
75*04fd306cSNickeau                        $id = $attributes->getValue("id");
76*04fd306cSNickeau                        if (empty($id)) {
77*04fd306cSNickeau                            LogUtility::msg("A conditional toggle breakpoint ($value) needs an id attribute.", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
78*04fd306cSNickeau                            continue 2;
79*04fd306cSNickeau                        }
80*04fd306cSNickeau                        $breakpoint = $conditionalValue->getBreakpointSize();
81*04fd306cSNickeau                        $styleSheet = <<<EOF
82*04fd306cSNickeau@media (min-width: {$breakpoint}px) {
83*04fd306cSNickeau   #{$id} {
84*04fd306cSNickeau        display: block!important
85*04fd306cSNickeau   }
86*04fd306cSNickeau}
87*04fd306cSNickeauEOF;
88*04fd306cSNickeau                        /**
89*04fd306cSNickeau                         * The snippet id is dependent on id
90*04fd306cSNickeau                         * if there is more than one
91*04fd306cSNickeau                         */
92*04fd306cSNickeau                        $snippetId = self::CANONICAL."-$id";
93*04fd306cSNickeau                        PluginUtility::getSnippetManager()->attachCssInternalStyleSheet($snippetId, $styleSheet);
94*04fd306cSNickeau
95*04fd306cSNickeau                }
96*04fd306cSNickeau            }
97*04fd306cSNickeau        }
98*04fd306cSNickeau
99*04fd306cSNickeau        /**
100*04fd306cSNickeau         * Old
101*04fd306cSNickeau         * https://combostrap.com/release/deprecated/toggle
102*04fd306cSNickeau         * @deprecated
103*04fd306cSNickeau         */
104*04fd306cSNickeau        $collapse = "toggleTargetId";
105*04fd306cSNickeau        if ($attributes->hasComponentAttribute($collapse)) {
106*04fd306cSNickeau            $targetId = $attributes->getValueAndRemoveIfPresent($collapse);
107*04fd306cSNickeau        } else {
108*04fd306cSNickeau            $targetId = $attributes->getValueAndRemoveIfPresent("collapse");
109*04fd306cSNickeau        }
110*04fd306cSNickeau        if ($targetId != null) {
111*04fd306cSNickeau            $bootstrapNamespace = "bs-";
112*04fd306cSNickeau            if (Bootstrap::getBootStrapMajorVersion() == Bootstrap::BootStrapFourMajorVersion) {
113*04fd306cSNickeau                $bootstrapNamespace = "";
114*04fd306cSNickeau            }
115*04fd306cSNickeau            /**
116*04fd306cSNickeau             * We can use it in a link
117*04fd306cSNickeau             */
118*04fd306cSNickeau            if (substr($targetId, 0, 1) != "#") {
119*04fd306cSNickeau                $targetId = "#" . $targetId;
120*04fd306cSNickeau            }
121*04fd306cSNickeau            $attributes->addOutputAttributeValue("data-{$bootstrapNamespace}toggle", "collapse");
122*04fd306cSNickeau            $attributes->addOutputAttributeValue("data-{$bootstrapNamespace}target", $targetId);
123*04fd306cSNickeau
124*04fd306cSNickeau        }
125*04fd306cSNickeau
126*04fd306cSNickeau        /**
127*04fd306cSNickeau         * Toggle state
128*04fd306cSNickeau         * @deprecated
129*04fd306cSNickeau         * https://combostrap.com/release/deprecated/toggle
130*04fd306cSNickeau         */
131*04fd306cSNickeau        $collapsed = self::COLLAPSED;
132*04fd306cSNickeau        if ($attributes->hasComponentAttribute($collapsed)) {
133*04fd306cSNickeau            $value = $attributes->getValueAndRemove($collapsed);
134*04fd306cSNickeau            if ($value) {
135*04fd306cSNickeau                $attributes->addClassName("collapse");
136*04fd306cSNickeau            }
137*04fd306cSNickeau        }
138*04fd306cSNickeau
139*04fd306cSNickeau
140*04fd306cSNickeau    }
141*04fd306cSNickeau
142*04fd306cSNickeau    public static function disableEntity(string $mode): bool
143*04fd306cSNickeau    {
144*04fd306cSNickeau        if ($mode === "entity") {
145*04fd306cSNickeau            return false;
146*04fd306cSNickeau        }
147*04fd306cSNickeau        return true;
148*04fd306cSNickeau    }
149*04fd306cSNickeau
150*04fd306cSNickeau}
151