UNPKG

ngx-masonry

Version:

Angular Module for displaying a feed of items in a masonry layout using https://github.com/desandro/masonry

138 lines 16.1 kB
import { isPlatformBrowser } from '@angular/common'; import { Component, EventEmitter, Inject, Input, Output, PLATFORM_ID } from '@angular/core'; import * as i0 from "@angular/core"; let masonryConstructor; export class NgxMasonryComponent { constructor(platformId, _element) { this.platformId = platformId; this._element = _element; this.updateLayout = false; this.ordered = false; // Outputs this.layoutComplete = new EventEmitter(); this.removeComplete = new EventEmitter(); this.itemsLoaded = new EventEmitter(); this.pendingItems = []; } ngOnInit() { if (isPlatformBrowser(this.platformId) && masonryConstructor === undefined) { masonryConstructor = require('masonry-layout'); } // Create masonry options object if (!this.options) { this.options = {}; } // Set default itemSelector if (!this.options.itemSelector) { this.options.itemSelector = '[ngxMasonryItem], ngxMasonryItem'; } this.options['transitionDuration'] = '0s'; if (isPlatformBrowser(this.platformId)) { // Initialize Masonry this.masonryInstance = new masonryConstructor(this._element.nativeElement, this.options); // Bind to events this.masonryInstance.on('layoutComplete', (items) => { this.layoutComplete.emit(items); }); this.masonryInstance.on('removeComplete', (items) => { this.removeComplete.emit(items); }); this.masonryInstance.items = []; } } ngOnChanges(changes) { // only update layout if it's not the first change if (changes.updateLayout) { if (!changes.updateLayout.firstChange) { this.layout(); } } } ngOnDestroy() { if (this.masonryInstance) { this.masonryInstance.destroy(); } } layout() { setTimeout(() => { this.masonryInstance.layout(); }); } reloadItems() { setTimeout(() => { this.masonryInstance.reloadItems(); }); } addPendingItem(item) { this.pendingItems.push(item); } add(newItem) { if (this.ordered) { for (const [index, item] of this.pendingItems.entries()) { if (item) { if (item.images && item.images.size === 0) { this.pendingItems[index] = undefined; this.itemLoaded(item); if (index + 1 === this.pendingItems.length) { // All items are loaded this.itemsLoaded.emit(this.pendingItems.length); this.pendingItems = []; } } else { return; } } } } else { this.itemLoaded(newItem); } } itemLoaded(item) { if (isPlatformBrowser(this.platformId)) { // Tell Masonry that a child element has been added if (item.prepend) { this.masonryInstance.prepended(item.element.nativeElement); } else { this.masonryInstance.appended(item.element.nativeElement); } // Check if first item if (this.masonryInstance.items.length === 1) { this.masonryInstance.layout(); } item.playAnimation(true); } } remove(element) { if (isPlatformBrowser(this.platformId)) { // Tell Masonry that a child element has been removed this.masonryInstance.remove(element); // Layout items this.layout(); } } } NgxMasonryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: NgxMasonryComponent, deps: [{ token: PLATFORM_ID }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); NgxMasonryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: NgxMasonryComponent, selector: "[ngx-masonry], ngx-masonry", inputs: { options: "options", updateLayout: "updateLayout", ordered: "ordered" }, outputs: { layoutComplete: "layoutComplete", removeComplete: "removeComplete", itemsLoaded: "itemsLoaded" }, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [":host{display:block}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: NgxMasonryComponent, decorators: [{ type: Component, args: [{ selector: '[ngx-masonry], ngx-masonry', template: '<ng-content></ng-content>', styles: [":host{display:block}\n"] }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }, { type: i0.ElementRef }]; }, propDecorators: { options: [{ type: Input }], updateLayout: [{ type: Input }], ordered: [{ type: Input }], layoutComplete: [{ type: Output }], removeComplete: [{ type: Output }], itemsLoaded: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc29ucnkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hc29ucnkvc3JjL2xpYi9uZ3gtbWFzb25yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFFLFdBQVcsRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBS3JKLElBQUksa0JBQXVCLENBQUM7QUFhNUIsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUF5QyxVQUFlLEVBQVUsUUFBb0I7UUFBN0MsZUFBVSxHQUFWLFVBQVUsQ0FBSztRQUFVLGFBQVEsR0FBUixRQUFRLENBQVk7UUFNN0UsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUV6QixVQUFVO1FBQ0EsbUJBQWMsR0FBd0IsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNoRSxtQkFBYyxHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO1FBQ2hFLGdCQUFXLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFakUsaUJBQVksR0FBRyxFQUFFLENBQUM7SUFkK0QsQ0FBQztJQWdCMUYsUUFBUTtRQUVOLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRTtZQUMxRSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUNoRDtRQUVELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztTQUNuQjtRQUVELDJCQUEyQjtRQUMzQixJQUFJLENBQUMsSUFBSSxD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TTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUExBVEZPUk1fSUQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neE1hc29ucnlPcHRpb25zIH0gZnJvbSAnLi9uZ3gtbWFzb25yeS1vcHRpb25zJztcbmltcG9ydCB7IE5neE1hc29ucnlEaXJlY3RpdmUgfSBmcm9tICcuL25neC1tYXNvbnJ5LmRpcmVjdGl2ZSc7XG5cbmRlY2xhcmUgdmFyIHJlcXVpcmU6IGFueTtcbmxldCBtYXNvbnJ5Q29uc3RydWN0b3I6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW25neC1tYXNvbnJ5XSwgbmd4LW1hc29ucnknLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICBzdHlsZXM6IFtcbiAgICBgXG5cdFx0Omhvc3Qge1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0fVxuXHRgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWFzb25yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IGFueSwgcHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZikge31cblxuICBwdWJsaWMgbWFzb25yeUluc3RhbmNlOiBhbnk7XG5cbiAgLy8gSW5wdXRzXG4gIEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zOiBOZ3hNYXNvbnJ5T3B0aW9ucztcbiAgQElucHV0KCkgdXBkYXRlTGF5b3V0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9yZGVyZWQgPSBmYWxzZTtcblxuICAvLyBPdXRwdXRzXG4gIEBPdXRwdXQoKSBsYXlvdXRDb21wbGV0ZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gIEBPdXRwdXQoKSByZW1vdmVDb21wbGV0ZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gIEBPdXRwdXQoKSBpdGVtc0xvYWRlZDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBwcml2YXRlIHBlbmRpbmdJdGVtcyA9IFtdO1xuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiYgbWFzb25yeUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1hc29ucnlDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJ21hc29ucnktbGF5b3V0Jyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIG1hc29ucnkgb3B0aW9ucyBvYmplY3RcbiAgICBpZiAoIXRoaXMub3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgaXRlbVNlbGVjdG9yXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yID0gJ1tuZ3hNYXNvbnJ5SXRlbV0sIG5neE1hc29ucnlJdGVtJztcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnNbJ3RyYW5zaXRpb25EdXJhdGlvbiddID0gJzBzJztcblxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAvLyBJbml0aWFsaXplIE1hc29ucnlcbiAgICAgIHRoaXMubWFzb25yeUluc3RhbmNlID0gbmV3IG1hc29ucnlDb25zdHJ1Y3Rvcih0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgIC8vIEJpbmQgdG8gZXZlbnRzXG4gICAgICB0aGlzLm1hc29ucnlJbnN0YW5jZS5vbignbGF5b3V0Q29tcGxldGUnLCAoaXRlbXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxheW91dENvbXBsZXRlLmVtaXQoaXRlbXMpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1hc29ucnlJbnN0YW5jZS5vbigncmVtb3ZlQ29tcGxldGUnLCAoaXRlbXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUNvbXBsZXRlLmVtaXQoaXRlbXMpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1hc29ucnlJbnN0YW5jZS5pdGVtcz1bXTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgLy8gb25seSB1cGRhdGUgbGF5b3V0IGlmIGl0J3Mgbm90IHRoZSBmaXJzdCBjaGFuZ2VcbiAgICBpZiAoY2hhbmdlcy51cGRhdGVMYXlvdXQpIHtcbiAgICAgIGlmICghY2hhbmdlcy51cGRhdGVMYXlvdXQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5tYXNvbnJ5SW5zdGFuY2UpIHtcbiAgICAgIHRoaXMubWFzb25yeUluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbGF5b3V0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5tYXNvbnJ5SW5zdGFuY2UubGF5b3V0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkSXRlbXMoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1hc29ucnlJbnN0YW5jZS5yZWxvYWRJdGVtcygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZFBlbmRpbmdJdGVtKGl0ZW06IE5neE1hc29ucnlEaXJlY3RpdmUpIHtcbiAgICB0aGlzLnBlbmRpbmdJdGVtcy5wdXNoKGl0ZW0pO1xuICB9XG5cbiAgcHVibGljIGFkZChuZXdJdGVtOiBOZ3hNYXNvbnJ5RGlyZWN0aXZlKSB7XG4gICAgaWYgKHRoaXMub3JkZXJlZCkge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHRoaXMucGVuZGluZ0l0ZW1zLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgIGlmIChpdGVtLmltYWdlcyAmJiBpdGVtLmltYWdlcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdJdGVtc1tpbmRleF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLml0ZW1Mb2FkZWQoaXRlbSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggKyAxID09PSB0aGlzLnBlbmRpbmdJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gQWxsIGl0ZW1zIGFyZSBsb2FkZWRcbiAgICAgICAgICAgICAgdGhpcy5pdGVtc0xvYWRlZC5lbWl0KHRoaXMucGVuZGluZ0l0ZW1zLmxlbmd0aCk7XG4gICAgICAgICAgICAgIHRoaXMucGVuZGluZ0l0ZW1zID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pdGVtTG9hZGVkKG5ld0l0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXRlbUxvYWRlZChpdGVtOiBOZ3hNYXNvbnJ5RGlyZWN0aXZlKSB7XG4gICAgaWYoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSl7XG4gICAgICAvLyBUZWxsIE1hc29ucnkgdGhhdCBhIGNoaWxkIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWRcbiAgICAgIGlmIChpdGVtLnByZXBlbmQpIHtcbiAgICAgICAgdGhpcy5tYXNvbnJ5SW5zdGFuY2UucHJlcGVuZGVkKGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFzb25yeUluc3RhbmNlLmFwcGVuZGVkKGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgZmlyc3QgaXRlbVxuICAgICAgaWYgKHRoaXMubWFzb25yeUluc3RhbmNlLml0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHRoaXMubWFzb25yeUluc3RhbmNlLmxheW91dCgpO1xuICAgICAgfVxuICAgICAgaXRlbS5wbGF5QW5pbWF0aW9uKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmUoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgLy8gVGVsbCBNYXNvbnJ5IHRoYXQgYSBjaGlsZCBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWRcbiAgICAgIHRoaXMubWFzb25yeUluc3RhbmNlLnJlbW92ZShlbGVtZW50KTtcblxuICAgICAgLy8gTGF5b3V0IGl0ZW1zXG4gICAgICB0aGlzLmxheW91dCgpO1xuICAgIH1cbiAgfVxufVxuIl19