ngm-masonry
Version:
Angular Module for displaying a feed of items in a masonry layout using https://github.com/glebmlk/ngx-masonry
215 lines • 18.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { isPlatformBrowser } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgZone, Output, PLATFORM_ID, } from '@angular/core';
/** @type {?} */
let imagesLoaded;
/** @type {?} */
let masonryConstructor;
export class NgmMasonryComponent {
/**
* @param {?} platformId
* @param {?} element
* @param {?} ngZone
* @param {?} changeDetectorRef
*/
constructor(platformId, element, ngZone, changeDetectorRef) {
this.platformId = platformId;
this.element = element;
this.ngZone = ngZone;
this.changeDetectorRef = changeDetectorRef;
// Inputs
this.options = {};
this.useImagesLoaded = false;
this.updateLayout = false;
// Outputs
this.layoutComplete = new EventEmitter();
this.removeComplete = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
this.ngZone.runOutsideAngular(() => {
if (this.useImagesLoaded && imagesLoaded === undefined) {
imagesLoaded = require('imagesloaded');
}
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 = '[ngmMasonryItem], ngmMasonryItem';
}
if (isPlatformBrowser(this.platformId)) {
// Initialize Masonry
this._msnry = new masonryConstructor(this.element.nativeElement, this.options);
// Bind to events
this._msnry.on('layoutComplete', (items) => {
this.layoutComplete.emit(items);
this.changeDetectorRef.markForCheck();
});
this._msnry.on('removeComplete', (items) => {
this.removeComplete.emit(items);
this.changeDetectorRef.markForCheck();
});
}
});
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
// only update layout if it's not the first change
if (changes.updateLayout) {
if (!changes.updateLayout.firstChange) {
this.layout();
}
}
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this._msnry) {
this._msnry.destroy();
}
}
/**
* @return {?}
*/
layout() {
requestAnimationFrame(() => {
this._msnry.layout();
this.changeDetectorRef.markForCheck();
});
}
/**
* @return {?}
*/
reloadItems() {
requestAnimationFrame(() => {
this._msnry.reloadItems();
this.changeDetectorRef.markForCheck();
});
}
// public add(element: HTMLElement, prepend: boolean = false) {
/**
* @param {?} element
* @return {?}
*/
add(element) {
this.ngZone.runOutsideAngular(() => {
/** @type {?} */
let isFirstItem = false;
// Check if first item
if (this._msnry.items.length === 0) {
isFirstItem = true;
}
if (this.useImagesLoaded) {
imagesLoaded(element, (instance) => {
this.element.nativeElement.appendChild(element);
// Tell Masonry that a child element has been added
setTimeout(() => {
this._msnry.appended(element);
this.changeDetectorRef.markForCheck();
});
// layout if first item
if (isFirstItem) {
this.layout();
}
});
this.element.nativeElement.removeChild(element);
}
else {
// Tell Masonry that a child element has been added
setTimeout(() => {
this._msnry.appended(element);
this.changeDetectorRef.markForCheck();
});
// layout if first item
if (isFirstItem) {
this.layout();
}
}
});
}
/**
* @param {?} element
* @return {?}
*/
remove(element) {
// Tell Masonry that a child element has been removed
this._msnry.remove(element);
// Layout items
this.layout();
}
}
NgmMasonryComponent.decorators = [
{ type: Component, args: [{
selector: '[ngm-masonry], ngm-masonry',
template: '<ng-content></ng-content>',
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [`
:host {
display: block;
}
`]
}] }
];
/** @nocollapse */
NgmMasonryComponent.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: ElementRef },
{ type: NgZone },
{ type: ChangeDetectorRef }
];
NgmMasonryComponent.propDecorators = {
options: [{ type: Input }],
useImagesLoaded: [{ type: Input }],
updateLayout: [{ type: Input }],
layoutComplete: [{ type: Output }],
removeComplete: [{ type: Output }]
};
if (false) {
/** @type {?} */
NgmMasonryComponent.prototype._msnry;
/** @type {?} */
NgmMasonryComponent.prototype.options;
/** @type {?} */
NgmMasonryComponent.prototype.useImagesLoaded;
/** @type {?} */
NgmMasonryComponent.prototype.updateLayout;
/** @type {?} */
NgmMasonryComponent.prototype.layoutComplete;
/** @type {?} */
NgmMasonryComponent.prototype.removeComplete;
/**
* @type {?}
* @private
*/
NgmMasonryComponent.prototype.platformId;
/**
* @type {?}
* @private
*/
NgmMasonryComponent.prototype.element;
/**
* @type {?}
* @private
*/
NgmMasonryComponent.prototype.ngZone;
/**
* @type {?}
* @private
*/
NgmMasonryComponent.prototype.changeDetectorRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdtLW1hc29ucnkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmdtLW1hc29ucnkvIiwic291cmNlcyI6WyJuZ20tbWFzb25yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEdBRWQsTUFBTSxlQUFlLENBQUM7O0lBR25CLFlBQWlCOztJQUNqQixrQkFBdUI7QUFnQjNCLE1BQU0sT0FBTyxtQkFBbUI7Ozs7Ozs7SUFDNUIsWUFDMEMsVUFBZSxFQUNwQyxPQUFtQixFQUNuQixNQUFjLEVBQ2QsaUJBQW9DO1FBSGYsZUFBVSxHQUFWLFVBQVUsQ0FBSztRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1COztRQU16QyxZQUFPLEdBQXVCLEVBQUUsQ0FBQztRQUNqQyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUN4QyxpQkFBWSxHQUFZLEtBQUssQ0FBQzs7UUFHN0IsbUJBQWMsR0FBd0IsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNoRSxtQkFBYyxHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO0lBWHZFLENBQUM7Ozs7SUFhSixRQUFRO1FBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7Z0JBQ3BELFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDMUM7WUFFRCxJQUFJLGlCQUFpQixDQUFDLElBQUks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LGlCQUFpQjs7O3NCQTRDaEIsS0FBSzs4QkFDTCxLQUFLOzJCQUNMLEtBQUs7NkJBR0wsTUFBTTs2QkFDTixNQUFNOzs7O0lBVFAscUNBQW1COztJQUduQixzQ0FBaUQ7O0lBQ2pELDhDQUFpRDs7SUFDakQsMkNBQXVDOztJQUd2Qyw2Q0FBMEU7O0lBQzFFLDZDQUEwRTs7Ozs7SUFmdEUseUNBQXFEOzs7OztJQUNyRCxzQ0FBb0M7Ozs7O0lBQ3BDLHFDQUErQjs7Ozs7SUFDL0IsZ0RBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc1BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIHZhciByZXF1aXJlOiBhbnk7XG5sZXQgaW1hZ2VzTG9hZGVkOiBhbnk7XG5sZXQgbWFzb25yeUNvbnN0cnVjdG9yOiBhbnk7XG5cbmltcG9ydCB7SU5nbU1hc29ucnlPcHRpb25zfSBmcm9tICcuL25nbS1tYXNvbnJ5LW9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1tuZ20tbWFzb25yeV0sIG5nbS1tYXNvbnJ5JyxcbiAgICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmdtTWFzb25yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IGFueSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgX21zbnJ5OiBhbnk7XG5cbiAgICAvLyBJbnB1dHNcbiAgICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogSU5nbU1hc29ucnlPcHRpb25zID0ge307XG4gICAgQElucHV0KCkgcHVibGljIHVzZUltYWdlc0xvYWRlZDogQm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHVwZGF0ZUxheW91dDogQm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gT3V0cHV0c1xuICAgIEBPdXRwdXQoKSBsYXlvdXRDb21wbGV0ZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gICAgQE91dHB1dCgpIHJlbW92ZUNvbXBsZXRlOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VJbWFnZXNMb2FkZWQgJiYgaW1hZ2VzTG9hZGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpbWFnZXNMb2FkZWQgPSByZXF1aXJlKCdpbWFnZXNsb2FkZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiYgbWFzb25yeUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtYXNvbnJ5Q29uc3RydWN0b3IgPSByZXF1aXJlKCdtYXNvbnJ5LWxheW91dCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgbWFzb25yeSBvcHRpb25zIG9iamVjdFxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHQgaXRlbVNlbGVjdG9yXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtU2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yID0gJ1tuZ21NYXNvbnJ5SXRlbV0sIG5nbU1hc29ucnlJdGVtJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIE1hc29ucnlcbiAgICAgICAgICAgICAgICB0aGlzLl9tc25yeSA9IG5ldyBtYXNvbnJ5Q29uc3RydWN0b3IoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIEJpbmQgdG8gZXZlbnRzXG4gICAgICAgICAgICAgICAgdGhpcy5fbXNucnkub24oJ2xheW91dENvbXBsZXRlJywgKGl0ZW1zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb21wbGV0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tc25yeS5vbigncmVtb3ZlQ29tcGxldGUnLCAoaXRlbXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNvbXBsZXRlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIC8vIG9ubHkgdXBkYXRlIGxheW91dCBpZiBpdCdzIG5vdCB0aGUgZmlyc3QgY2hhbmdlXG4gICAgICAgIGlmIChjaGFuZ2VzLnVwZGF0ZUxheW91dCkge1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2VzLnVwZGF0ZUxheW91dC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21zbnJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9tc25yeS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbGF5b3V0KCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbXNucnkubGF5b3V0KCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsb2FkSXRlbXMoKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tc25yeS5yZWxvYWRJdGVtcygpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcHVibGljIGFkZChlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJlcGVuZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgcHVibGljIGFkZChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaXNGaXJzdEl0ZW0gPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZmlyc3QgaXRlbVxuICAgICAgICAgICAgaWYgKHRoaXMuX21zbnJ5Lml0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlzRmlyc3RJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMudXNlSW1hZ2VzTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VzTG9hZGVkKGVsZW1lbnQsIChpbnN0YW5jZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRlbGwgTWFzb25yeSB0aGF0IGEgY2hpbGQgZWxlbWVudCBoYXMgYmVlbiBhZGRlZFxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21zbnJ5LmFwcGVuZGVkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGF5b3V0IGlmIGZpcnN0IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3RJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGVsbCBNYXNvbnJ5IHRoYXQgYSBjaGlsZCBlbGVtZW50IGhhcyBiZWVuIGFkZGVkXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21zbnJ5LmFwcGVuZGVkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gbGF5b3V0IGlmIGZpcnN0IGl0ZW1cbiAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgLy8gVGVsbCBNYXNvbnJ5IHRoYXQgYSBjaGlsZCBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWRcbiAgICAgICAgdGhpcy5fbXNucnkucmVtb3ZlKGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIExheW91dCBpdGVtc1xuICAgICAgICB0aGlzLmxheW91dCgpO1xuICAgIH1cbn1cbiJdfQ==