From f580ad7d91ff04a72189cc0a01afdea8ce95cde7 Mon Sep 17 00:00:00 2001
From: Ron Lucke <lucke@elan-ev.de>
Date: Fri, 23 Aug 2024 11:43:12 +0000
Subject: [PATCH] Aktion "Inhalt kopieren" bei einer abgegebenen Aufgabe
 funktioniert nicht

Closes #2805

Merge request studip/studip!3312
---
 .../Courseware/StructuralElementsCopy.php     |  3 +-
 .../tasks/CoursewareDashboardTasks.vue        | 63 ++++++++++++-------
 2 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCopy.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCopy.php
index 234d8f0c37b..291f519fd39 100644
--- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCopy.php
+++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCopy.php
@@ -29,7 +29,8 @@ class StructuralElementsCopy extends NonJsonApiController
         $sourceElement = StructuralElement::find($args['id']);
         $newParent = StructuralElement::find($data['parent_id']);
         $user = $this->getUser($request);
-        if (!Authority::canCreateStructuralElement($user, $newParent) || !Authority::canUpdateStructuralElement($user, $sourceElement)) {
+        $sourceAuthorityFunction = $sourceElement->isTask() ? 'canShowStructuralElement' : 'canUpdateStructuralElement';
+        if (!Authority::canCreateStructuralElement($user, $newParent) || !Authority::$sourceAuthorityFunction($user, $sourceElement)) {
             throw new AuthorizationFailedException();
         }
 
diff --git a/resources/vue/components/courseware/tasks/CoursewareDashboardTasks.vue b/resources/vue/components/courseware/tasks/CoursewareDashboardTasks.vue
index 8dac7c3a1c8..35384fce41f 100644
--- a/resources/vue/components/courseware/tasks/CoursewareDashboardTasks.vue
+++ b/resources/vue/components/courseware/tasks/CoursewareDashboardTasks.vue
@@ -69,7 +69,7 @@
                             :items="getTaskMenuItems(task, status, element)"
                             @submitTask="displaySubmitDialog(task)"
                             @renewalRequest="renewalRequest(task)"
-                            @copyContent="copyContent(element)"
+                            @copyContent="copyContent(taskGroup, element)"
                         />
                     </td>
                 </tr>
@@ -147,6 +147,7 @@ export default {
             getElementById: 'courseware-structural-elements/byId',
             getFeedbackById: 'courseware-task-feedback/byId',
             getTaskGroupById: 'courseware-task-groups/byId',
+            lastCreateCoursewareUnit: 'courseware-units/lastCreated',
         }),
         tasks() {
             return this.allTasks.map((task) => {
@@ -173,6 +174,7 @@ export default {
             copyStructuralElement: 'copyStructuralElement',
             companionSuccess: 'companionSuccess',
             companionError: 'companionError',
+            createCoursewareUnit: 'courseware-units/create',
         }),
         getTaskMenuItems(task, status, element) {
             let menuItems = [];
@@ -195,7 +197,7 @@ export default {
                 });
             }
             if (task.attributes.submitted) {
-                menuItems.push({ id: 4, label: this.$gettext('Inhalt kopieren'), icon: 'export', emit: 'copyContent' });
+                menuItems.push({ id: 4, label: this.$gettext('Inhalt auf Arbeitsplatz kopieren'), icon: 'export', emit: 'copyContent' });
             }
 
             return menuItems;
@@ -233,28 +235,43 @@ export default {
             });
             this.currentTask = null;
         },
-        async copyContent(element) {
-            let ownCoursewareInstance = await this.loadRemoteCoursewareStructure({
-                rangeId: this.userId,
-                rangeType: 'users',
+        async copyContent(taskGroup, element) {
+            const unit = {
+                attributes: {
+                    title: taskGroup.attributes.title,
+                    purpose: 'content',
+                    payload: {
+                        description: '',
+                        color: 'studip-blue',
+                        license_type: '',
+                        required_time: '',
+                        difficulty_start: '',
+                        difficulty_end: ''
+                    },
+                    settings: {
+                        'root-layout': 'classic'
+                    }
+                },
+                relationships: {
+                    range: {
+                        data: {
+                            type: 'users',
+                            id: this.userId
+                        }
+                    }
+                }
+            };
+            await this.createCoursewareUnit(unit, { root: true });
+            const newElementId = this.lastCreateCoursewareUnit.relationships['structural-element'].data.id
+            await this.copyStructuralElement({
+                parentId: newElementId,
+                elementId: element.id,
+                removeType: false,
+                migrate: true,
+            });
+            this.companionSuccess({
+                info: this.$gettext('Die Inhalte wurden zu Ihren persönlichen Lernmaterialien hinzugefügt.'),
             });
-            if (ownCoursewareInstance !== null) {
-                await this.copyStructuralElement({
-                    parentId: ownCoursewareInstance.relationships.root.data.id,
-                    elementId: element.id,
-                    removeType: true,
-                    migrate: false,
-                });
-                this.companionSuccess({
-                    info: this.$gettext('Die Inhalte wurden zu Ihren persönlichen Lernmaterialien hinzugefügt.'),
-                });
-            } else {
-                this.companionError({
-                    info: this.$gettext(
-                        'Die Inhalte konnten nicht zu Ihren persönlichen Lernmaterialien hinzugefügt werden.'
-                    ),
-                });
-            }
         },
         displayFeedback(feedback) {
             this.showFeedbackDialog = true;
-- 
GitLab