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
JavaScript
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