@raphy/ngx-equalizer
Version:
A library to equalize height and width of elements with Angular4+
250 lines (239 loc) • 17.3 kB
JavaScript
import { Injectable, Directive, ElementRef, Input, ContentChildren, HostListener, QueryList, Renderer2, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class EqualizerService {
/**
* @param {?} renderer
* @param {?} elementRefs
* @param {?=} params
* @return {?}
*/
equalize(renderer, elementRefs, params = { property: 'height', reset: true }) {
let /** @type {?} */ maxValue = 0;
elementRefs.map((elementRef) => {
if (params.reset) {
renderer.setStyle(elementRef.nativeElement, params.property, 'initial');
}
const /** @type {?} */ value = elementRef.nativeElement['offset' + params.property[0].toUpperCase() + params.property.slice(1)];
maxValue = value > maxValue ? value : maxValue;
});
elementRefs.map((elementRef) => {
renderer.setStyle(elementRef.nativeElement, params.property, maxValue + 'px');
});
}
}
EqualizerService.decorators = [
{ type: Injectable },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class EqualizerWatcherDirective {
/**
* @param {?} _elementRef
*/
constructor(_elementRef) {
this._elementRef = _elementRef;
}
/**
* @return {?}
*/
get elementRef() {
return this._elementRef;
}
/**
* @return {?}
*/
get id() {
return this._id;
}
/**
* @param {?} value
* @return {?}
*/
set id(value) {
this._id = value;
}
}
EqualizerWatcherDirective.decorators = [
{ type: Directive, args: [{
selector: '[equalizerWatcher]'
},] },
];
/** @nocollapse */
EqualizerWatcherDirective.ctorParameters = () => [
{ type: ElementRef }
];
EqualizerWatcherDirective.propDecorators = {
_id: [{ type: Input, args: ['equalizerWatcher',] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class EqualizerDirective {
/**
* @param {?} _elementRef
* @param {?} _renderer
* @param {?} _equalizerService
*/
constructor(_elementRef, _renderer, _equalizerService) {
this._elementRef = _elementRef;
this._renderer = _renderer;
this._equalizerService = _equalizerService;
this._params = 'height';
this._watchers = new QueryList();
}
/**
* @return {?}
*/
get params() {
return this._params;
}
/**
* @param {?} value
* @return {?}
*/
set params(value) {
this._params = value;
this.equalize();
}
/**
* @return {?}
*/
get elementRef() {
return this._elementRef;
}
/**
* @return {?}
*/
get id() {
return this._id;
}
/**
* @param {?} value
* @return {?}
*/
set id(value) {
this._id = value;
}
/**
* @return {?}
*/
ngAfterViewChecked() {
this.equalize();
}
/**
* @return {?}
*/
_onResize() {
this.equalize();
}
/**
* @return {?}
*/
equalize() {
if (!this._params) {
this._params = 'height';
}
const /** @type {?} */ params = Object.assign({ property: 'height', reset: true }, typeof this._params === 'string' ? { property: this._params } : this._params);
const /** @type {?} */ watchers = this._watchers.filter((watcher) => {
console.log('ID matching', watcher.id, this.id);
if (watcher.id || this.id) {
return watcher.id === this.id;
}
return watcher.elementRef.nativeElement !== this._elementRef.nativeElement;
}).map((watcher) => watcher.elementRef);
this._equalizerService.equalize(this._renderer, watchers, params);
}
}
EqualizerDirective.decorators = [
{ type: Directive, args: [{
selector: '[equalizer]',
exportAs: 'equalizer'
},] },
];
/** @nocollapse */
EqualizerDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 },
{ type: EqualizerService }
];
EqualizerDirective.propDecorators = {
_params: [{ type: Input, args: ['equalizer',] }],
_id: [{ type: Input, args: ['equalizerId',] }],
_watchers: [{ type: ContentChildren, args: [EqualizerWatcherDirective, { read: EqualizerWatcherDirective },] }],
_onResize: [{ type: HostListener, args: ['window:resize',] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class EqualizerModule {
/**
* @return {?}
*/
static forRoot() {
return {
ngModule: EqualizerModule,
providers: [
EqualizerService,
]
};
}
/**
* @return {?}
*/
static forChild() {
return {
ngModule: EqualizerModule,
providers: [
EqualizerService
]
};
}
}
EqualizerModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule,
],
exports: [
EqualizerDirective,
EqualizerWatcherDirective,
],
declarations: [
EqualizerDirective,
EqualizerWatcherDirective,
],
providers: [
EqualizerService,
],
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { EqualizerDirective, EqualizerWatcherDirective, EqualizerService, EqualizerModule, EqualizerDirective as ɵa, EqualizerWatcherDirective as ɵb, EqualizerService as ɵc };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFwaHktbmd4LWVxdWFsaXplci5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQHJhcGh5L25neC1lcXVhbGl6ZXIvbGliL3NlcnZpY2VzL2VxdWFsaXplci5zZXJ2aWNlLnRzIiwibmc6Ly9AcmFwaHkvbmd4LWVxdWFsaXplci9saWIvZGlyZWN0aXZlcy9lcXVhbGl6ZXItd2F0Y2hlci5kaXJlY3RpdmUudHMiLCJuZzovL0ByYXBoeS9uZ3gtZXF1YWxpemVyL2xpYi9kaXJlY3RpdmVzL2VxdWFsaXplci5kaXJlY3RpdmUudHMiLCJuZzovL0ByYXBoeS9uZ3gtZXF1YWxpemVyL2xpYi9lcXVhbGl6ZXIubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBFcXVhbGl6ZVBhcmFtcyB9IGZyb20gJy4uL2VxdWFsaXplLXBhcmFtcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFcXVhbGl6ZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgZXF1YWxpemUoXG4gICAgICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIGVsZW1lbnRSZWZzOiBFbGVtZW50UmVmW10sXG4gICAgICAgIHBhcmFtczogRXF1YWxpemVQYXJhbXMgPSB7cHJvcGVydHk6ICdoZWlnaHQnLCByZXNldDogdHJ1ZX1cbiAgICApIHtcblxuICAgICAgICBsZXQgbWF4VmFsdWU6IG51bWJlciA9IDA7XG5cbiAgICAgICAgZWxlbWVudFJlZnMubWFwKFxuICAgICAgICAgICAgKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnJlc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgcGFyYW1zLnByb3BlcnR5LCAnaW5pdGlhbCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlOiBudW1iZXIgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRbJ29mZnNldCcgKyBwYXJhbXMucHJvcGVydHlbMF0udG9VcHBlckNhc2UoKSArIHBhcmFtcy5wcm9wZXJ0eS5zbGljZSgxKV07XG4gICAgICAgICAgICAgICAgbWF4VmFsdWUgPSB2YWx1ZSA+IG1heFZhbHVlID8gdmFsdWUgOiBtYXhWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBlbGVtZW50UmVmcy5tYXAoXG4gICAgICAgICAgICAoZWxlbWVudFJlZjogRWxlbWVudFJlZikgPT4ge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgcGFyYW1zLnByb3BlcnR5LCBtYXhWYWx1ZSArICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbZXF1YWxpemVyV2F0Y2hlcl0nXG59KVxuZXhwb3J0IGNsYXNzIEVxdWFsaXplcldhdGNoZXJEaXJlY3RpdmUge1xuICAgIEBJbnB1dCgnZXF1YWxpemVyV2F0Y2hlcicpXG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZyB8IG51bWJlcjtcblxuICAgIGdldCBlbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZjtcbiAgICB9XG5cbiAgICBnZXQgaWQoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH1cblxuICAgIHNldCBpZCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2lkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWZcbiAgICApIHtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBZnRlclZpZXdDaGVja2VkLCBDb250ZW50Q2hpbGRyZW4sIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgUXVlcnlMaXN0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRXF1YWxpemVQYXJhbXMgfSBmcm9tICcuLi9lcXVhbGl6ZS1wYXJhbXMnO1xuaW1wb3J0IHsgRXF1YWxpemVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2luZGV4JztcbmltcG9ydCB7IEVxdWFsaXplcldhdGNoZXJEaXJlY3RpdmUgfSBmcm9tICcuL2VxdWFsaXplci13YXRjaGVyLmRpcmVjdGl2ZSc7XG5cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbZXF1YWxpemVyXScsXG4gICAgZXhwb3J0QXM6ICdlcXVhbGl6ZXInXG59KVxuZXhwb3J0IGNsYXNzIEVxdWFsaXplckRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQge1xuICAgIEBJbnB1dCgnZXF1YWxpemVyJylcbiAgICBwcml2YXRlIF9wYXJhbXM6ICdoZWlnaHQnIHwgJ3dpZHRoJyB8IEVxdWFsaXplUGFyYW1zID0gJ2hlaWdodCc7XG5cbiAgICBASW5wdXQoJ2VxdWFsaXplcklkJylcbiAgICBwcml2YXRlIF9pZDogc3RyaW5nIHwgbnVtYmVyO1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihFcXVhbGl6ZXJXYXRjaGVyRGlyZWN0aXZlLCB7cmVhZDogRXF1YWxpemVyV2F0Y2hlckRpcmVjdGl2ZX0pXG4gICAgcHJpdmF0ZSBfd2F0Y2hlcnM6IFF1ZXJ5TGlzdDxFcXVhbGl6ZXJXYXRjaGVyRGlyZWN0aXZlPiA9IG5ldyBRdWVyeUxpc3Q8RXF1YWxpemVyV2F0Y2hlckRpcmVjdGl2ZT4oKTtcblxuICAgIGdldCBwYXJhbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbXM7XG4gICAgfVxuXG4gICAgc2V0IHBhcmFtcyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9wYXJhbXMgPSB2YWx1ZTtcblxuICAgICAgICB0aGlzLmVxdWFsaXplKCk7XG4gICAgfVxuXG4gICAgZ2V0IGVsZW1lbnRSZWYoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmO1xuICAgIH1cblxuICAgIGdldCBpZCgpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuXG4gICAgc2V0IGlkKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBfZXF1YWxpemVyU2VydmljZTogRXF1YWxpemVyU2VydmljZVxuICAgICkge1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXF1YWxpemUoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgICBwcml2YXRlIF9vblJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lcXVhbGl6ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlcXVhbGl6ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9wYXJhbXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcmFtcyA9ICdoZWlnaHQnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zOiBFcXVhbGl6ZVBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe3Byb3BlcnR5OiAnaGVpZ2h0JywgcmVzZXQ6IHRydWV9LCB0eXBlb2YgdGhpcy5fcGFyYW1zID09PSAnc3RyaW5nJyA/IHtwcm9wZXJ0eTogdGhpcy5fcGFyYW1zfSA6IHRoaXMuX3BhcmFtcyk7XG4gICAgICAgIGNvbnN0IHdhdGNoZXJzOiBFbGVtZW50UmVmW10gPSB0aGlzLl93YXRjaGVycy5maWx0ZXIoKHdhdGNoZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdJRCBtYXRjaGluZycsIHdhdGNoZXIuaWQsIHRoaXMuaWQpO1xuICAgICAgICAgICAgaWYgKHdhdGNoZXIuaWQgfHwgdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3YXRjaGVyLmlkID09PSB0aGlzLmlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gd2F0Y2hlci5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgfSkubWFwKCh3YXRjaGVyKSA9PiB3YXRjaGVyLmVsZW1lbnRSZWYpO1xuXG4gICAgICAgIHRoaXMuX2VxdWFsaXplclNlcnZpY2UuZXF1YWxpemUoXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlcixcbiAgICAgICAgICAgIHdhdGNoZXJzLFxuICAgICAgICAgICAgcGFyYW1zXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEVxdWFsaXplckRpcmVjdGl2ZSwgRXF1YWxpemVyV2F0Y2hlckRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBFcXVhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgXSxcbiAgICBleHBvcnRzOiBbXG4gICAgICAgIEVxdWFsaXplckRpcmVjdGl2ZSxcbiAgICAgICAgRXF1YWxpemVyV2F0Y2hlckRpcmVjdGl2ZSxcbiAgICBdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBFcXVhbGl6ZXJEaXJlY3RpdmUsXG4gICAgICAgIEVxdWFsaXplcldhdGNoZXJEaXJlY3RpdmUsXG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRXF1YWxpemVyU2VydmljZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBFcXVhbGl6ZXJNb2R1bGUge1xuICAgIHB1YmxpYyBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBFcXVhbGl6ZXJNb2R1bGUsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICBFcXVhbGl6ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgXVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZm9yQ2hpbGQoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZ01vZHVsZTogRXF1YWxpemVyTW9kdWxlLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgRXF1YWxpemVyU2VydmljZVxuICAgICAgICAgICAgXVxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7Ozs7SUFNVyxRQUFRLENBQ1gsUUFBbUIsRUFDbkIsV0FBeUIsRUFDekIsU0FBeUIsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7UUFHMUQscUJBQUksUUFBUSxHQUFXLENBQUMsQ0FBQztRQUV6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