xref: /plugin/combo/ComboStrap/SearchTag.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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