@offensichtbar-codestock/ngx-flex-masonry-grid
Version:
Angular Module for displaying items in a flex-based masonry layout without any third party dependencies
143 lines • 18.4 kB
JavaScript
import { Component, ElementRef, HostBinding, Inject, HostListener } from '@angular/core';
import { AnimationBuilder, useAnimation } from '@angular/animations';
import { NgxFlexMasonryGridService } from "./ngx-flex-masonry-grid.service";
import { CIRCULAR_IMPORT_PARENT } from './circular-imports';
import NgxFMG_ANIMATION from './animations';
export class NgxFlexMasonryGridItemComponent {
constructor(element, builder, service, parent) {
this.element = element;
this.builder = builder;
this.service = service;
this.parent = parent;
this.heightprops = 'max-content';
this._translateY = 0;
this._isready = false;
this._remove = false;
}
get getLeaveDrawer() {
return this._remove;
}
animationIsDone() {
if (this._remove)
this.service.removeItem(this);
}
get height() {
return this.element.nativeElement.offsetHeight;
}
get isready() {
return this._isready;
}
set isready(ready) {
this._isready = ready;
}
get width() {
const marginLeft = window
.getComputedStyle(this.element.nativeElement, null)
.getPropertyValue('margin-left')
.match(/\d+/);
const marginRight = window
.getComputedStyle(this.element.nativeElement, null)
.getPropertyValue('margin-right')
.match(/\d+/);
return this.element.nativeElement.offsetWidth + (parseInt(marginLeft[0]) + parseInt(marginRight[0]));
}
set translateY(value) {
if (this._isready) {
this.upDatePosition(value);
}
else {
this.element.nativeElement.style.transform = `translateY(-${value}px)`;
}
this._translateY = value;
}
get translateY() {
return this._translateY;
}
ngOnInit() { }
upDatePosition(to) {
const params = { animatePosY: `-${to}px` };
const metadata = useAnimation(NgxFMG_ANIMATION.UPDATE_POSITION, { params: params });
const player = this.builder.build(metadata).create(this.element.nativeElement);
player.play();
}
playAnimation() {
const metadata = NgxFMG_ANIMATION.FADE_IN;
this.element.nativeElement.style.visibility = 'visible';
const player = this.builder.build(metadata).create(this.element.nativeElement);
player.play();
}
ngAfterViewInit() {
this.translateY = 0;
this.startLoading();
}
startLoading() {
const images = this.element.nativeElement.querySelectorAll('img');
this.images = new Set(images);
let loaded = [];
if (images.length == 0) {
setTimeout(() => {
this.service.observeimage([...loaded, {
item: this,
height: this.element.nativeElement.offsetHeight
}]);
});
return;
}
Array.from(this.images).forEach((image) => {
this.loadImage(image.src).then(props => {
var _a;
loaded = this.checkActionLoaded(loaded, images, props);
(_a = this.images) === null || _a === void 0 ? void 0 : _a.delete(image);
}).catch((error) => {
var _a;
loaded = this.checkActionLoaded(loaded, images);
(_a = this.images) === null || _a === void 0 ? void 0 : _a.delete(image);
});
});
}
checkActionLoaded(loaded, images, props) {
loaded = [...loaded, (props) ? props : {
item: this,
height: this.element.nativeElement.offsetHeight
}];
if (loaded.length === images.length) {
this.service.observeimage(loaded);
}
return loaded;
}
loadImage(src) {
return new Promise((resolve, reject) => {
let img = new Image();
img.onload = () => resolve({
item: this,
height: this.element.nativeElement.offsetHeight
});
img.onerror = reject;
img.src = src;
});
}
ngOnDestroy() {
this._remove = true;
}
}
NgxFlexMasonryGridItemComponent.decorators = [
{ type: Component, args: [{
selector: 'osb-ngx-flexmasonry-grid-item',
template: '<ng-content></ng-content> ',
animations: [
NgxFMG_ANIMATION.TRIGGER_FADE_OUT
]
},] }
];
NgxFlexMasonryGridItemComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: AnimationBuilder },
{ type: NgxFlexMasonryGridService },
{ type: undefined, decorators: [{ type: Inject, args: [CIRCULAR_IMPORT_PARENT,] }] }
];
NgxFlexMasonryGridItemComponent.propDecorators = {
heightprops: [{ type: HostBinding, args: ['style.height',] }],
getLeaveDrawer: [{ type: HostBinding, args: ['@TRIGGER_FADE_OUT',] }],
animationIsDone: [{ type: HostListener, args: ['@TRIGGER_FADE_OUT.done',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZsZXgtbWFzb25yeS1ncmlkLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZsZXgtbWFzb25yeS1ncmlkL3NyYy9saWIvbmd4LWZsZXgtbWFzb25yeS1ncmlkLWl0ZW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQW9DLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6SCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUMsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUUsT0FBTyxFQUF5QixzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25GLE9BQU8sZ0JBQWdCLE1BQU0sY0FBYyxDQUFDO0FBVzVDLE1BQU0sT0FBTywrQkFBK0I7SUE0RHhDLFlBQ1ksT0FBbUIsRUFDbkIsT0FBeUIsRUFDMUIsT0FBa0MsRUFDRCxNQUE2QjtRQUg3RCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQzFCLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBQ0QsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUE3RDVDLGdCQUFXLEdBQUksYUFBYSxDQUFDO1FBYWxELGdCQUFXLEdBQVUsQ0FBQyxDQUFDO1FBQ3ZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsWUFBTyxHQUFZLEtBQUssQ0FBQztJQStDN0IsQ0FBQztJQTVETCxJQUFzQyxjQUFjO1FBQ2hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRXVDLGVBQWU7UUFDbkQsSUFBRyxJQUFJLENBQUMsT0FBTztZQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElB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LG1CQUFtQjs4QkFJL0IsWUFBWSxTQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIEluamVjdCwgSG9zdExpc3RlbmVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neEZsZXhNYXNvbnJ5R3JpZExvYWRpbmdQYXJhbXMgfSBmcm9tICcuL25neC1mbGV4LW1hc29ucnktZ3JpZC1vcHRpb25zJztcbmltcG9ydCB7IEFuaW1hdGlvbkJ1aWxkZXIsdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBOZ3hGbGV4TWFzb25yeUdyaWRTZXJ2aWNlIH0gZnJvbSBcIi4vbmd4LWZsZXgtbWFzb25yeS1ncmlkLnNlcnZpY2VcIjtcbmltcG9ydCB7IENpcmN1bGFySW1wb3J0c1BhcmVudCwgQ0lSQ1VMQVJfSU1QT1JUX1BBUkVOVCB9IGZyb20gJy4vY2lyY3VsYXItaW1wb3J0cyc7XG5pbXBvcnQgTmd4Rk1HX0FOSU1BVElPTiBmcm9tICcuL2FuaW1hdGlvbnMnO1xuXG5AQ29tcG9uZW50KHsgXG4gICAgc2VsZWN0b3I6ICdvc2Itbmd4LWZsZXhtYXNvbnJ5LWdyaWQtaXRlbScsXG4gICAgdGVtcGxhdGU6ICc8bmctY29udGVudD48L25nLWNvbnRlbnQ+ICcsIFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgTmd4Rk1HX0FOSU1BVElPTi5UUklHR0VSX0ZBREVfT1VUXG4gICAgXVxuICAgIFxufSkgXG5cbmV4cG9ydCBjbGFzcyBOZ3hGbGV4TWFzb25yeUdyaWRJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQgIHtcblxuICAgIFxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JykgaGVpZ2h0cHJvcHMgPSAgJ21heC1jb250ZW50JzsgXG5cbiAgICBASG9zdEJpbmRpbmcoJ0BUUklHR0VSX0ZBREVfT1VUJykgZ2V0IGdldExlYXZlRHJhd2VyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVtb3ZlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ0BUUklHR0VSX0ZBREVfT1VULmRvbmUnKSBhbmltYXRpb25Jc0RvbmUoKSB7XG4gICAgICAgIGlmKHRoaXMuX3JlbW92ZSlcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5yZW1vdmVJdGVtKHRoaXMpO1xuICAgIH1cbiBcbiAgIFxuICAgIHB1YmxpYyBpbWFnZXM/OiBTZXQ8SFRNTEltYWdlRWxlbWVudD47XG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRlWTogbnVtYmVyID0wO1xuICAgIHByaXZhdGUgX2lzcmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yZW1vdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNyZWFkeSgpOmJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNyZWFkeTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBzZXQgaXNyZWFkeShyZWFkeTpib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2lzcmVhZHkgPSByZWFkeTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6bnVtYmVyIHtcbiAgICAgICAgY29uc3QgIG1hcmdpbkxlZnQ6YW55ID0gd2luZG93XG4gICAgICAgICAgICAuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCxudWxsKVxuICAgICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1sZWZ0JylcbiAgICAgICAgICAgIC5tYXRjaCgvXFxkKy8pO1xuICAgIFxuICAgICAgICBjb25zdCBtYXJnaW5SaWdodDphbnkgPSB3aW5kb3dcbiAgICAgICAgICAgIC5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LG51bGwpXG4gICAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLXJpZ2h0JylcbiAgICAgICAgICAgIC5tYXRjaCgvXFxkKy8pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArIChwYXJzZUludChtYXJnaW5MZWZ0WzBdKSArIHBhcnNlSW50KG1hcmdpblJpZ2h0WzBdKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB0cmFuc2xhdGVZKHZhbHVlOm51bWJlcikge1xuICAgICAgICBpZih0aGlzLl9pc3JlYWR5KSB7XG4gICAgICAgICAgICB0aGlzLnVwRGF0ZVBvc2l0aW9uKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKC0ke3ZhbHVlfXB4KWA7XG4gICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZVkgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRyYW5zbGF0ZVkoKTpudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlWTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBcbiAgICAgICAgcHJpdmF0ZSBidWlsZGVyOiBBbmltYXRpb25CdWlsZGVyLCAgIFxuICAgICAgICBwdWJsaWMgc2VydmljZTogTmd4RmxleE1hc29ucnlHcmlkU2VydmljZSxcbiAgICAgICAgQEluamVjdChDSVJDVUxBUl9JTVBPUlRfUEFSRU5UKSBwcml2YXRlIHBhcmVudDogQ2lyY3VsYXJJbXBvcnRzUGFyZW50XG4gICAgKSB7IH1cblxuICAgIG5nT25Jbml0KCkge31cblxuICAgIHVwRGF0ZVBvc2l0aW9uKHRvOm51bWJlcikge1xuICAgICAgXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHthbmltYXRlUG9zWTogYC0ke3RvfXB4YH07XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdXNlQW5pbWF0aW9uKE5neEZNR19BTklNQVRJT04uVVBEQVRFX1BPU0lUSU9OLCB7cGFyYW1zOiBwYXJhbXN9KTtcblxuICAgICAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLmJ1aWxkZXIuYnVpbGQobWV0YWRhdGEpLmNyZWF0ZSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gXG5cbiAgICAgICAgcGxheWVyLnBsYXkoKTsgICAgICAgICAgIFxuICAgICAgICAgICAgXG4gICAgfVxuXG4gICAgcGxheUFuaW1hdGlvbigpIHtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gTmd4Rk1HX0FOSU1BVElPTi5GQURFX0lOO1xuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuXG4gICAgICAgIGNvbnN0IHBsYXllciA9IHRoaXMuYnVpbGRlci5idWlsZChtZXRhZGF0YSkuY3JlYXRlKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgcGxheWVyLnBsYXkoKTsgICAgICAgXG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVkgPSAwO1xuICAgICAgICB0aGlzLnN0YXJ0TG9hZGluZygpO1xuICAgIH1cblxuICAgIHN0YXJ0TG9hZGluZygpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VzID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7ICAgICBcbiAgICAgICAgdGhpcy5pbWFnZXMgPSBuZXcgU2V0KGltYWdlcyk7ICAgIFxuICAgICAgICBsZXQgbG9hZGVkOkFycmF5PE5neEZsZXhNYXNvbnJ5R3JpZExvYWRpbmdQYXJhbXM+ID0gW107XG5cbiAgICAgICAgaWYoIGltYWdlcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+e1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5vYnNlcnZlaW1hZ2UoWy4uLmxvYWRlZCwge1xuICAgICAgICAgICAgICAgICAgICBpdGVtOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodFxuICAgICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBBcnJheS5mcm9tKHRoaXMuaW1hZ2VzKS5mb3JFYWNoKChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmxvYWRJbWFnZShpbWFnZS5zcmMpLnRoZW4ocHJvcHMgPT4ge1xuICAgICAgICAgICAgICAgIGxvYWRlZCA9IHRoaXMuY2hlY2tBY3Rpb25Mb2FkZWQobG9hZGVkLCBpbWFnZXMsIHByb3BzKVxuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VzPy5kZWxldGUoaW1hZ2UpO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsb2FkZWQgPSB0aGlzLmNoZWNrQWN0aW9uTG9hZGVkKGxvYWRlZCwgaW1hZ2VzKVxuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VzPy5kZWxldGUoaW1hZ2UpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2hlY2tBY3Rpb25Mb2FkZWQobG9hZGVkOiBBcnJheTxOZ3hGbGV4TWFzb25yeUdyaWRMb2FkaW5nUGFyYW1zPiwgaW1hZ2VzOiBBcnJheTxIVE1MSW1hZ2VFbGVtZW50PiwgcHJvcHM/Ok5neEZsZXhNYXNvbnJ5R3JpZExvYWRpbmdQYXJhbXMpIHtcbiAgICAgICAgbG9hZGVkID0gWy4uLmxvYWRlZCwgKHByb3BzKSA/IHByb3BzIDoge1xuICAgICAgICAgICAgaXRlbTogdGhpcyxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgICAgIH1dO1xuXG4gICAgICAgIGlmKGxvYWRlZC5sZW5ndGggPT09IGltYWdlcy5sZW5ndGgpIHsgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLm9ic2VydmVpbWFnZShsb2FkZWQpO1xuICAgICAgICB9IFxuXG4gICAgICAgIHJldHVybiBsb2FkZWQ7XG4gICAgfVxuXG4gICAgbG9hZEltYWdlKHNyYzogc3RyaW5nKTogUHJvbWlzZTxOZ3hGbGV4TWFzb25yeUdyaWRMb2FkaW5nUGFyYW1zPiB7XG5cbiAgICAgICAgcmV0dXJuICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaW1nID0gbmV3IEltYWdlKClcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBpdGVtOiB0aGlzLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3RcbiAgICAgICAgICAgIGltZy5zcmMgPSBzcmNcbiAgICAgICAgfSlcbiAgICAgICBcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlID0gdHJ1ZTtcbiAgICAgICBcbiAgICB9XG59XG4iXX0=