mss-doc-viewer
Version:
A simple typehead library developed by MSS development team to be used for document viewer
98 lines • 15.5 kB
JavaScript
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