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
JavaScript
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=