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.
165 lines • 17.1 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 {
pdfShyButtonServiceService;
sanitizer;
primaryToolbarId;
secondaryMenuId;
cssClass;
eventBusName = undefined;
l10nId;
l10nLabel;
title;
toggled;
disabled;
order;
action = undefined;
closeOnClick = true;
onlySecondaryMenu = false;
_imageHtml;
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);
}
constructor(pdfShyButtonServiceService, sanitizer) {
this.pdfShyButtonServiceService = pdfShyButtonServiceService;
this.sanitizer = sanitizer;
}
ngOnInit() {
this.pdfShyButtonServiceService.add(this);
}
ngOnChanges(changes) {
this.pdfShyButtonServiceService.update(this);
}
sanitizeHtml(html) {
return this.sanitizer.bypassSecurityTrustHtml(html); // NOSONAR
}
onClick(htmlEvent) {
if (this.action) {
this.action(htmlEvent, false);
htmlEvent.preventDefault();
}
else if (this.eventBusName) {
const PDFViewerApplication = window.PDFViewerApplication;
PDFViewerApplication.eventBus.dispatch(this.eventBusName);
htmlEvent.preventDefault();
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: PdfShyButtonComponent, deps: [{ token: i1.PdfShyButtonService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", 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", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", 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: () => [{ 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNoeS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3BkZi1zaHktYnV0dG9uL3BkZi1zaHktYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvdG9vbGJhci9wZGYtc2h5LWJ1dHRvbi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7Ozs7O0FBVXBFLE1BQU0sT0FBTyxxQkFBcUI7SUFpSVo7SUFBeUQ7SUEvSHRFLGdCQUFnQixDQUFTO0lBR3pCLGVBQWUsQ0FBUztJQUd4QixRQUFRLENBQXFCO0lBRzdCLFlBQVksR0FBdUIsU0FBUyxDQUFDO0lBRzdDLE1BQU0sQ0FBUztJQUdmLFNBQVMsQ0FBUztJQUdsQixLQUFLLENBQVM7SUFHZCxPQUFPLENBQVU7SUFHakIsUUFBUSxDQUFVO0lBR2xCLEtBQUssQ0FBUztJQUdkLE1BQU0sR0FBMEUsU0FBUyxDQUFDO0lBRzFGLFlBQVksR0FBWSxJQUFJLENBQUM7SUFHN0IsaUJBQWlCLEdBQVksS0FBSyxDQUFDO0lBRWxDLFVBQVUsQ0FBVztJQUU3QixJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUNXLEtBQUssQ0FBQyxLQUFhO1FBQzVCLE1BQU0sT0FBTyxHQUFHO1lBQ2Qsc0JBQXNCO1lBQ3RCLFNBQVM7WUFDVCxlQUFlO1lBQ2Ysa0JBQWtCO1lBQ2xCLE9BQU87WUFDUCxRQUFRO1lBQ1IsUUFBUTtZQUNSLFVBQVU7WUFDVixNQUFNO1lBQ04sTUFBTTtZQUNO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SUFDSCxDQUFDO3VHQXhKVSxxQkFBcUI7MkZBQXJCLHFCQUFxQixpYkNWbEMseWdCQWtCQTs7MkZEUmEscUJBQXFCO2tCQUpqQyxTQUFTOytCQUNFLGdCQUFnQjttSEFLbkIsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsUUFBUTtzQkFEZCxLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsTUFBTTtzQkFEWixLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQUlDLFFBQVE7c0JBRGQsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsTUFBTTtzQkFEWixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQVVLLEtBQUs7c0JBRGYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBJUERGVmlld2VyQXBwbGljYXRpb24gfSBmcm9tICcuLi8uLi9vcHRpb25zL3BkZi12aWV3ZXItYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgUmVzcG9uc2l2ZUNTU0NsYXNzIH0gZnJvbSAnLi4vLi4vcmVzcG9uc2l2ZS12aXNpYmlsaXR5JztcbmltcG9ydCB7IFBkZlNoeUJ1dHRvblNlcnZpY2UgfSBmcm9tICcuL3BkZi1zaHktYnV0dG9uLXNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZGYtc2h5LWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFBkZlNoeUJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KClcbiAgcHVibGljIHByaW1hcnlUb29sYmFySWQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2Vjb25kYXJ5TWVudUlkOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNzc0NsYXNzOiBSZXNwb25zaXZlQ1NTQ2xhc3M7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGV2ZW50QnVzTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsMTBuSWQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbDEwbkxhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRvZ2dsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvcmRlcjogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhY3Rpb246ICgoaHRtbEV2ZW50PzogRXZlbnQsIGlzU2Vjb25kYXJ5TWVudWU/OiBib29sZWFuKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY2xvc2VPbkNsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgb25seVNlY29uZGFyeU1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9pbWFnZUh0bWw6IFNhZmVIdG1sO1xuXG4gIHB1YmxpYyBnZXQgaW1hZ2VIdG1sKCk6IFNhZmVIdG1sIHtcbiAgICByZXR1cm4gdGhpcy5faW1hZ2VIdG1sO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbWFnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ZnVGFncyA9IFtcbiAgICAgIC8vICdhJyBpcyBub3QgYWxsb3dlZCFcbiAgICAgICdhbmltYXRlJyxcbiAgICAgICdhbmltYXRlTW90aW9uJyxcbiAgICAgICdhbmltYXRlVHJhbnNmb3JtJyxcbiAgICAgICdhdWRpbycsXG4gICAgICAnY2FudmFzJyxcbiAgICAgICdjaXJjbGUnLFxuICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICdkZWZzJyxcbiAgICAgICdkZXNjJyxcbiAgICAgICdkaXNjYXJkJyxcbiAgICAgICdlbGxpcHNlJyxcbiAgICAgICdmZUJsZW5kJyxcbiAgICAgICdmZUNvbG9yTWF0cml4JyxcbiAgICAgICdmZUNvbXBvbmVudFRyYW5zZmVyJyxcbiAgICAgICdmZUNvbXBvc2l0ZScsXG4gICAgICAnZmVDb252b2x2ZU1hdHJpeCcsXG4gICAgICAnZmVEaWZmdXNlTGlnaHRpbmcnLFxuICAgICAgJ2ZlRGlzcGxhY2VtZW50TWFwJyxcbiAgICAgICdmZURpc3RhbnRMaWdodCcsXG4gICAgICAnZmVEcm9wU2hhZG93JyxcbiAgICAgICdmZUZsb29kJyxcbiAgICAgICdmZUZ1bmNBJyxcbiAgICAgICdmZUZ1bmNCJyxcbiAgICAgICdmZUZ1bmNHJyxcbiAgICAgICdmZUZ1bmNSJyxcbiAgICAgICdmZUdhdXNzaWFuQmx1cicsXG4gICAgICAnZmVJbWFnZScsXG4gICAgICAnZmVNZXJnZScsXG4gICAgICAnZmVNZXJnZU5vZGUnLFxuICAgICAgJ2ZlTW9ycGhvbG9neScsXG4gICAgICAnZmVPZmZzZXQnLFxuICAgICAgJ2ZlUG9pbnRMaWdodCcsXG4gICAgICAnZmVTcGVjdWxhckxpZ2h0aW5nJyxcbiAgICAgICdmZVNwb3RMaWdodCcsXG4gICAgICAnZmVUaWxlJyxcbiAgICAgICdmZVR1cmJ1bGVuY2UnLFxuICAgICAgJ2ZpbHRlcicsXG4gICAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgICAnZycsXG4gICAgICAnaWZyYW1lJyxcbiAgICAgICdpbWFnZScsXG4gICAgICAnbGluZScsXG4gICAgICAnbGluZWFyR3JhZGllbnQnLFxuICAgICAgJ21hcmtlcicsXG4gICAgICAnbWFzaycsXG4gICAgICAnbWV0YWRhdGEnLFxuICAgICAgJ21wYXRoJyxcbiAgICAgICdwYXRoJyxcbiAgICAgICdwYXR0ZXJuJyxcbiAgICAgICdwb2x5Z29uJyxcbiAgICAgICdwb2x5bGluZScsXG4gICAgICAncmFkaWFsR3JhZGllbnQnLFxuICAgICAgJ3JlY3QnLFxuICAgICAgJ3NjcmlwdCcsXG4gICAgICAnc2V0JyxcbiAgICAgICdzdG9wJyxcbiAgICAgICdzdHlsZScsXG4gICAgICAnc3ZnJyxcbiAgICAgICdzd2l0Y2gnLFxuICAgICAgJ3N5bWJvbCcsXG4gICAgICAndGV4dCcsXG4gICAgICAndGV4dFBhdGgnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICd0c3BhbicsXG4gICAgICAndW5rbm93bicsXG4gICAgICAndXNlJyxcbiAgICAgICd2aWRlbycsXG4gICAgICAndmlldycsXG4gICAgXTtcblxuICAgIC8vIG9ubHkgPHN2Zz4gYW5kIFNWRyB0YWdzIGFyZSBhbGxvd2VkXG4gICAgY29uc3QgdGFncyA9IHZhbHVlLnNwbGl0KCc8JykuZmlsdGVyKCh0YWcpID0+IHRhZy5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBsZWdhbCA9IHRhZ3MuZXZlcnkoKHRhZykgPT4gdGFnLnN0YXJ0c1dpdGgoJ3N2ZycpIHx8IHRhZy5zdGFydHNXaXRoKCcvJykgfHwgc3ZnVGFncy5pbmNsdWRlcyh0YWcuc3BsaXQoL1xcc3w+LylbMF0pKTtcbiAgICBpZiAoIWxlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgaW1hZ2UgZm9yIFBERlNoeUJ1dHRvbi4gT25seSBTVkcgaW1hZ2VzIGFyZSBhbGxvd2VkLiBQbGVhc2UgdXNlIG9ubHkgdGhlIHRhZ3MgPHN2Zz4gYW5kIDxwYXRoPi4gJyArIHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5faW1hZ2VIdG1sID0gdGhpcy5zYW5pdGl6ZUh0bWwodmFsdWUpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwZGZTaHlCdXR0b25TZXJ2aWNlU2VydmljZTogUGRmU2h5QnV0dG9uU2VydmljZSwgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wZGZTaHlCdXR0b25TZXJ2aWNlU2VydmljZS5hZGQodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wZGZTaHlCdXR0b25TZXJ2aWNlU2VydmljZS51cGRhdGUodGhpcyk7XG4gIH1cblxuICBwcml2YXRlIHNhbml0aXplSHRtbChodG1sOiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpOyAvLyBOT1NPTkFSXG4gIH1cblxuICBwdWJsaWMgb25DbGljayhodG1sRXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aW9uKSB7XG4gICAgICB0aGlzLmFjdGlvbihodG1sRXZlbnQsIGZhbHNlKTtcbiAgICAgIGh0bWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudEJ1c05hbWUpIHtcbiAgICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gPSAod2luZG93IGFzIGFueSkuUERGVmlld2VyQXBwbGljYXRpb247XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5kaXNwYXRjaCh0aGlzLmV2ZW50QnVzTmFtZSk7XG4gICAgICBodG1sRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxidXR0b25cbiAgKm5nSWY9XCIhb25seVNlY29uZGFyeU1lbnVcIlxuICB0eXBlPVwiYnV0dG9uXCJcbiAgW2lkXT1cInByaW1hcnlUb29sYmFySWRcIlxuICBjbGFzcz1cInRvb2xiYXJCdXR0b25cIlxuICBbY2xhc3NdPVwiY3NzQ2xhc3NcIlxuICBbdGl0bGVdPVwidGl0bGVcIlxuICBbYXR0ci5kYXRhLWwxMG4taWRdPVwibDEwbklkXCJcbiAgW2NsYXNzLnRvZ2dsZWRdPVwidG9nZ2xlZFwiXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIFtpbm5lckhUTUxdPVwiaW1hZ2VIdG1sXCJcbiAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwidGl0bGVcIlxuICByb2xlPVwiYnV0dG9uXCJcbj5cbiAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhaW1hZ2VcIiByb2xlPVwiaW1nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9uZy1jb250ZW50PlxuICA8c3BhbiBbYXR0ci5kYXRhLWwxMG4taWRdPVwibDEwbkxhYmVsXCI+e3sgdGl0bGUgfX08L3NwYW4+XG48L2J1dHRvbj5cbiJdfQ==