1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap; 4*04fd306cSNickeau 5*04fd306cSNickeauuse ComboStrap\TagAttribute\StyleAttribute; 6*04fd306cSNickeau 7*04fd306cSNickeau/** 8*04fd306cSNickeau * Search Tag Implementation 9*04fd306cSNickeau * 10*04fd306cSNickeau * See also Command menu / Command Palettes : 11*04fd306cSNickeau * * https://uiw.tf/cmdk 12*04fd306cSNickeau * * https://tailwindui.com/components/application-ui/navigation/command-palettes 13*04fd306cSNickeau */ 14*04fd306cSNickeauclass SearchTag 15*04fd306cSNickeau{ 16*04fd306cSNickeau 17*04fd306cSNickeau const TAG = "search"; 18*04fd306cSNickeau public const COMBO_SEARCH_BOX = "combo-search-box"; 19*04fd306cSNickeau public const SNIPPET_ID = "search"; 20*04fd306cSNickeau public const COMBO_DEBOUNCE = "combo-debounce"; 21*04fd306cSNickeau const CANONICAL = "search"; 22*04fd306cSNickeau 23*04fd306cSNickeau public static function render(TagAttributes $tagAttributes): string 24*04fd306cSNickeau { 25*04fd306cSNickeau global $lang; 26*04fd306cSNickeau global $ACT; 27*04fd306cSNickeau global $QUERY; // $QUERY = $INPUT->str('q') 28*04fd306cSNickeau 29*04fd306cSNickeau // don't print the search form if search action has been disabled 30*04fd306cSNickeau // if (!actionOK('search')) return false; 31*04fd306cSNickeau 32*04fd306cSNickeau /** 33*04fd306cSNickeau * Add the debounce dependency first 34*04fd306cSNickeau */ 35*04fd306cSNickeau PluginUtility::getSnippetManager()->attachJavascriptFromComponentId(self::COMBO_DEBOUNCE); 36*04fd306cSNickeau PluginUtility::getSnippetManager()->attachJavascriptFromComponentId(self::COMBO_SEARCH_BOX); 37*04fd306cSNickeau 38*04fd306cSNickeau /** 39*04fd306cSNickeau * Doku Base is not defined when the 40*04fd306cSNickeau * {@link \ComboStrap\TplUtility::CONF_DISABLE_BACKEND_JAVASCRIPT} 41*04fd306cSNickeau * is used 42*04fd306cSNickeau */ 43*04fd306cSNickeau $dokuBase = DOKU_BASE; 44*04fd306cSNickeau PluginUtility::getSnippetManager()->attachJavascriptFromComponentId(self::SNIPPET_ID, "var DOKU_BASE='$dokuBase';"); 45*04fd306cSNickeau PluginUtility::getSnippetManager()->attachJavascriptFromComponentId(self::SNIPPET_ID); 46*04fd306cSNickeau 47*04fd306cSNickeau try { 48*04fd306cSNickeau $extraClass = $tagAttributes->getClass(""); 49*04fd306cSNickeau } catch (ExceptionNull $e) { 50*04fd306cSNickeau $extraClass = ""; 51*04fd306cSNickeau } 52*04fd306cSNickeau 53*04fd306cSNickeau try { 54*04fd306cSNickeau $id = WikiPath::createRequestedPagePathFromRequest()->getWikiId(); 55*04fd306cSNickeau } catch (ExceptionNotFound $e) { 56*04fd306cSNickeau LogUtility::error($e->getMessage(), self::CANONICAL,$e);; 57*04fd306cSNickeau $id = "not_found"; 58*04fd306cSNickeau } 59*04fd306cSNickeau $inputSearchId = 'internal-search-box'; 60*04fd306cSNickeau 61*04fd306cSNickeau // https://getbootstrap.com/docs/5.0/getting-started/accessibility/#visually-hidden-content 62*04fd306cSNickeau // 63*04fd306cSNickeau $visuallyHidden = "sr-only"; 64*04fd306cSNickeau $bootStrapVersion = Bootstrap::getFromContext()->getMajorVersion(); 65*04fd306cSNickeau if ($bootStrapVersion == Bootstrap::BootStrapFiveMajorVersion) { 66*04fd306cSNickeau $visuallyHidden = "visually-hidden"; 67*04fd306cSNickeau } 68*04fd306cSNickeau if($bootStrapVersion===Bootstrap::BootStrapFourMajorVersion){ 69*04fd306cSNickeau $formInlineClass = "form-inline"; 70*04fd306cSNickeau } else { 71*04fd306cSNickeau $formInlineClass = "d-flex align-middle mb-0"; 72*04fd306cSNickeau } 73*04fd306cSNickeau $valueKeyProp = ""; 74*04fd306cSNickeau if ($ACT == 'search') $valueKeyProp = ' value="' . htmlspecialchars($QUERY) . '" '; 75*04fd306cSNickeau $browserAutoComplete = 'on'; 76*04fd306cSNickeau if (!$tagAttributes->getBooleanValue('autocomplete')) { 77*04fd306cSNickeau $browserAutoComplete = 'off'; 78*04fd306cSNickeau } 79*04fd306cSNickeau $tagClass = StyleAttribute::addComboStrapSuffix(self::TAG); 80*04fd306cSNickeau $action = wl(); 81*04fd306cSNickeau return <<<EOF 82*04fd306cSNickeau<form 83*04fd306cSNickeau id="dw__search" 84*04fd306cSNickeau action="$action" 85*04fd306cSNickeau accept-charset="utf-8" 86*04fd306cSNickeau method="get" 87*04fd306cSNickeau role="search" 88*04fd306cSNickeau class="$tagClass $formInlineClass $extraClass" 89*04fd306cSNickeau > 90*04fd306cSNickeau<input type="hidden" name="do" value="search" /> 91*04fd306cSNickeau<input type="hidden" name="id" value="$id" /> 92*04fd306cSNickeau<label class="$visuallyHidden" for="$inputSearchId">Search Term</label> 93*04fd306cSNickeau<input class="edit form-control" type="text" id="$inputSearchId" name="q" $valueKeyProp placeholder="{$lang['btn_search']}... (Alt+Shift+F)" autocomplete="$browserAutoComplete" accesskey="f" title="[F]"/> 94*04fd306cSNickeau</form> 95*04fd306cSNickeauEOF; 96*04fd306cSNickeau } 97*04fd306cSNickeau 98*04fd306cSNickeau} 99