ngx-masonry
Version:
Angular Module for displaying a feed of items in a masonry layout using https://github.com/desandro/masonry
135 lines • 15.5 kB
JavaScript
import { isPlatformBrowser } from '@angular/common';
import { Component, EventEmitter, Inject, Input, Output, PLATFORM_ID } from '@angular/core';
import Masonry from 'masonry-layout';
import * as i0 from "@angular/core";
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() {
// 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 Masonry(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc29ucnkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hc29ucnkvc3JjL2xpYi9uZ3gtbWFzb25yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFFLFdBQVcsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFHckosT0FBTyxPQUFPLE1BQU0sZ0JBQWdCLENBQUM7O0FBYXJDLE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsWUFBeUMsVUFBZSxFQUFVLFFBQW9CO1FBQTdDLGVBQVUsR0FBVixVQUFVLENBQUs7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFZO1FBTTdFLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFekIsVUFBVTtRQUNBLG1CQUFjLEdBQXdCLElBQUksWUFBWSxFQUFTLENBQUM7UUFDaEUsbUJBQWMsR0FBd0IsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNoRSxnQkFBVyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWpFLGlCQUFZLEdBQUcsRUFBRSxDQUFDO0lBZCtELENBQUM7SUFnQjFGLFFBQVE7UUFFTixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7U0FDbkI7UUFFRCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLGtDQUFrQyxDQUFDO1NBQ2hFO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0Is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QUFJLENBQUMsT0FBTyxFQUFFO2dCQUNoQixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzVEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDM0Q7WUFFRCxzQkFBc0I7WUFDdEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2pDO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsT0FBb0I7UUFDaEMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMscURBQXFEO1lBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXJDLGVBQWU7WUFDZixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDZjtJQUNILENBQUM7O2dIQTVIVSxtQkFBbUIsa0JBQ1YsV0FBVztvR0FEcEIsbUJBQW1CLHNSQVRwQiwyQkFBMkI7MkZBUzFCLG1CQUFtQjtrQkFYL0IsU0FBUzsrQkFDRSw0QkFBNEIsWUFDNUIsMkJBQTJCOzswQkFVeEIsTUFBTTsyQkFBQyxXQUFXO3FFQUtmLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBQTEFURk9STV9JRCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4TWFzb25yeU9wdGlvbnMgfSBmcm9tICcuL25neC1tYXNvbnJ5LW9wdGlvbnMnO1xuaW1wb3J0IHsgTmd4TWFzb25yeURpcmVjdGl2ZSB9IGZyb20gJy4vbmd4LW1hc29ucnkuZGlyZWN0aXZlJztcbmltcG9ydCBNYXNvbnJ5IGZyb20gJ21hc29ucnktbGF5b3V0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW25neC1tYXNvbnJ5XSwgbmd4LW1hc29ucnknLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICBzdHlsZXM6IFtcbiAgICBgXG5cdFx0Omhvc3Qge1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0fVxuXHRgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWFzb25yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IGFueSwgcHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZikge31cblxuICBwdWJsaWMgbWFzb25yeUluc3RhbmNlOiBhbnk7XG5cbiAgLy8gSW5wdXRzXG4gIEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zOiBOZ3hNYXNvbnJ5T3B0aW9ucztcbiAgQElucHV0KCkgdXBkYXRlTGF5b3V0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9yZGVyZWQgPSBmYWxzZTtcblxuICAvLyBPdXRwdXRzXG4gIEBPdXRwdXQoKSBsYXlvdXRDb21wbGV0ZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gIEBPdXRwdXQoKSByZW1vdmVDb21wbGV0ZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gIEBPdXRwdXQoKSBpdGVtc0xvYWRlZDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBwcml2YXRlIHBlbmRpbmdJdGVtcyA9IFtdO1xuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgLy8gQ3JlYXRlIG1hc29ucnkgb3B0aW9ucyBvYmplY3RcbiAgICBpZiAoIXRoaXMub3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgaXRlbVNlbGVjdG9yXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yID0gJ1tuZ3hNYXNvbnJ5SXRlbV0sIG5neE1hc29ucnlJdGVtJztcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnNbJ3RyYW5zaXRpb25EdXJhdGlvbiddID0gJzBzJztcblxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAvLyBJbml0aWFsaXplIE1hc29ucnlcbiAgICAgIHRoaXMubWFzb25yeUluc3RhbmNlID0gbmV3IE1hc29ucnkodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAvLyBCaW5kIHRvIGV2ZW50c1xuICAgICAgdGhpcy5tYXNvbnJ5SW5zdGFuY2Uub24oJ2xheW91dENvbXBsZXRlJywgKGl0ZW1zOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sYXlvdXRDb21wbGV0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXNvbnJ5SW5zdGFuY2Uub24oJ3JlbW92ZUNvbXBsZXRlJywgKGl0ZW1zOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVDb21wbGV0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXNvbnJ5SW5zdGFuY2UuaXRlbXM9W107XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vIG9ubHkgdXBkYXRlIGxheW91dCBpZiBpdCdzIG5vdCB0aGUgZmlyc3QgY2hhbmdlXG4gICAgaWYgKGNoYW5nZXMudXBkYXRlTGF5b3V0KSB7XG4gICAgICBpZiAoIWNoYW5nZXMudXBkYXRlTGF5b3V0LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMubGF5b3V0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMubWFzb25yeUluc3RhbmNlKSB7XG4gICAgICB0aGlzLm1hc29ucnlJbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxheW91dCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubWFzb25yeUluc3RhbmNlLmxheW91dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZEl0ZW1zKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5tYXNvbnJ5SW5zdGFuY2UucmVsb2FkSXRlbXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQZW5kaW5nSXRlbShpdGVtOiBOZ3hNYXNvbnJ5RGlyZWN0aXZlKSB7XG4gICAgdGhpcy5wZW5kaW5nSXRlbXMucHVzaChpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGQobmV3SXRlbTogTmd4TWFzb25yeURpcmVjdGl2ZSkge1xuICAgIGlmICh0aGlzLm9yZGVyZWQpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiB0aGlzLnBlbmRpbmdJdGVtcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICBpZiAoaXRlbS5pbWFnZXMgJiYgaXRlbS5pbWFnZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nSXRlbXNbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5pdGVtTG9hZGVkKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA9PT0gdGhpcy5wZW5kaW5nSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIC8vIEFsbCBpdGVtcyBhcmUgbG9hZGVkXG4gICAgICAgICAgICAgIHRoaXMuaXRlbXNMb2FkZWQuZW1pdCh0aGlzLnBlbmRpbmdJdGVtcy5sZW5ndGgpO1xuICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdJdGVtcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbUxvYWRlZChuZXdJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGl0ZW1Mb2FkZWQoaXRlbTogTmd4TWFzb25yeURpcmVjdGl2ZSkge1xuICAgIGlmKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpe1xuICAgICAgLy8gVGVsbCBNYXNvbnJ5IHRoYXQgYSBjaGlsZCBlbGVtZW50IGhhcyBiZWVuIGFkZGVkXG4gICAgICBpZiAoaXRlbS5wcmVwZW5kKSB7XG4gICAgICAgIHRoaXMubWFzb25yeUluc3RhbmNlLnByZXBlbmRlZChpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hc29ucnlJbnN0YW5jZS5hcHBlbmRlZChpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpcnN0IGl0ZW1cbiAgICAgIGlmICh0aGlzLm1hc29ucnlJbnN0YW5jZS5pdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLm1hc29ucnlJbnN0YW5jZS5sYXlvdXQoKTtcbiAgICAgIH1cbiAgICAgIGl0ZW0ucGxheUFuaW1hdGlvbih0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIC8vIFRlbGwgTWFzb25yeSB0aGF0IGEgY2hpbGQgZWxlbWVudCBoYXMgYmVlbiByZW1vdmVkXG4gICAgICB0aGlzLm1hc29ucnlJbnN0YW5jZS5yZW1vdmUoZWxlbWVudCk7XG5cbiAgICAgIC8vIExheW91dCBpdGVtc1xuICAgICAgdGhpcy5sYXlvdXQoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==