diff --git a/client/src/app/site/motions/modules/shared-motion/motion-export-dialog/motion-export-dialog.component.html b/client/src/app/site/motions/modules/shared-motion/motion-export-dialog/motion-export-dialog.component.html index fe8b4c603..414945c2b 100644 --- a/client/src/app/site/motions/modules/shared-motion/motion-export-dialog/motion-export-dialog.component.html +++ b/client/src/app/site/motions/modules/shared-motion/motion-export-dialog/motion-export-dialog.component.html @@ -49,6 +49,9 @@ {{ getLabelForMetadata(metaInfo) | translate }} + + Speakers + Voting result diff --git a/client/src/app/site/motions/modules/shared-motion/motion-export-dialog/motion-export-dialog.component.ts b/client/src/app/site/motions/modules/shared-motion/motion-export-dialog/motion-export-dialog.component.ts index b6b173ba8..6d868b3de 100644 --- a/client/src/app/site/motions/modules/shared-motion/motion-export-dialog/motion-export-dialog.component.ts +++ b/client/src/app/site/motions/modules/shared-motion/motion-export-dialog/motion-export-dialog.component.ts @@ -83,6 +83,12 @@ export class MotionExportDialogComponent implements OnInit { @ViewChild('votingResultButton', { static: true }) public votingResultButton: MatButtonToggle; + /** + * To deactivate the speakers button. + */ + @ViewChild('speakersButton', { static: false }) + public speakersButton: MatButtonToggle; + /** * Constructor * Sets the default values for the lineNumberingMode and changeRecoMode and creates the form. @@ -134,8 +140,10 @@ export class MotionExportDialogComponent implements OnInit { // XLSX cannot have "content" if (format === ExportFileFormat.XLSX) { this.disableControl('content'); + this.changeStateOfButton(this.speakersButton, false); } else { this.enableControl('content'); + this.changeStateOfButton(this.speakersButton, true); } if (format === ExportFileFormat.CSV || format === ExportFileFormat.XLSX) { @@ -144,12 +152,10 @@ export class MotionExportDialogComponent implements OnInit { this.disableControl('pdfOptions'); // remove the selection of "votingResult" - let metaInfoVal: string[] = this.exportForm.get('metaInfo').value; - if (metaInfoVal) { - metaInfoVal = metaInfoVal.filter(info => { - return info !== 'polls'; - }); - this.exportForm.get('metaInfo').setValue(metaInfoVal); + if (format === ExportFileFormat.CSV) { + this.disableMetaInfoControl('polls', 'speakers'); + } else { + this.disableMetaInfoControl('polls'); } this.votingResultButton.disabled = true; } @@ -162,6 +168,20 @@ export class MotionExportDialogComponent implements OnInit { } } + /** + * Function to change the state of the property `disabled` of a given button. + * + * Ensures, that the button exists. + * + * @param button The button whose state will change. + * @param nextState The next state the button will assume. + */ + private changeStateOfButton(button: MatButtonToggle, nextState: boolean): void { + if (!!button) { + button.disabled = nextState; + } + } + /** * Helper function to easier enable a control * @param name @@ -196,6 +216,19 @@ export class MotionExportDialogComponent implements OnInit { } } + /** + * Function to deactivate at least one field of the meta-info. + * + * @param fields All fields to deactivate. + */ + private disableMetaInfoControl(...fields: string[]): void { + let metaInfoVal: string[] = this.exportForm.get('metaInfo').value; + if (metaInfoVal) { + metaInfoVal = metaInfoVal.filter(info => !fields.includes(info)); + this.exportForm.get('metaInfo').setValue(metaInfoVal); + } + } + /** * Creates the form with default values */ diff --git a/client/src/app/site/motions/services/motion-export.service.ts b/client/src/app/site/motions/services/motion-export.service.ts index fb2c08568..e249459c7 100644 --- a/client/src/app/site/motions/services/motion-export.service.ts +++ b/client/src/app/site/motions/services/motion-export.service.ts @@ -43,6 +43,9 @@ export class MotionExportService { ) {} public evaluateExportRequest(exportInfo: MotionExportInfo, data: ViewMotion[]): void { + if (!exportInfo) { + return; + } if (!!exportInfo.format) { if (exportInfo.format === ExportFileFormat.PDF) { try { diff --git a/client/src/app/site/motions/services/motion-pdf.service.ts b/client/src/app/site/motions/services/motion-pdf.service.ts index b2f30d08c..e37a0106c 100644 --- a/client/src/app/site/motions/services/motion-pdf.service.ts +++ b/client/src/app/site/motions/services/motion-pdf.service.ts @@ -31,6 +31,7 @@ export type InfoToExport = | 'origin' | 'tags' | 'polls' + | 'speakers' | 'id' | 'allcomments'; diff --git a/client/src/app/site/motions/services/motion-xlsx-export.service.ts b/client/src/app/site/motions/services/motion-xlsx-export.service.ts index 77ca86459..ce74a9954 100644 --- a/client/src/app/site/motions/services/motion-xlsx-export.service.ts +++ b/client/src/app/site/motions/services/motion-xlsx-export.service.ts @@ -81,7 +81,9 @@ export class MotionXlsxExportService { */ public exportMotionList(motions: ViewMotion[], infoToExport: InfoToExport[], comments: number[]): void { const workbook = new Workbook(); - const properties = sortMotionPropertyList(['identifier', 'title'].concat(infoToExport)); + const properties = infoToExport.includes('speakers') + ? sortMotionPropertyList(['identifier', 'title'].concat(infoToExport)).concat('speakers') + : sortMotionPropertyList(['identifier', 'title'].concat(infoToExport)); const worksheet = workbook.addWorksheet(this.translate.instant('Motions'), { pageSetup: { @@ -105,10 +107,17 @@ export class MotionXlsxExportService { const columns = []; columns.push( ...properties.map(property => { - const propertyHeader = - property === 'motion_block' - ? 'Motion block' - : property.charAt(0).toLocaleUpperCase() + property.slice(1); + let propertyHeader = ''; + switch (property) { + case 'motion_block': + propertyHeader = 'Motion block'; + break; + case 'speakers': + propertyHeader = 'List of next speakers'; + break; + default: + propertyHeader = property.charAt(0).toUpperCase() + property.slice(1); + } return { header: this.translate.instant(propertyHeader) }; @@ -138,18 +147,22 @@ export class MotionXlsxExportService { data.push( ...properties.map(property => { const motionProp = motion[property]; - if (motionProp) { - switch (property) { - case 'state': - return this.motionRepo.getExtendedStateLabel(motion); - case 'recommendation': - return this.motionRepo.getExtendedRecommendationLabel(motion); - default: - return this.translate.instant(motionProp.toString()); - } - } else { + if (property === 'speakers') { + return motion.listOfSpeakers && motion.listOfSpeakers.waitingSpeakerAmount > 0 + ? motion.listOfSpeakers.waitingSpeakerAmount + : ''; + } + if (!motionProp) { return ''; } + switch (property) { + case 'state': + return this.motionRepo.getExtendedStateLabel(motion); + case 'recommendation': + return this.motionRepo.getExtendedRecommendationLabel(motion); + default: + return this.translate.instant(motionProp.toString()); + } }) ); if (comments) {