@syncfusion/ej2-gantt
Version:
Essential JS 2 Gantt Component
412 lines (411 loc) • 22.1 kB
JavaScript
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
import { PdfGanttTaskbarCollection } from './pdf-taskbar';
import { isNullOrUndefined } from '@syncfusion/ej2-base';
import { PointF, PdfPen, PdfColor } from '@syncfusion/ej2-pdf-export';
import { PdfTreeGrid } from './pdf-treegrid';
import { PdfTimeline } from './pdf-timeline';
import { pixelToPoint, pointToPixel } from '../base/utils';
import { PdfGanttPredecessor } from './pdf-connector-line';
import { EventMarker } from './pdf-event-marker';
/**
*
*/
var PdfGantt = /** @class */ (function (_super) {
__extends(PdfGantt, _super);
function PdfGantt(parent) {
var _this = _super.call(this) || this;
_this.exportProps = {};
_this.changeCloneProjectDates = false;
_this.currentPage = 0;
_this.parent = parent;
_this.chartHeader = new PdfTimeline(_this);
_this.eventMarker = new EventMarker(parent);
_this.predecessor = new PdfGanttPredecessor(parent, _this);
_this.headerDetails = [];
_this.pdfPageDetail = [];
_this.taskbarCollection = [];
_this.predecessorCollection = [];
return _this;
}
Object.defineProperty(PdfGantt.prototype, "taskbar", {
get: function () {
if (isNullOrUndefined(this.taskbars)) {
this.taskbars = new PdfGanttTaskbarCollection(this.parent);
}
return this.taskbars;
},
enumerable: true,
configurable: true
});
PdfGantt.prototype.drawChart = function (result) {
this.result = result;
this.totalPages = this.result.page.section.count;
this.perColumnPages = this.totalPages / this.layouter.columnRanges.length;
this.calculateRange();
this.drawGantttChart();
this.drawPageBorder();
};
//Calcualte the header range for each pdf page based on schedule start and end date.
PdfGantt.prototype.calculateRange = function () {
var lastColumnRange = this.layouter.columnRanges[this.layouter.columnRanges.length - 1];
var totalColumnWidth = 0;
var isPageFinished = true;
var pageWidth = 0;
var remainWidth = 0;
var point = 0;
var headerWidth = pixelToPoint(this.chartHeader.width);
var timelineSettings = this.parent.timelineModule;
for (var index = lastColumnRange[0]; index <= lastColumnRange[1]; index++) {
totalColumnWidth += this.layouter.treegrid.columns.getColumn(index).width;
}
totalColumnWidth += 0.5;
if (totalColumnWidth + 100 < this.result.page.getClientSize().width) {
remainWidth = this.result.page.getClientSize().width - totalColumnWidth;
this.chartPageIndex = this.startPageIndex = this.totalPages - this.perColumnPages;
isPageFinished = false;
this.startPoint = new PointF(totalColumnWidth, 0);
}
else {
this.result.page.section.add();
this.chartPageIndex = this.startPageIndex = this.totalPages;
isPageFinished = true;
this.startPoint = new PointF(point, 0);
}
while (Math.round(point) < Math.round(headerWidth)) {
if (isPageFinished) {
pageWidth = this.result.page.getClientSize().width;
}
else {
pageWidth = remainWidth;
isPageFinished = true;
}
var detail = {};
var range = [];
var convertedWidth = pixelToPoint(this.chartHeader.bottomTierCellWidth);
var width = 0;
if (this.chartHeader.bottomTierCellWidth !== 0) {
width = (Math.floor(pageWidth / convertedWidth) * convertedWidth);
}
range[0] = point;
if (headerWidth - point <= width) {
range[1] = headerWidth;
detail.totalWidth = pointToPixel(headerWidth - point);
}
else {
range[1] = point + width;
detail.totalWidth = pointToPixel(width);
}
detail.startPoint = range[0];
detail.endPoint = range[1];
if (this.parent.cloneProjectStartDate.getHours() === 0 && this.parent.cloneProjectStartDate.getMinutes() === 0
&& this.parent.cloneProjectStartDate.getSeconds() === 0) {
this.changeCloneProjectDates = true;
this.parent.cloneProjectStartDate.setHours(8);
}
var timelineStartDate = this.parent.dataOperation.getDateFromFormat(this.parent.timelineModule.timelineStartDate);
var count = isNullOrUndefined(timelineSettings.customTimelineSettings.bottomTier.count) ?
timelineSettings.customTimelineSettings.topTier.count : timelineSettings.customTimelineSettings.bottomTier.count;
var scheduleType = timelineSettings.customTimelineSettings.bottomTier.unit === 'None' ?
timelineSettings.customTimelineSettings.topTier.unit : timelineSettings.customTimelineSettings.bottomTier.unit;
switch (scheduleType) {
case 'Minutes':
{
detail.startDate = new Date(timelineStartDate.getTime());
var sDays = Math.floor(pointToPixel(detail.startPoint) / (this.chartHeader.bottomTierCellWidth));
detail.startDate.setMinutes(detail.startDate.getMinutes() + sDays * count);
detail.startDate.setSeconds(detail.startDate.getSeconds() + 1);
detail.endDate = new Date(detail.startDate.getTime());
var eDays = Math.floor(pointToPixel(detail.endPoint - detail.startPoint)
/ (this.chartHeader.bottomTierCellWidth));
detail.endDate.setMinutes(detail.endDate.getMinutes() + eDays * count);
break;
}
case 'Hour':
{
detail.startDate = new Date(timelineStartDate.getTime());
var startHours = Math.floor(pointToPixel(detail.startPoint) / (this.chartHeader.bottomTierCellWidth));
var currentDate = new Date(detail.startDate.getTime());
if (!this.parent.timelineSettings.showWeekend) {
currentDate = this.calculateHoursWithoutNonworkingDays(currentDate, startHours, count);
detail.startDate = new Date(currentDate.getTime());
}
else {
detail.startDate.setHours(detail.startDate.getHours() + startHours * count);
detail.startDate.setMinutes(detail.startDate.getMinutes() + 1);
}
var endHours = Math.floor((detail.endPoint - detail.startPoint)
/ pointToPixel(this.chartHeader.bottomTierCellWidth));
currentDate = new Date(detail.startDate.getTime());
if (!this.parent.timelineSettings.showWeekend) {
currentDate = this.calculateHoursWithoutNonworkingDays(currentDate, endHours, count);
}
else {
currentDate.setHours(currentDate.getHours() + endHours * count);
}
detail.endDate = new Date(currentDate.getTime());
break;
}
case 'Day':
{
detail.startDate = new Date(timelineStartDate.getTime());
var startDays = Math.round(detail.startPoint / pixelToPoint(this.chartHeader.bottomTierCellWidth));
var currentDate = new Date(detail.startDate.getTime());
if (!this.parent.timelineSettings.showWeekend) {
detail.startDate = this.calculateDaysWithoutNonworkingDays(detail.startDate, startDays * count);
}
else {
detail.startDate.setDate(detail.startDate.getDate() + startDays * count);
}
var endDays = Math.round((detail.endPoint - detail.startPoint)
/ pixelToPoint(this.chartHeader.bottomTierCellWidth)) - 1;
var startdate = detail.startDate;
startdate.setHours(0, 0, 0, 0);
currentDate = new Date(detail.startDate.getTime());
if (!this.parent.timelineSettings.showWeekend) {
currentDate = this.calculateDaysWithoutNonworkingDays(currentDate, endDays * count);
}
else {
currentDate.setDate(currentDate.getDate() + endDays * count);
}
var secondsToAdd = this.parent.workingTimeRanges[this.parent.workingTimeRanges.length - 1].to * 1000;
detail.endDate = new Date(currentDate.getTime());
detail.endDate.setTime(detail.endDate.getTime() + secondsToAdd);
break;
}
case 'Week':
{
detail.startDate = new Date(timelineStartDate.getTime());
var startDays1 = (detail.startPoint / pixelToPoint(this.chartHeader.bottomTierCellWidth) * 7);
if (!this.parent.timelineSettings.showWeekend) {
detail.startDate = this.calculateDaysWithoutNonworkingDays(detail.startDate, startDays1 * count);
}
else {
detail.startDate.setDate(detail.startDate.getDate() + startDays1 * count);
}
var endDays1 = Math.round((detail.endPoint - detail.startPoint)
/ pixelToPoint(this.chartHeader.bottomTierCellWidth)) * 7 - 1;
detail.endDate = new Date(detail.startDate.getTime());
if (!this.parent.timelineSettings.showWeekend) {
detail.endDate = this.calculateDaysWithoutNonworkingDays(detail.endDate, endDays1 * count);
}
else {
detail.endDate.setDate(detail.startDate.getDate() + endDays1 * count);
}
break;
}
case 'Month':
{
detail.startDate = new Date(timelineStartDate.getTime());
var startDays2 = (detail.startPoint / pixelToPoint(this.chartHeader.bottomTierCellWidth) * 31);
detail.startDate.setDate(detail.startDate.getDate() + startDays2 * count);
var endDays2 = Math.round((detail.endPoint - detail.startPoint)
/ pixelToPoint(this.chartHeader.bottomTierCellWidth)) * 31 - 1;
detail.endDate = new Date(detail.startDate.getTime());
detail.endDate.setDate(detail.startDate.getDate() + endDays2 * count);
break;
}
case 'Year':
{
detail.startDate = new Date(timelineStartDate.getTime());
var startDays3 = (detail.startPoint / pixelToPoint(this.chartHeader.bottomTierCellWidth) * 365);
detail.startDate.setDate(detail.startDate.getDate() + startDays3 * count);
var endDays3 = Math.round((detail.endPoint - detail.startPoint)
/ pixelToPoint(this.chartHeader.bottomTierCellWidth)) * 365 - 1;
detail.endDate = new Date(detail.startDate.getTime());
detail.endDate.setDate(detail.startDate.getDate() + endDays3 * count);
break;
}
}
this.headerDetails.push(detail);
point += width;
}
};
/**
* Calculates the end date by adding the specified number of working hours to the current date,
* excluding any non-working days as specified in the nonWorkingDayIndex.
*
* @param {Date} currentDate - The starting date from which to begin adding working hours.
* @param {number} startHours - The number of hours to add to the current date.
* @param {number} count - A multiplier to apply to the startHours, typically representing a scaling factor.
* @returns {Date} - A new Date object representing the calculated date/time after working hours have been added.
*
*/
PdfGantt.prototype.calculateHoursWithoutNonworkingDays = function (currentDate, startHours, count) {
var totalHours = 0;
while (totalHours < startHours * count) {
currentDate.setHours(currentDate.getHours() + 1);
if (this.parent.nonWorkingDayIndex.indexOf(currentDate.getDay()) === -1) {
totalHours++;
}
if (this.parent.nonWorkingDayIndex.indexOf(currentDate.getDay()) !== -1) {
currentDate.setHours(24, 0, 0, 0);
}
}
return currentDate;
};
/**
* Calculates the end date by adding the specified number of working days to the current date,
* excluding any non-working days as defined in the nonWorkingDayIndex.
*
* @param {Date} startDate - The starting date from which to begin adding working days.
* @param {number} daysToAdd - The number of days to add to the current date.
* @param {number} count - A multiplier applied to daysToAdd, typically representing the number of units.
* @returns {Date} - A new Date object representing the calculated date after working days have been added.
*
*/
PdfGantt.prototype.calculateDaysWithoutNonworkingDays = function (startDate, daysToAdd) {
var result = new Date(startDate.getTime());
var nonWorkingDays = this.parent.nonWorkingDayIndex.length;
var workingDaysInWeek = 7 - nonWorkingDays;
var fullWeeks = Math.floor(daysToAdd / workingDaysInWeek);
var remainingDays = daysToAdd % workingDaysInWeek;
result.setDate(result.getDate() + fullWeeks * 7);
// Process remaining days
while (remainingDays > 0) {
result.setDate(result.getDate() + 1);
if (this.parent.nonWorkingDayIndex.indexOf(result.getDay()) === -1) {
remainingDays--;
}
}
return result;
};
PdfGantt.prototype.drawPageBorder = function () {
var pages = this.result.page.section.getPages();
for (var index = 0; index < pages.length; index++) {
var page = pages[index];
var graphics = page.graphics;
var pageSize = page.getClientSize();
var pen = new PdfPen(new PdfColor(this.ganttStyle.chartGridLineColor));
graphics.drawRectangle(pen, 0, 0, pageSize.width, pageSize.height);
}
};
//Draw the gantt chart side
PdfGantt.prototype.drawGantttChart = function () {
var _this = this;
var taskbarPoint = this.startPoint;
var pagePoint = new PointF();
var pageStartX = 0;
var cumulativeWidth = 0;
var cumulativeHeight = 0;
var pageData;
this.headerDetails.forEach(function (detail, index) {
_this.currentPage = 0;
var page = _this.result.page.section.getPages()[_this.startPageIndex];
page['contentWidth'] = (_this.parent.pdfExportModule.gantt.taskbar.isAutoFit()) ? pointToPixel(_this.headerDetails[index].endPoint - _this.headerDetails[index].startPoint) : _this.headerDetails[index].endPoint - _this.headerDetails[index].startPoint;
_this.chartHeader.drawTimeline(page, _this.startPoint, detail, 0);
taskbarPoint.y = taskbarPoint.y + pixelToPoint(_this.parent.timelineModule.isSingleTier ? 45 : 60); // headerHeight
pageStartX = taskbarPoint.x;
cumulativeHeight = pixelToPoint(_this.parent.timelineModule.isSingleTier ? 45 : 60); // headerHeight
_this.headerDetails[_this.headerDetails.indexOf(detail)].startIndex = _this.startPageIndex;
_this.headerDetails[_this.headerDetails.indexOf(detail)].pageStartPoint = taskbarPoint;
for (var i = 0; i < _this.taskbarCollection.length; i++) {
var task = _this.taskbarCollection[i];
var rowHeight = _this.rows.getRow(i + 1).height;
var pdfPage = _this.result.page.section.getPages()[_this.startPageIndex];
var graphics = pdfPage.graphics;
var pen = new PdfPen(new PdfColor(_this.ganttStyle.chartGridLineColor));
var lineWidth = void 0;
if (page['contentWidth'] && (_this.parent.gridLines === 'Both' || _this.parent.gridLines === 'Horizontal')) {
lineWidth = _this.chartHeader.timelineWidth;
graphics.drawRectangle(pen, pageStartX, taskbarPoint.y, page['contentWidth'] + 0.5, rowHeight);
}
var isNextPage = task.drawTaskbar(pdfPage, taskbarPoint, detail, cumulativeWidth, rowHeight, _this.taskbarCollection[parseInt(i.toString(), 10)], lineWidth, index);
if (isNextPage) {
if (_this.enableHeader) {
taskbarPoint.y = pixelToPoint(_this.parent.timelineModule.isSingleTier ? 45 : 60);
}
else {
taskbarPoint.y = 0;
}
_this.startPageIndex++;
pageData = {};
pageData.height = cumulativeHeight;
pageData.pageStartX = pageStartX;
pageData.startPoint = __assign({}, pagePoint);
if (_this.parent.pdfExportModule.gantt.taskbar.isAutoFit()) {
pageData.width = (detail.totalWidth);
}
else {
pageData.width = (detail.totalWidth);
}
_this.pdfPageDetail.push(pageData);
pagePoint.y += pageData.height;
if (_this.enableHeader) {
cumulativeHeight = _this.chartHeader.height;
}
else {
taskbarPoint.y = 0;
cumulativeHeight = 0;
}
}
taskbarPoint.y += rowHeight;
cumulativeHeight += rowHeight;
_this.eventMarker.renderHeight = _this.layouter.pageHeightCollection[_this.currentPage].totalHeight;
_this.parent.eventMarkerColloction.map(function (eventMarker) {
var timelimeHeight = pixelToPoint(_this.parent.timelineModule.isSingleTier ? 45 : 60);
if (_this.currentPage !== 0) {
_this.eventMarker.renderHeight = _this.layouter.pageHeightCollection[_this.currentPage].totalHeight + timelimeHeight;
}
var pdfPage = _this.result.page.section.getPages()[_this.startPageIndex];
_this.eventMarker.drawEventMarker(pdfPage, taskbarPoint, cumulativeWidth, detail, eventMarker, timelimeHeight, _this.ganttStyle);
});
}
_this.headerDetails[index].endIndex = _this.startPageIndex;
cumulativeWidth += detail.totalWidth;
pageData = {};
pageData.height = cumulativeHeight;
pageData.pageStartX = pageStartX;
pageData.startPoint = __assign({}, pagePoint);
if (_this.parent.pdfExportModule.gantt.taskbar.isAutoFit()) {
pageData.width = (detail.totalWidth);
}
else {
pageData.width = pixelToPoint(detail.totalWidth);
}
_this.pdfPageDetail.push(pageData);
pagePoint.x += pageData.width;
pagePoint.y = 0;
if (_this.enableHeader) {
cumulativeHeight = _this.chartHeader.height;
}
else {
taskbarPoint.y = 0;
}
if (_this.headerDetails.indexOf(detail) !== _this.headerDetails.length - 1) {
_this.result.page.section.add();
_this.startPageIndex = _this.result.page.section.count - 1;
taskbarPoint = _this.startPoint = new PointF(0, 0);
}
});
// Draw predecessor line.
for (var i = 0; i < this.predecessorCollection.length; i++) {
var predecessor = this.predecessorCollection[i];
predecessor.drawPredecessor(this);
}
};
return PdfGantt;
}(PdfTreeGrid));
export { PdfGantt };