OpenSlides/client/src/app/site/assignments/services/assignment-pdf-export.service.ts
2019-07-30 09:53:14 +02:00

117 lines
3.9 KiB
TypeScript

import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { PdfDocumentService, PdfError } from 'app/core/ui-services/pdf-document.service';
import { AssignmentPdfService } from './assignment-pdf.service';
import { ViewAssignment } from '../models/view-assignment';
/**
* Controls PDF export for assignments
*/
@Injectable({
providedIn: 'root'
})
export class AssignmentPdfExportService {
/**
* Constructor
*
* @param translate Translate
* @param assignmentPdfService Service for single assignment details
* @param pdfDocumentService Service for PDF document generation
*/
public constructor(
private translate: TranslateService,
private assignmentPdfService: AssignmentPdfService,
private pdfDocumentService: PdfDocumentService
) {}
/**
* Generates an pdf out of a given assignment and saves it as file
*
* @param assignment the assignment to export
*/
public exportSingleAssignment(assignment: ViewAssignment): void {
const doc = this.assignmentPdfService.assignmentToDocDef(assignment);
const filename = `${this.translate.instant('Election')}_${assignment.title}`;
const metadata = {
title: filename
};
this.pdfDocumentService.download(doc, filename, metadata);
}
/**
* Generates a pdf document for a list of assignments
*
* @param assignments The list of assignments that should be exported as pdf.
*/
public exportMultipleAssignments(assignments: ViewAssignment[]): void {
const doc = this.createDocOfMultipleAssignments(assignments);
const filename = this.translate.instant('Elections');
const metaData = {
title: filename
};
this.pdfDocumentService.download(doc, filename, metaData);
}
/**
* Helper to generate from a list of assignments a document for the pdf export.
*
* @param assignments The list of assignments
*
* @returns doc definition as object
*/
private createDocOfMultipleAssignments(assignments: ViewAssignment[]): object {
const doc = [];
const fileList = assignments.map((assignment, index) => {
try {
const assignmentDocDef = this.assignmentPdfService.assignmentToDocDef(assignment);
assignmentDocDef[0].id = `${assignment.id}`;
return index < assignments.length - 1
? [assignmentDocDef, this.pdfDocumentService.getPageBreak()]
: [assignmentDocDef];
} catch (error) {
const errorText = `${this.translate.instant('Error during PDF creation of election:')} ${
assignment.title
}`;
console.error(`${errorText}\nDebugInfo:\n`, error);
throw new PdfError(errorText);
}
});
if (assignments.length > 1) {
doc.push(
this.pdfDocumentService.createTitle('assignments_pdf_title'),
this.pdfDocumentService.createPreamble('assignments_pdf_preamble'),
this.createToc(assignments)
);
}
doc.push(fileList);
return doc;
}
/**
* Function to create the 'Table of contents'
*
* @param assignments All the assignments, who should be exported as PDF.
*
* @returns The toc as
*/
private createToc(assignments: ViewAssignment[]): Object {
const toc = [];
const tocTitle = {
text: this.translate.instant('Table of contents'),
style: 'heading2'
};
const tocBody = assignments.map((assignment, index) =>
this.pdfDocumentService.createTocLine(`${index + 1}`, assignment.title, `${assignment.id}`)
);
toc.push(this.pdfDocumentService.createTocTableDef(tocBody));
return [tocTitle, toc, this.pdfDocumentService.getPageBreak()];
}
}