export personal note pdf

This commit is contained in:
Maximilian Krambach 2019-02-06 13:13:19 +01:00
parent 5ace768427
commit dc27a20842
7 changed files with 96 additions and 17 deletions

View File

@ -21,13 +21,16 @@
</ng-container> </ng-container>
<ng-container class="meta-text-block-action-row"> <ng-container class="meta-text-block-action-row">
<button mat-icon-button *ngIf="!isCommentEdited(section)" (click)="editComment(section)"> <button mat-icon-button *ngIf="!isCommentEdited(section)" (click)="editComment(section)"
matTooltip="{{ 'Edit' | translate }}">
<mat-icon>edit</mat-icon> <mat-icon>edit</mat-icon>
</button> </button>
<button mat-icon-button *ngIf="isCommentEdited(section)" (click)="saveComment(section)"> <button mat-icon-button *ngIf="isCommentEdited(section)" (click)="saveComment(section)"
matTooltip="{{ 'Save' | translate }}">
<mat-icon>save</mat-icon> <mat-icon>save</mat-icon>
</button> </button>
<button mat-icon-button *ngIf="isCommentEdited(section)" (click)="cancelEditing(section)"> <button mat-icon-button *ngIf="isCommentEdited(section)" (click)="cancelEditing(section)"
matTooltip="{{ 'Cancel edit' | translate }}">
<mat-icon>close</mat-icon> <mat-icon>close</mat-icon>
</button> </button>
</ng-container> </ng-container>

View File

@ -21,13 +21,20 @@
</ng-container> </ng-container>
<ng-container class="meta-text-block-action-row"> <ng-container class="meta-text-block-action-row">
<button mat-icon-button *ngIf="!isEditMode" (click)="editPersonalNote()"> <button mat-icon-button *ngIf="!isEditMode" (click)="editPersonalNote()"
matTooltip="{{ 'Edit' | translate }}">
<mat-icon>edit</mat-icon> <mat-icon>edit</mat-icon>
</button> </button>
<button mat-icon-button *ngIf="isEditMode" (click)="savePersonalNote()"> <button mat-icon-button *ngIf="!isEditMode && personalNote" (click)="printPersonalNote()"
matTooltip="{{ 'Export personal note only' | translate }}">
<mat-icon>picture_as_pdf</mat-icon>
</button>
<button mat-icon-button *ngIf="isEditMode" (click)="savePersonalNote()"
matTooltip="{{ 'Save' | translate }}">
<mat-icon>save</mat-icon> <mat-icon>save</mat-icon>
</button> </button>
<button mat-icon-button *ngIf="isEditMode" (click)="isEditMode = false"> <button mat-icon-button *ngIf="isEditMode" (click)="isEditMode = false"
matTooltip="{{ 'Cancel edit' | translate }}">
<mat-icon>close</mat-icon> <mat-icon>close</mat-icon>
</button> </button>
</ng-container> </ng-container>

View File

@ -4,9 +4,10 @@ import { FormBuilder, FormGroup } from '@angular/forms';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { BaseComponent } from '../../../../base.component'; import { BaseComponent } from '../../../../base.component';
import { ViewMotion } from '../../models/view-motion'; import { MotionPdfExportService } from '../../services/motion-pdf-export.service';
import { PersonalNoteService } from 'app/core/ui-services/personal-note.service';
import { PersonalNoteContent } from 'app/shared/models/users/personal-note'; import { PersonalNoteContent } from 'app/shared/models/users/personal-note';
import { PersonalNoteService } from 'app/core/ui-services/personal-note.service';
import { ViewMotion } from '../../models/view-motion';
/** /**
* Component for the motion comments view * Component for the motion comments view
@ -65,7 +66,18 @@ export class PersonalNoteComponent extends BaseComponent implements OnDestroy {
*/ */
private personalNoteSubscription: Subscription; private personalNoteSubscription: Subscription;
public constructor(private personalNoteService: PersonalNoteService, formBuilder: FormBuilder) { /**
* Constructor. Creates form
*
* @param personalNoteService
* @param formBuilder
* @param pdfService
*/
public constructor(
private personalNoteService: PersonalNoteService,
formBuilder: FormBuilder,
private pdfService: MotionPdfExportService
) {
super(); super();
this.personalNoteForm = formBuilder.group({ this.personalNoteForm = formBuilder.group({
note: [''] note: ['']
@ -113,4 +125,11 @@ export class PersonalNoteComponent extends BaseComponent implements OnDestroy {
this.personalNoteSubscription.unsubscribe(); this.personalNoteSubscription.unsubscribe();
} }
} }
/**
* Triggers a pdf export of the personal note
*/
public printPersonalNote(): void {
this.pdfService.exportPersonalNote(this.personalNote, this.motion);
}
} }

View File

@ -3,8 +3,9 @@ import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { CsvExportService, CsvColumnDefinitionProperty } from 'app/core/ui-services/csv-export.service'; import { CsvExportService, CsvColumnDefinitionProperty } from 'app/core/ui-services/csv-export.service';
import { ViewMotion } from '../models/view-motion';
import { FileExportService } from 'app/core/ui-services/file-export.service'; import { FileExportService } from 'app/core/ui-services/file-export.service';
import { InfoToExport } from './motion-pdf.service';
import { ViewMotion } from '../models/view-motion';
/** /**
* Exports CSVs for motions. Collect all CSV types here to have them in one place. * Exports CSVs for motions. Collect all CSV types here to have them in one place.
@ -32,7 +33,7 @@ export class MotionCsvExportService {
* @param contentToExport content properties to export * @param contentToExport content properties to export
* @param infoToExport meta info to export * @param infoToExport meta info to export
*/ */
public exportMotionList(motions: ViewMotion[], contentToExport: string[], infoToExport: string[]): void { public exportMotionList(motions: ViewMotion[], contentToExport: string[], infoToExport: InfoToExport[]): void {
const propertyList = ['identifier', 'title'].concat(contentToExport, infoToExport); const propertyList = ['identifier', 'title'].concat(contentToExport, infoToExport);
const exportProperties: CsvColumnDefinitionProperty<ViewMotion>[] = propertyList.map(option => { const exportProperties: CsvColumnDefinitionProperty<ViewMotion>[] = propertyList.map(option => {
return { property: option } as CsvColumnDefinitionProperty<ViewMotion>; return { property: option } as CsvColumnDefinitionProperty<ViewMotion>;

View File

@ -3,7 +3,7 @@ import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { ViewMotion, LineNumberingMode, ChangeRecoMode } from '../models/view-motion'; import { ViewMotion, LineNumberingMode, ChangeRecoMode } from '../models/view-motion';
import { MotionPdfService } from './motion-pdf.service'; import { MotionPdfService, InfoToExport } from './motion-pdf.service';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.service';
import { Category } from 'app/shared/models/motions/category'; import { Category } from 'app/shared/models/motions/category';
@ -52,7 +52,7 @@ export class MotionPdfCatalogService {
lnMode?: LineNumberingMode, lnMode?: LineNumberingMode,
crMode?: ChangeRecoMode, crMode?: ChangeRecoMode,
contentToExport?: string[], contentToExport?: string[],
infoToExport?: string[] infoToExport?: InfoToExport[]
): object { ): object {
let doc = []; let doc = [];
const motionDocList = []; const motionDocList = [];

View File

@ -2,11 +2,12 @@ import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { MotionPdfService } from './motion-pdf.service'; import { MotionPdfService, InfoToExport } from './motion-pdf.service';
import { PdfDocumentService } from 'app/core/ui-services/pdf-document.service'; import { PdfDocumentService } from 'app/core/ui-services/pdf-document.service';
import { ViewMotion, LineNumberingMode, ChangeRecoMode } from '../models/view-motion'; import { ViewMotion, LineNumberingMode, ChangeRecoMode } from '../models/view-motion';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.service';
import { MotionPdfCatalogService } from './motion-pdf-catalog.service'; import { MotionPdfCatalogService } from './motion-pdf-catalog.service';
import { PersonalNoteContent } from 'app/shared/models/users/personal-note';
/** /**
* Export service to handle various kind of exporting necessities. * Export service to handle various kind of exporting necessities.
@ -61,7 +62,7 @@ export class MotionPdfExportService {
lnMode?: LineNumberingMode, lnMode?: LineNumberingMode,
crMode?: ChangeRecoMode, crMode?: ChangeRecoMode,
contentToExport?: string[], contentToExport?: string[],
infoToExport?: string[] infoToExport?: InfoToExport[]
): void { ): void {
const doc = this.pdfCatalogService.motionListToDocDef(motions, lnMode, crMode, contentToExport, infoToExport); const doc = this.pdfCatalogService.motionListToDocDef(motions, lnMode, crMode, contentToExport, infoToExport);
const filename = this.translate.instant(this.configService.instant<string>('motions_export_title')); const filename = this.translate.instant(this.configService.instant<string>('motions_export_title'));
@ -84,4 +85,20 @@ export class MotionPdfExportService {
}; };
this.pdfDocumentService.downloadLandscape(doc, filename, metadata); this.pdfDocumentService.downloadLandscape(doc, filename, metadata);
} }
/**
* Exports the given personalNote with some short information about the
* motion the note refers to
*
* @param note
* @param motion
*/
public exportPersonalNote(note: PersonalNoteContent, motion: ViewMotion): void {
const doc = this.motionPdfService.textToDocDef(note.note, motion, 'Personal note');
const filename = `${motion.identifierOrTitle} - ${this.translate.instant('Personal note')}`;
const metadata = {
title: filename
};
this.pdfDocumentService.download(doc, filename, metadata);
}
} }

View File

@ -8,6 +8,12 @@ import { ConfigService } from 'app/core/ui-services/config.service';
import { ChangeRecommendationRepositoryService } from 'app/core/repositories/motions/change-recommendation-repository.service'; import { ChangeRecommendationRepositoryService } from 'app/core/repositories/motions/change-recommendation-repository.service';
import { ViewUnifiedChange } from '../models/view-unified-change'; import { ViewUnifiedChange } from '../models/view-unified-change';
import { HtmlToPdfService } from 'app/core/ui-services/html-to-pdf.service'; import { HtmlToPdfService } from 'app/core/ui-services/html-to-pdf.service';
/**
* Type declaring which strings are valid options for metainfos to be exported into a pdf
*/
export type InfoToExport = 'submitters' | 'state' | 'recommendation' | 'category' | 'block' | 'origin' | 'polls';
/** /**
* Converts a motion to pdf. Can be used from the motion detail view or executed on a list of motions * Converts a motion to pdf. Can be used from the motion detail view or executed on a list of motions
* Provides the public method `motionToDocDef(motion: Motion)` which should be convenient to use. * Provides the public method `motionToDocDef(motion: Motion)` which should be convenient to use.
@ -55,7 +61,7 @@ export class MotionPdfService {
lnMode?: LineNumberingMode, lnMode?: LineNumberingMode,
crMode?: ChangeRecoMode, crMode?: ChangeRecoMode,
contentToExport?: string[], contentToExport?: string[],
infoToExport?: string[] infoToExport?: InfoToExport[]
): object { ): object {
let motionPdfContent = []; let motionPdfContent = [];
@ -145,7 +151,7 @@ export class MotionPdfService {
* @param motion the target motion * @param motion the target motion
* @returns doc def for the meta infos * @returns doc def for the meta infos
*/ */
private createMetaInfoTable(motion: ViewMotion, crMode: ChangeRecoMode, infoToExport?: string[]): object { private createMetaInfoTable(motion: ViewMotion, crMode: ChangeRecoMode, infoToExport?: InfoToExport[]): object {
const metaTableBody = []; const metaTableBody = [];
// submitters // submitters
@ -496,4 +502,30 @@ export class MotionPdfService {
{ text: motion.motion_block ? motion.motion_block.title : '' } { text: motion.motion_block ? motion.motion_block.title : '' }
]; ];
} }
/**
* Creates pdfmake definitions for basic information about the motion and
* comments or notes
*
* @param note string optionally containing html layout
* @param motion the ViewMotion this note refers to
* @param noteTitle additional heading to be used (will be translated)
* @returns pdfMake definitions
*/
public textToDocDef(note: string, motion: ViewMotion, noteTitle: string): object {
const title = this.createTitle(motion);
const subtitle = this.createSubtitle(motion);
const metaInfo = this.createMetaInfoTable(
motion,
this.configService.instant('motions_recommendation_text_mode'),
['submitters', 'state', 'category']
);
const noteContent = this.htmlToPdfService.convertHtml(note);
const subHeading = {
text: this.translate.instant(noteTitle),
style: 'heading2'
};
return [title, subtitle, metaInfo, subHeading, noteContent];
}
} }