From 40e5c18af7b26482cb724a2d074a8fd46c33fc2d Mon Sep 17 00:00:00 2001
From: Ron Lucke <lucke@elan-ev.de>
Date: Fri, 15 Sep 2023 12:30:51 +0000
Subject: [PATCH] fix #3143

Closes #3143

Merge request studip/studip!2143
---
 app/controllers/contents/courseware.php   |  2 +-
 app/controllers/course/courseware.php     |  1 +
 app/controllers/courseware_controller.php | 12 +++++++++++-
 resources/vue/courseware-shelf-app.js     | 11 +++++++++++
 4 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/app/controllers/contents/courseware.php b/app/controllers/contents/courseware.php
index 0183655cdef..1551fbd72ed 100644
--- a/app/controllers/contents/courseware.php
+++ b/app/controllers/contents/courseware.php
@@ -76,7 +76,7 @@ class Contents_CoursewareController extends CoursewareController
         /** @var array<mixed> $last */
         $last = UserConfig::get($this->user_id)->getValue('COURSEWARE_LAST_ELEMENT');
 
-        if ($unit_id === null) {
+        if (empty($unit_id)) {
             $this->redirectToFirstUnit('user', $this->user_id, $last);
 
             return;
diff --git a/app/controllers/course/courseware.php b/app/controllers/course/courseware.php
index 46419a88e85..967d993b763 100644
--- a/app/controllers/course/courseware.php
+++ b/app/controllers/course/courseware.php
@@ -44,6 +44,7 @@ class Course_CoursewareController extends CoursewareController
     public function courseware_action($unit_id = null):  void
     {
         global $user;
+        
         Navigation::activateItem('course/courseware/unit');
         if ($this->unitsNotFound) {
             PageLayout::postMessage(MessageBox::info(_('Es wurde kein Lernmaterial gefunden.')));
diff --git a/app/controllers/courseware_controller.php b/app/controllers/courseware_controller.php
index fb2b39c4e14..138a9862726 100644
--- a/app/controllers/courseware_controller.php
+++ b/app/controllers/courseware_controller.php
@@ -5,12 +5,22 @@ use Courseware\Unit;
 
 abstract class CoursewareController extends AuthenticatedController
 {
+    public function before_filter(&$action, &$args): void
+    {
+        parent::before_filter($action, $args);
+
+        if ($action === 'index' && Request::int('element_id')) {
+            $element = StructuralElement::find(Request::int('element_id'));
+            $this->redirect($this->action_url('courseware#/structural_element/' . $element->id, $element->findUnit()->id));
+        }
+    }
+
     public function redirectToFirstUnit(string $context, string $rangeId, array $last): void
     {
         $path = $context === 'user' ? 'contents' : $context;
         $last_element = $this->getLastElement($last, $context, $rangeId);
         if ($last_element) {
-            $unit = $last_element->findUnit($last);
+            $unit = $last_element->findUnit();
         } else {
             $unit = Unit::findOneBySql('range_id = ? ORDER BY mkdate ASC', [$rangeId]);
         }
diff --git a/resources/vue/courseware-shelf-app.js b/resources/vue/courseware-shelf-app.js
index d0d86255f03..68a8ac97deb 100644
--- a/resources/vue/courseware-shelf-app.js
+++ b/resources/vue/courseware-shelf-app.js
@@ -7,6 +7,17 @@ import { mapResourceModules } from '@elan-ev/reststate-vuex';
 import { StockImagesPlugin } from './plugins/stock-images.js';
 
 const mountApp = async (STUDIP, createApp, element) => {
+    // handle studip 5.0 to 5.2 urls
+    const elemId = window.location.hash.match(/structural_element\/(\d+)/);
+
+    if (elemId) {
+        let url = new URL(window.location.href);
+        url.searchParams.set('element_id', elemId[1]);
+        window.location.href = url;
+
+        return false;
+    }
+
     const getHttpClient = () =>
         axios.create({
             baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true),
-- 
GitLab