From f88ee31160cc2a8f21067e2cb30c6324a4f1fa38 Mon Sep 17 00:00:00 2001
From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de>
Date: Fri, 18 Aug 2023 07:35:16 +0000
Subject: [PATCH] add form to OptionsWidget and refactor code a bit, fixes
 #1474

Closes #1474

Merge request studip/studip!2044
---
 lib/classes/sidebar/LinkElement.php           |  3 +-
 lib/classes/sidebar/OptionsWidget.php         |  4 +--
 .../assets/stylesheets/scss/buttons.scss      |  9 +++---
 .../assets/stylesheets/scss/sidebar.scss      | 20 +++---------
 templates/sidebar/list-widget.php             | 31 ++++++++++---------
 5 files changed, 30 insertions(+), 37 deletions(-)

diff --git a/lib/classes/sidebar/LinkElement.php b/lib/classes/sidebar/LinkElement.php
index 8e3e2706e11..a6bbe961b5f 100644
--- a/lib/classes/sidebar/LinkElement.php
+++ b/lib/classes/sidebar/LinkElement.php
@@ -226,10 +226,9 @@ class LinkElement extends WidgetElement implements ArrayAccess
     protected function renderButton()
     {
         return sprintf(
-            '<form action="%1$s" method="post" %2$s>%3$s<button type="submit">%4$s</button></form>',
+            '<button formaction="%s" class="as-link" %s>%s</button>',
             htmlReady($this->url),
             arrayToHtmlAttributes((array) $this->attributes),
-            CSRFProtection::tokenTag(),
             htmlReady($this->label)
         );
     }
diff --git a/lib/classes/sidebar/OptionsWidget.php b/lib/classes/sidebar/OptionsWidget.php
index 1e56ed1cd76..f50625c3129 100644
--- a/lib/classes/sidebar/OptionsWidget.php
+++ b/lib/classes/sidebar/OptionsWidget.php
@@ -34,7 +34,7 @@ class OptionsWidget extends ListWidget
         $toggle_url_off = isset($toggle_url_off) ? html_entity_decode($toggle_url_off) : null;
 
         $content = sprintf(
-            '<a href="%s" role="checkbox" aria-checked="%s" class="options-checkbox options-%s" %s>%s</a>',
+            '<button formaction="%s" role="checkbox" aria-checked="%s" class="as-link options-checkbox options-%s" %s>%s</button>',
             htmlReady($state && $toggle_url_off !== null ? $toggle_url_off : $toggle_url),
             $state ? 'true' : 'false',
             $state ? 'checked' : 'unchecked',
@@ -55,7 +55,7 @@ class OptionsWidget extends ListWidget
         $url = html_entity_decode($url);
 
         $content = sprintf(
-            '<a href="%s" role="radio" aria-checked="%s" class="options-radio options-%s" %s>%s</a>',
+            '<button formaction="%s" role="radio" aria-checked="%s" class="as-link options-radio options-%s" %s>%s</button>',
             htmlReady($url),
             $checked ? 'true' : 'false',
             $checked ? 'checked' : 'unchecked',
diff --git a/resources/assets/stylesheets/scss/buttons.scss b/resources/assets/stylesheets/scss/buttons.scss
index 659a26a0a5b..539a2a3e0c4 100644
--- a/resources/assets/stylesheets/scss/buttons.scss
+++ b/resources/assets/stylesheets/scss/buttons.scss
@@ -142,12 +142,13 @@ button.styleless {
     border: 0;
 }
 button.as-link {
+    background-color: transparent;
     border: none;
-    padding: 0px;
-    margin: 0px;
+    color: $base-color;
     cursor: pointer;
-    background-color: transparent;
+    margin: 0px;
+    padding: 0px;
     &:hover {
-        background-color: transparent;
+        color: $active-color;
     }
 }
diff --git a/resources/assets/stylesheets/scss/sidebar.scss b/resources/assets/stylesheets/scss/sidebar.scss
index f03d7a2e8fb..493049c4e39 100644
--- a/resources/assets/stylesheets/scss/sidebar.scss
+++ b/resources/assets/stylesheets/scss/sidebar.scss
@@ -123,6 +123,11 @@ ul.widget-list {
         padding-left: 20px;
         word-wrap: break-word;
     }
+
+    button {
+        text-align: left;
+        width: 100%;
+    }
 }
 div#sidebar-navigation {
     div.sidebar-widget-header {
@@ -191,21 +196,6 @@ div#sidebar-navigation {
             }
         }
     }
-
-    button {
-        background: transparent;
-        border: 0;
-        color: $base-color;
-        margin: 0;
-        padding: 0;
-        text-align: left;
-        width: 100%;
-
-        &:hover {
-            color: $active-color;
-            cursor: pointer;
-        }
-    }
 }
 
 .sidebar-widget-cloud {
diff --git a/templates/sidebar/list-widget.php b/templates/sidebar/list-widget.php
index 0507cfab7ce..e9af862500b 100644
--- a/templates/sidebar/list-widget.php
+++ b/templates/sidebar/list-widget.php
@@ -1,15 +1,18 @@
-<ul class="<?= implode(' ', $css_classes) ?>" aria-label="<?= htmlReady($title) ?>">
-<? foreach ($elements as $index => $element): ?>
-    <? if ($element instanceof LinkElement): ?>
-        <? $icon = $element->icon ?? null ?>
-        <? if ($icon && $element->isDisabled()): ?>
-            <? $icon = $icon->copyWithRole('inactive') ?>
+<form method="post">
+    <?= CSRFProtection::tokenTag() ?>
+    <ul class="<?= implode(' ', $css_classes) ?>" aria-label="<?= htmlReady($title) ?>">
+    <? foreach ($elements as $index => $element): ?>
+        <? if ($element instanceof LinkElement): ?>
+            <? $icon = $element->icon ?? null ?>
+            <? if ($icon && $element->isDisabled()): ?>
+                <? $icon = $icon->copyWithRole('inactive') ?>
+            <? endif ?>
         <? endif ?>
-    <? endif ?>
-    <li id="<?= htmlReady($index) ?>"
-        <?= isset($icon) ? 'style="' . $icon->asCSS() .'"' : '' ?>
-        <?= !empty($element->active) ? 'class="active"' : '' ?>>
-        <?= $element->render() ?>
-    </li>
-<? endforeach; ?>
-</ul>
+        <li id="<?= htmlReady($index) ?>"
+            <?= isset($icon) ? 'style="' . $icon->asCSS() .'"' : '' ?>
+            <?= !empty($element->active) ? 'class="active"' : '' ?>>
+            <?= $element->render() ?>
+        </li>
+    <? endforeach; ?>
+    </ul>
+</form>
-- 
GitLab