diff --git a/resources/vue/components/courseware/CoursewareAccordionContainer.vue b/resources/vue/components/courseware/CoursewareAccordionContainer.vue index b297c8bf0e1bdda006601775bf8ada217e04170b..0cb3b43002118e14c9ed76e3c80d6051c23fe4b8 100644 --- a/resources/vue/components/courseware/CoursewareAccordionContainer.vue +++ b/resources/vue/components/courseware/CoursewareAccordionContainer.vue @@ -9,7 +9,7 @@ @closeEdit="initCurrentData" > <template v-slot:containerContent> - <template v-if="showEditMode && canEdit"> + <template v-if="showEditMode && 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.')}} @@ -22,7 +22,7 @@ :icon="section.icon" :open="index === 0 || sortInSlots.includes(index)" > - <ul v-if="!showEditMode" class="cw-container-accordion-block-list"> + <ul v-if="!showEditMode || 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)" @@ -32,47 +32,51 @@ /> </li> </ul> - <draggable - v-if="showEditMode && canEdit && !processing" - class="cw-container-list-block-list cw-container-list-sort-mode" - :class="[section.blocks.length === 0 ? 'cw-container-list-sort-mode-empty' : '']" - tag="ol" - role="listbox" - v-model="section.blocks" - v-bind="dragOptions" - handle=".cw-sortable-handle" - group="blocks" - @start="isDragging = true" - @end="dropBlock" - :containerId="container.id" - :sectionId="index" - > - <li v-for="block in section.blocks" :key="block.id" class="cw-block-item cw-block-item-sortable"> - <span - :class="{ 'cw-sortable-handle-dragging': isDragging }" - class="cw-sortable-handle" - tabindex="0" - role="option" - aria-describedby="operation" - :ref="'sortableHandle' + block.id" - @keydown="keyHandler($event, block.id, index)" - ></span> - <component - :is="component(block)" - :block="block" - :canEdit="canEdit" - :isTeacher="isTeacher" - :class="{ 'cw-block-item-selected': keyboardSelected === block.id}" - :blockId="block.id" - /> - </li> - </draggable> - <template v-if="showEditMode && canAddElements && !processing"> - <courseware-block-adder-area :container="container" :section="index" @updateContainerContent="updateContent"/> + <template v-else> + <template v-if="!processing"> + <draggable + v-if="canEdit" + class="cw-container-list-block-list cw-container-list-sort-mode" + :class="[section.blocks.length === 0 ? 'cw-container-list-sort-mode-empty' : '']" + tag="ol" + role="listbox" + v-model="section.blocks" + v-bind="dragOptions" + handle=".cw-sortable-handle" + group="blocks" + @start="isDragging = true" + @end="dropBlock" + :containerId="container.id" + :sectionId="index" + > + <li v-for="block in section.blocks" :key="block.id" class="cw-block-item cw-block-item-sortable"> + <span + :class="{ 'cw-sortable-handle-dragging': isDragging }" + class="cw-sortable-handle" + tabindex="0" + role="option" + aria-describedby="operation" + :ref="'sortableHandle' + block.id" + @keydown="keyHandler($event, block.id, index)" + ></span> + <component + :is="component(block)" + :block="block" + :canEdit="canEdit" + :isTeacher="isTeacher" + :class="{ 'cw-block-item-selected': keyboardSelected === block.id}" + :blockId="block.id" + /> + </li> + </draggable> + <template v-if="canAddElements"> + <courseware-block-adder-area :container="container" :section="index" @updateContainerContent="updateContent"/> + </template> + </template> + <div v-else class="progress-wrapper"> + <studip-progress-indicator :description="$gettext('Vorgang wird bearbeitet...')" /> + </div> </template> - <div v-if="showEditMode && processing" class="progress-wrapper"> - <studip-progress-indicator :description="$gettext('Vorgang wird bearbeitet...')" /> - </div> </courseware-collapsible-box> </template> <template v-slot:containerEditDialog> @@ -157,7 +161,8 @@ export default { computed: { ...mapGetters({ blockById: 'courseware-blocks/byId', - viewMode: 'viewMode' + viewMode: 'viewMode', + currentElementisLink: 'currentElementisLink' }), showEditMode() { return this.viewMode === 'edit'; diff --git a/resources/vue/components/courseware/CoursewareDefaultBlock.vue b/resources/vue/components/courseware/CoursewareDefaultBlock.vue index 248c0690af6f4891085a0a84e720ac8bc44ef683..ff9701986c346c7e2d1b949dd3a70306bd811931 100644 --- a/resources/vue/components/courseware/CoursewareDefaultBlock.vue +++ b/resources/vue/components/courseware/CoursewareDefaultBlock.vue @@ -144,9 +144,10 @@ export default { userId: 'userId', userById: 'users/byId', viewMode: 'viewMode', + currentElementisLink: 'currentElementisLink' }), showEditMode() { - let show = this.viewMode === 'edit' || this.blockedByThisUser; + let show = (this.viewMode === 'edit' || this.blockedByThisUser) && !this.currentElementisLink; if (!show) { this.displayFeature(false); } diff --git a/resources/vue/components/courseware/CoursewareDefaultContainer.vue b/resources/vue/components/courseware/CoursewareDefaultContainer.vue index fd89439b3558d378c2548695dd8a7e7772f025c1..e1fa87bf5480d6e36eff4007c39934da1d0c626d 100644 --- a/resources/vue/components/courseware/CoursewareDefaultContainer.vue +++ b/resources/vue/components/courseware/CoursewareDefaultContainer.vue @@ -108,10 +108,11 @@ export default { blockAdder: 'blockAdder', userId: 'userId', userById: 'users/byId', - viewMode: 'viewMode' + viewMode: 'viewMode', + currentElementisLink: 'currentElementisLink' }), showEditMode() { - return this.viewMode === 'edit'; + return this.viewMode === 'edit' && !this.currentElementisLink; }, colSpan() { return this.container.attributes.payload.colspan ? this.container.attributes.payload.colspan : 'full'; diff --git a/resources/vue/components/courseware/CoursewareListContainer.vue b/resources/vue/components/courseware/CoursewareListContainer.vue index 3ee4538dc466e457aa25ef19b87f8102341769b0..74c890ba4b0daf06676da19ca5a50a15b8a80483 100644 --- a/resources/vue/components/courseware/CoursewareListContainer.vue +++ b/resources/vue/components/courseware/CoursewareListContainer.vue @@ -7,60 +7,62 @@ @storeContainer="storeContainer" > <template v-slot:containerContent> - <ul v-if="!showEditMode" class="cw-container-list-block-list"> + <ul v-if="!showEditMode || 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> </ul> - <template v-if="showEditMode && !processing"> - <span aria-live="assertive" class="assistive-text">{{ assistiveLive }}</span> - <span id="operation" class="assistive-text"> - {{$gettext('Drücken Sie die Leertaste, um neu anzuordnen.')}} - </span> - <draggable - v-if="showEditMode && canEdit" - class="cw-container-list-block-list cw-container-list-sort-mode" - tag="ol" - role="listbox" - v-model="blockList" - v-bind="dragOptions" - handle=".cw-sortable-handle" - group="blocks" - @start="isDragging = true" - @end="dropBlock" - ref="sortables" - :containerId="container.id" - sectionId="0" - > - <li - v-for="block in blockList" - :key="block.id" - class="cw-block-item cw-block-item-sortable" + <template v-else> + <template v-if="!processing"> + <span aria-live="assertive" class="assistive-text">{{ assistiveLive }}</span> + <span id="operation" class="assistive-text"> + {{$gettext('Drücken Sie die Leertaste, um neu anzuordnen.')}} + </span> + <draggable + v-if="showEditMode && canEdit" + class="cw-container-list-block-list cw-container-list-sort-mode" + tag="ol" + role="listbox" + v-model="blockList" + v-bind="dragOptions" + handle=".cw-sortable-handle" + group="blocks" + @start="isDragging = true" + @end="dropBlock" + ref="sortables" + :containerId="container.id" + sectionId="0" > - <span - :class="{ 'cw-sortable-handle-dragging': isDragging }" - class="cw-sortable-handle" - tabindex="0" - role="option" - aria-describedby="operation" - :ref="'sortableHandle' + block.id" - @keydown="keyHandler($event, block.id)" - ></span> - <component - :is="component(block)" - :block="block" - :canEdit="canEdit" - :isTeacher="isTeacher" - :class="{ 'cw-block-item-selected': keyboardSelected === block.id}" - :blockId="block.id" - /> - </li> - </draggable> - <courseware-block-adder-area :container="container" :section="0" /> + <li + v-for="block in blockList" + :key="block.id" + class="cw-block-item cw-block-item-sortable" + > + <span + :class="{ 'cw-sortable-handle-dragging': isDragging }" + class="cw-sortable-handle" + tabindex="0" + role="option" + aria-describedby="operation" + :ref="'sortableHandle' + block.id" + @keydown="keyHandler($event, block.id)" + ></span> + <component + :is="component(block)" + :block="block" + :canEdit="canEdit" + :isTeacher="isTeacher" + :class="{ 'cw-block-item-selected': keyboardSelected === block.id}" + :blockId="block.id" + /> + </li> + </draggable> + <courseware-block-adder-area :container="container" :section="0" /> + </template> + <div v-else class="progress-wrapper" :style="{ height: contentHeight + 'px' }"> + <studip-progress-indicator :description="$gettext('Vorgang wird bearbeitet...')" /> + </div> </template> - <div v-if="showEditMode && processing" class="progress-wrapper" :style="{ height: contentHeight + 'px' }"> - <studip-progress-indicator :description="$gettext('Vorgang wird bearbeitet...')" /> - </div> </template> </courseware-default-container> </template> @@ -105,7 +107,8 @@ export default { ...mapGetters({ blockById: 'courseware-blocks/byId', containerById: 'courseware-containers/byId', - viewMode: 'viewMode' + viewMode: 'viewMode', + currentElementisLink: 'currentElementisLink' }), blocked() { return this.container?.relationships?.['edit-blocker']?.data !== null; diff --git a/resources/vue/components/courseware/CoursewareRibbonToolbar.vue b/resources/vue/components/courseware/CoursewareRibbonToolbar.vue index e1373ba012d70fa2bcc3db7b7f74c5c292c74808..edf356e545f9e469ac16486b0f79379d96e934fb 100644 --- a/resources/vue/components/courseware/CoursewareRibbonToolbar.vue +++ b/resources/vue/components/courseware/CoursewareRibbonToolbar.vue @@ -100,6 +100,7 @@ export default { userById: 'users/byId', userId: 'userId', selectedToolbarItem: 'selectedToolbarItem', + currentElementisLink: 'currentElementisLink', }), showEditMode() { return this.viewMode === 'edit'; @@ -108,7 +109,7 @@ export default { if (this.disableAdder) { return false; } else { - return !this.consumeMode && this.showEditMode && this.canEdit; + return !this.consumeMode && this.showEditMode && this.canEdit && !this.currentElementisLink; } }, displaySettings() { diff --git a/resources/vue/components/courseware/CoursewareStructuralElement.vue b/resources/vue/components/courseware/CoursewareStructuralElement.vue index bdd01692ba713ba7c5651e1f7672fd9f510665e8..a0053e6aa05713051f023c8e932e62823bee0b38 100644 --- a/resources/vue/components/courseware/CoursewareStructuralElement.vue +++ b/resources/vue/components/courseware/CoursewareStructuralElement.vue @@ -130,11 +130,12 @@ :structuralElement="structuralElement" :canEdit="canEdit" /> - <courseware-companion-box - v-if="editView" - :msgCompanion="$gettextInterpolate($gettext('Dieser Inhalt ist aus den persönlichen Lernmaterialien von %{ ownerName } verlinkt und kann nur dort bearbeitet werden.'), { ownerName: ownerName })" - mood="pointing" - /> + <div v-if="editView" 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" + /> + </div> <component v-for="container in linkedContainers" :key="container.id" @@ -146,7 +147,7 @@ class="cw-container-item" /> </div> - <div v-if="canVisit && canEdit && editView" class="cw-container-wrapper cw-container-wrapper-edit"> + <div v-if="canVisit && canEdit && editView && !isLink" 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"> @@ -827,6 +828,7 @@ export default { blockerId: 'currentElementBlockerId', blockedByThisUser: 'currentElementBlockedByThisUser', blockedByAnotherUser: 'currentElementBlockedByAnotherUser', + isLink: 'currentElementisLink', templates: 'courseware-templates/all', }), @@ -1179,14 +1181,6 @@ export default { ); }, - isLink() { - if (this.structuralElement) { - return this.structuralElement.attributes['is-link'] === 1; - } - - return false; - }, - linkedElement() { if (this.isLink) { return this.structuralElementById({ id: this.structuralElement.attributes['target-id']}); diff --git a/resources/vue/components/courseware/CoursewareTabsContainer.vue b/resources/vue/components/courseware/CoursewareTabsContainer.vue index dd0d96326be2c83ddcfdc21450d4fc91821dae19..114d86cb42b7016058e6fa9f090b675a16196c59 100644 --- a/resources/vue/components/courseware/CoursewareTabsContainer.vue +++ b/resources/vue/components/courseware/CoursewareTabsContainer.vue @@ -9,7 +9,7 @@ @closeEdit="initCurrentData" > <template v-slot:containerContent> - <template v-if="showEditMode && canEdit"> + <template v-if="showEditMode && 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.')}} @@ -24,7 +24,7 @@ :icon="section.icon" :selected="sortInTab === index" > - <ul v-if="!showEditMode" class="cw-container-tabs-block-list"> + <ul v-if="!showEditMode || 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)" @@ -34,43 +34,45 @@ /> </li> </ul> - <template v-if="showEditMode && canEdit"> - <draggable - class="cw-container-list-block-list cw-container-list-sort-mode" - :class="[section.blocks.length === 0 ? 'cw-container-list-sort-mode-empty' : '']" - tag="ol" - role="listbox" - v-model="section.blocks" - v-bind="dragOptions" - handle=".cw-sortable-handle" - group="blocks" - @start="isDragging = true" - @end="dropBlock" - :containerId="container.id" - :sectionId="index" - > - <li v-for="block in section.blocks" :key="block.id" class="cw-block-item cw-block-item-sortable"> - <span - :class="{ 'cw-sortable-handle-dragging': isDragging }" - class="cw-sortable-handle" - tabindex="0" - role="option" - aria-describedby="operation" - :ref="'sortableHandle' + block.id" - @keydown="keyHandler($event, block.id, index)" - ></span> - <component - :is="component(block)" - :block="block" - :canEdit="canEdit" - :isTeacher="isTeacher" - :class="{ 'cw-block-item-selected': keyboardSelected === block.id}" - :blockId="block.id" - /> - </li> - </draggable> - <template v-if="canAddElements"> - <courseware-block-adder-area :container="container" :section="index" @updateContainerContent="updateContent"/> + <template v-else> + <template v-if="canEdit"> + <draggable + class="cw-container-list-block-list cw-container-list-sort-mode" + :class="[section.blocks.length === 0 ? 'cw-container-list-sort-mode-empty' : '']" + tag="ol" + role="listbox" + v-model="section.blocks" + v-bind="dragOptions" + handle=".cw-sortable-handle" + group="blocks" + @start="isDragging = true" + @end="dropBlock" + :containerId="container.id" + :sectionId="index" + > + <li v-for="block in section.blocks" :key="block.id" class="cw-block-item cw-block-item-sortable"> + <span + :class="{ 'cw-sortable-handle-dragging': isDragging }" + class="cw-sortable-handle" + tabindex="0" + role="option" + aria-describedby="operation" + :ref="'sortableHandle' + block.id" + @keydown="keyHandler($event, block.id, index)" + ></span> + <component + :is="component(block)" + :block="block" + :canEdit="canEdit" + :isTeacher="isTeacher" + :class="{ 'cw-block-item-selected': keyboardSelected === block.id}" + :blockId="block.id" + /> + </li> + </draggable> + <template v-if="canAddElements"> + <courseware-block-adder-area :container="container" :section="index" @updateContainerContent="updateContent"/> + </template> </template> </template> </courseware-tab> @@ -164,7 +166,8 @@ export default { computed: { ...mapGetters({ blockById: 'courseware-blocks/byId', - viewMode: 'viewMode' + viewMode: 'viewMode', + currentElementisLink: 'currentElementisLink' }), showEditMode() { return this.viewMode === 'edit'; diff --git a/resources/vue/store/courseware/courseware.module.js b/resources/vue/store/courseware/courseware.module.js index 9aa42813ee6ba68fcd4a36a980a78022a88f6120..996cb37c6d4c35abff58404b45a411a21f1d8dbc 100644 --- a/resources/vue/store/courseware/courseware.module.js +++ b/resources/vue/store/courseware/courseware.module.js @@ -98,6 +98,9 @@ const getters = { currentElementBlockedByAnotherUser(state, getters) { return getters.currentElementBlocked && getters.userId !== getters.currentElementBlockerId; }, + currentElementisLink(state, getters, rootState, rootGetters) { + return getters.currentStructuralElement?.attributes?.['is-link'] === 1; + }, oerEnabled(state) { return state.oerEnabled; },