Merge pull request #4269 from MaximilianKrambach/notesExport
export personal note pdf
This commit is contained in:
commit
5932a8982e
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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>;
|
||||||
|
@ -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 = [];
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user