From 8a86838edd77735b924953d9f526a4eea0c3f864 Mon Sep 17 00:00:00 2001 From: Farbod Zamani Date: Fri, 25 Feb 2022 13:14:54 +0000 Subject: Introduces "CoursewareExportWidget" --- app/controllers/contents/courseware.php | 31 +++++++--- app/controllers/course/courseware.php | 23 +++++++- app/views/course/courseware/export_widget.php | 1 + resources/assets/stylesheets/scss/courseware.scss | 10 ++-- .../courseware/CoursewareActionWidget.vue | 67 ---------------------- .../courseware/CoursewareExportWidget.vue | 59 +++++++++++++++++++ .../courseware/CoursewareStructuralElement.vue | 20 ------- resources/vue/components/courseware/IndexApp.vue | 20 ++++++- 8 files changed, 128 insertions(+), 103 deletions(-) create mode 100644 app/views/course/courseware/export_widget.php create mode 100644 resources/vue/components/courseware/CoursewareExportWidget.vue diff --git a/app/controllers/contents/courseware.php b/app/controllers/contents/courseware.php index ffec9de..0dbc0b7 100755 --- a/app/controllers/contents/courseware.php +++ b/app/controllers/contents/courseware.php @@ -71,12 +71,10 @@ class Contents_CoursewareController extends AuthenticatedController */ public function courseware_action($action = false, $widgetId = null) { - global $perm; + global $perm, $user; Navigation::activateItem('/contents/courseware/courseware'); - $this->user_id = $GLOBALS['user']->id; - - $this->setCoursewareSidebar(); + $this->user_id = $user->id; $last = UserConfig::get($this->user_id)->getValue('COURSEWARE_LAST_ELEMENT'); @@ -89,12 +87,11 @@ class Contents_CoursewareController extends AuthenticatedController } // load courseware for current user - if (!$this->entry_element_id || !$struct || !$struct->canRead($GLOBALS['user'])) { - $user = User::find($this->user_id); + if (!$this->entry_element_id || !$struct || !$struct->canRead($user)) { if (!$user->courseware) { // create initial courseware dataset - StructuralElement::createEmptyCourseware($this->user_id, 'user'); + $struct = StructuralElement::createEmptyCourseware($this->user_id, 'user'); } $this->entry_element_id = $user->courseware->id; @@ -106,9 +103,19 @@ class Contents_CoursewareController extends AuthenticatedController $this->licenses = $this->getLicences(); $this->oer_enabled = Config::get()->OERCAMPUS_ENABLED && $perm->have_perm(Config::get()->OER_PUBLIC_STATUS); + + // Make sure struct has value., to evaluate the export (edit) capability. + if (!isset($struct)) { + $struct = \Courseware\StructuralElement::findOneBySQL( + "id = ? AND range_id = ? AND range_type = 'user'", + [$this->entry_element_id, $this->user_id] + ); + } + $canExport = !empty($struct) ? $struct->canEdit($user) : false; + $this->setCoursewareSidebar($canExport); } - private function setCoursewareSidebar() + private function setCoursewareSidebar(bool $canExport) { $sidebar = \Sidebar::Get(); $actions = new TemplateWidget( @@ -122,6 +129,14 @@ class Contents_CoursewareController extends AuthenticatedController $this->get_template_factory()->open('course/courseware/view_widget') ); $sidebar->addWidget($views)->addLayoutCSSClass('courseware-view-widget'); + + if ($canExport) { + $exports = new TemplateWidget( + _('Export '), + $this->get_template_factory()->open('course/courseware/export_widget') + ); + $sidebar->addWidget($exports)->addLayoutCSSClass('courseware-export-widget'); + } } private function getLicences() diff --git a/app/controllers/course/courseware.php b/app/controllers/course/courseware.php index 7c8cd78..e10e245 100755 --- a/app/controllers/course/courseware.php +++ b/app/controllers/course/courseware.php @@ -50,7 +50,7 @@ class Course_CoursewareController extends AuthenticatedController if (!$course->courseware) { // create initial courseware dataset - StructuralElement::createEmptyCourseware(Context::getId(), 'course'); + $struct = StructuralElement::createEmptyCourseware(Context::getId(), 'course'); } $this->entry_element_id = $course->courseware->id; @@ -60,13 +60,22 @@ class Course_CoursewareController extends AuthenticatedController UserConfig::get($GLOBALS['user']->id)->store('COURSEWARE_LAST_ELEMENT', $last); Navigation::activateItem('course/courseware/content'); - $this->setIndexSidebar(); $this->licenses = []; $sorm_licenses = License::findBySQL('1 ORDER BY name ASC'); foreach ($sorm_licenses as $license) { array_push($this->licenses, $license->toArray()); } $this->licenses = json_encode($this->licenses); + + // Make sure struct has value., to evaluate the export (edit) capability. + if (!isset($struct)) { + $struct = StructuralElement::findOneBySQL("id = ? AND range_id = ? AND range_type = 'course'", [ + $this->entry_element_id, + Context::getId(), + ]); + } + $canExport = !empty($struct) ? $struct->canEdit($GLOBALS['user']) : false; + $this->setIndexSidebar($canExport); } public function dashboard_action(): void @@ -98,7 +107,7 @@ class Course_CoursewareController extends AuthenticatedController $this->render_pdf($element->pdfExport($this->user), trim($element->title).'.pdf'); } - private function setIndexSidebar(): void + private function setIndexSidebar(bool $canExport): void { $sidebar = Sidebar::Get(); $actions = new TemplateWidget( @@ -112,6 +121,14 @@ class Course_CoursewareController extends AuthenticatedController $this->get_template_factory()->open('course/courseware/view_widget') ); $sidebar->addWidget($views)->addLayoutCSSClass('courseware-view-widget'); + + if ($canExport) { + $exports = new TemplateWidget( + _('Export '), + $this->get_template_factory()->open('course/courseware/export_widget') + ); + $sidebar->addWidget($exports)->addLayoutCSSClass('courseware-export-widget'); + } } diff --git a/app/views/course/courseware/export_widget.php b/app/views/course/courseware/export_widget.php new file mode 100644 index 0000000..1d7feb2 --- /dev/null +++ b/app/views/course/courseware/export_widget.php @@ -0,0 +1 @@ + diff --git a/resources/assets/stylesheets/scss/courseware.scss b/resources/assets/stylesheets/scss/courseware.scss index 2cceea1..8143c18 100755 --- a/resources/assets/stylesheets/scss/courseware.scss +++ b/resources/assets/stylesheets/scss/courseware.scss @@ -1666,7 +1666,7 @@ b l o c k a d d e r display: block; } } - } + } } .cw-blockadder-item { @@ -1913,13 +1913,15 @@ v i e w w i d g e t .cw-action-widget-trash{ @include background-icon(trash, clickable); } - .cw-action-widget-export{ +} +.cw-export-widget { + .cw-export-widget-export{ @include background-icon(export, clickable); } - .cw-action-widget-export-pdf{ + .cw-export-widget-export-pdf{ @include background-icon(file-pdf, clickable); } - .cw-action-widget-oer{ + .cw-export-widget-oer{ @include background-icon(oer-campus, clickable); } } diff --git a/resources/vue/components/courseware/CoursewareActionWidget.vue b/resources/vue/components/courseware/CoursewareActionWidget.vue index 2c98a3b..a718a64 100644 --- a/resources/vue/components/courseware/CoursewareActionWidget.vue +++ b/resources/vue/components/courseware/CoursewareActionWidget.vue @@ -35,21 +35,6 @@ Lesezeichen setzen -
  • - - Seite exportieren - -
  • -
  • - - Seite als pdf-Dokument exportieren - -
  • -
  • - - Seite auf %{oerTitle} veröffentlichen - -
  • Seite löschen @@ -72,13 +57,9 @@ export default { mixins: [CoursewareExport], computed: { ...mapGetters({ - context: 'context', - oerEnabled: 'oerEnabled', - oerTitle: 'oerTitle', userId: 'userId', consumeMode: 'consumeMode', showToolbar: 'showToolbar', - userIsTeacher: 'userIsTeacher', }), isRoot() { if (!this.structuralElement) { @@ -111,48 +92,8 @@ export default { tocText() { return this.showToolbar ? this.$gettext('Inhaltsverzeichnis ausblenden') : this.$gettext('Inhaltsverzeichnis anzeigen'); }, - pdfExportURL() { - if (this.context.type === 'users') { - return STUDIP.URLHelper.getURL('dispatch.php/contents/courseware/pdf_export/' + this.structuralElement.id); - } - if (this.context.type === 'courses') { - return STUDIP.URLHelper.getURL('dispatch.php/course/courseware/pdf_export/' + this.structuralElement.id); - } - - return ''; - }, - isTask() { - return this.structuralElement?.relationships.task.data !== null; - }, - canExport() { - if (this.context.type === 'users') { - return true; - } - - return this.canEdit && this.userIsTeacher; - }, - tocText() { - return this.showToolbar ? this.$gettext('Inhaltsverzeichnis ausblenden') : this.$gettext('Inhaltsverzeichnis anzeigen'); - }, - pdfExportURL() { - if (this.context.type === 'users') { - return STUDIP.URLHelper.getURL('dispatch.php/contents/courseware/pdf_export/' + this.structuralElement.id); - } - if (this.context.type === 'courses') { - return STUDIP.URLHelper.getURL('dispatch.php/course/courseware/pdf_export/' + this.structuralElement.id); - } - - return ''; - }, isTask() { return this.structuralElement?.relationships.task.data !== null; - }, - canExport() { - if (this.context.type === 'users') { - return true; - } - - return this.canEdit && this.userIsTeacher; } }, methods: { @@ -161,8 +102,6 @@ export default { showElementAddDialog: 'showElementAddDialog', showElementDeleteDialog: 'showElementDeleteDialog', showElementInfoDialog: 'showElementInfoDialog', - showElementExportDialog: 'showElementExportDialog', - showElementOerDialog: 'showElementOerDialog', setStructuralElementSortMode: 'setStructuralElementSortMode', companionInfo: 'companionInfo', addBookmark: 'addBookmark', @@ -201,9 +140,6 @@ export default { addElement() { this.showElementAddDialog(true); }, - exportElement() { - this.showElementExportDialog(true); - }, showElementInfo() { this.showElementInfoDialog(true); }, @@ -211,9 +147,6 @@ export default { this.addBookmark(this.structuralElement); this.companionInfo({ info: this.$gettext('Das Lesezeichen wurde gesetzt.') }); }, - oerElement() { - this.showElementOerDialog(true); - }, toggleTOC() { this.setShowToolbar(!this.showToolbar); }, diff --git a/resources/vue/components/courseware/CoursewareExportWidget.vue b/resources/vue/components/courseware/CoursewareExportWidget.vue new file mode 100644 index 0000000..e9c54dc --- /dev/null +++ b/resources/vue/components/courseware/CoursewareExportWidget.vue @@ -0,0 +1,59 @@ + + + diff --git a/resources/vue/components/courseware/CoursewareStructuralElement.vue b/resources/vue/components/courseware/CoursewareStructuralElement.vue index 60f3aac..d35d7bd 100755 --- a/resources/vue/components/courseware/CoursewareStructuralElement.vue +++ b/resources/vue/components/courseware/CoursewareStructuralElement.vue @@ -790,26 +790,6 @@ export default { menu.push({ id: 3, label: this.$gettext('Seite hinzufügen'), icon: 'add', emit: 'addElement' }); } - if ((this.userIsTeacher && this.canEdit) || this.context.type === 'users') { - menu.push({ - id: 6, - label: this.$gettext('Seite exportieren'), - icon: 'export', - emit: 'showExportOptions', - }); - } - if ((this.userIsTeacher || this.canEdit) && this.canVisit) { - menu.push({ - id: 7, - type: 'link', - label: this.$gettext('Seite als pdf-Dokument exportieren'), - icon: 'file-pdf', - url: this.pdfExportURL, - }); - } - if (this.canEdit && this.oerEnabled && this.userIsTeacher) { - menu.push({ id: 8, label: this.textOer.title, icon: 'oer-campus', emit: 'oerCurrentElement' }); - } if (!this.isRoot && this.canEdit && !this.isTask) { menu.push({ id: 9, diff --git a/resources/vue/components/courseware/IndexApp.vue b/resources/vue/components/courseware/IndexApp.vue index d2cc1f4..1a51272 100755 --- a/resources/vue/components/courseware/IndexApp.vue +++ b/resources/vue/components/courseware/IndexApp.vue @@ -10,6 +10,9 @@ + + + @@ -31,6 +34,7 @@ import CoursewareStructuralElement from './CoursewareStructuralElement.vue'; import CoursewareViewWidget from './CoursewareViewWidget.vue'; import CoursewareActionWidget from './CoursewareActionWidget.vue'; +import CoursewareExportWidget from './CoursewareExportWidget.vue'; import CoursewareCompanionBox from './CoursewareCompanionBox.vue'; import StudipProgressIndicator from '../StudipProgressIndicator.vue'; import { mapActions, mapGetters } from 'vuex'; @@ -42,6 +46,7 @@ export default { CoursewareActionWidget, CoursewareCompanionBox, StudipProgressIndicator, + CoursewareExportWidget }, data: () => ({ canVisit: null, @@ -51,6 +56,7 @@ export default { }), computed: { ...mapGetters({ + context: 'context', courseware: 'courseware', orderedStructuralElements: 'courseware-structure/ordered', relatedStructuralElement: 'courseware-structural-elements/related', @@ -58,6 +64,7 @@ export default { structuralElements: 'courseware-structural-elements/all', structuralElementById: 'courseware-structural-elements/byId', userId: 'userId', + userIsTeacher: 'userIsTeacher' }), loadingErrorMessage() { switch (this.loadingErrorStatus) { @@ -68,7 +75,18 @@ export default { default: return this.$gettext('Beim Laden der Seite ist ein Fehler aufgetreten.'); } - } + }, + canExport() { + if (!this.selected) { + return false; + } + + if (this.context.type === 'users') { + return true; + } + + return this.selected.attributes['can-edit'] && this.userIsTeacher; + }, }, methods: { ...mapActions({ -- cgit v1.0