From 7403c2be52ab969899bc9171fdba7c49c6deff89 Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms Date: Mon, 10 Mar 2025 11:03:26 +0000 Subject: fix position on statusgroups upon creation and ordering, fixes #5356 Closes #5356 Merge request studip/studip!4026 --- app/controllers/course/statusgroups.php | 30 ++++++++---------------------- lib/models/Course.php | 1 + lib/models/Statusgruppen.php | 8 +++----- 3 files changed, 12 insertions(+), 27 deletions(-) diff --git a/app/controllers/course/statusgroups.php b/app/controllers/course/statusgroups.php index 293f542..8d5b5be 100644 --- a/app/controllers/course/statusgroups.php +++ b/app/controllers/course/statusgroups.php @@ -570,7 +570,7 @@ class Course_StatusgroupsController extends AuthenticatedController $end_time = 0; } } - $position = 1; + $position = null; if (Statusgruppen::exists($group_id)) { $position = Statusgruppen::find($group_id)->position; } @@ -1493,30 +1493,16 @@ class Course_StatusgroupsController extends AuthenticatedController throw new Exception('Invalid group or group does not belong to course'); } - if ($group->position == $index) { - return; - } + $groups = $group->course->statusgruppen + ->filter(fn(Statusgruppen $grp) => $grp->id !== $group->id) + ->getArrayCopy(); + array_splice($groups, $index, 0, [$group]); - if ($group->position < $index) { - $range = [$group->position, $index]; - $adjustment = -1; - } else { - $range = [$index, $group->position]; - $adjustment = 1; + foreach ($groups as $i => $g) { + $g->position = $i; + $g->store(); } - Statusgruppen::findEachBySQL( - function ($g) use ($adjustment) { - $g->position = $g->position + $adjustment; - $g->store(); - }, - 'range_id = ? AND statusgruppe_id != ? AND position BETWEEN ? AND ?', - [$this->course_id, $id, $range[0], $range[1]] - ); - - $group->position = $index; - $group->store(); - $this->render_nothing(); } diff --git a/lib/models/Course.php b/lib/models/Course.php index df8be3b..5e6d7f4 100644 --- a/lib/models/Course.php +++ b/lib/models/Course.php @@ -130,6 +130,7 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe ]; $config['has_many']['statusgruppen'] = [ 'class_name' => Statusgruppen::class, + 'order_by' => 'ORDER BY position', 'on_delete' => 'delete', 'on_store' => 'store', ]; diff --git a/lib/models/Statusgruppen.php b/lib/models/Statusgruppen.php index 78153dc..015a306 100644 --- a/lib/models/Statusgruppen.php +++ b/lib/models/Statusgruppen.php @@ -720,11 +720,9 @@ class Statusgruppen extends SimpleORMap implements PrivacyObject public function cbAddPosition() { if ($this->position === null) { - $sql = "SELECT MAX(position) FROM statusgruppen WHERE range_id = ?"; - $stmt = DBManager::get()->prepare($sql); - $stmt->execute([$this->range_id]); - $max_position = $stmt->fetchColumn(); - $this->position = $max_position === null ? 0 : $max_position + 1; + $sql = "SELECT MAX(`position`) FROM `statusgruppen` WHERE `range_id` = ?"; + $max_position = DBManager::get()->fetchColumn($sql, [$this->range_id]); + $this->position = $max_position === null ? 0 : (int) $max_position + 1; } } -- cgit v1.0