From efb19ff81288e1f3368c5c468140e565f3303c63 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Thu, 14 Nov 2024 07:35:19 +0000
Subject: [PATCH] fix responsive logout, fixes #4744

Closes #4744

Merge request studip/studip!3542
---
 lib/classes/ResponsiveHelper.php              |  6 ++++--
 lib/navigation/Navigation.php                 |  2 ++
 .../assets/stylesheets/highcontrast.scss      |  3 ++-
 .../assets/stylesheets/scss/responsive.scss   |  3 ++-
 .../components/responsive/NavigationItem.vue  | 20 ++++++++++++++++---
 5 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/lib/classes/ResponsiveHelper.php b/lib/classes/ResponsiveHelper.php
index afa5005e5d0..d4d0651be47 100644
--- a/lib/classes/ResponsiveHelper.php
+++ b/lib/classes/ResponsiveHelper.php
@@ -53,7 +53,8 @@ class ResponsiveHelper
                 'parent'   => '/',
                 'path'     => $path,
                 'visible'  => $forceVisibility ? true : $nav->isVisible(true),
-                'active'   => $nav->isActive()
+                'active'   => $nav->isActive(),
+                'button'   => $nav->getRenderAsButton(),
             ];
 
             if ($nav->isActive()) {
@@ -130,7 +131,8 @@ class ResponsiveHelper
                 'parent'  => $path,
                 'path'    => $subpath,
                 'visible' => $subnav->isVisible(),
-                'active'  => $subnav->isActive()
+                'active'  => $subnav->isActive(),
+                'button'  => $subnav->getRenderAsButton(),
             ];
 
             if ($subnav->isActive()) {
diff --git a/lib/navigation/Navigation.php b/lib/navigation/Navigation.php
index c8fde82f930..9f26ab6e672 100644
--- a/lib/navigation/Navigation.php
+++ b/lib/navigation/Navigation.php
@@ -554,6 +554,8 @@ class Navigation implements IteratorAggregate
 
     /**
      * Return the list of subnavigation items of this object.
+     *
+     * @return Navigation[]
      */
     public function getSubNavigation()
     {
diff --git a/resources/assets/stylesheets/highcontrast.scss b/resources/assets/stylesheets/highcontrast.scss
index aba822354ea..fe4c654f49c 100644
--- a/resources/assets/stylesheets/highcontrast.scss
+++ b/resources/assets/stylesheets/highcontrast.scss
@@ -1049,7 +1049,8 @@ button.skiplink {
     }
 
     // list elements when hovering
-    a {
+    a,
+    button {
         &:hover {
             background-color: $lightgray;
             color: $black;
diff --git a/resources/assets/stylesheets/scss/responsive.scss b/resources/assets/stylesheets/scss/responsive.scss
index 7892d30daeb..5c2121430d3 100644
--- a/resources/assets/stylesheets/scss/responsive.scss
+++ b/resources/assets/stylesheets/scss/responsive.scss
@@ -216,7 +216,8 @@ $sidebarOut: -330px;
         color: var(--white);
         flex: 1;
 
-        > a {
+        > a,
+        button {
             display: inline-block;
             padding: 10px 10px 10px 5px;
             text-align: left;
diff --git a/resources/vue/components/responsive/NavigationItem.vue b/resources/vue/components/responsive/NavigationItem.vue
index 50ab5a8cac0..d65bda39917 100644
--- a/resources/vue/components/responsive/NavigationItem.vue
+++ b/resources/vue/components/responsive/NavigationItem.vue
@@ -10,7 +10,7 @@
                 >
                     <span class="navigation-icon">
                         <studip-icon v-if="isCourse" shape="seminar" role="info_alt" :size="24" alt=""></studip-icon>
-                        <img v-if="item.icon" :src="iconUrl" width="24" alt="" :class="{avatar: item.avatar}"/>
+                        <img v-else-if="item.icon" :src="iconUrl" width="24" alt="" :class="{avatar: item.avatar}"/>
                     </span>
                     <span class="navigation-text">
                         {{ item.title }}
@@ -29,14 +29,28 @@
             </button>
         </template>
         <div v-else class="navigation-title">
-            <a
+            <form v-if="item.button"
+                  :action="item.url"
+                  method="post"
+            >
+                <button class="as-link"
+                        tabindex="0"
+                        :title="navigateToText(item.title)"
+                        :aria-label="navigateToText(item.title)"
+                >
+                    <studip-icon v-if="isCourse" shape="seminar" role="info_alt" :size="24" alt=""></studip-icon>
+                    <img v-else-if="item.icon" :src="iconUrl" width="24" alt="" :class="{avatar: item.avatar}"/>
+                    {{ item.title }}
+                </button>
+            </form>
+            <a v-else
                 :href="item.url"
                 tabindex="0"
                 :title="navigateToText(item.title)"
                 :aria-label="navigateToText(item.title)"
             >
                 <studip-icon v-if="isCourse" shape="seminar" role="info_alt" :size="24" alt=""></studip-icon>
-                <img v-if="item.icon" :src="iconUrl" width="24" alt="" :class="{avatar: item.avatar}"/>
+                <img v-else-if="item.icon" :src="iconUrl" width="24" alt="" :class="{avatar: item.avatar}"/>
                 {{ item.title }}
             </a>
         </div>
-- 
GitLab