UNPKG

@twogate/ngx-photo-gallery

Version:

PhotoGallery library for Angular based on [PhotoSwipe](http://photoswipe.com/).

142 lines 20.2 kB
import { Directive, Output, Input, EventEmitter, Optional } from '@angular/core'; import PhotoSwipe from 'photoswipe'; import PhotoSwipeUI_Default from 'photoswipe/dist/photoswipe-ui-default'; import * as i0 from "@angular/core"; import * as i1 from "../interfaces/config"; import * as i2 from "../services/lightbox.service"; export const DEFAULT_OPTIONS = { history: false, closeEl: true, captionEl: false, fullscreenEl: false, zoomEl: true, shareEl: false, counterEl: true, arrowEl: false, preloaderEl: true, }; export class PhotoGalleryGroupDirective { constructor(photoGalleryConfig, lightboxService) { this.photoGalleryConfig = photoGalleryConfig; this.lightboxService = lightboxService; this.onPhotoGalleryInit = new EventEmitter(); this.onPhotoGalleryDestroy = new EventEmitter(); this.galleryItems = {}; this.galleryItemIds = new Set(); this.galleryImages = []; this.defaultOptions = { ...DEFAULT_OPTIONS, ...this.photoGalleryConfig?.defaultOptions }; } registerGalleryItem(item) { const image = { id: item.id, src: item.imageUrl, ...(item.caption ? { title: item.caption } : {}), w: 0, h: 0, doGetSlideDimensions: true, }; this.galleryItems[item.id] = { id: item.id, element: item.element, image, }; this.galleryItemIds.add(item.id); } unregisterGalleryItem(id) { this.galleryItemIds.delete(id); } async openPhotoSwipe(id) { this.lightboxService.create(); if (this.galleryItems[id].image.doGetSlideDimensions) { const targetImage = await loadImage(this.galleryItems[id].image.src); this.galleryItems[id].image.w = targetImage.naturalWidth; this.galleryItems[id].image.h = targetImage.naturalHeight; delete this.galleryItems[id].image.doGetSlideDimensions; } this.galleryImages = [...this.galleryItemIds].map((key) => this.galleryItems[key].image); const idx = this.galleryImages.findIndex((image) => image.id === id); const options = { ...this.defaultOptions, ...this.options }; options.index = idx; options.getThumbBoundsFn = (imageIndex) => { const key = this.galleryImages[imageIndex].id; const thumbnail = this.galleryItems[key].element; const origin = this.galleryItems[key].image; const pageYScroll = window.pageYOffset || document.documentElement.scrollTop; const rect = thumbnail.getBoundingClientRect(); const thumbnailRate = rect.height / rect.width; const originRate = origin.h / origin.w; let x, y, w; if (thumbnailRate > originRate) { // portrait y = rect.top + pageYScroll; w = (origin.w * rect.height) / origin.h; x = rect.left - (w - rect.width) / 2; } else { // landscape const imageHeight = (origin.h * rect.width) / origin.w; x = rect.left; w = rect.width; y = rect.top + pageYScroll - (imageHeight - rect.height) / 2; } return { x, y, w }; }; const photoSwipe = this.lightboxService.getLightboxElement(); this.gallery = new PhotoSwipe(photoSwipe, PhotoSwipeUI_Default, this.galleryImages, options); this.gallery.listen('gettingData', (_, slide) => { if (slide.doGetSlideDimensions) { setTimeout(async () => { await this.getSlideDimensions(slide); }, 300); } }); this.gallery.listen('imageLoadComplete', async (_, slide) => { if (slide.doGetSlideDimensions) { await this.getSlideDimensions(slide); } }); this.gallery.listen('destroy', () => { this.lightboxService.destroy(); this.onPhotoGalleryDestroy.emit(); }); this.onPhotoGalleryInit.emit(); this.gallery.init(); } async getSlideDimensions(slide) { if (!slide.doGetSlideDimensions) { return; } const image = await loadImage(slide.src).catch(() => null); slide.doGetSlideDimensions = false; slide.w = image.naturalWidth; slide.h = image.naturalHeight; this.gallery.invalidateCurrItems(); this.gallery.updateSize(true); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: PhotoGalleryGroupDirective, deps: [{ token: i1.PhotoGalleryConfig, optional: true }, { token: i2.LightboxService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.6", type: PhotoGalleryGroupDirective, selector: "[photoGalleryGroup]", inputs: { options: ["photoGalleryGroup", "options"] }, outputs: { onPhotoGalleryInit: "onPhotoGalleryInit", onPhotoGalleryDestroy: "onPhotoGalleryDestroy" }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: PhotoGalleryGroupDirective, decorators: [{ type: Directive, args: [{ selector: '[photoGalleryGroup]', }] }], ctorParameters: () => [{ type: i1.PhotoGalleryConfig, decorators: [{ type: Optional }] }, { type: i2.LightboxService }], propDecorators: { options: [{ type: Input, args: ['photoGalleryGroup'] }], onPhotoGalleryInit: [{ type: Output }], onPhotoGalleryDestroy: [{ type: Output }] } }); function loadImage(path) { return new Promise((resolve, reject) => { const image = new Image(); image.onload = () => resolve(image); image.onerror = (e) => reject(e); image.src = path; }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvdG8tZ2FsbGVyeS1ncm91cC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvZGlyZWN0aXZlcy9waG90by1nYWxsZXJ5LWdyb3VwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxvQkFBb0IsTUFBTSx1Q0FBdUMsQ0FBQzs7OztBQU16RSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0IsT0FBTyxFQUFFLEtBQUs7SUFDZCxPQUFPLEVBQUUsSUFBSTtJQUNiLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFlBQVksRUFBRSxLQUFLO0lBQ25CLE1BQU0sRUFBRSxJQUFJO0lBQ1osT0FBTyxFQUFFLEtBQUs7SUFDZCxTQUFTLEVBQUUsSUFBSTtJQUNmLE9BQU8sRUFBRSxLQUFLO0lBQ2QsV0FBVyxFQUFFLElBQUk7Q0FDbEIsQ0FBQztBQUtGLE1BQU0sT0FBTywwQkFBMEI7SUFXckMsWUFDc0Isa0JBQXNDLEVBQ2xELGVBQWdDO1FBRHBCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDbEQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBWGhDLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEMsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUk3QyxpQkFBWSxHQUFtQyxFQUFFLENBQUM7UUFDbEQsbUJBQWMsR0FBZ0IsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNoRCxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFNekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLEdBQUcsZUFBZSxFQUFFLEdBQUcsSUFB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aXZlLCBPdXRwdXQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgUGhvdG9Td2lwZSBmcm9tICdwaG90b3N3aXBlJztcbmltcG9ydCBQaG90b1N3aXBlVUlfRGVmYXVsdCBmcm9tICdwaG90b3N3aXBlL2Rpc3QvcGhvdG9zd2lwZS11aS1kZWZhdWx0JztcblxuaW1wb3J0IHsgUGhvdG9HYWxsZXJ5Q29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWcnO1xuaW1wb3J0IHsgR2FsbGVyeUltYWdlLCBHYWxsZXJ5SXRlbSwgR2FsbGVyeU9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Bob3Rvc3dpcGUnO1xuaW1wb3J0IHsgTGlnaHRib3hTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbGlnaHRib3guc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG4gIGhpc3Rvcnk6IGZhbHNlLFxuICBjbG9zZUVsOiB0cnVlLFxuICBjYXB0aW9uRWw6IGZhbHNlLFxuICBmdWxsc2NyZWVuRWw6IGZhbHNlLFxuICB6b29tRWw6IHRydWUsXG4gIHNoYXJlRWw6IGZhbHNlLFxuICBjb3VudGVyRWw6IHRydWUsXG4gIGFycm93RWw6IGZhbHNlLFxuICBwcmVsb2FkZXJFbDogdHJ1ZSxcbn07XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1twaG90b0dhbGxlcnlHcm91cF0nLFxufSlcbmV4cG9ydCBjbGFzcyBQaG90b0dhbGxlcnlHcm91cERpcmVjdGl2ZSB7XG4gIEBJbnB1dCgncGhvdG9HYWxsZXJ5R3JvdXAnKSBvcHRpb25zOiBHYWxsZXJ5T3B0aW9ucztcbiAgQE91dHB1dCgpIG9uUGhvdG9HYWxsZXJ5SW5pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uUGhvdG9HYWxsZXJ5RGVzdHJveSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcml2YXRlIGRlZmF1bHRPcHRpb25zOiBHYWxsZXJ5T3B0aW9ucztcbiAgcHJpdmF0ZSBnYWxsZXJ5OiBhbnk7XG4gIHByaXZhdGUgZ2FsbGVyeUl0ZW1zOiB7IFtrZXk6IHN0cmluZ106IEdhbGxlcnlJdGVtIH0gPSB7fTtcbiAgcHJpdmF0ZSBnYWxsZXJ5SXRlbUlkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBnYWxsZXJ5SW1hZ2VzOiBHYWxsZXJ5SW1hZ2VbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcGhvdG9HYWxsZXJ5Q29uZmlnOiBQaG90b0dhbGxlcnlDb25maWcsXG4gICAgcHJpdmF0ZSBsaWdodGJveFNlcnZpY2U6IExpZ2h0Ym94U2VydmljZVxuICApIHtcbiAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0geyAuLi5ERUZBVUxUX09QVElPTlMsIC4uLnRoaXMucGhvdG9HYWxsZXJ5Q29uZmlnPy5kZWZhdWx0T3B0aW9ucyB9O1xuICB9XG5cbiAgcmVnaXN0ZXJHYWxsZXJ5SXRlbShpdGVtOiB7IGlkOiBzdHJpbmc7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBpbWFnZVVybDogc3RyaW5nOyBjYXB0aW9uPzogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBjb25zdCBpbWFnZTogR2FsbGVyeUltYWdlID0ge1xuICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICBzcmM6IGl0ZW0uaW1hZ2VVcmwsXG4gICAgICAuLi4oaXRlbS5jYXB0aW9uID8geyB0aXRsZTogaXRlbS5jYXB0aW9uIH0gOiB7fSksXG4gICAgICB3OiAwLFxuICAgICAgaDogMCxcbiAgICAgIGRvR2V0U2xpZGVEaW1lbnNpb25zOiB0cnVlLFxuICAgIH07XG4gICAgdGhpcy5nYWxsZXJ5SXRlbXNbaXRlbS5pZF0gPSB7XG4gICAgICBpZDogaXRlbS5pZCxcbiAgICAgIGVsZW1lbnQ6IGl0ZW0uZWxlbWVudCxcbiAgICAgIGltYWdlLFxuICAgIH07XG5cbiAgICB0aGlzLmdhbGxlcnlJdGVtSWRzLmFkZChpdGVtLmlkKTtcbiAgfVxuXG4gIHVucmVnaXN0ZXJHYWxsZXJ5SXRlbShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nYWxsZXJ5SXRlbUlkcy5kZWxldGUoaWQpO1xuICB9XG5cbiAgYXN5bmMgb3BlblBob3RvU3dpcGUoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlnaHRib3hTZXJ2aWNlLmNyZWF0ZSgpO1xuXG4gICAgaWYgKHRoaXMuZ2FsbGVyeUl0ZW1zW2lkXS5pbWFnZS5kb0dldFNsaWRlRGltZW5zaW9ucykge1xuICAgICAgY29uc3QgdGFyZ2V0SW1hZ2UgPSBhd2FpdCBsb2FkSW1hZ2UodGhpcy5nYWxsZXJ5SXRlbXNbaWRdLmltYWdlLnNyYyk7XG4gICAgICB0aGlzLmdhbGxlcnlJdGVtc1tpZF0uaW1hZ2UudyA9IHRhcmdldEltYWdlLm5hdHVyYWxXaWR0aDtcbiAgICAgIHRoaXMuZ2FsbGVyeUl0ZW1zW2lkXS5pbWFnZS5oID0gdGFyZ2V0SW1hZ2UubmF0dXJhbEhlaWdodDtcbiAgICAgIGRlbGV0ZSB0aGlzLmdhbGxlcnlJdGVtc1tpZF0uaW1hZ2UuZG9HZXRTbGlkZURpbWVuc2lvbnM7XG4gICAgfVxuXG4gICAgdGhpcy5nYWxsZXJ5SW1hZ2VzID0gWy4uLnRoaXMuZ2FsbGVyeUl0ZW1JZHNdLm1hcCgoa2V5KSA9PiB0aGlzLmdhbGxlcnlJdGVtc1trZXldLmltYWdlKTtcbiAgICBjb25zdCBpZHggPSB0aGlzLmdhbGxlcnlJbWFnZXMuZmluZEluZGV4KChpbWFnZSkgPT4gaW1hZ2UuaWQgPT09IGlkKTtcbiAgICBjb25zdCBvcHRpb25zOiBHYWxsZXJ5T3B0aW9ucyA9IHsgLi4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4udGhpcy5vcHRpb25zIH07XG4gICAgb3B0aW9ucy5pbmRleCA9IGlkeDtcbiAgICBvcHRpb25zLmdldFRodW1iQm91bmRzRm4gPSAoaW1hZ2VJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmdhbGxlcnlJbWFnZXNbaW1hZ2VJbmRleF0uaWQ7XG4gICAgICBjb25zdCB0aHVtYm5haWwgPSB0aGlzLmdhbGxlcnlJdGVtc1trZXldLmVsZW1lbnQ7XG4gICAgICBjb25zdCBvcmlnaW4gPSB0aGlzLmdhbGxlcnlJdGVtc1trZXldLmltYWdlO1xuICAgICAgY29uc3QgcGFnZVlTY3JvbGwgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgIGNvbnN0IHJlY3QgPSB0aHVtYm5haWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIGNvbnN0IHRodW1ibmFpbFJhdGUgPSByZWN0LmhlaWdodCAvIHJlY3Qud2lkdGg7XG4gICAgICBjb25zdCBvcmlnaW5SYXRlID0gb3JpZ2luLmggLyBvcmlnaW4udztcbiAgICAgIGxldCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyO1xuICAgICAgaWYgKHRodW1ibmFpbFJhdGUgPiBvcmlnaW5SYXRlKSB7XG4gICAgICAgIC8vIHBvcnRyYWl0XG4gICAgICAgIHkgPSByZWN0LnRvcCArIHBhZ2VZU2Nyb2xsO1xuICAgICAgICB3ID0gKG9yaWdpbi53ICogcmVjdC5oZWlnaHQpIC8gb3JpZ2luLmg7XG4gICAgICAgIHggPSByZWN0LmxlZnQgLSAodyAtIHJlY3Qud2lkdGgpIC8gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGxhbmRzY2FwZVxuICAgICAgICBjb25zdCBpbWFnZUhlaWdodCA9IChvcmlnaW4uaCAqIHJlY3Qud2lkdGgpIC8gb3JpZ2luLnc7XG4gICAgICAgIHggPSByZWN0LmxlZnQ7XG4gICAgICAgIHcgPSByZWN0LndpZHRoO1xuICAgICAgICB5ID0gcmVjdC50b3AgKyBwYWdlWVNjcm9sbCAtIChpbWFnZUhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IHgsIHksIHcgfTtcbiAgICB9O1xuICAgIGNvbnN0IHBob3RvU3dpcGUgPSB0aGlzLmxpZ2h0Ym94U2VydmljZS5nZXRMaWdodGJveEVsZW1lbnQoKTtcblxuICAgIHRoaXMuZ2FsbGVyeSA9IG5ldyBQaG90b1N3aXBlKHBob3RvU3dpcGUsIFBob3RvU3dpcGVVSV9EZWZhdWx0LCB0aGlzLmdhbGxlcnlJbWFnZXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuZ2FsbGVyeS5saXN0ZW4oJ2dldHRpbmdEYXRhJywgKF8sIHNsaWRlOiBHYWxsZXJ5SW1hZ2UpID0+IHtcbiAgICAgIGlmIChzbGlkZS5kb0dldFNsaWRlRGltZW5zaW9ucykge1xuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFNsaWRlRGltZW5zaW9ucyhzbGlkZSk7XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5nYWxsZXJ5Lmxpc3RlbignaW1hZ2VMb2FkQ29tcGxldGUnLCBhc3luYyAoXywgc2xpZGU6IEdhbGxlcnlJbWFnZSkgPT4ge1xuICAgICAgaWYgKHNsaWRlLmRvR2V0U2xpZGVEaW1lbnNpb25zKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0U2xpZGVEaW1lbnNpb25zKHNsaWRlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmdhbGxlcnkubGlzdGVuKCdkZXN0cm95JywgKCkgPT4ge1xuICAgICAgdGhpcy5saWdodGJveFNlcnZpY2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy5vblBob3RvR2FsbGVyeURlc3Ryb3kuZW1pdCgpO1xuICAgIH0pO1xuICAgIHRoaXMub25QaG90b0dhbGxlcnlJbml0LmVtaXQoKTtcbiAgICB0aGlzLmdhbGxlcnkuaW5pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRTbGlkZURpbWVuc2lvbnMoc2xpZGU6IEdhbGxlcnlJbWFnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc2xpZGUuZG9HZXRTbGlkZURpbWVuc2lvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbWFnZTogSFRNTEltYWdlRWxlbWVudCA9IGF3YWl0IGxvYWRJbWFnZShzbGlkZS5zcmMpLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgc2xpZGUuZG9HZXRTbGlkZURpbWVuc2lvbnMgPSBmYWxzZTtcblxuICAgIHNsaWRlLncgPSBpbWFnZS5uYXR1cmFsV2lkdGg7XG4gICAgc2xpZGUuaCA9IGltYWdlLm5hdHVyYWxIZWlnaHQ7XG5cbiAgICB0aGlzLmdhbGxlcnkuaW52YWxpZGF0ZUN1cnJJdGVtcygpO1xuICAgIHRoaXMuZ2FsbGVyeS51cGRhdGVTaXplKHRydWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvYWRJbWFnZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1hZ2UpO1xuICAgIGltYWdlLm9uZXJyb3IgPSAoZSkgPT4gcmVqZWN0KGUpO1xuICAgIGltYWdlLnNyYyA9IHBhdGg7XG4gIH0pO1xufVxuIl19