From 9e3cfdbe768375994ca61d22c11039c151e95239 Mon Sep 17 00:00:00 2001
From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de>
Date: Thu, 28 Sep 2023 07:56:28 +0000
Subject: [PATCH] add SeparatorElement for sidebar widgets, re #3235

Merge request studip/studip!2204
---
 lib/classes/sidebar/ListWidget.php            | 12 +++++++-
 lib/classes/sidebar/SeparatorElement.php      | 28 +++++++++++++++++++
 .../assets/stylesheets/scss/sidebar.scss      |  6 ++++
 templates/sidebar/list-widget.php             |  1 +
 4 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 lib/classes/sidebar/SeparatorElement.php

diff --git a/lib/classes/sidebar/ListWidget.php b/lib/classes/sidebar/ListWidget.php
index ed37e4cd694..e6edce21db7 100644
--- a/lib/classes/sidebar/ListWidget.php
+++ b/lib/classes/sidebar/ListWidget.php
@@ -37,6 +37,16 @@ class ListWidget extends SidebarWidget
         $this->classes = array_diff($this->css_class, [$css_class]);
     }
 
+    /**
+     * Adds a separator to the widget
+     *
+     * @param array  $attributes  Optional additional attributes
+     */
+    public function addSeparator($attributes = [])
+    {
+        $this->addElement(new SeparatorElement($attributes));
+    }
+
     /**
      * 
      */
@@ -46,4 +56,4 @@ class ListWidget extends SidebarWidget
 
        return parent::render($variables);
     }
-}
\ No newline at end of file
+}
diff --git a/lib/classes/sidebar/SeparatorElement.php b/lib/classes/sidebar/SeparatorElement.php
new file mode 100644
index 00000000000..4cfb1ffb335
--- /dev/null
+++ b/lib/classes/sidebar/SeparatorElement.php
@@ -0,0 +1,28 @@
+<?php
+
+class SeparatorElement extends WidgetElement
+{
+    public $attributes = [];
+
+    /**
+     * create a separator element
+     *
+     * @param array  $attributes HTML-attributes in an associative array.
+     */
+    public function __construct($attributes = [])
+    {
+        parent::__construct();
+
+        $this->attributes = $attributes;
+    }
+
+    /**
+     * Renders the element.
+     *
+     * @return string
+     */
+    public function render()
+    {
+        return sprintf('<hr %s>', arrayToHtmlAttributes($this->attributes));
+    }
+}
diff --git a/resources/assets/stylesheets/scss/sidebar.scss b/resources/assets/stylesheets/scss/sidebar.scss
index 9a556a474ec..fd885af8a9c 100644
--- a/resources/assets/stylesheets/scss/sidebar.scss
+++ b/resources/assets/stylesheets/scss/sidebar.scss
@@ -124,6 +124,12 @@ ul.widget-list {
         word-wrap: break-word;
     }
 
+    hr {
+        border-style: none;
+        border-top: thin solid var(--content-color-40);
+        margin: 4px 0px 4px -20px;
+    }
+
     button {
         @extend .as-link;
         text-align: left;
diff --git a/templates/sidebar/list-widget.php b/templates/sidebar/list-widget.php
index e9af862500b..5c94a0ed149 100644
--- a/templates/sidebar/list-widget.php
+++ b/templates/sidebar/list-widget.php
@@ -2,6 +2,7 @@
     <?= CSRFProtection::tokenTag() ?>
     <ul class="<?= implode(' ', $css_classes) ?>" aria-label="<?= htmlReady($title) ?>">
     <? foreach ($elements as $index => $element): ?>
+        <? $icon = null ?>
         <? if ($element instanceof LinkElement): ?>
             <? $icon = $element->icon ?? null ?>
             <? if ($icon && $element->isDisabled()): ?>
-- 
GitLab