UNPKG

ngx-extended-pdf-viewer

Version:

Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.

153 lines 16.5 kB
import { Component, Input } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "./pdf-shy-button-service"; import * as i2 from "@angular/platform-browser"; import * as i3 from "@angular/common"; export class PdfShyButtonComponent { constructor(pdfShyButtonServiceService, sanitizer) { this.pdfShyButtonServiceService = pdfShyButtonServiceService; this.sanitizer = sanitizer; this.eventBusName = undefined; this.action = undefined; this.closeOnClick = true; this.onlySecondaryMenu = false; } get imageHtml() { return this._imageHtml; } set image(value) { const svgTags = [ // 'a' is not allowed! 'animate', 'animateMotion', 'animateTransform', 'audio', 'canvas', 'circle', 'clipPath', 'defs', 'desc', 'discard', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'foreignObject', 'g', 'iframe', 'image', 'line', 'linearGradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'script', 'set', 'stop', 'style', 'svg', 'switch', 'symbol', 'text', 'textPath', 'title', 'tspan', 'unknown', 'use', 'video', 'view', ]; // only <svg> and SVG tags are allowed const tags = value.split('<').filter((tag) => tag.length > 0); const legal = tags.every((tag) => tag.startsWith('svg') || tag.startsWith('/') || svgTags.includes(tag.split(/\s|>/)[0])); if (!legal) { throw new Error('Illegal image for PDFShyButton. Only SVG images are allowed. Please use only the tags <svg> and <path>. ' + value); } this._imageHtml = this.sanitizeHtml(value); } ngOnInit() { this.pdfShyButtonServiceService.add(this); } ngOnChanges(changes) { this.pdfShyButtonServiceService.update(this); } sanitizeHtml(html) { return this.sanitizer.bypassSecurityTrustHtml(html); // NOSONAR } onClick(event) { if (this.action) { this.action(); event.preventDefault(); } else if (this.eventBusName) { const PDFViewerApplication = window.PDFViewerApplication; PDFViewerApplication.eventBus.dispatch(this.eventBusName); event.preventDefault(); } } } PdfShyButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PdfShyButtonComponent, deps: [{ token: i1.PdfShyButtonService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); PdfShyButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: PdfShyButtonComponent, selector: "pdf-shy-button", inputs: { primaryToolbarId: "primaryToolbarId", secondaryMenuId: "secondaryMenuId", cssClass: "cssClass", eventBusName: "eventBusName", l10nId: "l10nId", l10nLabel: "l10nLabel", title: "title", toggled: "toggled", disabled: "disabled", order: "order", action: "action", closeOnClick: "closeOnClick", onlySecondaryMenu: "onlySecondaryMenu", image: "image" }, usesOnChanges: true, ngImport: i0, template: "<button\n *ngIf=\"!onlySecondaryMenu\"\n type=\"button\"\n [id]=\"primaryToolbarId\"\n class=\"toolbarButton\"\n [class]=\"cssClass\"\n [title]=\"title\"\n [attr.data-l10n-id]=\"l10nId\"\n [class.toggled]=\"toggled\"\n [disabled]=\"disabled\"\n [innerHTML]=\"imageHtml\"\n (click)=\"onClick($event)\"\n [attr.aria-label]=\"title\"\n role=\"button\"\n>\n <ng-content *ngIf=\"!image\" role=\"img\" aria-hidden=\"true\"></ng-content>\n <span [attr.data-l10n-id]=\"l10nLabel\">{{ title }}</span>\n</button>\n", directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PdfShyButtonComponent, decorators: [{ type: Component, args: [{ selector: 'pdf-shy-button', template: "<button\n *ngIf=\"!onlySecondaryMenu\"\n type=\"button\"\n [id]=\"primaryToolbarId\"\n class=\"toolbarButton\"\n [class]=\"cssClass\"\n [title]=\"title\"\n [attr.data-l10n-id]=\"l10nId\"\n [class.toggled]=\"toggled\"\n [disabled]=\"disabled\"\n [innerHTML]=\"imageHtml\"\n (click)=\"onClick($event)\"\n [attr.aria-label]=\"title\"\n role=\"button\"\n>\n <ng-content *ngIf=\"!image\" role=\"img\" aria-hidden=\"true\"></ng-content>\n <span [attr.data-l10n-id]=\"l10nLabel\">{{ title }}</span>\n</button>\n" }] }], ctorParameters: function () { return [{ type: i1.PdfShyButtonService }, { type: i2.DomSanitizer }]; }, propDecorators: { primaryToolbarId: [{ type: Input }], secondaryMenuId: [{ type: Input }], cssClass: [{ type: Input }], eventBusName: [{ type: Input }], l10nId: [{ type: Input }], l10nLabel: [{ type: Input }], title: [{ type: Input }], toggled: [{ type: Input }], disabled: [{ type: Input }], order: [{ type: Input }], action: [{ type: Input }], closeOnClick: [{ type: Input }], onlySecondaryMenu: [{ type: Input }], image: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNoeS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3BkZi1zaHktYnV0dG9uL3BkZi1zaHktYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvdG9vbGJhci9wZGYtc2h5LWJ1dHRvbi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7Ozs7O0FBVXBFLE1BQU0sT0FBTyxxQkFBcUI7SUFpSWhDLFlBQW9CLDBCQUErQyxFQUFVLFNBQXVCO1FBQWhGLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBcUI7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBdEg3RixpQkFBWSxHQUF1QixTQUFTLENBQUM7UUFxQjdDLFdBQU0sR0FBNkIsU0FBUyxDQUFDO1FBRzdDLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRzdCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztJQTJGNkQsQ0FBQztJQXZGeEcsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFDVyxLQUFLLENBQUMsS0FBYTtRQUM1QixNQUFNLE9BQU8sR0FBRztZQUNkLHNCQUFzQjtZQUN0QixTQUFTO1lBQ1QsZUFBZTtZQUNmLGtCQUFrQjtZQUNsQixPQUFPO1lBQ1AsUUFBUTtZQUNSLFFBQVE7WUFDUixVQUFVO1lBQ1YsTUFBTTtZQUNOLE1BQU07WUFDTixTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxlQUFlO1lBQ2YscUJBQXFCO1lBQ3JCLGFBQWE7WUFDYixrQkFB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QkFJQyxNQUFNO3NCQURaLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxPQUFPO3NCQURiLEtBQUs7Z0JBSUMsUUFBUTtzQkFEZCxLQUFLO2dCQUlDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxNQUFNO3NCQURaLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBVUssS0FBSztzQkFEZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IElQREZWaWV3ZXJBcHBsaWNhdGlvbiB9IGZyb20gJy4uLy4uL29wdGlvbnMvcGRmLXZpZXdlci1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBSZXNwb25zaXZlQ1NTQ2xhc3MgfSBmcm9tICcuLi8uLi9yZXNwb25zaXZlLXZpc2liaWxpdHknO1xuaW1wb3J0IHsgUGRmU2h5QnV0dG9uU2VydmljZSB9IGZyb20gJy4vcGRmLXNoeS1idXR0b24tc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkZi1zaHktYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BkZi1zaHktYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgUGRmU2h5QnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKVxuICBwdWJsaWMgcHJpbWFyeVRvb2xiYXJJZDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWNvbmRhcnlNZW51SWQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY3NzQ2xhc3M6IFJlc3BvbnNpdmVDU1NDbGFzcztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZXZlbnRCdXNOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGwxMG5JZDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsMTBuTGFiZWw6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdG9nZ2xlZDogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIG9yZGVyOiBudW1iZXI7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFjdGlvbjogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjbG9zZU9uQ2xpY2s6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvbmx5U2Vjb25kYXJ5TWVudTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2ltYWdlSHRtbDogU2FmZUh0bWw7XG5cbiAgcHVibGljIGdldCBpbWFnZUh0bWwoKTogU2FmZUh0bWwge1xuICAgIHJldHVybiB0aGlzLl9pbWFnZUh0bWw7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGltYWdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdmdUYWdzID0gW1xuICAgICAgLy8gJ2EnIGlzIG5vdCBhbGxvd2VkIVxuICAgICAgJ2FuaW1hdGUnLFxuICAgICAgJ2FuaW1hdGVNb3Rpb24nLFxuICAgICAgJ2FuaW1hdGVUcmFuc2Zvcm0nLFxuICAgICAgJ2F1ZGlvJyxcbiAgICAgICdjYW52YXMnLFxuICAgICAgJ2NpcmNsZScsXG4gICAgICAnY2xpcFBhdGgnLFxuICAgICAgJ2RlZnMnLFxuICAgICAgJ2Rlc2MnLFxuICAgICAgJ2Rpc2NhcmQnLFxuICAgICAgJ2VsbGlwc2UnLFxuICAgICAgJ2ZlQmxlbmQnLFxuICAgICAgJ2ZlQ29sb3JNYXRyaXgnLFxuICAgICAgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLFxuICAgICAgJ2ZlQ29tcG9zaXRlJyxcbiAgICAgICdmZUNvbnZvbHZlTWF0cml4JyxcbiAgICAgICdmZURpZmZ1c2VMaWdodGluZycsXG4gICAgICAnZmVEaXNwbGFjZW1lbnRNYXAnLFxuICAgICAgJ2ZlRGlzdGFudExpZ2h0JyxcbiAgICAgICdmZURyb3BTaGFkb3cnLFxuICAgICAgJ2ZlRmxvb2QnLFxuICAgICAgJ2ZlRnVuY0EnLFxuICAgICAgJ2ZlRnVuY0InLFxuICAgICAgJ2ZlRnVuY0cnLFxuICAgICAgJ2ZlRnVuY1InLFxuICAgICAgJ2ZlR2F1c3NpYW5CbHVyJyxcbiAgICAgICdmZUltYWdlJyxcbiAgICAgICdmZU1lcmdlJyxcbiAgICAgICdmZU1lcmdlTm9kZScsXG4gICAgICAnZmVNb3JwaG9sb2d5JyxcbiAgICAgICdmZU9mZnNldCcsXG4gICAgICAnZmVQb2ludExpZ2h0JyxcbiAgICAgICdmZVNwZWN1bGFyTGlnaHRpbmcnLFxuICAgICAgJ2ZlU3BvdExpZ2h0JyxcbiAgICAgICdmZVRpbGUnLFxuICAgICAgJ2ZlVHVyYnVsZW5jZScsXG4gICAgICAnZmlsdGVyJyxcbiAgICAgICdmb3JlaWduT2JqZWN0JyxcbiAgICAgICdnJyxcbiAgICAgICdpZnJhbWUnLFxuICAgICAgJ2ltYWdlJyxcbiAgICAgICdsaW5lJyxcbiAgICAgICdsaW5lYXJHcmFkaWVudCcsXG4gICAgICAnbWFya2VyJyxcbiAgICAgICdtYXNrJyxcbiAgICAgICdtZXRhZGF0YScsXG4gICAgICAnbXBhdGgnLFxuICAgICAgJ3BhdGgnLFxuICAgICAgJ3BhdHRlcm4nLFxuICAgICAgJ3BvbHlnb24nLFxuICAgICAgJ3BvbHlsaW5lJyxcbiAgICAgICdyYWRpYWxHcmFkaWVudCcsXG4gICAgICAncmVjdCcsXG4gICAgICAnc2NyaXB0JyxcbiAgICAgICdzZXQnLFxuICAgICAgJ3N0b3AnLFxuICAgICAgJ3N0eWxlJyxcbiAgICAgICdzdmcnLFxuICAgICAgJ3N3aXRjaCcsXG4gICAgICAnc3ltYm9sJyxcbiAgICAgICd0ZXh0JyxcbiAgICAgICd0ZXh0UGF0aCcsXG4gICAgICAndGl0bGUnLFxuICAgICAgJ3RzcGFuJyxcbiAgICAgICd1bmtub3duJyxcbiAgICAgICd1c2UnLFxuICAgICAgJ3ZpZGVvJyxcbiAgICAgICd2aWV3JyxcbiAgICBdO1xuXG4gICAgLy8gb25seSA8c3ZnPiBhbmQgU1ZHIHRhZ3MgYXJlIGFsbG93ZWRcbiAgICBjb25zdCB0YWdzID0gdmFsdWUuc3BsaXQoJzwnKS5maWx0ZXIoKHRhZykgPT4gdGFnLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGxlZ2FsID0gdGFncy5ldmVyeSgodGFnKSA9PiB0YWcuc3RhcnRzV2l0aCgnc3ZnJykgfHwgdGFnLnN0YXJ0c1dpdGgoJy8nKSB8fCBzdmdUYWdzLmluY2x1ZGVzKHRhZy5zcGxpdCgvXFxzfD4vKVswXSkpO1xuICAgIGlmICghbGVnYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBpbWFnZSBmb3IgUERGU2h5QnV0dG9uLiBPbmx5IFNWRyBpbWFnZXMgYXJlIGFsbG93ZWQuIFBsZWFzZSB1c2Ugb25seSB0aGUgdGFncyA8c3ZnPiBhbmQgPHBhdGg+LiAnICsgdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9pbWFnZUh0bWwgPSB0aGlzLnNhbml0aXplSHRtbCh2YWx1ZSk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBkZlNoeUJ1dHRvblNlcnZpY2VTZXJ2aWNlOiBQZGZTaHlCdXR0b25TZXJ2aWNlLCBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7fVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBkZlNoeUJ1dHRvblNlcnZpY2VTZXJ2aWNlLmFkZCh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnBkZlNoeUJ1dHRvblNlcnZpY2VTZXJ2aWNlLnVwZGF0ZSh0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2FuaXRpemVIdG1sKGh0bWw6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoaHRtbCk7IC8vIE5PU09OQVJcbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGlvbikge1xuICAgICAgdGhpcy5hY3Rpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50QnVzTmFtZSkge1xuICAgICAgY29uc3QgUERGVmlld2VyQXBwbGljYXRpb246IElQREZWaWV3ZXJBcHBsaWNhdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5QREZWaWV3ZXJBcHBsaWNhdGlvbjtcbiAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLmRpc3BhdGNoKHRoaXMuZXZlbnRCdXNOYW1lKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG59XG4iLCI8YnV0dG9uXG4gICpuZ0lmPVwiIW9ubHlTZWNvbmRhcnlNZW51XCJcbiAgdHlwZT1cImJ1dHRvblwiXG4gIFtpZF09XCJwcmltYXJ5VG9vbGJhcklkXCJcbiAgY2xhc3M9XCJ0b29sYmFyQnV0dG9uXCJcbiAgW2NsYXNzXT1cImNzc0NsYXNzXCJcbiAgW3RpdGxlXT1cInRpdGxlXCJcbiAgW2F0dHIuZGF0YS1sMTBuLWlkXT1cImwxMG5JZFwiXG4gIFtjbGFzcy50b2dnbGVkXT1cInRvZ2dsZWRcIlxuICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbaW5uZXJIVE1MXT1cImltYWdlSHRtbFwiXG4gIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cInRpdGxlXCJcbiAgcm9sZT1cImJ1dHRvblwiXG4+XG4gIDxuZy1jb250ZW50ICpuZ0lmPVwiIWltYWdlXCIgcm9sZT1cImltZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvbmctY29udGVudD5cbiAgPHNwYW4gW2F0dHIuZGF0YS1sMTBuLWlkXT1cImwxMG5MYWJlbFwiPnt7IHRpdGxlIH19PC9zcGFuPlxuPC9idXR0b24+XG4iXX0=