UNPKG

mss-doc-viewer

Version:

A simple typehead library developed by MSS development team to be used for document viewer

98 lines 15.5 kB
import { Component, Input, ViewChild, ViewContainerRef } from '@angular/core'; import { DocViewerComponent } from './dynamic-viewers/doc-viewer/doc-viewer.component'; import { SupportedDocuments } from './_helpers/supported-documents'; import * as i0 from "@angular/core"; import * as i1 from "./mss-doc-viewer.service"; import * as i2 from "@angular/common"; export class MssDocViewerComponent { constructor(cd, _doc_viewer) { this.cd = cd; this._doc_viewer = _doc_viewer; this.document = { url: "" }; this.documents = []; this.apiDoc = null; this.activeDoc = { url: '' }; } ngOnChanges(changes) { if (changes && this.dynamicViewerContainer) { this.getDocument(this.documents[0]); } } ngAfterViewInit() { this.getDocument(this.documents[0]); } ngOnInit() { } getDocument(doc) { this.activeDoc = doc; this._doc_viewer.getDocument(doc) .subscribe({ next: (res) => { this.apiDoc = res; this.registerDynamicViewer(res); }, error: (err) => { console.error({ err }); this.registerDynamicViewer({ type: this.get_url_extension(doc.url) }); } }); } get_url_extension(url) { return url.split('.').pop(); } get_filename(url) { return url.substring(url.lastIndexOf('/') + 1); } registerDynamicViewer(doc) { console.log({ registerDynamicViewer: doc }); this.dynamicViewerContainer.clear(); const componentInstance = this.getComponentByType(doc?.type); const dynamicComponent = this.dynamicViewerContainer.createComponent(componentInstance); dynamicComponent.setInput('document', this.activeDoc); this.cd.detectChanges(); } getComponentByType(type) { console.log({ type }); let componentDynamic = SupportedDocuments.find(c => c.type?.includes(type)); console.log({ componentDynamic }); return componentDynamic?.component || DocViewerComponent; } download(uri) { this._doc_viewer .downloadDoc(uri) .subscribe(blob => { const a = document.createElement('a'); const objectUrl = URL.createObjectURL(blob); a.href = objectUrl; a.download = this.get_filename(uri) || 'doc'; a.click(); URL.revokeObjectURL(objectUrl); }); } print(url) { const printWindow = window.open(url, '_blank', 'height=400,width=600'); console.log({ printWindow }); setTimeout(() => { console.log({ printWindow }); if (printWindow) printWindow.onload = function () { printWindow?.print(); printWindow?.close(); }; }, 500); } } MssDocViewerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: MssDocViewerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.MssDocViewerService }], target: i0.ɵɵFactoryTarget.Component }); MssDocViewerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: MssDocViewerComponent, selector: "lib-mss-doc-viewer", inputs: { document: "document", documents: "documents" }, viewQueries: [{ propertyName: "dynamicViewerContainer", first: true, predicate: ["dynamicViewerContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"mss-doc-container\">\r\n <div class=\"actions-container\">\r\n <a *ngIf=\"activeDoc?.download\" (click)=\"download(activeDoc.url)\">\r\n Download\r\n </a>\r\n <a *ngIf=\"activeDoc?.print\" (click)=\"print(activeDoc.url)\">\r\n Print\r\n </a>\r\n </div>\r\n <div *ngIf=\"documents.length>1\" class=\"documents-list-container\">\r\n <div *ngFor=\"let doc of documents\" (click)=\"getDocument(doc)\" class=\"document-item\">\r\n {{doc.url}}\r\n </div>\r\n </div>\r\n <ng-container #dynamicViewerContainer>\r\n </ng-container>\r\n</div>", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: MssDocViewerComponent, decorators: [{ type: Component, args: [{ selector: 'lib-mss-doc-viewer', template: "<div class=\"mss-doc-container\">\r\n <div class=\"actions-container\">\r\n <a *ngIf=\"activeDoc?.download\" (click)=\"download(activeDoc.url)\">\r\n Download\r\n </a>\r\n <a *ngIf=\"activeDoc?.print\" (click)=\"print(activeDoc.url)\">\r\n Print\r\n </a>\r\n </div>\r\n <div *ngIf=\"documents.length>1\" class=\"documents-list-container\">\r\n <div *ngFor=\"let doc of documents\" (click)=\"getDocument(doc)\" class=\"document-item\">\r\n {{doc.url}}\r\n </div>\r\n </div>\r\n <ng-container #dynamicViewerContainer>\r\n </ng-container>\r\n</div>" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.MssDocViewerService }]; }, propDecorators: { dynamicViewerContainer: [{ type: ViewChild, args: ['dynamicViewerContainer', { read: ViewContainerRef }] }], document: [{ type: Input }], documents: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNzLWRvYy12aWV3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbXNzLWRvYy12aWV3ZXIvc3JjL2xpYi9tc3MtZG9jLXZpZXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tc3MtZG9jLXZpZXdlci9zcmMvbGliL21zcy1kb2Mtdmlld2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLEtBQUssRUFBb0MsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xKLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBR3ZGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7O0FBUXBFLE1BQU0sT0FBTyxxQkFBcUI7SUFPaEMsWUFBb0IsRUFBcUIsRUFBVSxXQUFnQztRQUEvRCxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUoxRSxhQUFRLEdBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUE7UUFDaEMsY0FBUyxHQUFlLEVBQUUsQ0FBQTtRQUNuQyxXQUFNLEdBQVEsSUFBSSxDQUFBO1FBQ2xCLGNBQVMsR0FBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQTtJQUNzRCxDQUFDO0lBR3hGLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDcEM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFB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Q0FBQztJQUNELEtBQUssQ0FBQyxHQUFXO1FBQ2YsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFDNUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO1lBQzVCLElBQUksV0FBVztnQkFBRSxXQUFXLENBQUMsTUFBTSxHQUFHO29CQUNwQyxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7b0JBQ3JCLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQzs7bUhBbkZVLHFCQUFxQjt1R0FBckIscUJBQXFCLGlPQUVhLGdCQUFnQixrRENkL0QsZ29CQWdCTTs0RkRKTyxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0Usb0JBQW9COzBJQU9tQyxzQkFBc0I7c0JBQXRGLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ3RELFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb2NWaWV3ZXJDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtdmlld2Vycy9kb2Mtdmlld2VyL2RvYy12aWV3ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1zc0RvY1ZpZXdlclNlcnZpY2UgfSBmcm9tICcuL21zcy1kb2Mtdmlld2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuL19oZWxwZXJzL2RvY3VtZW50Lm1vZGVsJztcbmltcG9ydCB7IFN1cHBvcnRlZERvY3VtZW50cyB9IGZyb20gJy4vX2hlbHBlcnMvc3VwcG9ydGVkLWRvY3VtZW50cyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1tc3MtZG9jLXZpZXdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tc3MtZG9jLXZpZXdlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIE1zc0RvY1ZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcblxuICBAVmlld0NoaWxkKCdkeW5hbWljVmlld2VyQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGR5bmFtaWNWaWV3ZXJDb250YWluZXIhOiBWaWV3Q29udGFpbmVyUmVmO1xuICBASW5wdXQoKSBkb2N1bWVudDogRG9jdW1lbnQgPSB7IHVybDogXCJcIiB9XG4gIEBJbnB1dCgpIGRvY3VtZW50czogRG9jdW1lbnRbXSA9IFtdXG4gIGFwaURvYzogYW55ID0gbnVsbFxuICBhY3RpdmVEb2M6IERvY3VtZW50ID0geyB1cmw6ICcnIH1cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgX2RvY192aWV3ZXI6IE1zc0RvY1ZpZXdlclNlcnZpY2UpIHsgfVxuXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzICYmIHRoaXMuZHluYW1pY1ZpZXdlckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5nZXREb2N1bWVudCh0aGlzLmRvY3VtZW50c1swXSlcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXREb2N1bWVudCh0aGlzLmRvY3VtZW50c1swXSlcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgZ2V0RG9jdW1lbnQoZG9jOiBEb2N1bWVudCkge1xuICAgIHRoaXMuYWN0aXZlRG9jID0gZG9jXG4gICAgdGhpcy5fZG9jX3ZpZXdlci5nZXREb2N1bWVudChkb2MpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgIHRoaXMuYXBpRG9jID0gcmVzXG4gICAgICAgICAgdGhpcy5yZWdpc3RlckR5bmFtaWNWaWV3ZXIocmVzKVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoeyBlcnIgfSlcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyRHluYW1pY1ZpZXdlcih7IHR5cGU6IHRoaXMuZ2V0X3VybF9leHRlbnNpb24oZG9jLnVybCkgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxuXG4gIGdldF91cmxfZXh0ZW5zaW9uKHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVybC5zcGxpdCgnLicpLnBvcCgpXG4gIH1cbiAgZ2V0X2ZpbGVuYW1lKHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckR5bmFtaWNWaWV3ZXIoZG9jOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZyh7IHJlZ2lzdGVyRHluYW1pY1ZpZXdlcjogZG9jIH0pXG4gICAgdGhpcy5keW5hbWljVmlld2VyQ29udGFpbmVyLmNsZWFyKCk7XG4gICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLmdldENvbXBvbmVudEJ5VHlwZShkb2M/LnR5cGUpXG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudCA9IHRoaXMuZHluYW1pY1ZpZXdlckNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UpXG4gICAgZHluYW1pY0NvbXBvbmVudC5zZXRJbnB1dCgnZG9jdW1lbnQnLCB0aGlzLmFjdGl2ZURvYyk7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXRDb21wb25lbnRCeVR5cGUodHlwZTogc3RyaW5nKTogYW55IHtcbiAgICBjb25zb2xlLmxvZyh7IHR5cGUgfSlcbiAgICBsZXQgY29tcG9uZW50RHluYW1pYyA9IFN1cHBvcnRlZERvY3VtZW50cy5maW5kKGMgPT4gYy50eXBlPy5pbmNsdWRlcyh0eXBlKSk7XG4gICAgY29uc29sZS5sb2coeyBjb21wb25lbnREeW5hbWljIH0pXG4gICAgcmV0dXJuIGNvbXBvbmVudER5bmFtaWM/LmNvbXBvbmVudCB8fCBEb2NWaWV3ZXJDb21wb25lbnQ7XG4gIH1cblxuICBkb3dubG9hZCh1cmk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2RvY192aWV3ZXJcbiAgICAgIC5kb3dubG9hZERvYyh1cmkpXG4gICAgICAuc3Vic2NyaWJlKGJsb2IgPT4ge1xuICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgICAgYS5ocmVmID0gb2JqZWN0VXJsXG4gICAgICAgIGEuZG93bmxvYWQgPSB0aGlzLmdldF9maWxlbmFtZSh1cmkpIHx8ICdkb2MnO1xuICAgICAgICBhLmNsaWNrKCk7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwob2JqZWN0VXJsKTtcbiAgICAgIH0pXG4gIH1cbiAgcHJpbnQodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwcmludFdpbmRvdyA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycsICdoZWlnaHQ9NDAwLHdpZHRoPTYwMCcpO1xuICAgIGNvbnNvbGUubG9nKHsgcHJpbnRXaW5kb3cgfSlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKHsgcHJpbnRXaW5kb3cgfSlcbiAgICAgIGlmIChwcmludFdpbmRvdykgcHJpbnRXaW5kb3cub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwcmludFdpbmRvdz8ucHJpbnQoKTtcbiAgICAgICAgcHJpbnRXaW5kb3c/LmNsb3NlKCk7XG4gICAgICB9O1xuICAgIH0sIDUwMCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtc3MtZG9jLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGEgKm5nSWY9XCJhY3RpdmVEb2M/LmRvd25sb2FkXCIgKGNsaWNrKT1cImRvd25sb2FkKGFjdGl2ZURvYy51cmwpXCI+XHJcbiAgICAgICAgICAgIERvd25sb2FkXHJcbiAgICAgICAgPC9hPlxyXG4gICAgICAgIDxhICpuZ0lmPVwiYWN0aXZlRG9jPy5wcmludFwiIChjbGljayk9XCJwcmludChhY3RpdmVEb2MudXJsKVwiPlxyXG4gICAgICAgICAgICBQcmludFxyXG4gICAgICAgIDwvYT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImRvY3VtZW50cy5sZW5ndGg+MVwiIGNsYXNzPVwiZG9jdW1lbnRzLWxpc3QtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZG9jIG9mIGRvY3VtZW50c1wiIChjbGljayk9XCJnZXREb2N1bWVudChkb2MpXCIgY2xhc3M9XCJkb2N1bWVudC1pdGVtXCI+XHJcbiAgICAgICAgICAgIHt7ZG9jLnVybH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy1jb250YWluZXIgI2R5bmFtaWNWaWV3ZXJDb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+Il19