UNPKG

@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
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=