ngx-beautiful-charts
Version:
A library to create charts in Angular
178 lines • 17 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
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';
export class GanttChartComponent {
// setColors() {
// let cnt = 0;
// for (const team of this.ganttChartService.data) {
// if (!team.color) team.color = colorSchemes[this.ganttChartService.colorScheme][cnt % 10];
// cnt++;
// }
// }
/**
* @param {?} ganttChartService
* @param {?} globalParametersService
* @param {?} currentElement
*/
constructor(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 {?}
*/
setDimensions() {
if (this.width)
this.height = this.width - this.xPadding;
else {
/** @type {?} */
const host = this.currentElement.nativeElement;
if (host.parentNode != null) {
/** @type {?} */
const 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 {?}
*/
setColors() {
/** @type {?} */
let cnt = 0;
for (const team of this.data) {
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++;
}
}
}
/**
* @return {?}
*/
definePhaseTimelines() {
this.phaseTimelines = {};
for (const phase of this.ganttChartService.ganttPhases) {
this.phaseTimelines[phase] = [];
}
for (const team of this.ganttChartService.data) {
for (const phase of Object.keys(team.timelines)) {
for (const timeline of team.timelines[phase]) {
this.phaseTimelines[phase].push({ from: timeline.from,
to: timeline.to,
color: team.color,
info: timeline.info,
toolTip: (timeline.info ? 'block' : 'none') });
}
}
}
// console.log('phase timelines: ');
// console.log(this.phaseTimelines);
}
/**
* @return {?}
*/
ngOnInit() {
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 {?}
*/
ngOnChanges() {
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 = () => [
{ type: GanttChartService },
{ type: GlobalParametersService },
{ type: ElementRef }
];
GanttChartComponent.propDecorators = {
data: [{ type: Input }],
width: [{ type: Input }],
colorScheme: [{ type: Input }],
customColorScheme: [{ type: Input }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWJlYXV0aWZ1bC1jaGFydHMvIiwic291cmNlcyI6WyJsaWIvZ2FudHQtY2hhcnQvZ2FudHQtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQVFqRixNQUFNLE9BQU8sbUJBQW1COzs7Ozs7Ozs7Ozs7O0lBd0U5QixZQUFtQixpQkFBb0MsRUFDbkMsdUJBQWdELEVBQ2hELGNBQTBCO1FBRjNCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDbkMsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBWTtRQXRFckMsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFDekIsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFpRXFCLENBQUM7Ozs7SUE3RG5ELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDcEQ7O2tCQUNHLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWE7WUFDOUMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTs7c0JBQ3JCLElBQUksR0FBRyxJQUFJLENBQUMsVUFB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LENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztZQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUM1QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDOzs7WUE3R0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLHM0Q0FBMkM7Z0JBRTNDLFNBQVMsRUFBRSxDQUFDLGlCQUFpQixDQUFDOzthQUMvQjs7OztZQVJRLGlCQUFpQjtZQUNqQix1QkFBdUI7WUFIYyxVQUFVOzs7bUJBYXJELEtBQUs7b0JBQ0wsS0FBSzswQkFDTCxLQUFLO2dDQUNMLEtBQUs7Ozs7SUFITixtQ0FBYzs7SUFDZCxvQ0FBdUI7O0lBQ3ZCLDBDQUFrQzs7SUFDbEMsZ0RBQTBDOztJQUUxQywwQ0FBWTs7SUFDWix1Q0FBYzs7SUFDZCx1Q0FBNkI7O0lBQzdCLHFDQUFlOztJQUNmLDZDQUFlOztJQTZESCxnREFBMkM7Ozs7O0lBQzNDLHNEQUF3RDs7Ozs7SUFDeEQsNkNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uQ2hhbmdlcywgSW5wdXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbG9yU2NoZW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb2xvci1zY2hlbWVzJztcbmltcG9ydCB7IEdhbnR0Q2hhcnRTZXJ2aWNlIH0gZnJvbSAnLi9nYW50dC1jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2xvYmFsL2dsb2JhbC1wYXJhbWV0ZXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZ2FudHQtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FudHQtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYW50dC1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtHYW50dENoYXJ0U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgR2FudHRDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkYXRhO1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSBjb2xvclNjaGVtZSA9ICdjb2xvcmZ1bCc7XG4gIEBJbnB1dCgpIGN1c3RvbUNvbG9yU2NoZW1lOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbXBvbmVudElEO1xuICB4UGFkZGluZyA9IDYwO1xuICB5UGFkZGluZyA9IHRoaXMueFBhZGRpbmcgLyAyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgcGhhc2VUaW1lbGluZXM7XG5cbiAgc2V0RGltZW5zaW9ucygpIHtcbiAgICBpZiAodGhpcy53aWR0aCkgdGhpcy5oZWlnaHQgPSB0aGlzLndpZHRoIC0gdGhpcy54UGFkZGluZztcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmN1cnJlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoaG9zdC5wYXJlbnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZGltcyA9IGhvc3QucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IGRpbXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy53aWR0aCAtIHRoaXMueFBhZGRpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCctLS1zZXQgZGltZW5zaW9ucy0tLScpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd3aWR0aDogJyArIHRoaXMud2lkdGgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCk7XG4gICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gIH1cblxuICBzZXRDb2xvcnMoKSB7XG4gICAgbGV0IGNudCA9IDA7XG4gICAgZm9yIChjb25zdCB0ZWFtIG9mIHRoaXMuZGF0YSkge1xuICAgICAgaWYgKCF0ZWFtLmNvbG9yKSB7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUNvbG9yU2NoZW1lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0ZWFtLmNvbG9yID0gdGhpcy5jdXN0b21Db2xvclNjaGVtZVtjbnQgJSB0aGlzLmN1c3RvbUNvbG9yU2NoZW1lLmxlbmd0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGVhbS5jb2xvciA9IGNvbG9yU2NoZW1lc1t0aGlzLmNvbG9yU2NoZW1lXVtjbnQgJSAxMF07XG4gICAgICAgIH1cbiAgICAgICAgY250Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVmaW5lUGhhc2VUaW1lbGluZXMoKSB7XG4gICAgdGhpcy5waGFzZVRpbWVsaW5lcyA9IHt9O1xuICAgIGZvciAoY29uc3QgcGhhc2Ugb2YgdGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dFBoYXNlcykge1xuICAgICAgdGhpcy5waGFzZVRpbWVsaW5lc1twaGFzZV0gPSBbXTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRlYW0gb2YgdGhpcy5nYW50dENoYXJ0U2VydmljZS5kYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IHBoYXNlIG9mIE9iamVjdC5rZXlzKHRlYW0udGltZWxpbmVzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRpbWVsaW5lIG9mIHRlYW0udGltZWxpbmVzW3BoYXNlXSkge1xuICAgICAgICAgIHRoaXMucGhhc2VUaW1lbGluZXNbcGhhc2VdLnB1c2goe2Zyb206IHRpbWVsaW5lLmZyb20sXG4gICAgICAgICAgICB0bzogdGltZWxpbmUudG8sXG4gICAgICAgICAgICBjb2xvcjogdGVhbS5jb2xvcixcbiAgICAgICAgICAgIGluZm86IHRpbWVsaW5lLmluZm8sXG4gICAgICAgICAgICB0b29sVGlwOiAodGltZWxpbmUuaW5mbyA/ICdibG9jaycgOiAnbm9uZScpfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ3BoYXNlIHRpbWVsaW5lczogJyk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5waGFzZVRpbWVsaW5lcyk7XG4gIH1cblxuICAvLyBzZXRDb2xvcnMoKSB7XG4gIC8vICAgbGV0IGNudCA9IDA7XG4gIC8vICAgZm9yIChjb25zdCB0ZWFtIG9mIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZGF0YSkge1xuICAvLyAgICAgaWYgKCF0ZWFtLmNvbG9yKSB0ZWFtLmNvbG9yID0gY29sb3JTY2hlbWVzW3RoaXMuZ2FudHRDaGFydFNlcnZpY2UuY29sb3JTY2hlbWVdW2NudCAlIDEwXTtcbiAgLy8gICAgIGNudCsrO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBnYW50dENoYXJ0U2VydmljZTogR2FudHRDaGFydFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgZ2xvYmFsUGFyYW1ldGVyc1NlcnZpY2U6IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGN1cnJlbnRFbGVtZW50OiBFbGVtZW50UmVmKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbXBvbmVudElEID0gdGhpcy5nbG9iYWxQYXJhbWV0ZXJzU2VydmljZS5hZGROZXdDb21wb25lbnQoKTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuZ2FudHRDaGFydFNlcnZpY2Uuc2V0VmFsdWVzKHtcbiAgICAgIGNvbXBvbmVudElEOiB0aGlzLmNvbXBvbmVudElELFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfSk7XG4gICAgdGhpcy5oZWlnaHQgPSB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmhlaWdodDtcbiAgICB0aGlzLmRlZmluZVBoYXNlVGltZWxpbmVzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuZ2FudHRDaGFydFNlcnZpY2Uuc2V0VmFsdWVzKHtcbiAgICAgIGNvbXBvbmVudElEOiB0aGlzLmNvbXBvbmVudElELFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfSk7XG4gICAgdGhpcy5oZWlnaHQgPSB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmhlaWdodDtcbiAgICB0aGlzLmRlZmluZVBoYXNlVGltZWxpbmVzKCk7XG4gIH1cblxufVxuIl19