UNPKG

@junte/ui

Version:

Quality Angular UI components kit

135 lines 16.3 kB
var ChartComponent_1; import { __decorate, __metadata } from "tslib"; import { Component, ContentChildren, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, QueryList } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { NGXLogger } from 'ngx-logger'; import { State } from '../../core/enums/state'; import { PropertyApi } from '../../core/decorators/api'; import { UI } from '../../core/enums/ui'; import { isEqual } from '../../core/utils/equal'; import { ChartIndicatorComponent } from './chart-indicator'; let ChartComponent = ChartComponent_1 = class ChartComponent { constructor(logger) { this.logger = logger; this.host = 'jnt-chart-host'; this.ui = UI; this._widthMark = 100; this.heightIndicator = 55; this.widthPolygon = 50; this.onChange = () => this.logger.debug('value accessor is not registered'); this.onTouched = () => this.logger.debug('value accessor is not registered'); this.registerOnChange = fn => this.onChange = fn; this.registerOnTouched = fn => this.onTouched = fn; this.onBlur = () => this.onTouched(); this.updated = new EventEmitter(); } set widthMark(width) { this._widthMark = Math.min(width, 60); } get widthMark() { return this._widthMark; } set selected(value) { let isSame; if (!!this.keyField && !!this._selected && !!value) { isSame = this._selected[this.keyField] === value[this.keyField]; } else { isSame = isEqual(this._selected, value); } this._selected = !isSame ? value : null; this.onChange(!!this._selected ? (!!this.keyField ? this._selected[this.keyField] : this._selected) : null); this.updated.emit(this._selected); } get selected() { return this._selected; } get heightSvg() { return this.heightIndicator + (this.heightIndicator * this.indicators.length); } writeValue(value) { this._selected = value; } trackByFn(index, indicator) { return indicator.data.id || index; } }; ChartComponent.ctorParameters = () => [ { type: NGXLogger } ]; __decorate([ HostBinding('attr.host'), __metadata("design:type", Object) ], ChartComponent.prototype, "host", void 0); __decorate([ Input(), __metadata("design:type", String) ], ChartComponent.prototype, "keyField", void 0); __decorate([ PropertyApi({ description: 'Title of the charts group', type: 'string' }), Input(), __metadata("design:type", String) ], ChartComponent.prototype, "title", void 0); __decorate([ PropertyApi({ description: 'Name of metric for the charts', type: 'string' }), Input(), __metadata("design:type", String) ], ChartComponent.prototype, "metric", void 0); __decorate([ PropertyApi({ description: 'Chart state', path: 'ui.state', options: [State.loading] }), Input(), __metadata("design:type", String) ], ChartComponent.prototype, "state", void 0); __decorate([ ContentChildren(ChartIndicatorComponent), __metadata("design:type", QueryList) ], ChartComponent.prototype, "indicators", void 0); __decorate([ Input(), __metadata("design:type", Object) ], ChartComponent.prototype, "heightIndicator", void 0); __decorate([ Input(), __metadata("design:type", Object) ], ChartComponent.prototype, "widthPolygon", void 0); __decorate([ HostListener('blur'), __metadata("design:type", Object) ], ChartComponent.prototype, "onBlur", void 0); __decorate([ Output('selected'), __metadata("design:type", Object) ], ChartComponent.prototype, "updated", void 0); __decorate([ Input(), __metadata("design:type", Number), __metadata("design:paramtypes", [Number]) ], ChartComponent.prototype, "widthMark", null); ChartComponent = ChartComponent_1 = __decorate([ Component({ selector: 'jnt-chart', template: "<div child-of=\"jnt-chart-host\" data-wrapper>\n <table child-of=\"jnt-chart-host\" >\n <thead child-of=\"jnt-chart-host\" >\n <tr child-of=\"jnt-chart-host\" [style.height.px]=\"heightIndicator\" [style.min-height.px]=\"heightIndicator\">\n <th child-of=\"jnt-chart-host\" >\n {{title}}\n </th>\n <th child-of=\"jnt-chart-host\" colspan=\"2\">\n {{metric}}\n </th>\n </tr>\n </thead>\n <tbody child-of=\"jnt-chart-host\" >\n <ng-container *ngIf=\"indicators.length; else loadingTemplate\">\n <tr child-of=\"jnt-chart-host\" *ngFor=\"let indicator of indicators; trackBy: trackByFn\"\n (click)=\"selected = indicator.data\"\n [attr.selected]=\"(!!keyField && !!selected\n ? selected[keyField] === indicator.data[keyField]\n : (selected === indicator.data))\"\n [style.height.px]=\"heightIndicator\"\n [style.max-height.px]=\"heightIndicator\"\n [style.min-height.px]=\"heightIndicator\">\n <td child-of=\"jnt-chart-host\" >\n <ng-container *ngIf=\"indicator.titleTemplate; else indicatorTitle\">\n <div child-of=\"jnt-chart-host\" data-content [style.max-height.px]=\"heightIndicator - 1\">\n <ng-container *ngTemplateOutlet=\"indicator.titleTemplate; context: indicator\"></ng-container>\n </div>\n </ng-container>\n <ng-template #indicatorTitle>\n {{indicator.title}}\n </ng-template>\n </td>\n <td child-of=\"jnt-chart-host\" >\n {{indicator.label}}\n </td>\n <td child-of=\"jnt-chart-host\" [style.background-color]=\"indicator.color | lightenDarken : -20\">\n <span child-of=\"jnt-chart-host\" [style.color]=\"indicator.color | lightenDarken : -20 | textBrightness\">\n {{indicator.value | number: '1.0-0'}}%\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n</div>\n\n<svg child-of=\"jnt-chart-host\" *ngIf=\"indicators.length\"\n [style.min-width]=\"widthMark + widthPolygon\"\n [attr.width]=\"widthMark + widthPolygon\"\n [attr.height]=\"heightSvg\" xmlns=\"http://www.w3.org/2000/svg\">\n\n <ng-container *ngFor=\"let indicator of indicators; trackBy: trackByFn; let i = index; let first = first\">\n <polygon child-of=\"jnt-chart-host\" [attr.points]=\"'0 ' + (first ? heightIndicator : heightIndicator * (i + 1)) + ' ' + widthPolygon + ' ' + (first ? 0 : (i - 1 | sumIndicators: indicators) | percentToNumber: heightSvg) + ' ' + widthPolygon + ' ' + ((i | sumIndicators: indicators) | percentToNumber: heightSvg) + ' 0 ' + heightIndicator * (i + 2)\"\n [attr.fill]=\"indicator.color | lightenDarken: 10\"></polygon>\n <rect child-of=\"jnt-chart-host\" [attr.x]=\"widthPolygon\"\n [attr.y]=\"first ? 0 : (i - 1 | sumIndicators: indicators) | percentToNumber: heightSvg\"\n [attr.width]=\"widthMark\"\n [attr.height]=\"indicator.value | percentToNumber : heightSvg\"\n [attr.fill]=\"indicator.color\">\n </rect>\n </ng-container>\n\n</svg>\n\n<ng-template #loadingTemplate>\n <tr child-of=\"jnt-chart-host\" data-nodata>\n <td child-of=\"jnt-chart-host\" [attr.colspan]=\"3\">\n <jnt-skeleton child-of=\"jnt-chart-host\" *ngIf=\"state === ui.state.loading; else noDataTemplate\" [lines]=\"5\"></jnt-skeleton>\n <ng-template #noDataTemplate>\n <jnt-icon child-of=\"jnt-chart-host\" [icon]=\"ui.icons.neutral\"></jnt-icon>\n </ng-template>\n </td>\n </tr>\n</ng-template>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ChartComponent_1), multi: true } ] }), __metadata("design:paramtypes", [NGXLogger]) ], ChartComponent); export { ChartComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2R5bmFtaWMvY2hhcnQvY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWE1RCxJQUFhLGNBQWMsc0JBQTNCLE1BQWEsY0FBYztJQW1GekIsWUFBb0IsTUFBaUI7UUFBakIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQWpGRixTQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFFM0QsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUdBLGVBQVUsR0FBRyxHQUFHLENBQUM7UUE4QnpCLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBR3JCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBRWxCLGFBQVEsR0FBeUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUM3RixjQUFTLEdBQWUsR0FBRyxFQUFFLENBQUMsSUFBSSxD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QUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0tBQ3pCLENBQUM7SUFDRCxLQUFLLEVBQUU7OzZDQUNLO0FBR2I7SUFEQyxlQUFlLENBQUMsdUJBQXVCLENBQUM7OEJBQzdCLFNBQVM7a0RBQTBCO0FBRy9DO0lBREMsS0FBSyxFQUFFOzt1REFDYTtBQUdyQjtJQURDLEtBQUssRUFBRTs7b0RBQ1U7QUFNSTtJQUFyQixZQUFZLENBQUMsTUFBTSxDQUFDOzs4Q0FBaUM7QUFHdEQ7SUFEQyxNQUFNLENBQUMsVUFBVSxDQUFDOzsrQ0FDZTtBQUdsQztJQURDLEtBQUssRUFBRTs7OytDQUdQO0FBdERVLGNBQWM7SUFYMUIsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLFdBQVc7UUFDckIsZ2hIQUF3QztRQUN4QyxTQUFTLEVBQUU7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGdCQUFjLENBQUM7Z0JBQzdDLEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRjtLQUNGLENBQUM7cUNBb0Y0QixTQUFTO0dBbkYxQixjQUFjLENBNkYxQjtTQTdGWSxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyIH0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvc3RhdGUnO1xuaW1wb3J0IHsgUHJvcGVydHlBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2RlY29yYXRvcnMvYXBpJztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy91aSc7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9lcXVhbCc7XG5pbXBvcnQgeyBDaGFydEluZGljYXRvckNvbXBvbmVudCB9IGZyb20gJy4vY2hhcnQtaW5kaWNhdG9yJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam50LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0LmVuY2Fwc3VsYXRlZC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGFydENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaG9zdCcpIHJlYWRvbmx5IGhvc3QgPSAnam50LWNoYXJ0LWhvc3QnO1xuXG4gIHVpID0gVUk7XG5cbiAgcHJpdmF0ZSBfc2VsZWN0ZWQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfd2lkdGhNYXJrID0gMTAwO1xuXG4gIEBJbnB1dCgpIGtleUZpZWxkOiBzdHJpbmc7XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIG9mIHRoZSBjaGFydHMgZ3JvdXAnLFxuICAgIHR5cGU6ICdzdHJpbmcnXG4gIH0pXG4gIEBJbnB1dCgpXG4gIHRpdGxlOiBzdHJpbmc7XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ05hbWUgb2YgbWV0cmljIGZvciB0aGUgY2hhcnRzJyxcbiAgICB0eXBlOiAnc3RyaW5nJ1xuICB9KVxuICBASW5wdXQoKVxuICBtZXRyaWM6IHN0cmluZztcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hhcnQgc3RhdGUnLFxuICAgIHBhdGg6ICd1aS5zdGF0ZScsXG4gICAgb3B0aW9uczogW1N0YXRlLmxvYWRpbmddXG4gIH0pXG4gIEBJbnB1dCgpXG4gIHN0YXRlOiBTdGF0ZTtcblxuICBAQ29udGVudENoaWxkcmVuKENoYXJ0SW5kaWNhdG9yQ29tcG9uZW50KVxuICBpbmRpY2F0b3JzOiBRdWVyeUxpc3Q8Q2hhcnRJbmRpY2F0b3JDb21wb25lbnQ+O1xuXG4gIEBJbnB1dCgpXG4gIGhlaWdodEluZGljYXRvciA9IDU1O1xuXG4gIEBJbnB1dCgpXG4gIHdpZHRoUG9seWdvbiA9IDUwO1xuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHRoaXMubG9nZ2VyLmRlYnVnKCd2YWx1ZSBhY2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZCcpO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5kZWJ1ZygndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgcmVnaXN0ZXJPbkNoYW5nZSA9IGZuID0+IHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgcmVnaXN0ZXJPblRvdWNoZWQgPSBmbiA9PiB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICBASG9zdExpc3RlbmVyKCdibHVyJykgb25CbHVyID0gKCkgPT4gdGhpcy5vblRvdWNoZWQoKTtcblxuICBAT3V0cHV0KCdzZWxlY3RlZCcpXG4gIHVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASW5wdXQoKVxuICBzZXQgd2lkdGhNYXJrKHdpZHRoOiBudW1iZXIpIHtcbiAgICB0aGlzLl93aWR0aE1hcmsgPSBNYXRoLm1pbih3aWR0aCwgNjApO1xuICB9XG5cbiAgZ2V0IHdpZHRoTWFyaygpIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGhNYXJrO1xuICB9XG5cbiAgc2V0IHNlbGVjdGVkKHZhbHVlOiBhbnkpIHtcbiAgICBsZXQgaXNTYW1lOiBib29sZWFuO1xuICAgIGlmICghIXRoaXMua2V5RmllbGQgJiYgISF0aGlzLl9zZWxlY3RlZCAmJiAhIXZhbHVlKSB7XG4gICAgICBpc1NhbWUgPSB0aGlzLl9zZWxlY3RlZFt0aGlzLmtleUZpZWxkXSA9PT0gdmFsdWVbdGhpcy5rZXlGaWVsZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzU2FtZSA9IGlzRXF1YWwodGhpcy5fc2VsZWN0ZWQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZWxlY3RlZCA9ICFpc1NhbWUgPyB2YWx1ZSA6IG51bGw7XG4gICAgdGhpcy5vbkNoYW5nZSghIXRoaXMuX3NlbGVjdGVkXG4gICAgICA/ICghIXRoaXMua2V5RmllbGQgPyB0aGlzLl9zZWxlY3RlZFt0aGlzLmtleUZpZWxkXSA6IHRoaXMuX3NlbGVjdGVkKVxuICAgICAgOiBudWxsKTtcbiAgICB0aGlzLnVwZGF0ZWQuZW1pdCh0aGlzLl9zZWxlY3RlZCk7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICB9XG5cbiAgZ2V0IGhlaWdodFN2ZygpIHtcbiAgICByZXR1cm4gdGhpcy5oZWlnaHRJbmRpY2F0b3IgKyAodGhpcy5oZWlnaHRJbmRpY2F0b3IgKiB0aGlzLmluZGljYXRvcnMubGVuZ3RoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIpIHtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gdmFsdWU7XG4gIH1cblxuICB0cmFja0J5Rm4oaW5kZXgsIGluZGljYXRvcikge1xuICAgIHJldHVybiBpbmRpY2F0b3IuZGF0YS5pZCB8fCBpbmRleDtcbiAgfVxufVxuIl19