From 874bd358f5ecc2e148a6ad36bcf155fe738c107a Mon Sep 17 00:00:00 2001
From: Ron Lucke <lucke@elan-ev.de>
Date: Wed, 10 Jan 2024 14:04:02 +0000
Subject: [PATCH] TIC #3260

Merge request studip/studip!2378
---
 app/controllers/courseware_controller.php     |  1 -
 .../vue/components/courseware/IndexApp.vue    |  5 --
 .../blocks/CoursewareBeforeAfterBlock.vue     |  8 +--
 .../blocks/CoursewareDefaultBlock.vue         |  2 +-
 .../CoursewareAccordionContainer.vue          |  7 +-
 .../containers/CoursewareDefaultContainer.vue |  4 +-
 .../containers/CoursewareListContainer.vue    |  7 +-
 .../containers/CoursewareTabsContainer.vue    |  7 +-
 .../CoursewareEmptyElementBox.vue             | 33 +++------
 .../CoursewareRibbonToolbar.vue               |  8 ---
 .../CoursewareStructuralElement.vue           | 16 ++---
 .../structural-element/CoursewareTree.vue     |  7 +-
 .../structural-element/CoursewareTreeItem.vue | 22 +++---
 .../CoursewareWelcomeScreen.vue               |  3 -
 .../courseware/toolbar/CoursewareToolbar.vue  | 25 ++++---
 .../widgets/CoursewareViewWidget.vue          | 71 -------------------
 .../vue/store/courseware/courseware.module.js | 15 +++-
 17 files changed, 62 insertions(+), 179 deletions(-)
 delete mode 100644 resources/vue/components/courseware/widgets/CoursewareViewWidget.vue

diff --git a/app/controllers/courseware_controller.php b/app/controllers/courseware_controller.php
index eaec6093df4..faf7393f399 100644
--- a/app/controllers/courseware_controller.php
+++ b/app/controllers/courseware_controller.php
@@ -81,6 +81,5 @@ abstract class CoursewareController extends AuthenticatedController
         $sidebar->addWidget(new VueWidget('courseware-action-widget'));
         SkipLinks::addIndex(_('Aktionen'), 'courseware-action-widget', 21);
         $sidebar->addWidget(new VueWidget('courseware-search-widget'));
-        $sidebar->addWidget(new VueWidget('courseware-view-widget'));
     }
 }
diff --git a/resources/vue/components/courseware/IndexApp.vue b/resources/vue/components/courseware/IndexApp.vue
index 2ac86c2278d..53238b43db7 100644
--- a/resources/vue/components/courseware/IndexApp.vue
+++ b/resources/vue/components/courseware/IndexApp.vue
@@ -15,9 +15,6 @@
             <MountingPortal mountTo="#courseware-search-widget" name="sidebar-search">
                 <courseware-search-widget v-if="selected !== null"></courseware-search-widget>
             </MountingPortal>
-            <MountingPortal mountTo="#courseware-view-widget" name="sidebar-views">
-                <courseware-view-widget v-if="!showSearchResults" :structural-element="selected" :canVisit="canVisit"></courseware-view-widget>
-            </MountingPortal>
         </div>
         <studip-progress-indicator
             v-if="structureLoadingState === 'loading'"
@@ -38,7 +35,6 @@ import CoursewareStructuralElement from './structural-element/CoursewareStructur
 import CoursewareSearchResults from './structural-element/CoursewareSearchResults.vue';
 import CoursewareCompanionBox from './layouts/CoursewareCompanionBox.vue';
 import CoursewareCompanionOverlay from './layouts/CoursewareCompanionOverlay.vue';
-import CoursewareViewWidget from './widgets/CoursewareViewWidget.vue';
 import CoursewareActionWidget from './widgets/CoursewareActionWidget.vue';
 import CoursewareSearchWidget from './widgets/CoursewareSearchWidget.vue';
 
@@ -50,7 +46,6 @@ export default {
     components: {
         CoursewareStructuralElement,
         CoursewareSearchResults,
-        CoursewareViewWidget,
         CoursewareActionWidget,
         CoursewareCompanionBox,
         StudipProgressIndicator,
diff --git a/resources/vue/components/courseware/blocks/CoursewareBeforeAfterBlock.vue b/resources/vue/components/courseware/blocks/CoursewareBeforeAfterBlock.vue
index 65df25c4bcb..20d820aa626 100644
--- a/resources/vue/components/courseware/blocks/CoursewareBeforeAfterBlock.vue
+++ b/resources/vue/components/courseware/blocks/CoursewareBeforeAfterBlock.vue
@@ -12,7 +12,7 @@
             <template #content>
                 <TwentyTwenty v-if="!isEmpty" :before="currentBeforeUrl" :after="currentAfterUrl" />
                 <courseware-companion-box
-                    v-if="isEmpty && editMode"
+                    v-if="isEmpty && canEdit"
                     :msgCompanion="$gettext('Bitte wählen Sie ein Vorher- und ein Nachher-Bild aus.')"
                     mood="pointing"
                 />
@@ -69,7 +69,7 @@ import BlockComponents from './block-components.js';
 import blockMixin from '@/vue/mixins/courseware/block.js';
 import TwentyTwenty from 'vue-twentytwenty';
 import 'vue-twentytwenty/dist/vue-twentytwenty.css';
-import { mapActions, mapGetters } from 'vuex';
+import { mapActions } from 'vuex';
 
 export default {
     name: 'courseware-before-after-block',
@@ -99,7 +99,6 @@ export default {
     computed: {
         ...mapGetters({
             fileRefById: 'file-refs/byId',
-            viewMode: 'viewMode',
         }),
         beforeSource() {
             return this.block?.attributes?.payload?.before_source;
@@ -140,9 +139,6 @@ export default {
         isEmpty() {
             return this.currentBeforeUrl === '' || this.currentAfterUrl === '';
         },
-        editMode() {
-            return this.viewMode === 'edit';
-        },
     },
     mounted() {
         if (this.block.id) {
diff --git a/resources/vue/components/courseware/blocks/CoursewareDefaultBlock.vue b/resources/vue/components/courseware/blocks/CoursewareDefaultBlock.vue
index 2fabdda16f5..6bac6ff6e66 100644
--- a/resources/vue/components/courseware/blocks/CoursewareDefaultBlock.vue
+++ b/resources/vue/components/courseware/blocks/CoursewareDefaultBlock.vue
@@ -155,7 +155,7 @@ export default {
             currentElementisLink: 'currentElementisLink',
         }),
         showEditMode() {
-            let show = (this.viewMode === 'edit' || this.blockedByThisUser) && !this.currentElementisLink;
+            let show = this.canEdit && !this.currentElementisLink;
             if (!show) {
                 this.displayFeature(false);
             }
diff --git a/resources/vue/components/courseware/containers/CoursewareAccordionContainer.vue b/resources/vue/components/courseware/containers/CoursewareAccordionContainer.vue
index c45f03af110..75db30cdb01 100644
--- a/resources/vue/components/courseware/containers/CoursewareAccordionContainer.vue
+++ b/resources/vue/components/courseware/containers/CoursewareAccordionContainer.vue
@@ -10,7 +10,7 @@
         @closeEdit="initCurrentData"
     >
         <template v-slot:containerContent>
-            <template v-if="showEditMode && canEdit && !currentElementisLink">
+            <template v-if="canEdit && !currentElementisLink">
                 <span aria-live="assertive" class="assistive-text">{{ assistiveLive }}</span>
                 <span id="operation" class="assistive-text">
                     {{ $gettext('Drücken Sie die Leertaste, um neu anzuordnen.') }}
@@ -23,7 +23,7 @@
                 :icon="section.icon"
                 :open="index === 0 || sortInSlots.includes(index)"
             >
-                <ul v-if="!showEditMode || currentElementisLink" class="cw-container-accordion-block-list">
+                <ul v-if="!canEdit || currentElementisLink" class="cw-container-accordion-block-list">
                     <li v-for="block in section.blocks" :key="block.id" class="cw-block-item">
                         <component
                             :is="component(block)"
@@ -181,9 +181,6 @@ export default {
             viewMode: 'viewMode',
             currentElementisLink: 'currentElementisLink'
         }),
-        showEditMode() {
-            return this.viewMode === 'edit';
-        },
         blocks() {
             if (!this.container || this.container.newContainer) {
                 return [];
diff --git a/resources/vue/components/courseware/containers/CoursewareDefaultContainer.vue b/resources/vue/components/courseware/containers/CoursewareDefaultContainer.vue
index ad60b1453fc..64b74e70b99 100644
--- a/resources/vue/components/courseware/containers/CoursewareDefaultContainer.vue
+++ b/resources/vue/components/courseware/containers/CoursewareDefaultContainer.vue
@@ -4,7 +4,7 @@
         :class="['cw-container-colspan-' + colSpan, showEditMode && canEdit ? 'cw-container-active' : '', containerClass]"
     >
         <div class="cw-container-content">
-            <header v-if="showEditMode && canEdit" class="cw-container-header" :class="{ 'cw-container-header-open': isOpen }">
+            <header v-if="showEditMode" class="cw-container-header" :class="{ 'cw-container-header-open': isOpen }">
                 <a href="#" class="cw-container-header-toggle" :aria-expanded="isOpen" @click.prevent="isOpen = !isOpen">
                     <studip-icon :shape="isOpen ? 'arr_1down' : 'arr_1right'" />
                     <span>{{ container.attributes.title }} ({{container.attributes.width}})</span>
@@ -182,7 +182,7 @@ export default {
             containerTypes: 'containerTypes',
         }),
         showEditMode() {
-            return this.viewMode === 'edit' && !this.currentElementisLink;
+            return this.canEdit && !this.currentElementisLink;
         },
         colSpan() {
             return this.container.attributes.payload.colspan ? this.container.attributes.payload.colspan : 'full';
diff --git a/resources/vue/components/courseware/containers/CoursewareListContainer.vue b/resources/vue/components/courseware/containers/CoursewareListContainer.vue
index 7f23210676a..7ffa413cb38 100644
--- a/resources/vue/components/courseware/containers/CoursewareListContainer.vue
+++ b/resources/vue/components/courseware/containers/CoursewareListContainer.vue
@@ -7,7 +7,7 @@
         @storeContainer="storeContainer"
     >
         <template v-slot:containerContent>
-            <ul v-if="!showEditMode || currentElementisLink"  class="cw-container-list-block-list">
+            <ul v-if="!canEdit || currentElementisLink"  class="cw-container-list-block-list">
                 <li v-for="block in blocks" :key="block.id" class="cw-block-item">
                     <component :is="component(block)" :block="block" :canEdit="canEdit" :isTeacher="isTeacher" />
                 </li>
@@ -24,7 +24,7 @@
                         :msgCompanion="$gettext('Dieser Abschnitt enthält keine Blöcke.')">
                     </courseware-companion-box>
                     <draggable
-                        v-if="showEditMode && canEdit"
+                        v-if="canEdit"
                         class="cw-container-list-block-list cw-container-list-sort-mode"
                         tag="ol"
                         role="listbox"
@@ -124,9 +124,6 @@ export default {
         blockedByAnotherUser() {
             return this.blocked && this.userId !== this.blockerId;
         },
-        showEditMode() {
-            return this.viewMode === 'edit';
-        },
         blocks() {
             if (!this.container || this.container.newContainer) {
                 return [];
diff --git a/resources/vue/components/courseware/containers/CoursewareTabsContainer.vue b/resources/vue/components/courseware/containers/CoursewareTabsContainer.vue
index 391cc820e91..fd7450c7797 100644
--- a/resources/vue/components/courseware/containers/CoursewareTabsContainer.vue
+++ b/resources/vue/components/courseware/containers/CoursewareTabsContainer.vue
@@ -18,7 +18,7 @@
                 @confirm="deleteCurrentSection"
                 @close="closeDeleteDialog"
             ></studipDialog>
-            <template v-if="showEditMode && canEdit && !currentElementisLink">
+            <template v-if="canEdit && !currentElementisLink">
                 <span aria-live="assertive" class="assistive-text">{{ assistiveLive }}</span>
                 <span id="operation" class="assistive-text">
                     {{ $gettext('Drücken Sie die Leertaste, um neu anzuordnen.') }}
@@ -33,7 +33,7 @@
                     :icon="section.icon"
                     :selected="sortInTab === index"
                 >
-                    <ul v-if="!showEditMode || currentElementisLink" class="cw-container-tabs-block-list">
+                    <ul v-if="!canEdit || currentElementisLink" class="cw-container-tabs-block-list">
                         <li v-for="block in section.blocks" :key="block.id" class="cw-block-item">
                             <component
                                 :is="component(block)"
@@ -185,9 +185,6 @@ export default {
             viewMode: 'viewMode',
             currentElementisLink: 'currentElementisLink'
         }),
-        showEditMode() {
-            return this.viewMode === 'edit';
-        },
         blocks() {
             if (!this.container || this.container.newContainer) {
                 return [];
diff --git a/resources/vue/components/courseware/structural-element/CoursewareEmptyElementBox.vue b/resources/vue/components/courseware/structural-element/CoursewareEmptyElementBox.vue
index 062fa572bcd..abbe87f7054 100644
--- a/resources/vue/components/courseware/structural-element/CoursewareEmptyElementBox.vue
+++ b/resources/vue/components/courseware/structural-element/CoursewareEmptyElementBox.vue
@@ -2,8 +2,9 @@
     <div class="cw-welcome-screen">
         <courseware-companion-box :msgCompanion="this.$gettext('Es wurden bisher noch keine Inhalte eingepflegt.')">
             <template v-slot:companionActions>
-                <button v-if="canEdit && noContainers" class="button" @click="addContainer"><translate>Einen Abschnitt hinzufügen</translate></button>
-                <button v-if="canEdit && !noContainers && !editMode" class="button" @click="switchToEditView"><translate>Seite bearbeiten</translate></button>
+                <button v-if="canEdit && noContainers" class="button" @click="addContainer">
+                    {{ $gettext('Einen Abschnitt hinzufügen') }}
+                </button>
             </template>
         </courseware-companion-box>
     </div>
@@ -20,39 +21,21 @@ export default {
     },
     props: {
         canEdit: Boolean,
-        noContainers: Boolean
-    },
-    data() {
-        return{}
-    },
-    computed: {
-        ...mapGetters({
-            viewMode: 'viewMode'
-        }),
-        editMode() {
-            return this.viewMode === 'edit';
-        }
+        noContainers: Boolean,
     },
     methods: {
         ...mapActions({
-            coursewareViewMode: 'coursewareViewMode',
             coursewareConsumeMode: 'coursewareConsumeMode',
             coursewareContainerAdder: 'coursewareContainerAdder',
             coursewareSelectedToolbarItem: 'coursewareSelectedToolbarItem',
-            coursewareShowToolbar: 'coursewareShowToolbar'
+            coursewareShowToolbar: 'coursewareShowToolbar',
         }),
         addContainer() {
-            this.coursewareViewMode('edit');
             this.coursewareConsumeMode(false);
             this.coursewareContainerAdder(true);
             this.coursewareSelectedToolbarItem('blockadder');
             this.coursewareShowToolbar(true);
         },
-        switchToEditView() {
-            this.coursewareViewMode('edit');
-            this.coursewareConsumeMode(false);
-        }
-    }
-
-}
-</script>
\ No newline at end of file
+    },
+};
+</script>
diff --git a/resources/vue/components/courseware/structural-element/CoursewareRibbonToolbar.vue b/resources/vue/components/courseware/structural-element/CoursewareRibbonToolbar.vue
index 992c3a1f8b3..2e44204b2c8 100644
--- a/resources/vue/components/courseware/structural-element/CoursewareRibbonToolbar.vue
+++ b/resources/vue/components/courseware/structural-element/CoursewareRibbonToolbar.vue
@@ -85,9 +85,6 @@ export default {
             selectedToolbarItem: 'selectedToolbarItem',
             currentElementisLink: 'currentElementisLink',
         }),
-        showEditMode() {
-            return this.viewMode === 'edit';
-        },
         isTeacher() {
             return this.userIsTeacher;
         },
@@ -129,11 +126,6 @@ export default {
                 this.selectTool('blockadder');
             }
         },
-        showEditMode(newValue) {
-            if (!newValue) {
-                this.selectTool('contents');
-            }
-        },
         toolsActive(newValue) {
             const focusElement = this.$refs.tabs.getTabButtonByAlias(this.selectedToolbarItem);
             if (newValue && focusElement) {
diff --git a/resources/vue/components/courseware/structural-element/CoursewareStructuralElement.vue b/resources/vue/components/courseware/structural-element/CoursewareStructuralElement.vue
index 4f70f4894fe..143a03ae258 100644
--- a/resources/vue/components/courseware/structural-element/CoursewareStructuralElement.vue
+++ b/resources/vue/components/courseware/structural-element/CoursewareStructuralElement.vue
@@ -128,7 +128,7 @@
                             <courseware-root-content v-if="showRootLayout" :structuralElement="currentElement" :canEdit="canEdit" />
 
                             <div
-                                v-if="canVisit && !editView && !isLink && !hideRootContent"
+                                v-if="canVisit && (!canEdit || !toolbarActive ) && !isLink && !hideRootContent"
                                 class="cw-container-wrapper"
                                 :class="{
                                     'cw-container-wrapper-consume': consumeMode,
@@ -139,7 +139,7 @@
                                     :key="container.id"
                                     :is="containerComponent(container)"
                                     :container="container"
-                                    :canEdit="canEdit"
+                                    :canEdit="canEdit && toolbarActive"
                                     :canAddElements="canAddElements"
                                     :isTeacher="userIsTeacher"
                                     class="cw-container-item"
@@ -153,7 +153,7 @@
                                     'cw-container-wrapper-consume': consumeMode,
                                 }"
                             >
-                                <div v-if="editView" class="cw-companion-box-wrapper">
+                                <div v-if="canEdit" class="cw-companion-box-wrapper">
                                     <courseware-companion-box
                                         :msgCompanion="$gettextInterpolate($gettext('Dieser Inhalt ist aus den persönlichen Lernmaterialien von %{ ownerName } verlinkt und kann nur dort bearbeitet werden.'), { ownerName: ownerName })"
                                         mood="pointing"
@@ -170,7 +170,7 @@
                                     class="cw-container-item"
                                 />
                             </div>
-                            <div v-if="canVisit && canEdit && editView && !isLink && !hideRootContent" class="cw-container-wrapper cw-container-wrapper-edit">
+                            <div v-if="canVisit && canEdit && toolbarActive && !isLink && !hideRootContent" class="cw-container-wrapper cw-container-wrapper-edit">
                                 <template v-if="!processing">
                                     <span aria-live="assertive" class="assistive-text">{{ assistiveLive }}</span>
                                     <span id="operation" class="assistive-text">
@@ -216,7 +216,7 @@
                                 <studip-progress-indicator v-if="processing" :description="$gettext('Vorgang wird bearbeitet...')" />
                             </div>
                         </div>
-                        <courseware-toolbar v-if="canVisit && canEdit && editView && !isLink" /> 
+                        <courseware-toolbar v-if="canVisit && canEdit && !isLink" /> 
                     </div>
                     <courseware-call-to-action-box
                         v-if="commentable"
@@ -784,7 +784,8 @@ export default {
             showRootElement: 'showRootElement',
             childrenById: 'courseware-structure/children',
 
-            rootLayout: 'rootLayout'
+            rootLayout: 'rootLayout',
+            toolbarActive: 'toolbarActive'
         }),
 
         currentId() {
@@ -1135,9 +1136,6 @@ export default {
         blockingUserName() {
             return this.blockingUser ? this.blockingUser.attributes['formatted-name'] : '';
         },
-        editView() {
-            return this.viewMode === 'edit';
-        },
         pdfExportURL() {
             if (this.context.type === 'users') {
                 return STUDIP.URLHelper.getURL(
diff --git a/resources/vue/components/courseware/structural-element/CoursewareTree.vue b/resources/vue/components/courseware/structural-element/CoursewareTree.vue
index 68947e3998e..08019dd26d7 100644
--- a/resources/vue/components/courseware/structural-element/CoursewareTree.vue
+++ b/resources/vue/components/courseware/structural-element/CoursewareTree.vue
@@ -1,6 +1,6 @@
 <template>
     <div class="cw-tree" ref="tree">
-        <template v-if="editMode">
+        <template>
                 <span aria-live="assertive" class="assistive-text">{{ assistiveLive }}</span>
                 <span id="operation" class="assistive-text">
                     {{$gettext('Drücken Sie die Leertaste, um neu anzuordnen.')}}
@@ -18,7 +18,7 @@
                 @moveItemNextLevel="moveItemNextLevel"
                 @childrenUpdated="updateNestedChildren"
             ></courseware-tree-item>
-            <courseware-tree-item-adder v-if="editMode && canEditRoot" :parentId="rootElement.id"/>
+            <courseware-tree-item-adder v-if="canEditRoot" :parentId="rootElement.id"/>
         </ol>
         <studip-progress-indicator
             v-else 
@@ -84,9 +84,6 @@ export default {
         canEditRoot() {
             return this.rootElement.attributes['can-edit'];
         },
-        editMode() {
-            return this.viewMode === 'edit';
-        },
     },
     methods: {
          ...mapActions({
diff --git a/resources/vue/components/courseware/structural-element/CoursewareTreeItem.vue b/resources/vue/components/courseware/structural-element/CoursewareTreeItem.vue
index 418d443e88a..540e76b3529 100644
--- a/resources/vue/components/courseware/structural-element/CoursewareTreeItem.vue
+++ b/resources/vue/components/courseware/structural-element/CoursewareTreeItem.vue
@@ -1,11 +1,8 @@
 <template>
-    <li v-if="showItem"
-        :draggable="editMode ? true : null"
-        :aria-selected="editMode ? keyboardSelected : null"
-    >
+    <li v-if="showItem" :draggable="canEdit ? true : null" :aria-selected="canEdit ? keyboardSelected : null">
         <div class="cw-tree-item-wrapper" v-if="showRootElement || depth > 0">
             <span
-                v-if="editMode && depth > 0 && canEdit"
+                v-if="canEdit && depth > 0 && canEdit"
                 class="cw-sortable-handle"
                 :tabindex="0"
                 aria-describedby="operation"
@@ -15,7 +12,7 @@
             >
             </span>
             <courseware-tree-item-updater
-                v-if="editMode && editingItem"
+                v-if="canEdit && editingItem"
                 :structuralElement="element"
                 @close="editingItem = false"
                 @childrenUpdated="$emit('childrenUpdated')"
@@ -26,12 +23,12 @@
                 class="cw-tree-item-link"
                 :class="{
                     'cw-tree-item-link-current': isCurrent,
-                    'cw-tree-item-link-edit': editMode,
+                    'cw-tree-item-link-edit': canEdit,
                     'cw-tree-item-link-selected': keyboardSelected,
                 }"
             >
                 {{ element.attributes?.title || '–' }}
-                <button v-if="editMode && canEdit" class="cw-tree-item-edit-button" @click.prevent="editingItem = true">
+                <button v-if="canEdit" class="cw-tree-item-edit-button" @click.prevent="editingItem = true">
                     <studip-icon shape="edit" />
                 </button>
 
@@ -69,7 +66,7 @@
             </router-link>
         </div>
         <ol
-            v-if="hasChildren && !editMode"
+            v-if="hasChildren && !canEdit"
             :class="{
                 'cw-tree-chapter-list': isRoot,
                 'cw-tree-subchapter-list': isFirstLevel,
@@ -85,7 +82,7 @@
             />
         </ol>
         <draggable
-            v-if="editMode"
+            v-if="canEdit"
             :class="{ 'cw-tree-chapter-list-empty': nestedChildren.length === 0 }"
             tag="ol"
             :component-data="draggableData"
@@ -117,7 +114,7 @@
             />
         </draggable>
         <ol
-            v-if="editMode && canEdit && isFirstLevel"
+            v-if="canEdit && isFirstLevel"
             class="cw-tree-adder-list"
         >
             <courseware-tree-item-adder :parentId="element.id" />
@@ -307,9 +304,6 @@ export default {
 
             return true;
         },
-        editMode() {
-            return this.viewMode === 'edit';
-        },
         dragOptions() {
             return {
                 animation: 0,
diff --git a/resources/vue/components/courseware/structural-element/CoursewareWelcomeScreen.vue b/resources/vue/components/courseware/structural-element/CoursewareWelcomeScreen.vue
index 50813689fa3..e968f7c4f53 100644
--- a/resources/vue/components/courseware/structural-element/CoursewareWelcomeScreen.vue
+++ b/resources/vue/components/courseware/structural-element/CoursewareWelcomeScreen.vue
@@ -41,7 +41,6 @@ export default {
             unlockObject: 'unlockObject',
 
             coursewareConsumeMode: 'coursewareConsumeMode',
-            coursewareViewMode: 'coursewareViewMode',
             coursewareContainerAdder: 'coursewareContainerAdder',
             coursewareShowToolbar: 'coursewareShowToolbar'
 
@@ -49,7 +48,6 @@ export default {
         addContainer() {
             this.coursewareConsumeMode(false);
             this.coursewareShowToolbar(true);
-            this.coursewareViewMode('edit');
             this.$nextTick(() => {
                 this.coursewareContainerAdder(true);
             });
@@ -69,7 +67,6 @@ export default {
                 section: 0,
                 blockType: 'text',
             });
-            this.coursewareViewMode('edit');
             this.coursewareConsumeMode(false);
             this.companionSuccess({
                 info: this.$gettext('Das Elemente für Ihren ersten Inhalt wurde angelegt.'),
diff --git a/resources/vue/components/courseware/toolbar/CoursewareToolbar.vue b/resources/vue/components/courseware/toolbar/CoursewareToolbar.vue
index 300a4e24748..0a56b5c902a 100644
--- a/resources/vue/components/courseware/toolbar/CoursewareToolbar.vue
+++ b/resources/vue/components/courseware/toolbar/CoursewareToolbar.vue
@@ -30,7 +30,7 @@
                     <button
                         class="cw-toolbar-button cw-toolbar-button-toggle cw-toolbar-button-toggle-out"
                         :title="$gettext('Werkzeugleiste einklappen')"
-                        @click="toggleToolbar"
+                        @click="toggleToolbarActive"
                     ></button>
                 </div>
                 <courseware-toolbar-blocks v-if="activeTool === 'blockAdder'" />
@@ -41,7 +41,7 @@
                 v-else
                 class="cw-toolbar-button cw-toolbar-button-toggle cw-toolbar-button-toggle-in"
                 :title="$gettext('Werkzeugleiste ausklappen')"
-                @click="toggleToolbar"
+                @click="toggleToolbarActive"
             ></button>
             <div class="cw-toolbar-spacer-right"></div>
         </div>
@@ -65,7 +65,6 @@ export default {
     },
     data() {
         return {
-            toolsActive: true,
             unfold: true,
             showTools: true,
             toolbarTop: 0,
@@ -79,13 +78,13 @@ export default {
         ...mapGetters({
             relatedContainers: 'courseware-containers/related',
             structuralElementById: 'courseware-structural-elements/byId',
+            toolbarActive: 'toolbarActive',
         }),
         toolbarStyle() {
-            const footerHeight = document.getElementById('main-footer').getBoundingClientRect().height;
             const scrollTopStyles = window.getComputedStyle(document.getElementById('scroll-to-top'));
-            const scrollTopHeight = parseInt(scrollTopStyles['height']) + parseInt(scrollTopStyles['padding-top']) + parseInt(scrollTopStyles['padding-bottom']);
+            const scrollTopHeight = parseInt(scrollTopStyles['height'], 10) + parseInt(scrollTopStyles['padding-top'], 10) + parseInt(scrollTopStyles['padding-bottom'], 10) + parseInt(scrollTopStyles['margin-bottom'], 10);
             let height = parseInt(
-                Math.min(this.windowInnerHeight * 0.9, this.windowInnerHeight - this.toolbarTop - scrollTopHeight - footerHeight)
+                Math.min(this.windowInnerHeight * 0.9, this.windowInnerHeight - this.toolbarTop - scrollTopHeight)
             );
 
             return {
@@ -119,17 +118,17 @@ export default {
         },
     },
     methods: {
-        toggleToolbar() {
-            this.toolsActive = !this.toolsActive;
-        },
+        ...mapActions({
+            toggleToolbarActive: 'toggleToolbarActive',
+        }),
         activateTool(tool) {
             this.activeTool = tool;
         },
         updateToolbarTop() {
             const responsiveContentbar = document.getElementById('responsive-contentbar');
             if (responsiveContentbar) {
-                const contentbarRect = this.responsiveContentbar.getBoundingClientRect();
-                this.toolbarTop = contentbarRect.bottom + 35;
+                const contentbarRect = responsiveContentbar.getBoundingClientRect();
+                this.toolbarTop = contentbarRect.bottom + 25;
                 return;
             }
 
@@ -168,7 +167,7 @@ export default {
                 this.resetAdderStorage();
             }
         },
-        toolsActive(newState, oldState) {
+        toolbarActive(newState, oldState) {
             let view = this;
             if (newState) {
                 this.showTools = true;
@@ -178,7 +177,7 @@ export default {
             } else {
                 this.unfold = false;
                 setTimeout(() => {
-                    if (!view.toolsActive) {
+                    if (!view.toolbarActive) {
                         view.showTools = false;
                     }
                 }, 600);
diff --git a/resources/vue/components/courseware/widgets/CoursewareViewWidget.vue b/resources/vue/components/courseware/widgets/CoursewareViewWidget.vue
deleted file mode 100644
index 6f9d787f6bc..00000000000
--- a/resources/vue/components/courseware/widgets/CoursewareViewWidget.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-<template>
-    <sidebar-widget :title="$gettext('Ansichten')" v-if="structuralElement">
-        <template #content>
-            <ul class="widget-list widget-links sidebar-views cw-view-widget">
-                <li :class="{ active: readView }">
-                    <button @click="setReadView">
-                        <translate>Lesen</translate>
-                    </button>
-                </li>
-                <li
-                    v-if="canEdit"
-                    :class="{ active: editView }"
-                >
-                    <button @click="setEditView">
-                        <translate>Bearbeiten</translate>
-                    </button>
-                </li>
-            </ul>
-        </template>
-    </sidebar-widget>
-</template>
-
-<script>
-import SidebarWidget from '../../SidebarWidget.vue';
-import { mapActions, mapGetters } from 'vuex';
-
-export default {
-    name: 'courseware-view-widget',
-    props: ['structuralElement', 'canVisit'],
-    components: {
-        SidebarWidget
-    },
-    computed: {
-        ...mapGetters({
-            viewMode: 'viewMode',
-            context: 'context',
-            rootLayout: 'rootLayout'
-        }),
-        readView() {
-            return this.viewMode === 'read';
-        },
-        editView() {
-            return this.viewMode === 'edit';
-        },
-        canEdit() {
-            if (!this.structuralElement) {
-                return false;
-            }
-            return this.structuralElement.attributes['can-edit'];
-        },
-        isRoot() {
-            return this.structuralElement.relationships.parent.data === null;
-        }
-    },
-    methods: {
-        ...mapActions({
-            coursewareViewMode: 'coursewareViewMode',
-            coursewareBlockAdder: 'coursewareBlockAdder',
-            setToolbarItem: 'coursewareSelectedToolbarItem',
-        }),
-        setReadView() {
-            this.coursewareViewMode('read');
-            this.setToolbarItem('contents');
-            this.coursewareBlockAdder({});
-        },
-        setEditView() {
-            this.coursewareViewMode('edit');
-        },
-    },
-};
-</script>
diff --git a/resources/vue/store/courseware/courseware.module.js b/resources/vue/store/courseware/courseware.module.js
index db13cf16de8..2f4dc606418 100644
--- a/resources/vue/store/courseware/courseware.module.js
+++ b/resources/vue/store/courseware/courseware.module.js
@@ -62,7 +62,9 @@ const getDefaultState = () => {
         searchResults: [],
 
         assistiveLiveContents: '',
-        progresses: null
+        progresses: null,
+
+        toolbarActive: true,
     };
 };
 
@@ -275,6 +277,10 @@ const getters = {
     },
     oerEnableSuggestions(state, getters, rootState, rootGetters) {
         return getters.oerCampusEnabled && rootGetters['studip-properties/byId']({ id: 'oer-enable-suggestions'}).attributes?.value;
+    },
+
+    toolbarActive(state) {
+        return state.toolbarActive;
     }
 };
 
@@ -1492,6 +1498,10 @@ export const actions = {
     async deleteUserClipboards({ dispatch, rootGetters }, { uid, type }) {
         await state.httpClient.delete(`users/${uid}/courseware-clipboards/${type}`);
         dispatch('loadUserClipboards', uid);
+    },
+
+    toggleToolbarActive({ commit, rootGetters }) {
+        commit('setToolbarActive', !rootGetters['toolbarActive']);
     }
 };
 
@@ -1687,6 +1697,9 @@ export const mutations = {
     },
     setProgresses(state, data) {
         state.progresses = data;
+    },
+    setToolbarActive(state, active) {
+        state.toolbarActive = active;
     }
 };
 
-- 
GitLab