1 import {Injectable, EventEmitter, TemplateRef} from '@angular/core';
2 import {tap} from 'rxjs/operators';
3 import {StoreService} from '@eg/core/store.service';
4 import {LocaleService} from '@eg/core/locale.service';
5 import {AuthService} from '@eg/core/auth.service';
7 declare var js2JSON: (jsThing: any) => string;
10 const PRINT_TEMPLATE_PATH = '/print_template';
12 export interface PrintRequest {
13 template?: TemplateRef<any>;
14 templateName?: string;
15 templateOwner?: number; // org unit ID, follows ancestors
16 templateId?: number; // useful for testing templates
20 contentType?: string; // defaults to text/html
24 export interface PrintTemplateResponse {
30 export class PrintService {
32 onPrintRequest$: EventEmitter<PrintRequest>;
35 private locale: LocaleService,
36 private auth: AuthService,
37 private store: StoreService
39 this.onPrintRequest$ = new EventEmitter<PrintRequest>();
42 print(printReq: PrintRequest) {
43 this.onPrintRequest$.emit(printReq);
47 const prev = this.store.getLocalItem('eg.print.last_printed');
50 const req: PrintRequest = {
52 printContext: prev.context || 'default',
53 contentType: prev.content_type || 'text/html',
54 showDialog: Boolean(prev.show_dialog)
61 compileRemoteTemplate(printReq: PrintRequest): Promise<PrintTemplateResponse> {
63 const formData: FormData = new FormData();
65 formData.append('ses', this.auth.token());
66 if (printReq.templateName) {
67 formData.append('template_name', printReq.templateName);
69 if (printReq.templateId) {
70 formData.append('template_id', '' + printReq.templateId);
72 if (printReq.templateOwner) {
73 formData.append('template_owner', '' + printReq.templateOwner);
75 formData.append('template_data', js2JSON(printReq.contextData));
76 formData.append('template_locale', this.locale.currentLocaleCode());
78 // Sometimes we want to know the time zone of the browser/user,
79 // regardless of any org unit settings.
81 formData.append('client_timezone', OpenSRF.tz);
84 return new Promise((resolve, reject) => {
85 const xhttp = new XMLHttpRequest();
86 xhttp.onreadystatechange = function() {
87 if (this.readyState === 4) {
88 if (this.status === 200) {
90 content: xhttp.responseText,
91 contentType: this.getResponseHeader('content-type')
94 reject('Error compiling print template');
98 xhttp.open('POST', PRINT_TEMPLATE_PATH, true);