From 6ad7722061da547b7c02b7be84f9d142ab0d0464 Mon Sep 17 00:00:00 2001 From: Ron Lucke <lucke@elan-ev.de> Date: Fri, 22 Apr 2022 05:59:00 +0000 Subject: [PATCH] fix #712 Closes #712 --- app/controllers/contents/courseware.php | 4 +- app/controllers/course/courseware.php | 4 +- lib/models/Courseware/StructuralElement.php | 15 ++++--- .../courseware/CoursewareExportWidget.vue | 18 +++----- .../CoursewareStructuralElement.vue | 41 +++++++++++++++++++ .../vue/store/courseware/courseware.module.js | 12 ++++++ 6 files changed, 72 insertions(+), 22 deletions(-) diff --git a/app/controllers/contents/courseware.php b/app/controllers/contents/courseware.php index 2e27077660b..340800678b4 100755 --- a/app/controllers/contents/courseware.php +++ b/app/controllers/contents/courseware.php @@ -441,10 +441,10 @@ class Contents_CoursewareController extends AuthenticatedController $sidebar->addWidget($actions); } - public function pdf_export_action($element_id) + public function pdf_export_action($element_id, $with_children) { $element = \Courseware\StructuralElement::findOneById($element_id); - $this->render_pdf($element->pdfExport($this->user), trim($element->title).'.pdf'); + $this->render_pdf($element->pdfExport($this->user, $with_children), trim($element->title).'.pdf'); } } diff --git a/app/controllers/course/courseware.php b/app/controllers/course/courseware.php index 9ef96616fb3..0e609e7f9cb 100755 --- a/app/controllers/course/courseware.php +++ b/app/controllers/course/courseware.php @@ -100,11 +100,11 @@ class Course_CoursewareController extends AuthenticatedController } } - public function pdf_export_action($element_id) + public function pdf_export_action($element_id, $with_children) { $element = \Courseware\StructuralElement::findOneById($element_id); - $this->render_pdf($element->pdfExport($this->user), trim($element->title).'.pdf'); + $this->render_pdf($element->pdfExport($this->user, $with_children), trim($element->title).'.pdf'); } private function setIndexSidebar(): void diff --git a/lib/models/Courseware/StructuralElement.php b/lib/models/Courseware/StructuralElement.php index ba1563e1434..b135e4a135a 100755 --- a/lib/models/Courseware/StructuralElement.php +++ b/lib/models/Courseware/StructuralElement.php @@ -715,7 +715,7 @@ SQL; } } - public function pdfExport($user) + public function pdfExport($user, bool $with_children = false) { $doc = new \ExportPDF('P', 'mm', 'A4', true, 'UTF-8', false); $doc->setHeaderTitle(_('Courseware')); @@ -734,31 +734,34 @@ SQL; return $doc; } - $doc->writeHTML($this->getElementPdfExport()); + $doc->writeHTML($this->getElementPdfExport('', $with_children, $user)); return $doc; } - private function getElementPdfExport(string $parent_name = '', bool $with_children = false) + private function getElementPdfExport(string $parent_name = '', bool $with_children, $user) { + if (!$this->canRead($user)) { + return ''; + } if ($parent_name !== '') { $parent_name .= ' / '; } $html = '<h1>' . $parent_name . $this->title . '</h1>'; $html .= $this->getContainerPdfExport(); if ($with_children) { - $html .= $this->getChildrenPdfExport($parent_name); + $html .= $this->getChildrenPdfExport($parent_name, $with_children, $user); } return $html; } - private function getChildrenPdfExport(string $parent_name) + private function getChildrenPdfExport(string $parent_name, bool $with_children, $user) { $children = self::findBySQL('parent_id = ?', [$this->id]); $html = ''; foreach ($children as $child) { - $html .= $child->getElementPdfExport($parent_name . $this->title); + $html .= $child->getElementPdfExport($parent_name . $this->title, $with_children, $user); } return $html; diff --git a/resources/vue/components/courseware/CoursewareExportWidget.vue b/resources/vue/components/courseware/CoursewareExportWidget.vue index dabc3ae735e..7b55a7898cb 100644 --- a/resources/vue/components/courseware/CoursewareExportWidget.vue +++ b/resources/vue/components/courseware/CoursewareExportWidget.vue @@ -6,9 +6,9 @@ </button> </li> <li v-if="showExportPdf" class="cw-export-widget-export-pdf"> - <a :href="pdfExportURL" target="_blank"> + <button @click="pdfElement"> <translate>Seite als pdf-Dokument exportieren</translate> - </a> + </button> </li> <li v-if="showOer" class="cw-export-widget-oer"> <button @click="oerElement"> @@ -36,16 +36,6 @@ export default { oerTitle: 'oerTitle', userIsTeacher: 'userIsTeacher', }), - 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 ''; - }, canEdit() { if (!this.structuralElement) { return false; @@ -77,11 +67,15 @@ export default { methods: { ...mapActions({ showElementExportDialog: 'showElementExportDialog', + showElementPdfExportDialog: 'showElementPdfExportDialog', showElementOerDialog: 'showElementOerDialog', }), exportElement() { this.showElementExportDialog(true); }, + pdfElement() { + this.showElementPdfExportDialog(true); + }, oerElement() { this.showElementOerDialog(true); } diff --git a/resources/vue/components/courseware/CoursewareStructuralElement.vue b/resources/vue/components/courseware/CoursewareStructuralElement.vue index e1bfd938cad..9276ba7dcba 100755 --- a/resources/vue/components/courseware/CoursewareStructuralElement.vue +++ b/resources/vue/components/courseware/CoursewareStructuralElement.vue @@ -403,6 +403,28 @@ </template> </studip-dialog> + <studip-dialog + v-if="showPdfExportDialog" + :title="textExport.title" + :confirmText="textExport.confirm" + confirmClass="accept" + :closeText="textExport.close" + closeClass="cancel" + height="350" + @close="showElementPdfExportDialog(false)" + @confirm="pdfExportCurrentElement" + > + <template v-slot:dialogContent> + <translate> Hiermit exportieren Sie die Seite "%{ currentElement.attributes.title }" als PDF-Datei.</translate> + <div class="cw-element-export"> + <label> + <input type="checkbox" v-model="pdfExportChildren" /> + <translate>Unterseiten exportieren</translate> + </label> + </div> + </template> + </studip-dialog> + <studip-dialog v-if="showOerDialog" height="600" @@ -559,6 +581,7 @@ export default { }, exportRunning: false, exportChildren: false, + pdfExportChildren: false, oerChildren: true, containerList: [], isDragging: false, @@ -589,6 +612,7 @@ export default { showEditDialog: 'showStructuralElementEditDialog', showAddDialog: 'showStructuralElementAddDialog', showExportDialog: 'showStructuralElementExportDialog', + showPdfExportDialog: 'showStructuralElementPdfExportDialog', showInfoDialog: 'showStructuralElementInfoDialog', showDeleteDialog: 'showStructuralElementDeleteDialog', showOerDialog: 'showStructuralElementOerDialog', @@ -1040,6 +1064,7 @@ export default { showElementEditDialog: 'showElementEditDialog', showElementAddDialog: 'showElementAddDialog', showElementExportDialog: 'showElementExportDialog', + showElementPdfExportDialog: 'showElementPdfExportDialog', showElementInfoDialog: 'showElementInfoDialog', showElementDeleteDialog: 'showElementDeleteDialog', showElementOerDialog: 'showElementOerDialog', @@ -1209,6 +1234,22 @@ export default { this.showElementExportDialog(false); }, + pdfExportCurrentElement() { + this.showElementPdfExportDialog(false); + let url = ''; + let withChildren = this.pdfExportChildren ? '/1' : '/0'; + if (this.context.type === 'users') { + url = STUDIP.URLHelper.getURL('dispatch.php/contents/courseware/pdf_export/' + this.structuralElement.id + withChildren); + } + if (this.context.type === 'courses') { + url = STUDIP.URLHelper.getURL('dispatch.php/course/courseware/pdf_export/' + this.structuralElement.id + withChildren); + } + + if (url) { + window.open(url , '_blank').focus(); + } + }, + async publishCurrentElement() { this.exportToOER(this.currentElement, { withChildren: this.oerChildren }); }, diff --git a/resources/vue/store/courseware/courseware.module.js b/resources/vue/store/courseware/courseware.module.js index 5a6e479620e..b266d3a406f 100755 --- a/resources/vue/store/courseware/courseware.module.js +++ b/resources/vue/store/courseware/courseware.module.js @@ -32,6 +32,7 @@ const getDefaultState = () => { showStructuralElementEditDialog: false, showStructuralElementAddDialog: false, showStructuralElementExportDialog: false, + showStructuralElementPdfExportDialog: false, showStructuralElementInfoDialog: false, showStructuralElementDeleteDialog: false, showStructuralElementOerDialog: false, @@ -153,6 +154,9 @@ const getters = { showStructuralElementExportDialog(state) { return state.showStructuralElementExportDialog; }, + showStructuralElementPdfExportDialog(state) { + return state.showStructuralElementPdfExportDialog; + }, showStructuralElementInfoDialog(state) { return state.showStructuralElementInfoDialog; }, @@ -782,6 +786,10 @@ export const actions = { context.commit('setShowStructuralElementExportDialog', bool); }, + showElementPdfExportDialog(context, bool) { + context.commit('setShowStructuralElementPdfExportDialog', bool); + }, + showElementInfoDialog(context, bool) { context.commit('setShowStructuralElementInfoDialog', bool); }, @@ -1250,6 +1258,10 @@ export const mutations = { state.showStructuralElementExportDialog = showExport; }, + setShowStructuralElementPdfExportDialog(state, showPdfExport) { + state.showStructuralElementPdfExportDialog = showPdfExport; + }, + setShowStructuralElementInfoDialog(state, showInfo) { state.showStructuralElementInfoDialog = showInfo; }, -- GitLab