@junte/ui
Version:
Quality Angular UI components kit
150 lines • 17.6 kB
JavaScript
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';
var ChartComponent = /** @class */ (function () {
function ChartComponent(logger) {
var _this = this;
this.logger = logger;
this.host = 'jnt-chart-host';
this.ui = UI;
this._widthMark = 100;
this.heightIndicator = 55;
this.widthPolygon = 50;
this.onChange = function () { return _this.logger.debug('value accessor is not registered'); };
this.onTouched = function () { return _this.logger.debug('value accessor is not registered'); };
this.registerOnChange = function (fn) { return _this.onChange = fn; };
this.registerOnTouched = function (fn) { return _this.onTouched = fn; };
this.onBlur = function () { return _this.onTouched(); };
this.updated = new EventEmitter();
}
ChartComponent_1 = ChartComponent;
Object.defineProperty(ChartComponent.prototype, "widthMark", {
get: function () {
return this._widthMark;
},
set: function (width) {
this._widthMark = Math.min(width, 60);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChartComponent.prototype, "selected", {
get: function () {
return this._selected;
},
set: function (value) {
var 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);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChartComponent.prototype, "heightSvg", {
get: function () {
return this.heightIndicator + (this.heightIndicator * this.indicators.length);
},
enumerable: true,
configurable: true
});
ChartComponent.prototype.writeValue = function (value) {
this._selected = value;
};
ChartComponent.prototype.trackByFn = function (index, indicator) {
return indicator.data.id || index;
};
var ChartComponent_1;
ChartComponent.ctorParameters = function () { return [
{ 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(function () { return ChartComponent_1; }),
multi: true
}
]
}),
__metadata("design:paramtypes", [NGXLogger])
], ChartComponent);
return ChartComponent;
}());
export { ChartComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2R5bmFtaWMvY2hhcnQvY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBYTVEO0lBbUZFLHdCQUFvQixNQUFpQjtRQUFyQyxpQkFDQztRQURtQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBakZGLFNBQUksR0FBRyxnQkFBZ0IsQ0FBQztRQUUzRCxPQUFFLEdBQUcsRUFBRSxDQUFDO1FBR0EsZUFBVSxHQUFHLEdBQUcsQ0FBQztRQThCekIsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFHckIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFFbEIsYUFBUSxHQUF5QixjQUFNLE9BQUEsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsRUFBckQsQ0FBcUQsQ0FBQztRQUM3RixjQUFTLEdBQWUsY0FBTSxPQUFBLEtBQUksQ0FBQyxNQUFNLENBQUMs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RUFBRTs7a0RBQ087SUFRZjtRQU5DLFdBQVcsQ0FBQztZQUNYLFdBQVcsRUFBRSxhQUFhO1lBQzFCLElBQUksRUFBRSxVQUFVO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDekIsQ0FBQztRQUNELEtBQUssRUFBRTs7aURBQ0s7SUFHYjtRQURDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQztrQ0FDN0IsU0FBUztzREFBMEI7SUFHL0M7UUFEQyxLQUFLLEVBQUU7OzJEQUNhO0lBR3JCO1FBREMsS0FBSyxFQUFFOzt3REFDVTtJQU1JO1FBQXJCLFlBQVksQ0FBQyxNQUFNLENBQUM7O2tEQUFpQztJQUd0RDtRQURDLE1BQU0sQ0FBQyxVQUFVLENBQUM7O21EQUNlO0lBR2xDO1FBREMsS0FBSyxFQUFFOzs7bURBR1A7SUF0RFUsY0FBYztRQVgxQixTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsV0FBVztZQUNyQixnaEhBQXdDO1lBQ3hDLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxnQkFBYyxFQUFkLENBQWMsQ0FBQztvQkFDN0MsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRjtTQUNGLENBQUM7eUNBb0Y0QixTQUFTO09BbkYxQixjQUFjLENBNkYxQjtJQUFELHFCQUFDO0NBQUEsQUE3RkQsSUE2RkM7U0E3RlksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5HWExvZ2dlciB9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL3N0YXRlJztcbmltcG9ydCB7IFByb3BlcnR5QXBpIH0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3JzL2FwaSc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvdWknO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZXF1YWwnO1xuaW1wb3J0IHsgQ2hhcnRJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICcuL2NoYXJ0LWluZGljYXRvcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2pudC1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFydC5lbmNhcHN1bGF0ZWQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2hhcnRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhvc3QnKSByZWFkb25seSBob3N0ID0gJ2pudC1jaGFydC1ob3N0JztcblxuICB1aSA9IFVJO1xuXG4gIHByaXZhdGUgX3NlbGVjdGVkOiBudW1iZXI7XG4gIHByaXZhdGUgX3dpZHRoTWFyayA9IDEwMDtcblxuICBASW5wdXQoKSBrZXlGaWVsZDogc3RyaW5nO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdUaXRsZSBvZiB0aGUgY2hhcnRzIGdyb3VwJyxcbiAgICB0eXBlOiAnc3RyaW5nJ1xuICB9KVxuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdOYW1lIG9mIG1ldHJpYyBmb3IgdGhlIGNoYXJ0cycsXG4gICAgdHlwZTogJ3N0cmluZydcbiAgfSlcbiAgQElucHV0KClcbiAgbWV0cmljOiBzdHJpbmc7XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoYXJ0IHN0YXRlJyxcbiAgICBwYXRoOiAndWkuc3RhdGUnLFxuICAgIG9wdGlvbnM6IFtTdGF0ZS5sb2FkaW5nXVxuICB9KVxuICBASW5wdXQoKVxuICBzdGF0ZTogU3RhdGU7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihDaGFydEluZGljYXRvckNvbXBvbmVudClcbiAgaW5kaWNhdG9yczogUXVlcnlMaXN0PENoYXJ0SW5kaWNhdG9yQ29tcG9uZW50PjtcblxuICBASW5wdXQoKVxuICBoZWlnaHRJbmRpY2F0b3IgPSA1NTtcblxuICBASW5wdXQoKVxuICB3aWR0aFBvbHlnb24gPSA1MDtcblxuICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5kZWJ1ZygndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4gdGhpcy5sb2dnZXIuZGVidWcoJ3ZhbHVlIGFjY2Vzc29yIGlzIG5vdCByZWdpc3RlcmVkJyk7XG4gIHJlZ2lzdGVyT25DaGFuZ2UgPSBmbiA9PiB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIHJlZ2lzdGVyT25Ub3VjaGVkID0gZm4gPT4gdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpIG9uQmx1ciA9ICgpID0+IHRoaXMub25Ub3VjaGVkKCk7XG5cbiAgQE91dHB1dCgnc2VsZWN0ZWQnKVxuICB1cGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQElucHV0KClcbiAgc2V0IHdpZHRoTWFyayh3aWR0aDogbnVtYmVyKSB7XG4gICAgdGhpcy5fd2lkdGhNYXJrID0gTWF0aC5taW4od2lkdGgsIDYwKTtcbiAgfVxuXG4gIGdldCB3aWR0aE1hcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dpZHRoTWFyaztcbiAgfVxuXG4gIHNldCBzZWxlY3RlZCh2YWx1ZTogYW55KSB7XG4gICAgbGV0IGlzU2FtZTogYm9vbGVhbjtcbiAgICBpZiAoISF0aGlzLmtleUZpZWxkICYmICEhdGhpcy5fc2VsZWN0ZWQgJiYgISF2YWx1ZSkge1xuICAgICAgaXNTYW1lID0gdGhpcy5fc2VsZWN0ZWRbdGhpcy5rZXlGaWVsZF0gPT09IHZhbHVlW3RoaXMua2V5RmllbGRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc1NhbWUgPSBpc0VxdWFsKHRoaXMuX3NlbGVjdGVkLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSAhaXNTYW1lID8gdmFsdWUgOiBudWxsO1xuICAgIHRoaXMub25DaGFuZ2UoISF0aGlzLl9zZWxlY3RlZFxuICAgICAgPyAoISF0aGlzLmtleUZpZWxkID8gdGhpcy5fc2VsZWN0ZWRbdGhpcy5rZXlGaWVsZF0gOiB0aGlzLl9zZWxlY3RlZClcbiAgICAgIDogbnVsbCk7XG4gICAgdGhpcy51cGRhdGVkLmVtaXQodGhpcy5fc2VsZWN0ZWQpO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIGdldCBoZWlnaHRTdmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVpZ2h0SW5kaWNhdG9yICsgKHRoaXMuaGVpZ2h0SW5kaWNhdG9yICogdGhpcy5pbmRpY2F0b3JzLmxlbmd0aCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyKSB7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHZhbHVlO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4LCBpbmRpY2F0b3IpIHtcbiAgICByZXR1cm4gaW5kaWNhdG9yLmRhdGEuaWQgfHwgaW5kZXg7XG4gIH1cbn1cbiJdfQ==