ngx-masonry-gallery
Version:
Masonry gallery for Angular
1 lines • 19.5 kB
Source Map (JSON)
{"version":3,"file":"ngx-masonry-gallery.mjs","sources":["../../src/lib/utilities.ts","../../src/lib/masonry-gallery.component.ts","../../src/lib/masonry-gallery.module.ts","../../src/public_api.ts","../../src/ngx-masonry-gallery.ts"],"sourcesContent":["export class Utilities {\r\n newGuid() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n // tslint:disable-next-line:no-bitwise triple-equals\r\n const r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n}\r\n\r\nexport let utilities = new Utilities();\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n Renderer2,\r\n SimpleChanges,\r\n ChangeDetectionStrategy,\r\n} from \"@angular/core\";\r\nimport * as imagesLoaded from \"imagesloaded\";\r\nimport * as Masonry from \"masonry-layout\";\r\n\r\nimport { IMasonryGalleryImage } from \"./masonry-gallery-models\";\r\nimport { utilities } from \"./utilities\";\r\n\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: \"ngx-masonry-gallery\",\r\n template: '<div [id]=\"galleryGuid\"></div>',\r\n})\r\nexport class MasonryGalleryComponent\r\n implements AfterViewInit, OnDestroy, OnChanges\r\n{\r\n @Input() images: IMasonryGalleryImage[] = [];\r\n @Input() width: number = 330;\r\n @Input() gutter: number = 5;\r\n @Input() verticalGutter: number = 5;\r\n @Input() imageClasses: string[] = [];\r\n\r\n @Output() clickImage = new EventEmitter<IMasonryGalleryImage>();\r\n @Output() removeComplete = new EventEmitter<any[]>();\r\n @Output() layoutComplete = new EventEmitter<any[]>();\r\n\r\n public readonly galleryGuid: string = utilities.newGuid();\r\n\r\n private readonly mansonryItemSelectorClass = `grid-item-${this.galleryGuid}`;\r\n private readonly activeImages: ActiveImage[] = [];\r\n\r\n private msnry?: Masonry;\r\n private grid?: HTMLElement | null;\r\n private changesToProcess?: SimpleChanges;\r\n private viewReady: boolean = false;\r\n\r\n constructor(private renderer: Renderer2) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.images && changes.images.currentValue) {\r\n if (!this.viewReady) {\r\n // process images once we can\r\n this.changesToProcess = changes;\r\n } else {\r\n this.processImages(changes);\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.msnry?.destroy?.();\r\n }\r\n\r\n handleClick(image: IMasonryGalleryImage): void {\r\n this.clickImage.next(image);\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.viewReady = true;\r\n this.initMasonry();\r\n\r\n // process images now\r\n if (this.changesToProcess) {\r\n this.processImages(this.changesToProcess);\r\n this.changesToProcess = undefined;\r\n }\r\n }\r\n\r\n addImages(images: IMasonryGalleryImage[]): void {\r\n if (images && images.length > 0) {\r\n this.addImagesToGallery(images);\r\n }\r\n }\r\n\r\n removeImages(images: IMasonryGalleryImage[]): void {\r\n if (images && images.length > 0) {\r\n images.forEach((image) => {\r\n this.removeImageFromGallery(image);\r\n });\r\n }\r\n }\r\n\r\n private processImages(changes: SimpleChanges): void {\r\n const imagesToProcess = this.getAddedAndRemovesImages(changes);\r\n\r\n // add images to mansonry layout\r\n this.addImages(imagesToProcess.addedImages);\r\n\r\n // removes images from layout\r\n this.removeImages(imagesToProcess.removedImages);\r\n }\r\n\r\n private getAddedAndRemovesImages(changes: SimpleChanges): {\r\n addedImages: IMasonryGalleryImage[];\r\n removedImages: IMasonryGalleryImage[];\r\n } {\r\n let addedImages: IMasonryGalleryImage[] = [];\r\n const removedImages: IMasonryGalleryImage[] = [];\r\n\r\n const newImagesValue = changes.images\r\n .currentValue as IMasonryGalleryImage[];\r\n const oldImagesValue = changes.images\r\n .previousValue as IMasonryGalleryImage[];\r\n\r\n if (!oldImagesValue) {\r\n // all images are new ones\r\n addedImages = changes.images.currentValue;\r\n } else {\r\n // process added images\r\n newImagesValue.forEach((newImage) => {\r\n const existingImage = oldImagesValue.find(\r\n (m) => m.imageUrl.toLowerCase() === newImage.imageUrl.toLowerCase()\r\n );\r\n\r\n if (existingImage) {\r\n // image was in previous value && is in new, do nothing\r\n } else {\r\n // image is new\r\n addedImages.push(newImage);\r\n }\r\n });\r\n\r\n // process removed images\r\n oldImagesValue.forEach((oldImage) => {\r\n const existingImage = newImagesValue.find(\r\n (m) => m.imageUrl.toLowerCase() === oldImage.imageUrl.toLowerCase()\r\n );\r\n\r\n if (existingImage) {\r\n // image was in previous value && is in new, do nothing\r\n } else {\r\n // image is removed\r\n removedImages.push(oldImage);\r\n }\r\n });\r\n }\r\n\r\n return {\r\n addedImages: addedImages,\r\n removedImages: removedImages,\r\n };\r\n }\r\n\r\n private initMasonry(): void {\r\n const grid = document.getElementById(this.galleryGuid);\r\n\r\n if (!grid) {\r\n console.warn(`Invalid grid element with id '${this.galleryGuid}'`);\r\n return;\r\n }\r\n\r\n // remove all existing data from grid\r\n grid.innerHTML = \"\";\r\n\r\n const msnry = new Masonry(grid, {\r\n // options...\r\n itemSelector: \".\" + this.mansonryItemSelectorClass,\r\n columnWidth: this.width,\r\n gutter: this.gutter,\r\n });\r\n\r\n const that = this;\r\n\r\n msnry.on?.(\"layoutComplete\", (items: any) => {\r\n that.layoutComplete.next(items);\r\n });\r\n\r\n msnry.on?.(\"removeComplete\", (items: any) => {\r\n that.removeComplete.next(items);\r\n });\r\n\r\n this.grid = grid;\r\n this.msnry = msnry;\r\n }\r\n\r\n private removeImageFromGallery(image: IMasonryGalleryImage): void {\r\n // get image guid\r\n const imageIdResult = this.activeImages.find(\r\n (m) => m.image.imageUrl.toLowerCase() === image.imageUrl.toLowerCase()\r\n );\r\n\r\n if (!imageIdResult) {\r\n // image was not found, this is probably an error\r\n console.warn(\r\n `Image with url '${image.imageUrl}' was not found. If you are adding images, make sure to 'replace' the images array with a new one\r\n so that detection change can be executed instead of just adding an image to array\r\n (which doesn't fire change detection on array property)`\r\n );\r\n return;\r\n }\r\n\r\n // find image based on its id\r\n const imageElem = document.getElementById(imageIdResult.id);\r\n\r\n if (!imageElem) {\r\n // image was not found in DOM\r\n console.warn(\r\n `Image with id '{${imageIdResult.id}}' was not found in DOM. Have you manipulated the DOM in some way?`\r\n );\r\n return;\r\n }\r\n\r\n // remove image from gallery\r\n this.msnry?.remove?.([imageElem]);\r\n\r\n // refresh layout\r\n this.msnry?.layout?.();\r\n\r\n // remove image from array\r\n for (let i = 0; i < this.activeImages.length; i++) {\r\n const idWithImage = this.activeImages[i];\r\n if (\r\n idWithImage.image.imageUrl.toLowerCase() ===\r\n imageIdResult.image.imageUrl.toLowerCase()\r\n ) {\r\n this.activeImages.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n private addImagesToGallery(images: IMasonryGalleryImage[]): void {\r\n if (!this.grid) {\r\n throw Error(\r\n \"Grid element is not yet ready, are you trying to add image too soon?\"\r\n );\r\n }\r\n\r\n const imagesWrapper = this.renderer.createElement(\"span\");\r\n\r\n images.forEach((image) => {\r\n // generate unique image id\r\n const imageId = this.getImageId();\r\n\r\n // create element\r\n const imageElem = this.renderer.createElement(\"img\");\r\n imageElem.setAttribute(\"id\", imageId);\r\n imageElem.setAttribute(\"alt\", image.alt ? image.alt : \"no description\");\r\n imageElem.setAttribute(\"src\", image.imageUrl);\r\n // note - images are hidden by default and should be shown only after they are loaded\r\n imageElem.setAttribute(\r\n \"style\",\r\n `display: block; width: ${this.width}px; margin-bottom: ${this.verticalGutter}px`\r\n );\r\n imageElem.className = this.getImageClass();\r\n imageElem.addEventListener(\"click\", () => {\r\n this.handleClick(image);\r\n });\r\n\r\n // store guid with this image\r\n this.activeImages.push({\r\n id: imageId,\r\n image: image,\r\n });\r\n\r\n // add to dom and mansory & refresh layout\r\n this.renderer.appendChild(imagesWrapper, imageElem);\r\n });\r\n\r\n // add html to dom\r\n this.renderer.appendChild(this.grid, imagesWrapper);\r\n\r\n // add images once they are loaded\r\n const imgLoad = imagesLoaded(imagesWrapper);\r\n imgLoad.on(\"progress\", (instance, image) => {\r\n if (\r\n image &&\r\n image.isLoaded &&\r\n this.msnry &&\r\n this.msnry.appended &&\r\n this.msnry.reloadItems\r\n ) {\r\n // this.renderer.appendChild(this.grid, image.img);\r\n // unhide image\r\n // this.renderer.setStyle(image.img, \"display\", \"block\");\r\n\r\n // remove image from gallery\r\n this.msnry?.addItems?.([image.img]);\r\n\r\n // refresh layout\r\n this.msnry?.layout?.();\r\n }\r\n });\r\n }\r\n\r\n private getImageClass(): string {\r\n let className = this.mansonryItemSelectorClass;\r\n\r\n if (this.imageClasses && this.imageClasses.length > 0) {\r\n const customClass = this.imageClasses.join(\" \");\r\n\r\n className += \" \" + customClass;\r\n }\r\n\r\n return className;\r\n }\r\n\r\n private getImageId(): string {\r\n return this.galleryGuid + \"_\" + utilities.newGuid();\r\n }\r\n}\r\n\r\ninterface ActiveImage {\r\n id: string;\r\n image: IMasonryGalleryImage;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\n\r\nimport { MasonryGalleryComponent } from './masonry-gallery.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule\r\n ],\r\n declarations: [\r\n MasonryGalleryComponent,\r\n ],\r\n exports: [\r\n MasonryGalleryComponent,\r\n ],\r\n})\r\nexport class MasonryGalleryModule { }\r\n","/*\r\n * Public API\r\n */\r\n\r\nexport * from './lib/index';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}