UNPKG

ngx-beautiful-charts

Version:
178 lines 17 kB
/** * @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