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