@syncfusion/ej2-gantt
Version:
Essential JS 2 Gantt Component
894 lines • 153 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 __());
};
})();
import { createElement, isNullOrUndefined, extend, compile, getValue, setValue, SanitizeHtmlHelper, append } from '@syncfusion/ej2-base';
import { formatUnit, addClass, Browser } from '@syncfusion/ej2-base';
import { isScheduledTask, getTaskData } from '../base/utils';
import { DataManager, Query } from '@syncfusion/ej2-data';
import * as cls from '../base/css-constants';
import { DateProcessor } from '../base/date-processor';
/**
* To render the chart rows in Gantt
*/
var ChartRows = /** @class */ (function (_super) {
__extends(ChartRows, _super);
function ChartRows(ganttObj) {
var _this = _super.call(this, ganttObj) || this;
_this.taskBarHeight = 0;
_this.milestoneHeight = 0;
_this.milesStoneRadius = 0;
_this.baselineTop = 0;
_this.baselineHeight = 8;
_this.touchLeftConnectorpoint = '';
_this.touchRightConnectorpoint = '';
_this.dropSplit = false;
_this.refreshedTr = [];
_this.refreshedData = [];
_this.isUpdated = true;
_this.tagRegex = /<\/?(\w+)([^>]*?)(\/?)>/g;
_this.attributeRegex = /([\w-]+)\s*=\s*"([^"]*)"/g;
_this.taskBaselineTemplateNode = null;
/**
* To trigger the touchmove.
*
* @param {TouchEvent} event .
* @returns {void}
* @private
*/
_this.handleTouchMove = function (event) {
_this.parent.ganttChartModule['ganttChartMove'](event);
};
/**
* To trigger the touchend.
*
* @param {TouchEvent} event .
* @returns {void}
* @private
*/
_this.handleTouchEnd = function (event) {
_this.parent.ganttChartModule['documentMouseUp'](event);
};
_this.parent = ganttObj;
_this.initPublicProp();
_this.addEventListener();
return _this;
}
/**
* To initialize the public property.
*
* @returns {void}
* @private
*/
ChartRows.prototype.initPublicProp = function () {
this.ganttChartTableBody = null;
};
ChartRows.prototype.addEventListener = function () {
this.parent.on('renderPanels', this.createChartTable, this);
this.parent.on('dataReady', this.initiateTemplates, this);
this.parent.on('destroy', this.destroy, this);
};
ChartRows.prototype.refreshChartByTimeline = function () {
this.taskTable.style.width = formatUnit(this.parent.enableTimelineVirtualization ?
this.parent.timelineModule.wholeTimelineWidth : this.parent.timelineModule.totalTimelineWidth);
var prevDate = getValue('prevProjectStartDate', this.parent.dataOperation);
var isUpdated = false;
if (prevDate) {
isUpdated = prevDate.getTime() === this.parent.cloneProjectStartDate.getTime();
}
this.isUpdated = this.parent.isFromOnPropertyChange && isUpdated &&
getValue('mutableData', this.parent.treeGrid.grid.contentModule) ? true : false;
this.refreshGanttRows();
this.isUpdated = true;
};
/**
* To render chart rows.
*
* @returns {void}
* @private
*/
ChartRows.prototype.createChartTable = function () {
this.taskTable = createElement('table', {
className: cls.taskTable + ' ' + (Browser.info.name === 'safari' ? null : cls.zeroSpacing),
id: 'GanttTaskTable' + this.parent.element.id, styles: 'position: absolute; width: ' +
(this.parent.enableTimelineVirtualization
? this.parent.timelineModule.wholeTimelineWidth
: this.parent.timelineModule.totalTimelineWidth) +
'px;' +
(Browser.info.name === 'safari' ? 'border-spacing: 0.25px;' : ''),
attrs: { cellspacing: '0.25px' }
});
var colgroup = createElement('colgroup');
var column = createElement('col', { styles: 'width:' + this.parent.timelineModule.totalTimelineWidth + 'px;' });
colgroup.appendChild(column);
this.taskTable.appendChild(colgroup);
this.ganttChartTableBody = createElement('tbody', {
id: this.parent.element.id + 'GanttTaskTableBody'
});
this.taskTable.appendChild(this.ganttChartTableBody);
this.parent.ganttChartModule.chartBodyContent.appendChild(this.taskTable);
};
ChartRows.prototype.initiateTemplates = function () {
this.taskTable.style.width = formatUnit(this.parent.enableTimelineVirtualization ?
this.parent.timelineModule.wholeTimelineWidth : this.parent.timelineModule.totalTimelineWidth);
this.initChartHelperPrivateVariable();
this.initializeChartTemplate();
};
/**
* To render chart rows.
*
* @returns {void}
* @private
*/
ChartRows.prototype.renderChartRows = function () {
this.createTaskbarTemplate();
this.parent.isGanttChartRendered = true;
};
/**
* To get gantt Indicator.
*
* @param {IIndicator} indicator .
* @returns {NodeList} .
* @private
*/
ChartRows.prototype.getIndicatorNode = function (indicator) {
var templateString = '<label class="' + cls.label + ' ' + cls.taskIndicatorDiv + '" style="display: inline-flex; align-items: center; margin-top: 0; line-height:'
+ (this.parent.rowHeight) + 'px;' +
(this.parent.enableRtl ? 'right:' : 'left:') + this.getIndicatorleft(indicator.date) + 'px;"><i class="' + indicator.iconClass + '" style="margin-right: 3px;"></i> </label>';
return this.createDivElement(templateString);
};
/**
* To get gantt Indicator.
*
* @param {Date | string} date .
* @returns {number} .
* @private
*/
ChartRows.prototype.getIndicatorleft = function (date) {
date = this.parent.dateValidationModule.getDateFromFormat(date);
var left = this.parent.dataOperation.getTaskLeft(date, false);
return left;
};
/**
* To get child taskbar Node.
*
* @param {number} i .
* @param {NodeList} rootElement .
* @returns {NodeList} .
* @private
*/
ChartRows.prototype.getChildTaskbarNode = function (i, rootElement) {
var childTaskbarNode = null;
var data = this.templateData;
var direction;
if (this.parent.enableRtl) {
direction = 'right:';
}
else {
direction = 'left:';
}
if (this.childTaskbarTemplateFunction) {
childTaskbarNode = this.childTaskbarTemplateFunction(extend({ index: i }, data), this.parent, 'TaskbarTemplate', this.getTemplateID('TaskbarTemplate'), false, undefined, rootElement[0], this.parent.treeGrid['root']);
}
else {
var labelString = '';
var taskLabel = '';
var taskbarInnerDiv = void 0;
var progressDiv = void 0;
if (data.ganttProperties.startDate && data.ganttProperties.endDate
&& data.ganttProperties.duration) {
taskbarInnerDiv = this.createDivElement('<div class="' + cls.childTaskBarInnerDiv + ' ' + cls.traceChildTaskBar +
' ' + (data.ganttProperties.isAutoSchedule ? '' : cls.manualChildTaskBar) + '"' +
'style="width:' + data.ganttProperties.width + 'px;height:' +
(this.taskBarHeight) + 'px; margin-top :-1px"></div>');
progressDiv = this.createDivElement('<div class="' + cls.childProgressBarInnerDiv + ' ' +
cls.traceChildProgressBar + ' ' + (data.ganttProperties.isAutoSchedule ?
'' : cls.manualChildProgressBar) + '"' +
' style="border-style:' + (data.ganttProperties.progressWidth ? 'solid;' : 'none;') +
'width:' + data.ganttProperties.progressWidth + 'px;height:100%;' +
'border-top-right-radius:' + this.getBorderRadius(data.ganttProperties) + 'px;' +
'border-bottom-right-radius:' + this.getBorderRadius(data.ganttProperties) + 'px;">' +
'</div>');
}
var tempDiv = createElement('div');
if (this.taskLabelTemplateFunction && !isNullOrUndefined(progressDiv) && progressDiv.length > 0) {
var taskLabelTemplateNode = this.taskLabelTemplateFunction(extend({ index: i }, data), this.parent, 'TaskLabelTemplate', this.getTemplateID('TaskLabelTemplate'), false, undefined, progressDiv[0]);
if (taskLabelTemplateNode && taskLabelTemplateNode.length > 0) {
append(taskLabelTemplateNode, tempDiv);
labelString = tempDiv.innerHTML;
labelString = this.getTaskLabel(this.parent.labelSettings.taskLabel);
labelString = labelString === 'isCustomTemplate' ? tempDiv.innerHTML : labelString;
if (this.parent.enableHtmlSanitizer && typeof (labelString) === 'string') {
labelString = SanitizeHtmlHelper.sanitize(labelString);
}
}
}
else {
var field = this.parent.labelSettings.taskLabel;
labelString = this.getTaskLabel(field);
labelString = labelString === 'isCustomTemplate' ? this.parent.labelSettings.taskLabel : labelString;
if (this.parent.enableHtmlSanitizer && typeof (labelString) === 'string') {
labelString = SanitizeHtmlHelper.sanitize(labelString);
}
}
if (labelString.indexOf('null') === -1) {
if (this.getTaskLabel(this.parent.labelSettings.taskLabel) === 'isCustomTemplate' &&
!this.isTemplate(this.parent.labelSettings.taskLabel)) {
labelString = '';
}
if (isNaN(parseInt(labelString, 10))) {
taskLabel = '<span class="' + cls.taskLabel + '" style="line-height:' +
(this.taskBarHeight - 1) + 'px; text-align:' + (this.parent.enableRtl ? 'right;' : 'left;') +
'display:' + 'inline-block;' +
'width:' + (data.ganttProperties.width - 10) + 'px; height:' +
this.taskBarHeight + 'px;"></span>';
}
else {
taskLabel = '<span class="' + cls.taskLabel + '" style="line-height:' +
(this.taskBarHeight - 1) + 'px;' + (this.parent.viewType === 'ResourceView' ? ('text-align:' +
(this.parent.enableRtl ? 'right;' : 'left;')) : '') +
+(this.parent.viewType === 'ResourceView' ? 'display:inline-flex;' : '') +
+(this.parent.viewType === 'ResourceView' ? (data.ganttProperties.width - 10) : '') + 'px; height:' +
this.taskBarHeight + 'px;"></span>';
}
}
var template = !isNullOrUndefined(data.ganttProperties.segments) && data.ganttProperties.segments.length > 0 ?
this.splitTaskbar(data, labelString) : (data.ganttProperties.startDate && data.ganttProperties.endDate
&& data.ganttProperties.duration) ? (taskLabel) :
(data.ganttProperties.startDate && !data.ganttProperties.endDate && !data.ganttProperties.duration) ? ('<div class="' + cls.childProgressBarInnerDiv + ' ' + cls.traceChildTaskBar + ' ' +
cls.unscheduledTaskbarLeft + ' ' + (data.ganttProperties.isAutoSchedule ?
'' : cls.manualChildTaskBar) + '"' +
'style="' + direction + data.ganttProperties.left + 'px; height:' + this.taskBarHeight + 'px;"></div>') :
(data.ganttProperties.endDate && !data.ganttProperties.startDate && !data.ganttProperties.duration) ?
('<div class="' + cls.childProgressBarInnerDiv + ' ' + cls.traceChildTaskBar + ' ' +
cls.unscheduledTaskbarRight + ' ' + (data.ganttProperties.isAutoSchedule ?
'' : cls.manualChildTaskBar) + '"' +
'style="' + direction + data.ganttProperties.left + 'px; height:' + this.taskBarHeight + 'px;"></div>') :
(data.ganttProperties.duration && !data.ganttProperties.startDate && !data.ganttProperties.endDate) ?
('<div class="' + cls.childProgressBarInnerDiv + ' ' + cls.traceChildTaskBar + ' ' +
cls.unscheduledTaskbar + ' ' + (data.ganttProperties.isAutoSchedule ?
'' : cls.manualChildTaskBar) + '"' +
'style="' + direction + data.ganttProperties.left + 'px; width:' + data.ganttProperties.width + 'px;' +
' height:' + this.taskBarHeight + 'px;"></div>') : '';
if (data.ganttProperties.segments && data.ganttProperties.segments.length > 0) {
var progress = this.getSplitProgressResizerNode();
template = template + progress;
}
if (data.ganttProperties.startDate && data.ganttProperties.endDate && data.ganttProperties.duration &&
(isNullOrUndefined(data.ganttProperties.segments) || (!isNullOrUndefined(data.ganttProperties.segments) &&
data.ganttProperties.segments.length === 0))) {
if (template !== '' && !isNullOrUndefined(progressDiv) && progressDiv.length > 0) {
/* eslint-disable-next-line */
var templateElement = this.createDivElement(template)[0];
if (this.parent.disableHtmlEncode) {
templateElement.innerText = labelString;
}
else {
templateElement.innerHTML = labelString;
}
var childLabel = this.parent.labelSettings.taskLabel;
if (childLabel && childLabel['elementRef']) {
templateElement.appendChild(tempDiv);
}
progressDiv[0].appendChild(templateElement);
if (progressDiv[0].querySelectorAll('.e-task-label')[0].textContent !== '' &&
!this.isTemplate(childLabel) &&
progressDiv[0].querySelectorAll('.e-task-label')[0].children[0] && this.parent.disableHtmlEncode) {
progressDiv[0].querySelectorAll('.e-task-label')[0].children[0].remove();
}
if (progressDiv[0].querySelectorAll('.e-task-label')[0].textContent === '' &&
childLabel && !childLabel['elementRef'] && tempDiv.innerHTML !== '') {
progressDiv[0].querySelectorAll('.e-task-label')[0].textContent = childLabel;
}
}
if (!isNullOrUndefined(taskbarInnerDiv) && taskbarInnerDiv.length > 0) {
taskbarInnerDiv[0].appendChild([].slice.call(progressDiv)[0]);
}
childTaskbarNode = taskbarInnerDiv;
}
else {
childTaskbarNode = this.createDivElement(template);
}
}
if (this.parent.enableRtl && !isNullOrUndefined(childTaskbarNode) && childTaskbarNode[0] && childTaskbarNode[0].querySelector('.e-task-label')) {
childTaskbarNode[0].querySelector('.e-task-label').style.marginLeft = '15px';
childTaskbarNode[0].querySelector('.e-task-label').style.marginRight = '8px';
if (childTaskbarNode[0].querySelector('.e-gantt-child-progressbar')) {
childTaskbarNode[0].querySelector('.e-gantt-child-progressbar').style.textAlign = 'left';
}
}
return childTaskbarNode;
};
ChartRows.prototype.splitTaskbar = function (data, labelString) {
var splitTasks = '';
for (var i = 0; i < data.ganttProperties.segments.length; i++) {
var segment = data.ganttProperties.segments[i];
var progressBarVisible = void 0;
if (!segment.showProgress) {
progressBarVisible = 'hidden';
}
else {
progressBarVisible = 'initial';
}
var segmentPosition = (i === 0) ? 'e-segment-first' : (i === data.ganttProperties.segments.length - 1)
? 'e-segment-last' : 'e-segment-inprogress';
splitTasks += (
//split taskbar
'<div class="' + cls.childTaskBarInnerDiv + ' ' + segmentPosition + ' ' + cls.traceChildTaskBar + ' ' +
' e-segmented-taskbar' +
'"style="width:' + segment.width + 'px;position: absolute;' + (this.parent.enableRtl ? 'right:' : 'left:') + segment.left + 'px;height:' +
(this.taskBarHeight) + 'px; overflow:' + progressBarVisible + ';" data-segment-index = "' + i + '" aria-label = "' +
this.generateSpiltTaskAriaLabel(segment, data.ganttProperties) + '"> ' +
this.getSplitTaskbarLeftResizerNode() +
//split progress bar
'<div class="' + cls.childProgressBarInnerDiv + ' ' + cls.traceChildProgressBar + ' ' +
'" style="border-style:' + (segment.progressWidth ? 'solid;' : 'none;') +
'display:' + (segment.progressWidth >= 0 ? 'block;' : 'none;') +
'width:' + segment.progressWidth + 'px;height:100%;' + 'text-align:' + (this.parent.enableRtl ? 'left;' : 'right;') +
'border-top-right-radius:' + this.getSplitTaskBorderRadius(segment) + 'px;' +
'border-bottom-right-radius:' + this.getSplitTaskBorderRadius(segment) + 'px;">' +
// progress label
'<span class="' + cls.taskLabel + '" style="line-height:' +
(this.taskBarHeight - 1) + 'px;display:' + (segment.showProgress ? 'inline;' : 'none;') +
'height:' + this.taskBarHeight + 'px;">' + labelString + '</span>' +
'</div>' +
this.getSplitTaskbarRightResizerNode(segment) +
'</div></div>');
}
return splitTasks;
};
ChartRows.prototype.getSplitTaskbarLeftResizerNode = function () {
var lResizerLeft = (!isNullOrUndefined(document.body.className) && document.body.className.includes('e-bigger')) ? 5 : -2;
var template = '<div class="' + cls.taskBarLeftResizer + ' ' + cls.icon + '"' +
' style="' + (this.parent.enableRtl ? 'right:' : 'left:') + lResizerLeft + 'px;height:' + (this.taskBarHeight) + 'px;z-index:1"></div>';
return template;
};
ChartRows.prototype.getSplitTaskbarRightResizerNode = function (segment) {
var rResizerLeft = (!isNullOrUndefined(document.body.className) && document.body.className.includes('e-bigger')) ? -17 : -10;
var template = '<div class="' + cls.taskBarRightResizer + ' ' + cls.icon + '"' +
' style="' + (this.parent.enableRtl ? 'right:' : 'left:') + (segment.width + rResizerLeft) + 'px;' +
'height:' + (this.taskBarHeight) + 'px;z-index:1"></div>';
return template;
};
ChartRows.prototype.getSplitProgressResizerNode = function () {
var width = this.parent.enableRtl ? (this.templateData.ganttProperties.progressWidth + 8) :
(this.templateData.ganttProperties.progressWidth - 6);
var template = '<div class="' + cls.childProgressResizer + '"' +
' style="' + (this.parent.enableRtl ? 'right:' : 'left:') + width + 'px;margin-top:' +
(this.taskBarHeight - 4) + 'px;"><div class="' + cls.progressBarHandler + '"' +
'><div class="' + cls.progressHandlerElement + '"></div>' +
'<div class="' + cls.progressBarHandlerAfter + '"></div></div>';
return template;
};
ChartRows.prototype.getSegmentIndex = function (splitStartDate, record) {
var segmentIndex = -1;
var ganttProp = record.ganttProperties;
var segments = ganttProp.segments;
if (!isNullOrUndefined(segments)) {
segments.sort(function (a, b) {
return a.startDate.getTime() - b.startDate.getTime();
});
var length_1 = segments.length;
for (var i = 0; i < length_1; i++) {
var segment = segments[i];
// To find if user tend to split the start date of a main taskbar
// purpose of this to restrict the split action
if (splitStartDate.getTime() === ganttProp.startDate.getTime()) {
this.dropSplit = true;
segmentIndex = 0;
// To find the if user tend to split the first date of already segmented task.
// purpose of this to move on day of a segment
}
else if (splitStartDate.getTime() === segment.startDate.getTime()) {
this.dropSplit = true;
var sDate = segment.startDate;
sDate.setDate(sDate.getDate() + 1);
sDate = segment.startDate = this.parent.dataOperation.checkStartDate(sDate, ganttProp, false);
segment.startDate = sDate;
var eDate = segment.endDate;
eDate = this.parent.dataOperation.getEndDate(sDate, segment.duration, ganttProp.durationUnit, ganttProp, false);
segment.endDate = eDate;
if (i === segments.length - 1) {
this.parent.setRecordValue('endDate', eDate, ganttProp, true);
}
this.incrementSegments(segments, i, record);
segmentIndex = segment.segmentIndex;
// To find if the user tend to split the segment and find the segment index
}
else {
segment.endDate = this.parent.dataOperation.getEndDate(segment.startDate, segment.duration, ganttProp.durationUnit, ganttProp, false);
if (splitStartDate.getTime() >= segment.startDate.getTime() && splitStartDate.getTime() <= segment.endDate.getTime()) {
segmentIndex = segment.segmentIndex;
}
}
this.parent.setRecordValue('segments', ganttProp.segments, ganttProp, true);
}
}
if (segmentIndex === -1) {
this.dropSplit = true;
}
return segmentIndex;
};
ChartRows.prototype.mergeTask = function (taskId, segmentIndexes) {
var mergeArrayLength = segmentIndexes.length;
var taskFields = this.parent.taskFields;
var mergeData = this.parent.flatData.filter(function (x) {
if (x[taskFields.id] === taskId) {
return x;
}
else {
return null;
}
})[0];
if (this.parent.undoRedoModule && !this.parent.undoRedoModule['isUndoRedoPerformed']) {
var details = {};
details['action'] = 'MergeTaskbar';
if (this.parent['isUndoRedoItemPresent']('Edit')) {
if (this.parent.editModule && this.parent.editModule.taskbarEditModule['isDragged'] && this.parent.getUndoActions().length > 0) {
this.parent.undoRedoModule['getUndoCollection'].splice(this.parent.undoRedoModule['getUndoCollection'].length - 1, 1);
}
this.parent.undoRedoModule['createUndoCollection']();
var rec = this.parent.previousFlatData[mergeData.index];
details['modifiedRecords'] = extend([], [rec], [], true);
this.parent.undoRedoModule['getUndoCollection'][this.parent.undoRedoModule['getUndoCollection'].length - 1] = details;
}
}
var segments = mergeData.ganttProperties.segments;
segmentIndexes = segmentIndexes.sort(function (a, b) {
return b.firstSegmentIndex - a.firstSegmentIndex;
});
for (var arrayLength = 0; arrayLength < mergeArrayLength; arrayLength++) {
var firstSegment = segments[segmentIndexes[arrayLength].firstSegmentIndex];
var secondSegment = segments[segmentIndexes[arrayLength].secondSegmentIndex];
var duration = firstSegment.duration + secondSegment.duration;
var endDate = this.parent.dataOperation.getEndDate(firstSegment.startDate, duration, mergeData.ganttProperties.durationUnit, mergeData.ganttProperties, false);
var segment = {
startDate: firstSegment.startDate,
endDate: endDate,
duration: duration
};
var insertIndex = segmentIndexes[arrayLength].firstSegmentIndex;
segments.splice(insertIndex, 2, segment);
this.parent.setRecordValue('segments', segments, mergeData.ganttProperties, true);
this.parent.dataOperation.updateMappingData(mergeData, 'segments');
if (segments.length === 1) {
this.parent.setRecordValue('endDate', endDate, mergeData.ganttProperties, true);
this.parent.setRecordValue('EndDate', endDate, mergeData, true);
this.parent.setRecordValue('segments', null, mergeData.ganttProperties, true);
this.parent.dataOperation.updateMappingData(mergeData, 'segments');
}
else if (mergeData.ganttProperties.endDate !== segments[segments.length - 1].endDate) {
this.parent.setRecordValue('endDate', segments[segments.length - 1].endDate, mergeData.ganttProperties, true);
}
}
var segmentFields;
if (!isNullOrUndefined(mergeData[taskFields.segments]) && !isNullOrUndefined(mergeData[taskFields.segments][0])) {
segmentFields = Object.keys(mergeData[taskFields.segments][0]);
}
var modifiedSegments = [];
for (var i = 0; i < segments.length; i++) {
if (!isNullOrUndefined(segmentFields) && !modifiedSegments[i]) {
modifiedSegments[i] = {};
}
if (!isNullOrUndefined(segmentFields) && segmentFields.indexOf('StartDate') !== -1) {
modifiedSegments[i][taskFields.startDate] = segments[i].startDate;
}
if (!isNullOrUndefined(segmentFields) && segmentFields.indexOf('EndDate') !== -1) {
modifiedSegments[i][taskFields.endDate] = segments[i].endDate;
}
if (!isNullOrUndefined(segmentFields) && segmentFields.indexOf('Duration') !== -1) {
modifiedSegments[i][taskFields.duration] = segments[i].duration;
}
}
mergeData[taskFields.segments] = modifiedSegments;
this.updateSegment(mergeData.ganttProperties.segments, taskId);
this.refreshChartAfterSegment(mergeData, 'mergeSegment');
};
ChartRows.prototype.updateSegment = function (segmentData, taskId) {
var _this = this;
if (!isNullOrUndefined(this.parent.taskFields.segmentId) && this.parent.segmentData.length > 0) {
if (!isNullOrUndefined(segmentData)) {
var segmentsArray = [];
for (var i = 0; i < segmentData.length; i++) {
var segmentObj = {};
var segment = segmentData[i];
segmentObj[this.parent.taskFields.segmentId] = taskId;
if (!isNullOrUndefined(this.parent.taskFields.startDate)) {
segmentObj[this.parent.taskFields.startDate] = segment.startDate;
}
if (!isNullOrUndefined(this.parent.taskFields.duration)) {
segmentObj[this.parent.taskFields.duration] = segment.duration;
}
if (!isNullOrUndefined(this.parent.taskFields.endDate)) {
segmentObj[this.parent.taskFields.endDate] = segment.endDate;
}
segmentsArray.push(segmentObj);
}
var filterData = this.parent.segmentData.filter(function (data) {
return !(taskId === data[_this.parent.taskFields.segmentId]);
});
for (var i = 0; i < segmentsArray.length; i++) {
filterData.push(segmentsArray[i]);
}
this.parent.segmentData = filterData;
}
else {
var filterData = this.parent.segmentData.filter(function (data) {
return !(taskId === data[_this.parent.taskFields.segmentId]);
});
this.parent.segmentData = filterData;
}
}
};
ChartRows.prototype.refreshChartAfterSegment = function (data, requestType) {
this.parent.setRecordValue('segments', this.parent.dataOperation.setSegmentsInfo(data, false), data.ganttProperties, true);
this.parent.dataOperation.updateMappingData(data, 'segments');
this.parent.dataOperation.updateWidthLeft(data);
this.parent.dataOperation.updateParentItems(data);
if (data.ganttProperties.sharedTaskUniqueIds && data.ganttProperties.sharedTaskUniqueIds.length > 1) {
this.parent.editModule['updateSharedTask'](data);
}
if (this.parent.predecessorModule && this.parent.taskFields.dependency) {
this.parent.predecessorModule.updatedRecordsDateByPredecessor();
this.parent.connectorLineModule.removePreviousConnectorLines(this.parent.flatData);
this.parent.connectorLineEditModule.refreshEditedRecordConnectorLine(this.parent.flatData);
if (data.parentItem && this.parent.getParentTask(data.parentItem).ganttProperties.isAutoSchedule
&& this.parent.isInPredecessorValidation) {
this.parent.dataOperation.updateParentItems(data.parentItem);
}
this.refreshRecords(this.parent.currentViewData);
}
else {
this.refreshRecords(this.parent.currentViewData);
}
var tr = this.ganttChartTableBody.querySelectorAll('tr')[this.parent.currentViewData.indexOf(data)];
var args = {
requestType: requestType,
rowData: data,
modifiedRecords: this.parent.editedRecords,
modifiedTaskData: getTaskData(this.parent.editedRecords, true)
};
this.triggerQueryTaskbarInfoByIndex(tr, data);
if (this.parent.selectionModule) {
this.parent.selectionModule.clearSelection();
}
var segments = args.rowData.taskData[this.parent.taskFields.segments];
if (this.parent.timezone && segments != null) {
for (var i = 0; i < segments.length; i++) {
segments[i][this.parent.taskFields.startDate] = this.parent.dateValidationModule.remove(args.rowData.ganttProperties.segments[i].startDate, this.parent.timezone);
if (this.parent.taskFields.endDate) {
segments[i][this.parent.taskFields.endDate] = this.parent.dateValidationModule.remove(args.rowData.ganttProperties.segments[i].endDate, this.parent.timezone);
}
}
}
this.parent.trigger('actionComplete', args);
this.parent['hideLoadingIndicator']();
setValue('isEdit', false, this.parent.contextMenuModule);
setValue('isEdit', false, this.parent);
};
/**
* public method to split task bar.
*
* @public
*/
ChartRows.prototype.splitTask = function (taskId, splitDates) {
var taskFields = this.parent.taskFields;
var splitDate = splitDates;
var splitRecord = this.parent.flatData.filter(function (x) {
if (x[taskFields.id] === taskId) {
return x;
}
else {
return null;
}
})[0];
if (this.parent.undoRedoModule && !this.parent.undoRedoModule['isUndoRedoPerformed']) {
var details = {};
details['action'] = 'MergeTaskbar';
if (this.parent['isUndoRedoItemPresent']('Edit')) {
this.parent.undoRedoModule['createUndoCollection']();
details['modifiedRecords'] = extend([], [splitRecord], [], true);
this.parent.undoRedoModule['getUndoCollection'][this.parent.undoRedoModule['getUndoCollection'].length - 1] = details;
}
}
var ganttProp = splitRecord.ganttProperties;
this.dropSplit = false;
var segmentIndex = -1;
var segments = ganttProp.segments;
if (isNullOrUndefined(splitDates.length) || splitDates.length < 0) {
var splitStartDate = this.parent.dataOperation.checkStartDate(splitDate, ganttProp, false);
if (splitStartDate.getTime() !== ganttProp.startDate.getTime()) {
if (ganttProp.isAutoSchedule) {
if (!isNullOrUndefined(segments) && segments.length > 0) {
segmentIndex = this.getSegmentIndex(splitStartDate, splitRecord);
}
//check atleast one day difference is there to split
if (this.dropSplit === false && splitDate.getTime() > ganttProp.startDate.getTime() &&
splitDate.getTime() < ganttProp.endDate.getTime()) {
segments = segmentIndex !== -1 ? segments : [];
var startDate = segmentIndex !== -1 ?
segments[segmentIndex].startDate : new Date(ganttProp.startDate.getTime());
var endDate = segmentIndex !== -1 ?
segments[segmentIndex].endDate : new Date(ganttProp.endDate.getTime());
var segmentDuration = this.parent.dataOperation.getDuration(startDate, endDate, ganttProp.durationUnit, ganttProp.isAutoSchedule, ganttProp.isMilestone);
this.parent.setRecordValue('segments', this.splitSegmentedTaskbar(startDate, endDate, splitDate, segmentIndex, segments, splitRecord, segmentDuration), ganttProp, true);
var modifiedSegments = [];
for (var i = 0; i < segments.length; i++) {
if (!modifiedSegments[i]) {
modifiedSegments[i] = {};
}
modifiedSegments[i][taskFields.startDate] = segments[i].startDate;
modifiedSegments[i][taskFields.endDate] = segments[i].endDate;
modifiedSegments[i][taskFields.duration] = segments[i].duration;
}
splitRecord[taskFields.segments] = modifiedSegments;
if (segmentIndex !== -1) {
this.incrementSegments(segments, segmentIndex + 1, splitRecord);
}
this.parent.setRecordValue('endDate', segments[segments.length - 1].endDate, ganttProp, true);
if (this.parent.taskFields.endDate) {
this.parent.dataOperation.updateMappingData(splitRecord, 'endDate');
}
}
this.updateSegment(splitRecord.ganttProperties.segments, taskId);
this.refreshChartAfterSegment(splitRecord, 'splitTaskbar');
}
}
}
else {
splitDates.sort(function (a, b) {
return a.getTime() - b.getTime();
});
this.parent.setRecordValue('segments', this.constructSegments(splitDates, splitRecord.ganttProperties), splitRecord.ganttProperties, true);
this.updateSegment(splitRecord.ganttProperties.segments, taskId);
this.refreshChartAfterSegment(splitRecord, 'splitTask');
}
};
ChartRows.prototype.constructSegments = function (dates, taskData) {
var segmentsArray = [];
var segment;
var startDate = new Date();
var endDate;
var duration;
for (var i = 0; i < dates.length + 1; i++) {
startDate = i === 0 ? taskData.startDate : startDate;
startDate = this.parent.dataOperation.checkStartDate(startDate, taskData, false);
endDate = i !== dates.length ? new Date(dates[i].getTime()) > taskData.endDate ? taskData.endDate
: new Date(dates[i].getTime()) : taskData.endDate;
endDate = this.parent.dataOperation.checkEndDate(endDate, taskData, false);
duration = this.parent.dataOperation.getDuration(startDate, endDate, taskData.durationUnit, taskData.isAutoSchedule, taskData.isMilestone);
if (endDate.getTime() >= startDate.getTime()) {
segment = {
startDate: startDate,
endDate: endDate,
duration: duration
};
segmentsArray.push(segment);
}
if (i === dates.length) {
break;
}
startDate = new Date(dates[i].getTime());
startDate.setDate(dates[i].getDate() + 1);
}
return segmentsArray;
};
ChartRows.prototype.splitSegmentedTaskbar = function (startDate, endDate, splitDate, segmentIndex, segments, ganttData, segmentDuration) {
var ganttProp = ganttData.ganttProperties;
var checkClickState;
var endDateState;
if (this.parent.includeWeekend) {
checkClickState = -1;
}
else {
checkClickState = this.parent.nonWorkingDayIndex.indexOf(splitDate.getDay());
}
var increment = checkClickState === -1 ? 0 : checkClickState === 0 ? 1 : checkClickState === 1 ? 1 : 2;
startDate = this.parent.dataOperation.checkStartDate(startDate, ganttProp, false);
var segmentEndDate = new Date(splitDate.getTime());
segmentEndDate = this.parent.dataOperation.checkEndDate(segmentEndDate, ganttProp, false);
for (var i = 0; i < 2; i++) {
if (this.parent.weekWorkingTime.length > 0) {
var dayEndTime = this.parent['getCurrentDayEndTime'](segmentEndDate);
this.setTime(dayEndTime, segmentEndDate);
}
var segment = {
startDate: startDate,
endDate: segmentEndDate,
duration: this.parent.dataOperation.getDuration(startDate, segmentEndDate, ganttProp.durationUnit, ganttProp.isAutoSchedule, ganttProp.isMilestone),
offsetDuration: 1
};
if (this.parent.includeWeekend) {
endDateState = -1;
}
else {
endDateState = this.parent.nonWorkingDayIndex.indexOf(segmentEndDate.getDay());
}
if (segmentIndex !== -1) {
segments.splice(segmentIndex, 1);
segmentIndex = -1;
}
segments.push(segment);
var mode = this.parent.timelineModule.customTimelineSettings.bottomTier.unit;
if (mode === 'Hour' || mode === 'Minutes') {
startDate = new Date(splitDate.getTime());
startDate = this.parent.dataOperation.checkStartDate(startDate, ganttProp, false);
var count = this.parent.timelineModule.customTimelineSettings.bottomTier.count;
var mode_1 = this.parent.timelineModule.customTimelineSettings.bottomTier.unit;
var timeIncrement = this.parent.timelineModule.getIncrement(startDate, count, mode_1);
var newTime = startDate.getTime() + timeIncrement;
startDate.setTime(newTime + increment);
segmentEndDate = new Date(endDate.getTime());
timeIncrement = this.parent.timelineModule.getIncrement(segmentEndDate, count, mode_1);
newTime = segmentEndDate.getTime() + timeIncrement;
segmentEndDate.setTime(newTime + increment);
}
else {
startDate = new Date(splitDate.getTime());
startDate.setDate(startDate.getDate() + 1 + increment);
var dayStartTime = this.parent['getCurrentDayStartTime'](startDate);
this.setTime(dayStartTime, startDate);
startDate = this.parent.dataOperation.checkStartDate(startDate, ganttProp, false);
if (!this.parent.taskFields.duration && increment <= 0) {
startDate.setDate(startDate.getDate() + 1);
}
segmentEndDate = new Date(endDate.getTime());
if (segmentEndDate < startDate) {
segmentEndDate.setDate(segmentEndDate.getDate() + 1);
}
if (this.isOnHolidayOrWeekEnd(segmentEndDate, true)) {
do {
segmentEndDate.setDate(segmentEndDate.getDate() + 1);
} while (this.isOnHolidayOrWeekEnd(segmentEndDate, true));
}
if (!this.parent.includeWeekend) {
segmentEndDate = this.getNextWorkingDay(segmentEndDate);
}
}
if (endDateState !== -1) {
var diff = segmentDuration - segment.duration;
segmentEndDate =
this.parent.dataOperation.getEndDate(startDate, diff, ganttProp.durationUnit, ganttProp, false);
}
else {
segmentEndDate = this.parent.dataOperation.checkEndDate(segmentEndDate, ganttProp, false);
}
}
segments.sort(function (a, b) {
return a.startDate.getTime() - b.startDate.getTime();
});
return segments;
};
ChartRows.prototype.incrementSegments = function (segments, segmentIndex, ganttData) {
var ganttProp = ganttData.ganttProperties;
for (var i = segmentIndex + 1; i < segments.length; i++) {
var segment = segments[i];
var startDate = i !== 0 ? new Date(segments[i - 1].endDate.getTime()) : new Date(segment.startDate.getTime());
this.parent.dataOperation['fromSegments'] = true;
startDate = this.parent.dataOperation.getEndDate(startDate, segment.offsetDuration, ganttProp.durationUnit, ganttProp, false);
this.parent.dataOperation['fromSegments'] = false;
startDate = this.parent.dataOperation.checkStartDate(startDate, ganttProp, false);
segment.startDate = startDate;
var endDate = segment.endDate = this.parent.dataOperation.getEndDate(startDate, segment.duration, ganttProp.durationUnit, ganttProp, false);
segment.endDate = endDate;
if (i === segments.length - 1) {
this.parent.setRecordValue('endDate', endDate, ganttProp, true);
if (this.parent.taskFields.endDate) {
this.parent.dataOperation.updateMappingData(ganttData, 'endDate');
}
}
}
segments.sort(function (a, b) {
return a.startDate.getTime() - b.startDate.getTime();
});
this.parent.setRecordValue('segments', segments, ganttProp, true);
this.parent.dataOperation.updateMappingData(ganttData, 'segments');
};
ChartRows.prototype.calculateLeftValue = function (rowHeight) {
var taskbarHeightValue = this.parent.renderBaseline ? 0.45 : ((!isNullOrUndefined(document.body.className) && document.body.className.includes('e-bigger')) ? 0.7 : 0.62);
var defaultTaskbarHeight = Math.floor(this.parent.rowHeight * taskbarHeightValue);
if ((!isNullOrUndefined(this.parent.taskbarHeight) && this.parent.taskbarHeight <= defaultTaskbarHeight) ||
(isNullOrUndefined(this.parent.taskbarHeight) && rowHeight <= 36)) {
return 1;
}
else {
if (rowHeight <= 36) {
return 1;
}
return (-1 / 12) * (rowHeight - 36) + 1;
}
};
/**
* To get milestone node.
*
* @param {number} i .
* @param {NodeList} rootElement .
* @returns {NodeList} .
* @private
*/
ChartRows.prototype.getMilestoneNode = function (i, rootElement) {
var milestoneNode = null;
var data = this.templateData;
var rowHeight = this.parent.rowHeight;
var leftValue = this.calculateLeftValue(rowHeight);
if (this.milestoneTemplateFunction) {
milestoneNode = this.milestoneTemplateFunction(extend({ index: i }, data), this.parent, 'MilestoneTemplate', this.getTemplateID('MilestoneTemplate'), false, undefined, rootElement[0], this.parent.treeGrid['root']);
}
else {
var template = '<div class="' + cls.traceMilestone + '" style="width:' + ((this.parent.renderBaseline ? this.taskBarHeight : this.taskBarHeight - 6)) + 'px;height:' +
((this.parent.renderBaseline ? this.taskBarHeight : this.taskBarHeight - 6)) + 'px;position:absolute;transform: rotate(45deg);left:' + leftValue + 'px;"> </div>';
milestoneNode = this.createDivElement(template);
}
return milestoneNode;
};
/**
* To get task baseline Node.
*
* @returns {NodeList} .
* @private
*/
ChartRows.prototype.getTaskBaselineNode = function () {
var data = this.templateData;
var template = '<div class="' + cls.baselineBar + ' ' + '" role="term" style="margin-top:' + this.baselineTop +
'px;' + (this.parent.enableRtl ? 'right:' : 'left:') + data.ganttProperties.baselineLeft + 'px;' +
'width:' + data.ganttProperties.baselineWidth + 'px;height:' +
this.baselineHeight + 'px;' + (this.baselineColor ? 'background-color: ' + this.baselineColor + ';' : '') + '"></div>';
return this.createDivElement(template);
};
ChartRows.prototype.updateTaskBaselineNode = function (childData) {
var template = '<div class="' + cls.baselineBar + ' ' + '" role="term" style="margin-top:' + this.baselineTop +
'px;' + (this.parent.enableRtl ? 'right:' : 'left:') + childData.ganttProperties.baselineLeft + 'px;' +
'width:' + childData.ganttProperties.baselineWidth + 'px;height:' +
this.baselineHeight + 'px;' + (this.baselineColor ? 'background-color: ' + this.baselineColor + ';' : '') + '"></div>';
return this.createDivElement(template);
};
/**
* To get milestone baseline node.
*
* @returns {NodeList} .
* @private
*/
ChartRows.prototype.getMilestoneBaselineNode = function () {
var data = this.templateData;
var baselineMilestoneHeight = this.parent.renderBaseline ? 5 : 2;
var template = '<div class="' + cls.baselineMilestoneContainer + '" style="width:' + ((this.parent.renderBaseline ? this.taskBarHeight : this.taskBarHeight - 10)) + 'px;height:' +
((this.parent.renderBaseline ? this.taskBarHeight : this.taskBarHeight - 10)) + 'px;position:absolute;transform:rotate(45deg);' + (this.parent.enableRtl ? 'right:' : 'left:') + (this.parent.enableRtl ? (data.ganttProperties.left -
(this.milestoneHeight / 2) + 3) : (data.ganttProperties.baselineLeft - (this.milestoneHeight / 2) + 1)) + 'px;' + (this.baselineColor ?
'background-color: ' + this.baselineColor + ';' : '') + 'margin-top:' + ((-Math.floor(this.parent.rowHeight - this.milestoneMarginTop) + baselineMilestoneHeight) + 2) + 'px"> </div>';
return this.createDivElement(template);
};
/**
* To get left label node.
*
* @param {number} i .
* @returns {NodeList} .
* @private
*/
ChartRows.prototype.getLeftLabelNode = function (i) {
var leftLabelNode = this.leftLabelContainer();
if (this.generateTaskLabelAriaLabel('left') !== '') {
leftLabelNode[0].setAttribute('aria-label', this.generateTaskLabelAriaLabel('left'));
}
var leftLabelTemplateNode = null;
if (this.leftTaskLabelTemplateFunction) {
leftLabelTemplateNode = this.leftTaskLabelTemplateFunction(extend({ index: i }, this.templateData), this.parent, 'LeftLabelTemplate', this.getTemplateID('LeftLabelTemplate'), false, undefined, leftLabelNode[0], this.parent.treeGrid['root']);
}
else {
var field = this.parent.labelSettings.leftLabel;
var labelString = this.getTaskLabel(field);
if (labelString) {
labelString = labelString === 'isCustomTemplate' ? field : labelString;
leftLabelTemplateNode = this.getLableText(labelString, cls.leftLabelInnerDiv);
if (this.parent.enableHtmlSanitizer && typeof (labelString) === 'string') {
labelString = SanitizeHtmlHelper.sanitize(labelString);
labelString = labelString === 'isCustomTemplate' ? field : labelString;
leftLabelTemplateNode = this.getLableText(labelString, cls.leftLabelInne