UNPKG

@syncfusion/ej2-gantt

Version:
894 lines 153 kB
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