From 348bd1303bc31d0f1be6a8990e0647d7233b388f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Noack?= <noack@data-quest.de>
Date: Mon, 22 Apr 2024 16:02:08 +0000
Subject: [PATCH] Resolve "MessageBox sollte als Statusmeldung ausgezeichnet
 werden"

Closes #4042

Merge request studip/studip!2896
---
 lib/classes/MessageBox.class.php  | 10 ++++++++++
 templates/_standard_loginform.php |  6 ++++--
 templates/shared/message_box.php  | 22 ++++++++++++----------
 3 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/lib/classes/MessageBox.class.php b/lib/classes/MessageBox.class.php
index 450851f41da..c0d94b297ed 100644
--- a/lib/classes/MessageBox.class.php
+++ b/lib/classes/MessageBox.class.php
@@ -41,6 +41,7 @@ class MessageBox implements LayoutMessage
     public $details;
     public $close_details;
     protected $hide_close = false;
+    public static $counter = 0;
 
     /**
      * This function returns an exception message box. Use it only for system errors
@@ -147,12 +148,21 @@ class MessageBox implements LayoutMessage
      */
     public function __toString()
     {
+        $label = [
+            'exception' => _('Systemfehler'),
+            'error'     => _('Fehler'),
+            'warning'   => _('Warnung'),
+            'info'      => _('Hinweis'),
+            'success'   => _('Erfolg'),
+        ];
         return $GLOBALS['template_factory']->render('shared/message_box', [
             'class'         => $this->class,
             'message'       => $this->message,
             'details'       => is_array($this->details) ? $this->details : [],
             'close_details' => $this->close_details,
             'hide_close'    => $this->hide_close,
+            'label'         => $label[$this->class],
+            'counter'       => self::$counter++,
         ]);
     }
 }
diff --git a/templates/_standard_loginform.php b/templates/_standard_loginform.php
index 51fc53b2352..57c9cec968b 100644
--- a/templates/_standard_loginform.php
+++ b/templates/_standard_loginform.php
@@ -43,9 +43,11 @@ $password_tooltip_text = (string)Config::get()->PASSWORD_TOOLTIP_TEXT;
                    name="password"
                    autocomplete="current-password"
                    size="20"
-                   required>
+                   required
+                   <?= $loginerror ? 'aria-describedby="messagebox-0"' : ''?>
+            >
 
-            <i id="password-toggle" tabindex="0" aria-role="button" class="enter-accessible">
+            <i id="password-toggle" tabindex="0" role="button" class="enter-accessible">
                 <?= Icon::create('visibility-checked')->asImg(20, [
                     'id   ' => 'visible-password',
                     'title' => _('Passwort anzeigen'),
diff --git a/templates/shared/message_box.php b/templates/shared/message_box.php
index 657563ba285..447763d7d97 100644
--- a/templates/shared/message_box.php
+++ b/templates/shared/message_box.php
@@ -1,4 +1,4 @@
-<div class="messagebox messagebox_<?= $class ?> <? if (count($details) > 0 && $close_details): ?>details_hidden<? endif; ?>">
+<div role="region" aria-label="<?= $label ?>" aria-describedby="messagebox-<?= $counter ?>" class="messagebox messagebox_<?= $class ?> <? if (count($details) > 0 && $close_details): ?>details_hidden<? endif; ?>">
     <div class="messagebox_buttons">
     <? if (count($details) > 0 && $close_details) : ?>
         <a class="details" href="#" title="<?=_('Detailanzeige umschalten')?>">
@@ -6,19 +6,21 @@
         </a>
     <? endif ?>
     <? if (!$hide_close): ?>
-        <a class="close" href="#" title="<?= _('Nachrichtenbox schließen') ?>">
+        <a class="close" role="button" href="#" title="<?= _('Nachrichtenbox schließen') ?>">
             <span><?= _('Nachrichtenbox schließen') ?></span>
         </a>
     <? endif; ?>
     </div>
+    <div role="status" id="messagebox-<?= $counter ?>">
     <?= $message ?>
-<? if (count($details) > 0) : ?>
-    <div class="messagebox_details">
-        <ul>
-        <? foreach ($details as $li) : ?>
-            <li><?= $li ?></li>
-        <? endforeach ?>
-        </ul>
+    <? if (count($details) > 0) : ?>
+        <div class="messagebox_details">
+            <ul>
+            <? foreach ($details as $li) : ?>
+                <li><?= $li ?></li>
+            <? endforeach ?>
+            </ul>
+        </div>
+    <? endif ?>
     </div>
-<? endif ?>
 </div>
-- 
GitLab