From 14efe428dac4ec824060d19c5e493a45f5ba4ed8 Mon Sep 17 00:00:00 2001
From: Moritz Strohm <strohm@data-quest.de>
Date: Fri, 22 Mar 2024 13:54:57 +0000
Subject: [PATCH] group calendar: prevent multiple display of dates that are
 assigned to multiple personal calendars, fixes #3850

Closes #3850

Merge request studip/studip!2723
---
 app/controllers/calendar/calendar.php | 29 +++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/app/controllers/calendar/calendar.php b/app/controllers/calendar/calendar.php
index 6ae77ebb085..678909477b3 100644
--- a/app/controllers/calendar/calendar.php
+++ b/app/controllers/calendar/calendar.php
@@ -613,19 +613,40 @@ class Calendar_CalendarController extends AuthenticatedController
 
         $result = [];
 
+        uasort($users, function(User $a, User $b) {
+            $fullname_a = $a->getFullName('no_title');
+            $fullname_b = $b->getFullName('no_title');
+            if ($fullname_a == $fullname_b) {
+                return 0;
+            }
+            return ($fullname_a > $fullname_b) ? 1 : -1;
+        });
+
         foreach ($users as $user) {
             $events = CalendarDateAssignment::getEvents($begin, $end, $user->id);
             if ($events) {
                 foreach ($events as $event) {
                     $data = $event->toEventData(User::findCurrent()->id);
-                    if (!$timeline_view) {
-                        $data->title = $user->getFullName();
+                    if ($timeline_view) {
+                        $result[] = $data->toFullcalendarEvent();
+                    } else {
+                        //Prevent duplicate entries:
+                        $data->title = $user->getFullName('no_title');
+                        if (array_key_exists($event->calendar_date_id, $result)) {
+                            $result[$event->calendar_date_id]['title'] .= ', ' . $data->title;
+                        } else {
+                            $result[$event->calendar_date_id] = $data->toFullcalendarEvent();
+                        }
                     }
-                    $result[] = $data->toFullcalendarEvent();
                 }
             }
         }
-        $this->render_json($result);
+        if ($timeline_view) {
+            $this->render_json($result);
+        } else {
+            //Clean up the array keys:
+            $this->render_json(array_values($result));
+        }
     }
 
     public function add_courses_action()
-- 
GitLab