@eternalheart/ngx-file-preview
Version:
A powerful Angular file preview component library supporting multiple file formats including images, videos, PDFs, Office documents, text files and more.
132 lines • 18.5 kB
JavaScript
import { Directive, EventEmitter, Input, Output } from '@angular/core';
import { FileReaderService, PreviewService, ThemeService } from '../services';
import { PreviewUtils } from '../utils';
import { fromEvent, merge, Subject, timer } from 'rxjs';
import { filter, switchMap, takeUntil, tap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "../services";
export class PreviewDirective {
get themeMode() {
return this._themeMode;
}
set themeMode(value) {
this._themeMode = value;
this.themeService.setMode(this.themeMode);
if (this.themeMode === 'auto' && this.autoConfig) {
this.themeService.setAutoConfig(this.autoConfig);
}
}
get lang() {
return this._lang;
}
set lang(value) {
this._lang = value;
this.previewService.setLang(value);
}
t(key, ...args) {
return this.previewService?.getLangParser()?.t(key, ...args);
}
constructor(previewService, themeService, injector, envInjector, elementRef) {
this.previewService = previewService;
this.themeService = themeService;
this.injector = injector;
this.envInjector = envInjector;
this.elementRef = elementRef;
this.previewIndex = 0;
this.trigger = 'click'; // 默认触发方式
this._themeMode = 'auto';
this._lang = 'zh';
this.previewEvent = new EventEmitter();
this.destroy$ = new Subject();
this.isLongPressing = false;
this.previewService.init(this.injector, this.envInjector);
this.element = this.elementRef.nativeElement;
}
ngOnInit() {
this.setupTriggers();
}
setupTriggers() {
const triggers = this.trigger.split(',').map(t => t.trim());
const observables = triggers.map(trigger => {
const [eventName, param] = trigger.split(':');
switch (eventName) {
case 'click':
return fromEvent(this.element, 'click');
case 'contextmenu':
return fromEvent(this.element, 'contextmenu').pipe(tap(e => e.preventDefault()));
case 'dblclick':
return fromEvent(this.element, 'dblclick');
case 'longpress':
const duration = parseInt(param) || 800;
return fromEvent(this.element, 'mousedown').pipe(switchMap(() => timer(duration).pipe(takeUntil(fromEvent(document, 'mouseup')))));
case 'hover':
const delay = parseInt(param) || 500;
return fromEvent(this.element, 'mouseenter').pipe(switchMap(() => timer(delay).pipe(takeUntil(fromEvent(this.element, 'mouseleave')))));
case 'keydown':
return fromEvent(this.element, 'keydown').pipe(filter(e => !param || e.key === param));
default:
return fromEvent(this.element, 'click');
}
});
merge(...observables)
.pipe(takeUntil(this.destroy$))
.subscribe(() => this.preview());
}
preview() {
if (!this.fileInput)
return;
const files = PreviewUtils.normalizeFiles(this.fileInput);
if (files.length > 0) {
this.previewService.open({
files,
index: this.previewIndex,
themeMode: this.themeMode,
autoThemeConfig: this.autoConfig
});
}
else {
this.previewEvent.emit({ type: 'error', message: this.t('preview.error.noFiles') });
}
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
// 清理由 createObjectURL 创建的 URL
if (this.fileInput instanceof File) {
URL.revokeObjectURL(PreviewUtils.normalizeFile(this.fileInput).url);
}
else if (Array.isArray(this.fileInput)) {
this.fileInput.forEach(item => {
if (item instanceof File) {
URL.revokeObjectURL(PreviewUtils.normalizeFile(item).url);
}
});
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PreviewDirective, deps: [{ token: i1.PreviewService }, { token: i1.ThemeService }, { token: i0.Injector }, { token: i0.EnvironmentInjector }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: PreviewDirective, isStandalone: true, selector: "[ngxFilePreview]", inputs: { fileInput: ["ngxFilePreview", "fileInput"], previewIndex: "previewIndex", trigger: "trigger", themeMode: "themeMode", autoConfig: "autoConfig", lang: "lang" }, outputs: { previewEvent: "previewEvent" }, providers: [PreviewService, ThemeService, FileReaderService], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PreviewDirective, decorators: [{
type: Directive,
args: [{
selector: '[ngxFilePreview]',
standalone: true,
providers: [PreviewService, ThemeService, FileReaderService]
}]
}], ctorParameters: () => [{ type: i1.PreviewService }, { type: i1.ThemeService }, { type: i0.Injector }, { type: i0.EnvironmentInjector }, { type: i0.ElementRef }], propDecorators: { fileInput: [{
type: Input,
args: ['ngxFilePreview']
}], previewIndex: [{
type: Input
}], trigger: [{
type: Input
}], themeMode: [{
type: Input
}], autoConfig: [{
type: Input
}], lang: [{
type: Input
}], previewEvent: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25neC1maWxlLXByZXZpZXcvc3JjL2xpYi9kaXJlY3RpdmVzL3ByZXZpZXcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsWUFBWSxFQUVaLEtBQUssRUFHTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFOUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQU8sU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBT3hFLE1BQU0sT0FBTyxnQkFBZ0I7SUFLM0IsSUFDSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFnQjtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBR0QsSUFDSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7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YyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztpQkFDN0Q7Z01BRTBCLFNBQVM7c0JBQWpDLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUNkLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUdGLFNBQVM7c0JBRFosS0FBSztnQkFZRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdGLElBQUk7c0JBRFAsS0FBSztnQkFTSSxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpbGVSZWFkZXJTZXJ2aWNlLCBQcmV2aWV3U2VydmljZSwgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgQXV0b1RoZW1lQ29uZmlnLCBQcmV2aWV3RXZlbnQsIFByZXZpZXdGaWxlSW5wdXQsIFRoZW1lTW9kZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFByZXZpZXdVdGlscyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIFN1YmplY3QsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEZpbGVQcmV2aWV3XScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW1ByZXZpZXdTZXJ2aWNlLCBUaGVtZVNlcnZpY2UsIEZpbGVSZWFkZXJTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBQcmV2aWV3RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoJ25neEZpbGVQcmV2aWV3JykgZmlsZUlucHV0OiBQcmV2aWV3RmlsZUlucHV0O1xuICBASW5wdXQoKSBwcmV2aWV3SW5kZXggPSAwO1xuICBASW5wdXQoKSB0cmlnZ2VyID0gJ2NsaWNrJzsgLy8g6buY6K6k6Kem5Y+R5pa55byPXG4gIHByaXZhdGUgX3RoZW1lTW9kZTogVGhlbWVNb2RlID0gJ2F1dG8nO1xuICBASW5wdXQoKVxuICBnZXQgdGhlbWVNb2RlKCk6IFRoZW1lTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuX3RoZW1lTW9kZTtcbiAgfVxuXG4gIHNldCB0aGVtZU1vZGUodmFsdWU6IFRoZW1lTW9kZSkge1xuICAgIHRoaXMuX3RoZW1lTW9kZSA9IHZhbHVlO1xuICAgIHRoaXMudGhlbWVTZXJ2aWNlLnNldE1vZGUodGhpcy50aGVtZU1vZGUpO1xuICAgIGlmICh0aGlzLnRoZW1lTW9kZSA9PT0gJ2F1dG8nICYmIHRoaXMuYXV0b0NvbmZpZykge1xuICAgICAgdGhpcy50aGVtZVNlcnZpY2Uuc2V0QXV0b0NvbmZpZyh0aGlzLmF1dG9Db25maWcpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKSBhdXRvQ29uZmlnPzogQXV0b1RoZW1lQ29uZmlnO1xuICBwcml2YXRlIF9sYW5nOnN0cmluZyA9ICd6aCc7XG4gIEBJbnB1dCgpXG4gIGdldCBsYW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmc7XG4gIH1cblxuICBzZXQgbGFuZyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGFuZyA9IHZhbHVlO1xuICAgIHRoaXMucHJldmlld1NlcnZpY2Uuc2V0TGFuZyh2YWx1ZSk7XG4gIH1cbiAgQE91dHB1dCgpIHByZXZpZXdFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UHJldmlld0V2ZW50PigpO1xuXG4gIHQoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICByZXR1cm4gdGhpcy5wcmV2aWV3U2VydmljZT8uZ2V0TGFuZ1BhcnNlcigpPy50KGtleSwgLi4uYXJncyk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBsb25nUHJlc3NUaW1lcjogYW55O1xuICBwcml2YXRlIGlzTG9uZ1ByZXNzaW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwcmV2aWV3U2VydmljZTogUHJldmlld1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGVudkluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZlxuICApIHtcbiAgICB0aGlzLnByZXZpZXdTZXJ2aWNlLmluaXQodGhpcy5pbmplY3RvciwgdGhpcy5lbnZJbmplY3Rvcik7XG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldHVwVHJpZ2dlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBUcmlnZ2VycygpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IHRoaXMudHJpZ2dlci5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKTtcbiAgICBjb25zdCBvYnNlcnZhYmxlcyA9IHRyaWdnZXJzLm1hcCh0cmlnZ2VyID0+IHtcbiAgICAgIGNvbnN0IFtldmVudE5hbWUsIHBhcmFtXSA9IHRyaWdnZXIuc3BsaXQoJzonKTtcbiAgICAgIFxuICAgICAgc3dpdGNoKGV2ZW50TmFtZSkge1xuICAgICAgICBjYXNlICdjbGljayc6XG4gICAgICAgICAgcmV0dXJuIGZyb21FdmVudCh0aGlzLmVsZW1lbnQsICdjbGljaycpO1xuICAgICAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgICAgICAgcmV0dXJuIGZyb21FdmVudCh0aGlzLmVsZW1lbnQsICdjb250ZXh0bWVudScpLnBpcGUoXG4gICAgICAgICAgICB0YXAoZSA9PiBlLnByZXZlbnREZWZhdWx0KCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnZGJsY2xpY2snOlxuICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQodGhpcy5lbGVtZW50LCAnZGJsY2xpY2snKTtcbiAgICAgICAgY2FzZSAnbG9uZ3ByZXNzJzpcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHBhcnNlSW50KHBhcmFtKSB8fCA4MDA7XG4gICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmVsZW1lbnQsICdtb3VzZWRvd24nKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRpbWVyKGR1cmF0aW9uKS5waXBlKFxuICAgICAgICAgICAgICB0YWtlVW50aWwoZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2V1cCcpKVxuICAgICAgICAgICAgKSlcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlICdob3Zlcic6XG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBwYXJzZUludChwYXJhbSkgfHwgNTAwO1xuICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQodGhpcy5lbGVtZW50LCAnbW91c2VlbnRlcicpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGltZXIoZGVsYXkpLnBpcGUoXG4gICAgICAgICAgICAgIHRha2VVbnRpbChmcm9tRXZlbnQodGhpcy5lbGVtZW50LCAnbW91c2VsZWF2ZScpKVxuICAgICAgICAgICAgKSlcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KHRoaXMuZWxlbWVudCwgJ2tleWRvd24nKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKGUgPT4gIXBhcmFtIHx8IGUua2V5ID09PSBwYXJhbSlcbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQodGhpcy5lbGVtZW50LCAnY2xpY2snKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG1lcmdlKC4uLm9ic2VydmFibGVzKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnByZXZpZXcoKSk7XG4gIH1cblxuICBwcml2YXRlIHByZXZpZXcoKSB7XG4gICAgaWYgKCF0aGlzLmZpbGVJbnB1dCkgcmV0dXJuO1xuICAgIGNvbnN0IGZpbGVzID0gUHJldmlld1V0aWxzLm5vcm1hbGl6ZUZpbGVzKHRoaXMuZmlsZUlucHV0KTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5wcmV2aWV3U2VydmljZS5vcGVuKHtcbiAgICAgICAgZmlsZXMsXG4gICAgICAgIGluZGV4OiB0aGlzLnByZXZpZXdJbmRleCxcbiAgICAgICAgdGhlbWVNb2RlOiB0aGlzLnRoZW1lTW9kZSxcbiAgICAgICAgYXV0b1RoZW1lQ29uZmlnOiB0aGlzLmF1dG9Db25maWdcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByZXZpZXdFdmVudC5lbWl0KHt0eXBlOiAnZXJyb3InLCBtZXNzYWdlOiB0aGlzLnQoJ3ByZXZpZXcuZXJyb3Iubm9GaWxlcycpfSlcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgLy8g5riF55CG55SxIGNyZWF0ZU9iamVjdFVSTCDliJvlu7rnmoQgVVJMXG4gICAgaWYgKHRoaXMuZmlsZUlucHV0IGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChQcmV2aWV3VXRpbHMubm9ybWFsaXplRmlsZSh0aGlzLmZpbGVJbnB1dCkudXJsKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5maWxlSW5wdXQpKSB7XG4gICAgICB0aGlzLmZpbGVJbnB1dC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKFByZXZpZXdVdGlscy5ub3JtYWxpemVGaWxlKGl0ZW0pLnVybCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19