ngx-beautiful-charts
Version:
A library to create charts in Angular
243 lines • 20.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, ElementRef } from '@angular/core';
import { colorSchemes } from '../../constants/color-schemes';
import { GanttChartService } from './gantt-chart.service';
import { GlobalParametersService } from '../../global/global-parameters.service';
var GanttChartComponent = /** @class */ (function () {
// setColors() {
// let cnt = 0;
// for (const team of this.ganttChartService.data) {
// if (!team.color) team.color = colorSchemes[this.ganttChartService.colorScheme][cnt % 10];
// cnt++;
// }
// }
function GanttChartComponent(ganttChartService, globalParametersService, currentElement) {
this.ganttChartService = ganttChartService;
this.globalParametersService = globalParametersService;
this.currentElement = currentElement;
this.colorScheme = 'colorful';
this.customColorScheme = [];
this.xPadding = 60;
this.yPadding = this.xPadding / 2;
}
/**
* @return {?}
*/
GanttChartComponent.prototype.setDimensions = /**
* @return {?}
*/
function () {
if (this.width)
this.height = this.width - this.xPadding;
else {
/** @type {?} */
var host = this.currentElement.nativeElement;
if (host.parentNode != null) {
/** @type {?} */
var dims = host.parentNode.getBoundingClientRect();
this.width = dims.width;
this.height = this.width - this.xPadding;
}
}
// console.log('---set dimensions---');
// console.log('width: ' + this.width);
// console.log('height: ' + this.height);
// console.log('--------------------');
};
/**
* @return {?}
*/
GanttChartComponent.prototype.setColors = /**
* @return {?}
*/
function () {
var e_1, _a;
/** @type {?} */
var cnt = 0;
try {
for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) {
var team = _c.value;
if (!team.color) {
if (this.customColorScheme.length > 0) {
team.color = this.customColorScheme[cnt % this.customColorScheme.length];
}
else {
team.color = colorSchemes[this.colorScheme][cnt % 10];
}
cnt++;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
};
/**
* @return {?}
*/
GanttChartComponent.prototype.definePhaseTimelines = /**
* @return {?}
*/
function () {
var e_2, _a, e_3, _b, e_4, _c, e_5, _d;
this.phaseTimelines = {};
try {
for (var _e = tslib_1.__values(this.ganttChartService.ganttPhases), _f = _e.next(); !_f.done; _f = _e.next()) {
var phase = _f.value;
this.phaseTimelines[phase] = [];
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
}
finally { if (e_2) throw e_2.error; }
}
try {
for (var _g = tslib_1.__values(this.ganttChartService.data), _h = _g.next(); !_h.done; _h = _g.next()) {
var team = _h.value;
try {
for (var _j = tslib_1.__values(Object.keys(team.timelines)), _k = _j.next(); !_k.done; _k = _j.next()) {
var phase = _k.value;
try {
for (var _l = tslib_1.__values(team.timelines[phase]), _m = _l.next(); !_m.done; _m = _l.next()) {
var timeline = _m.value;
this.phaseTimelines[phase].push({ from: timeline.from,
to: timeline.to,
color: team.color,
info: timeline.info,
toolTip: (timeline.info ? 'block' : 'none') });
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (_m && !_m.done && (_d = _l.return)) _d.call(_l);
}
finally { if (e_5) throw e_5.error; }
}
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
}
finally { if (e_4) throw e_4.error; }
}
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
}
finally { if (e_3) throw e_3.error; }
}
// console.log('phase timelines: ');
// console.log(this.phaseTimelines);
};
/**
* @return {?}
*/
GanttChartComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.componentID = this.globalParametersService.addNewComponent();
this.setDimensions();
this.setColors();
this.ganttChartService.setValues({
componentID: this.componentID,
width: this.width,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.height = this.ganttChartService.height;
this.definePhaseTimelines();
};
/**
* @return {?}
*/
GanttChartComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.setDimensions();
this.setColors();
this.ganttChartService.setValues({
componentID: this.componentID,
width: this.width,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.height = this.ganttChartService.height;
this.definePhaseTimelines();
};
GanttChartComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-gantt-chart',
template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n <g ngx-gc-chart-base />\n <g *ngFor=\"let phase of ganttChartService.ganttPhases; index as i\">\n <g id=\"component\" *ngFor=\"let ganttEntry of phaseTimelines[phase]; index as j\">\n <rect class=\"gantt-entry\"\n [attr.x]=\"xPadding + 150 + ganttChartService.transformGanttDate(ganttEntry.from)\" \n [attr.y]=\"i * 60 + yPadding + 20\" \n [attr.width]=\"ganttChartService.transformGanttDate(ganttEntry.to) - ganttChartService.transformGanttDate(ganttEntry.from)\" \n [attr.height]=\"20\" \n rx=\"6\" ry=\"6\"\n [attr.fill]=\"ganttEntry.color\" />\n\n <!-- [attr.x]=\"x + 150 + ganttChartService.transformGanttDate(ganttEntry.from)\" \n [attr.y]=\"i * 60 + y + 20\" -->\n <g class=\"tooltip\" [ngStyle]=\"{\n 'transform': 'translate(' + (xPadding + 150 + ganttChartService.transformGanttDate(ganttEntry.to) - ((ganttChartService.transformGanttDate(ganttEntry.to) - ganttChartService.transformGanttDate(ganttEntry.from)) / 2)) + 'px, ' + (i * 60 + yPadding - 5) + 'px)',\n 'display': ganttEntry.toolTip}\" \n opacity=\"0.9\">\n <rect rx=\"5\" width=\"200\" height=\"25\"></rect>\n <text x=\"15\" y=\"16\">{{ ganttEntry.info }}</text>\n </g>\n </g>\n </g>\n</svg>",
providers: [GanttChartService],
styles: [".gantt-entry{opacity:.8}.gantt-entry:hover{opacity:1}#component .tooltip{visibility:hidden}#component:hover .tooltip{visibility:visible;position:absolute}#component:hover:after .tooltip{position:relative;left:0;top:100%;white-space:nowrap}.tooltip text{fill:#eee;font-size:12px;font-family:sans-serif}.tooltip rect{fill:#222;stroke:#111}"]
}] }
];
/** @nocollapse */
GanttChartComponent.ctorParameters = function () { return [
{ type: GanttChartService },
{ type: GlobalParametersService },
{ type: ElementRef }
]; };
GanttChartComponent.propDecorators = {
data: [{ type: Input }],
width: [{ type: Input }],
colorScheme: [{ type: Input }],
customColorScheme: [{ type: Input }]
};
return GanttChartComponent;
}());
export { GanttChartComponent };
if (false) {
/** @type {?} */
GanttChartComponent.prototype.data;
/** @type {?} */
GanttChartComponent.prototype.width;
/** @type {?} */
GanttChartComponent.prototype.colorScheme;
/** @type {?} */
GanttChartComponent.prototype.customColorScheme;
/** @type {?} */
GanttChartComponent.prototype.componentID;
/** @type {?} */
GanttChartComponent.prototype.xPadding;
/** @type {?} */
GanttChartComponent.prototype.yPadding;
/** @type {?} */
GanttChartComponent.prototype.height;
/** @type {?} */
GanttChartComponent.prototype.phaseTimelines;
/** @type {?} */
GanttChartComponent.prototype.ganttChartService;
/**
* @type {?}
* @private
*/
GanttChartComponent.prototype.globalParametersService;
/**
* @type {?}
* @private
*/
GanttChartComponent.prototype.currentElement;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWJlYXV0aWZ1bC1jaGFydHMvIiwic291cmNlcyI6WyJsaWIvZ2FudHQtY2hhcnQvZ2FudHQtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFakY7SUFzRUUsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixzREFBc0Q7SUFDdEQsZ0dBQWdHO0lBQ2hHLGFBQWE7SUFDYixNQUFNO0lBQ04sSUFBSTtJQUVKLDZCQUFtQixpQkFBb0MsRUFDbkMsdUJBQWdELEVBQ2hELGNBQTBCO1FBRjNCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDbkMsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBWTtRQXRFckMsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFDekIsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFpRXFCLENBQUM7Ozs7SUE3RG5ELDJDQUFhOzs7SUFBYjtRQUNFLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNwRDs7Z0JBQ0csSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTtZQUM5QyxJQUFJ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LG9DQUF1Qjs7SUFDdkIsMENBQWtDOztJQUNsQyxnREFBMEM7O0lBRTFDLDBDQUFZOztJQUNaLHVDQUFjOztJQUNkLHVDQUE2Qjs7SUFDN0IscUNBQWU7O0lBQ2YsNkNBQWU7O0lBNkRILGdEQUEyQzs7Ozs7SUFDM0Msc0RBQXdEOzs7OztJQUN4RCw2Q0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25DaGFuZ2VzLCBJbnB1dCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29sb3JTY2hlbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbG9yLXNjaGVtZXMnO1xuaW1wb3J0IHsgR2FudHRDaGFydFNlcnZpY2UgfSBmcm9tICcuL2dhbnR0LWNoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9nbG9iYWwvZ2xvYmFsLXBhcmFtZXRlcnMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1nYW50dC1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9nYW50dC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhbnR0LWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0dhbnR0Q2hhcnRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBHYW50dENoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIGRhdGE7XG4gIEBJbnB1dCgpIHdpZHRoOiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbG9yU2NoZW1lID0gJ2NvbG9yZnVsJztcbiAgQElucHV0KCkgY3VzdG9tQ29sb3JTY2hlbWU6IHN0cmluZ1tdID0gW107XG5cbiAgY29tcG9uZW50SUQ7XG4gIHhQYWRkaW5nID0gNjA7XG4gIHlQYWRkaW5nID0gdGhpcy54UGFkZGluZyAvIDI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBwaGFzZVRpbWVsaW5lcztcblxuICBzZXREaW1lbnNpb25zKCkge1xuICAgIGlmICh0aGlzLndpZHRoKSB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggLSB0aGlzLnhQYWRkaW5nO1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgaG9zdCA9IHRoaXMuY3VycmVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChob3N0LnBhcmVudE5vZGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkaW1zID0gaG9zdC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLndpZHRoID0gZGltcy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLndpZHRoIC0gdGhpcy54UGFkZGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJy0tLXNldCBkaW1lbnNpb25zLS0tJyk7XG4gICAgLy8gY29uc29sZS5sb2coJ3dpZHRoOiAnICsgdGhpcy53aWR0aCk7XG4gICAgLy8gY29uc29sZS5sb2coJ2hlaWdodDogJyArIHRoaXMuaGVpZ2h0KTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgfVxuXG4gIHNldENvbG9ycygpIHtcbiAgICBsZXQgY250ID0gMDtcbiAgICBmb3IgKGNvbnN0IHRlYW0gb2YgdGhpcy5kYXRhKSB7XG4gICAgICBpZiAoIXRlYW0uY29sb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ29sb3JTY2hlbWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRlYW0uY29sb3IgPSB0aGlzLmN1c3RvbUNvbG9yU2NoZW1lW2NudCAlIHRoaXMuY3VzdG9tQ29sb3JTY2hlbWUubGVuZ3RoXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZWFtLmNvbG9yID0gY29sb3JTY2hlbWVzW3RoaXMuY29sb3JTY2hlbWVdW2NudCAlIDEwXTtcbiAgICAgICAgfVxuICAgICAgICBjbnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZWZpbmVQaGFzZVRpbWVsaW5lcygpIHtcbiAgICB0aGlzLnBoYXNlVGltZWxpbmVzID0ge307XG4gICAgZm9yIChjb25zdCBwaGFzZSBvZiB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmdhbnR0UGhhc2VzKSB7XG4gICAgICB0aGlzLnBoYXNlVGltZWxpbmVzW3BoYXNlXSA9IFtdO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGVhbSBvZiB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgcGhhc2Ugb2YgT2JqZWN0LmtleXModGVhbS50aW1lbGluZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGltZWxpbmUgb2YgdGVhbS50aW1lbGluZXNbcGhhc2VdKSB7XG4gICAgICAgICAgdGhpcy5waGFzZVRpbWVsaW5lc1twaGFzZV0ucHVzaCh7ZnJvbTogdGltZWxpbmUuZnJvbSxcbiAgICAgICAgICAgIHRvOiB0aW1lbGluZS50byxcbiAgICAgICAgICAgIGNvbG9yOiB0ZWFtLmNvbG9yLFxuICAgICAgICAgICAgaW5mbzogdGltZWxpbmUuaW5mbyxcbiAgICAgICAgICAgIHRvb2xUaXA6ICh0aW1lbGluZS5pbmZvID8gJ2Jsb2NrJyA6ICdub25lJyl9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZygncGhhc2UgdGltZWxpbmVzOiAnKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnBoYXNlVGltZWxpbmVzKTtcbiAgfVxuXG4gIC8vIHNldENvbG9ycygpIHtcbiAgLy8gICBsZXQgY250ID0gMDtcbiAgLy8gICBmb3IgKGNvbnN0IHRlYW0gb2YgdGhpcy5nYW50dENoYXJ0U2VydmljZS5kYXRhKSB7XG4gIC8vICAgICBpZiAoIXRlYW0uY29sb3IpIHRlYW0uY29sb3IgPSBjb2xvclNjaGVtZXNbdGhpcy5nYW50dENoYXJ0U2VydmljZS5jb2xvclNjaGVtZV1bY250ICUgMTBdO1xuICAvLyAgICAgY250Kys7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGdhbnR0Q2hhcnRTZXJ2aWNlOiBHYW50dENoYXJ0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBnbG9iYWxQYXJhbWV0ZXJzU2VydmljZTogR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY3VycmVudEVsZW1lbnQ6IEVsZW1lbnRSZWYpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSB0aGlzLmdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLmFkZE5ld0NvbXBvbmVudCgpO1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5nYW50dENoYXJ0U2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmcsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9KTtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuaGVpZ2h0O1xuICAgIHRoaXMuZGVmaW5lUGhhc2VUaW1lbGluZXMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5nYW50dENoYXJ0U2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmcsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9KTtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuaGVpZ2h0O1xuICAgIHRoaXMuZGVmaW5lUGhhc2VUaW1lbGluZXMoKTtcbiAgfVxuXG59XG4iXX0=