diff --git a/app/controllers/contents/courseware.php b/app/controllers/contents/courseware.php index 2e27077660bfb7594436df6f8b6e6eb5c593ab82..340800678b4886cdb1ef14416e6290c2923711d2 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 9ef96616fb32527149dec40e52bbb1fde013360f..0e609e7f9cbaf5b54b9442cfe09167cc118ff3fa 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 ba1563e143424ab075847d3793c8821ca0c959db..b135e4a135af0a048d17892c7d12689f0a047aa1 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 dabc3ae735e493df080e861c7e6f6a96fe9ceb72..7b55a7898cb9a2cfb4ebf1dbaff89a6610f191bc 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 e1bfd938cad0e9a41deb1b43d5147c6313997a0c..9276ba7dcba5bd243397381e71ccb762aa9a0037 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 5a6e479620ef63b38766522e3bf6af0571df2929..b266d3a406fd6d21ecae978928cd4dc17729ac2e 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; },