From 456dcab2683f135251cef68efe65c81a0bd7d5ad Mon Sep 17 00:00:00 2001
From: Michael Danielczok <michael@pcsg.de>
Date: Thu, 10 Oct 2024 09:28:49 +0200
Subject: [PATCH] feat: add project setting to activate floating nav

---
 events.xml                    |  1 +
 locale.xml                    | 47 +++++++++++++++++++++++++
 settings.xml                  | 65 ++++++++++++++++++++++++++++++++++-
 src/QUI/Menu/EventHandler.php | 35 +++++++++++++++++++
 4 files changed, 147 insertions(+), 1 deletion(-)

diff --git a/events.xml b/events.xml
index 195edba..5a50659 100644
--- a/events.xml
+++ b/events.xml
@@ -5,4 +5,5 @@
     <event on="onSmartyInit" fire="\QUI\Menu\EventHandler::onSmartyInit"/>
     <event on="onAdminLoadFooter" fire="\QUI\Menu\EventHandler::onAdminLoadFooter"/>
     <event on="onQuiqqerMenuIndependentClear" fire="\QUI\Menu\EventHandler::onQuiqqerMenuIndependentClear"/>
+    <event on="onQuiqqer::template::body::end" fire="\QUI\Menu\EventHandler::onQuiqqerTemplateBodyEnd"/>
 </events>
diff --git a/locale.xml b/locale.xml
index 076bd89..378062e 100644
--- a/locale.xml
+++ b/locale.xml
@@ -719,6 +719,53 @@
             <de><![CDATA[Das Menü wurde erfolgreich gespeichert.]]></de>
             <en><![CDATA[The menu has been saved successfully.]]></en>
         </locale>
+
+        <!-- floating menu -->
+        <locale name="floatingMenu.settings.title">
+            <de><![CDATA[Schwebendes Menü]]></de>
+            <en><![CDATA[Floated menu]]></en>
+        </locale>
+        <locale name="floatingMenu.settings.desc">
+            <de><![CDATA[Ein "Schwebendes Menü" ist ein Menü, das sich über den Inhalt der Seite legt und dabei oft an einer bestimmten Position "schwebt" oder fixiert bleibt, selbst wenn man nach unten scrollt. Dieses Menü kann z.B. am Rand des Bildschirms oder in einer Ecke platziert sein und bleibt sichtbar, damit der Nutzer jederzeit schnell darauf zugreifen kann.]]></de>
+            <en><![CDATA[A "Floating menu" is a menu that is superimposed over the content of the page and often "floats" or remains fixed in a certain position, even when scrolling down. This menu can be placed at the edge of the screen or in a corner, for example, and remains visible so that the user can access it quickly at any time.]]></en>
+        </locale>
+
+        <locale name="floatingMenu.settings.menuId">
+            <de><![CDATA[Menu ID]]></de>
+            <en><![CDATA[Menu ID]]></en>
+        </locale>
+        <locale name="floatingMenu.settings.menuId.desc">
+            <de><![CDATA[Wenn hier ein Menü ausgewählt wird, wird es automatisch aktiviert und für die Benutzer auf der Seite sichtbar. Zuvor muss ein Menü unter <i>Einstellungen → Menü Verwaltung</i> erstellt werden. Möchte man das schwebende Menü deaktivieren, muss lediglich das ausgewählte Menü durch Klick auf den X Button entfernt werden.]]></de>
+            <en><![CDATA[If a menu is selected here, it is automatically activated and visible to users on the page. A menu must first be created under <i>Settings → Menu management</i>. If you want to deactivate the floating menu, simply remove the selected menu by clicking on the X button.]]></en>
+        </locale>
+        <locale name="floatingMenu.settings.showLangSwitch">
+            <de><![CDATA[Sprachewechsel aktivieren]]></de>
+            <en><![CDATA[Enable lang switch]]></en>
+        </locale>
+        <locale name="floatingMenu.settings.showLangSwitch.desc">
+            <de><![CDATA[Wenn das Projekt mehrsprachig ist, kann man mit dieser Option den Sprachwechsel aktivieren.]]></de>
+            <en><![CDATA[If the project is multilingual, you can use this option to enable language switching.]]></en>
+        </locale>
+        <locale name="floatingMenu.settings.toggleButton">
+            <de><![CDATA[Umschaltbutton]]></de>
+            <en><![CDATA[Toggle button]]></en>
+        </locale>
+        <locale name="floatingMenu.settings.toggleButton.desc">
+            <de><![CDATA[Der Umschaltbutton zeigt und versteckt die schwebende Navigation. Mit dieser Option kann festgelegt werden, wann er angezeigt wird oder ob er vollständig verborgen bleibt.]]></de>
+            <en><![CDATA[The toggle button shows and hides the floating navigation. This option allows you to specify when it is displayed or if it remains completely hidden.]]></en>
+        </locale>
+        <locale name="floatingMenu.settings.toggleButton.mobile">
+            <de><![CDATA[Nur mobile anzeigen]]></de>
+            <en><![CDATA[Show only mobile]]></en>
+        </locale>
+        <locale name="floatingMenu.settings.toggleButton.always">
+            <de><![CDATA[Mobile und Desktop anzeigen]]></de>
+            <en><![CDATA[Show on mobile and on desktop]]></en>
+        </locale>
+        <locale name="floatingMenu.settings.toggleButton.hide">
+            <de><![CDATA[Deaktivieren]]></de>
+            <en><![CDATA[Disabled]]></en>
+        </locale>
     </groups>
 
     <groups name="quiqqer/menu" datatype="js">
diff --git a/settings.xml b/settings.xml
index 0e36dcf..0fbaf35 100644
--- a/settings.xml
+++ b/settings.xml
@@ -31,7 +31,7 @@
                         <type><![CDATA[number]]></type>
                         <defaultvalue>1</defaultvalue>
                     </conf>
-                </section>`
+                </section>
                 <section name="mobileMenu.slideoutAdvanced.settings">
                     <conf name="homeLink">
                         <type><![CDATA[number]]></type>
@@ -41,6 +41,19 @@
                         <type><![CDATA[number]]></type>
                     </conf>
                 </section>
+                <section name="floatingMenu.settings">
+                    <conf name="menuId">
+                        <type><![CDATA[number]]></type>
+                    </conf>
+                    <conf name="showLangSwitch">
+                        <type><![CDATA[bool]]></type>
+                        <defaultvalue>false</defaultvalue>
+                    </conf>
+                    <conf name="toggleButton">
+                        <type><![CDATA[text]]></type>
+                        <defaultvalue>mobile</defaultvalue>
+                    </conf>
+                </section>
             </config>
 
             <window>
@@ -176,6 +189,56 @@
                                 </description>
                             </input>
                         </settings>
+
+                        <!-- floated menu -->
+                        <settings title="floatingMenu.settings" name="floatingMenu.settings">
+                            <title>
+                                <locale group="quiqqer/menu" var="floatingMenu.settings.title"/>
+                            </title>
+
+                            <text>
+                                <locale group="quiqqer/menu" var="floatingMenu.settings.desc"/>
+                            </text>
+
+                            <input conf="floatingMenu.settings.menuId" type="text"
+                                   data-qui="package/quiqqer/menu/bin/Controls/Independent/Input"
+                            >
+                                <text>
+                                    <locale group="quiqqer/menu" var="floatingMenu.settings.menuId"/>
+                                </text>
+                                <description>
+                                    <locale group="quiqqer/menu" var="floatingMenu.settings.menuId.desc"/>
+                                </description>
+                            </input>
+
+                            <input conf="floatingMenu.settings.showLangSwitch" type="checkbox">
+                                <text>
+                                    <locale group="quiqqer/menu" var="floatingMenu.settings.showLangSwitch"/>
+                                </text>
+                                <description>
+                                    <locale group="quiqqer/menu" var="floatingMenu.settings.showLangSwitch.desc"/>
+                                </description>
+                            </input>
+
+<!--                            <select conf="floatingMenu.settings.toggleButton">-->
+<!--                                <text>-->
+<!--                                    <locale group="quiqqer/menu" var="floatingMenu.settings.toggleButton"/>-->
+<!--                                </text>-->
+<!--                                <description>-->
+<!--                                    <locale group="quiqqer/menu" var="floatingMenu.settings.toggleButton.desc"/>-->
+<!--                                </description>-->
+
+<!--                                <option value="mobile">-->
+<!--                                    <locale group="quiqqer/menu" var="floatingMenu.settings.toggleButton.mobile"/>-->
+<!--                                </option>-->
+<!--                                <option value="always">-->
+<!--                                    <locale group="quiqqer/menu" var="floatingMenu.settings.toggleButton.always"/>-->
+<!--                                </option>-->
+<!--                                <option value="hide">-->
+<!--                                    <locale group="quiqqer/menu" var="floatingMenu.settings.toggleButton.hide"/>-->
+<!--                                </option>-->
+<!--                            </select>-->
+                        </settings>
                     </category>
                 </categories>
 
diff --git a/src/QUI/Menu/EventHandler.php b/src/QUI/Menu/EventHandler.php
index cf6ae9c..939946f 100644
--- a/src/QUI/Menu/EventHandler.php
+++ b/src/QUI/Menu/EventHandler.php
@@ -3,9 +3,11 @@
 namespace QUI\Menu;
 
 use QUI;
+use QUI\Config;
 use QUI\Interfaces\Projects\Site;
 use Smarty;
 use SmartyException;
+use QUI\Smarty\Collector;
 
 /**
  * Class EventHandler
@@ -14,6 +16,11 @@
  */
 class EventHandler
 {
+    /**
+     * Cache Manager Configs
+     */
+    public static ?Config $Config = null;
+
     /**
      * @return string
      */
@@ -76,4 +83,32 @@ public static function onQuiqqerMenuIndependentClear($menuId): void
     {
         QUI\Cache\Manager::clear(self::menuCacheName());
     }
+
+    /**
+     * @param Collector $Collector
+     * @param QUI\Template $Template
+     * @return void
+     */
+    public static function onQuiqqerTemplateBodyEnd(Collector $Collector, QUI\Template $Template): void
+    {
+        $Projekt = $Template->getAttribute('Project');
+        $menuId = intval($Projekt->getConfig('floatingMenu.settings.menuId'));
+
+        if (!$menuId) {
+            return;
+        }
+
+        $showLandSwitch = $Projekt->getConfig('floatingMenu.settings.showLangSwitch');
+        $toggleButton = $Projekt->getConfig('floatingMenu.settings.toggleButton');
+        // todo - showToggleButton works not correctly in FloatedNav
+        $toggleButton = 'mobile';
+
+        $FloatingMenu = new QUI\Menu\Controls\FloatedNav([
+            'menuId' => $menuId,
+            'showLangSwitch' => $showLandSwitch,
+            'showToggleButton' => $toggleButton
+        ]);
+
+        $Collector->append($FloatingMenu->create());
+    }
 }
-- 
GitLab