@syncfusion/ej2-gantt
Version:
Essential JS 2 Gantt Component
915 lines • 185 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 { isNullOrUndefined, getValue, extend, setValue } from '@syncfusion/ej2-base';
import { DataManager, Query } from '@syncfusion/ej2-data';
import { getUniversalTime, isCountRequired, isScheduledTask } from './utils';
import { DateProcessor } from './date-processor';
/**
* To calculate and update task related values
*/
var TaskProcessor = /** @class */ (function (_super) {
__extends(TaskProcessor, _super);
function TaskProcessor(parent) {
var _this = _super.call(this, parent) || this;
_this.customSegmentProperties = [];
_this.isBaseline = false;
_this.uid = 0;
_this.isTaskIDInteger = true;
_this.recordIndex = 0;
_this.taskIds = [];
_this.hierarchyData = [];
_this.addEventListener();
return _this;
}
TaskProcessor.prototype.addEventListener = function () {
this.parent.on('beforeDataManipulate', this.checkDataBinding.bind(this));
};
/**
* @param {boolean} isChange .
* @returns {void} .
* @private
*/
TaskProcessor.prototype.checkDataBinding = function (isChange) {
var _this = this;
if (isChange) {
this.parent.flatData = [];
this.parent.currentViewData = [];
this.parent.updatedRecords = [];
this.dataArray = [];
this.taskIds = [];
this.parent.ids = [];
this.recordIndex = 0;
this.hierarchyData = [];
this.parent.predecessorsCollection = [];
this.parent.treeGrid.parentData = [];
this.parent.taskIds = [];
}
if (isNullOrUndefined(this.parent.dataSource)) {
this.parent.dataSource = [];
this.parent.processTimeline();
this.parent.renderGantt(isChange);
}
else if (this.parent.dataSource instanceof DataManager) {
this.initDataSource(isChange);
}
else {
if (this.parent.dataSource instanceof Object && isCountRequired(this.parent)) {
var ganttdata = getValue('result', this.parent.dataSource);
this.dataArray = ganttdata;
}
else {
this.dataArray = this.parent.dataSource;
}
this.processTimeline();
this.cloneDataSource();
this.parent.renderGantt(isChange);
this.parent.flatData.map(function (data) {
_this.parent.chartRowsModule.updateSegment(data.ganttProperties.segments, data.ganttProperties.taskId);
});
}
this.parent.flatData.map(function (data) {
_this.parent.chartRowsModule.updateSegment(data.ganttProperties.segments, data.ganttProperties.taskId);
});
};
TaskProcessor.prototype.processTimeline = function () {
this.parent.processTimeline();
if (!this.parent.enableValidation) {
this.parent.dataOperation.calculateProjectDatesForValidatedTasks();
this.parent.timelineModule.validateTimelineProp();
}
};
TaskProcessor.prototype.initDataSource = function (isChange) {
var _this = this;
var queryManager = this.parent.query instanceof Query ? this.parent.query : new Query();
queryManager.requiresCount();
var dataManager = this.parent.dataSource;
if (this.parent.loadChildOnDemand && this.parent.taskFields.hasChildMapping) {
this.processTimeline();
this.parent.renderGantt(isChange);
}
else {
dataManager.executeQuery(queryManager).then(function (e) {
_this.dataArray = e.result;
_this.processTimeline();
if (!_this.parent.loadChildOnDemand || (_this.parent.loadChildOnDemand && !(_this.parent.taskFields.hasChildMapping))) {
_this.cloneDataSource();
}
_this.parent.renderGantt(isChange);
}).catch(function (e) {
// Trigger action failure event
_this.parent.processTimeline();
_this.parent.renderGantt(isChange);
_this.parent.trigger('actionFailure', { error: e });
});
}
};
TaskProcessor.prototype.constructDataSource = function (dataSource) {
var mappingData = new DataManager(dataSource).executeLocal(new Query()
.group(this.parent.taskFields.parentID));
var rootData = [];
var index;
for (var i = 0; i < mappingData.length; i++) {
var groupData = mappingData[i];
if (!isNullOrUndefined(groupData.key)) {
index = this.taskIds.indexOf(groupData.key.toString());
if (index > -1) {
if (!isNullOrUndefined(groupData.key)) {
dataSource[index][this.parent.taskFields.child] = groupData.items;
continue;
}
}
}
if (index !== -1 || (this.parent.loadChildOnDemand && this.parent.taskFields.hasChildMapping)) {
rootData.push.apply(rootData, groupData.items); // eslint-disable-line
}
}
this.hierarchyData = this.dataReorder(dataSource, rootData);
};
TaskProcessor.prototype.cloneDataSource = function () {
var taskIdMapping = this.parent.taskFields.id;
var parentIdMapping = this.parent.taskFields.parentID;
var hierarchicalData = [];
if (!isNullOrUndefined(taskIdMapping) && !isNullOrUndefined(parentIdMapping)) {
var data = [];
var tempDataArray = void 0;
if (this.parent.loadChildOnDemand && this.parent.taskFields.hasChildMapping && !this.parent.enableVirtualization) {
tempDataArray = JSON.parse(JSON.stringify(this.dataArray));
}
for (var i = 0; i < this.dataArray.length; i++) {
var tempData = this.dataArray[i];
if (tempData['parentItem']) {
delete tempData['parentItem'];
}
data.push(extend({}, {}, tempData, true));
if (!isNullOrUndefined(tempData[taskIdMapping])) {
this.taskIds.push(tempData[taskIdMapping].toString());
}
}
if (!this.parent.taskFields.child) {
this.parent.setProperties({ taskFields: { child: 'Children' } }, true);
}
if (!isNullOrUndefined(tempDataArray)) {
this.constructDataSource(this.dataArray);
this.dataArray = tempDataArray;
}
else {
this.constructDataSource(data);
}
hierarchicalData = this.hierarchyData;
}
else {
hierarchicalData = this.dataArray;
}
if (this.parent.taskFields.segmentId) {
this.segmentCollection = new DataManager(this.parent.segmentData).executeLocal(new Query()
.group(this.parent.taskFields.segmentId));
if (!this.parent.taskFields.segments) {
this.parent.taskFields.segments = 'Segments';
}
}
if (this.parent.viewType !== 'ProjectView') {
var resources = extend([], [], this.parent.resources, true);
var unassignedTasks = [];
this.constructResourceViewDataSource(resources, hierarchicalData, unassignedTasks);
if (unassignedTasks.length > 0) {
var record = {};
var resourceName = this.parent.resourceFields.name || 'resourceName';
record[this.parent.resourceFields.id] = 0;
record[resourceName] = this.parent.localeObj.getConstant('unassignedTask');
record[this.parent.taskFields.child] = unassignedTasks;
resources.push(record);
}
hierarchicalData = resources;
}
this.prepareDataSource(hierarchicalData);
};
/**
* @param {object[]} resources .
* @param {object[]} data .
* @param {object[]} unassignedTasks .
* @returns {void} .
*
*/
TaskProcessor.prototype.constructResourceViewDataSource = function (resources, data, unassignedTasks) {
var _loop_1 = function (i) {
var tempData = data[i];
var child = this_1.parent.taskFields.child !== null ? this_1.parent.taskFields.child : this_1.parent.taskFields.child = 'Children';
var resourceData = tempData && tempData[this_1.parent.taskFields.resourceInfo];
var resourceIdMapping = this_1.parent.resourceFields.id;
if ((!tempData[child] || tempData[child].length === 0) && resourceData && resourceData.length) {
if (typeof (resourceData) === 'string') {
this_1.isResourceString = true;
var id = resourceData;
for (var j = 0; j < resources.length; j++) {
if (resources[j][this_1.parent.resourceFields.name].toString() === id.toString()) {
if (resources[j][child]) {
resources[j][child].push(tempData);
}
else {
resources[j][child] = [tempData];
}
break;
}
}
}
else {
resourceData.forEach(function (resource) {
var id = (typeof resource === 'object') ? resource[resourceIdMapping] :
resource;
for (var j = 0; j < resources.length; j++) {
if (resources[j][resourceIdMapping].toString() === id.toString()) {
if (resources[j][child]) {
resources[j][child].push(tempData);
}
else {
resources[j][child] = [tempData];
}
break;
}
}
});
}
}
else if (!tempData[child] || (tempData[child] && tempData[child].length === 0)) {
unassignedTasks.push(tempData);
}
if (tempData[this_1.parent.taskFields.child] && tempData[this_1.parent.taskFields.child].length) {
this_1.constructResourceViewDataSource(resources, tempData[this_1.parent.taskFields.child], unassignedTasks);
}
};
var this_1 = this;
for (var i = 0; i < data.length; i++) {
_loop_1(i);
}
};
/**
* Function to manipulate data-source
*
* @param {object[]} data .
* @returns {void} .
* @hidden
*/
TaskProcessor.prototype.prepareDataSource = function (data) {
this.prepareRecordCollection(data, 0);
this.parent.initialLoadData = extend({}, {}, this.parent.flatData, true);
if (!this.parent.autoCalculateDateScheduling || (this.parent.isLoad && this.parent.treeGrid.loadChildOnDemand &&
this.parent.taskFields.hasChildMapping)) {
this.parent.dataMap = this.parent.flatData.reduce(function (map, val) {
map.set(val.uniqueID, val);
return map;
}, new Map());
}
// Method to maintain the shared task uniqueIds
if (this.parent.viewType === 'ResourceView') {
this.calculateSharedTaskUniqueIds();
}
if (this.parent.taskFields.dependency && this.parent.predecessorModule) {
this.parent.predecessorModule.ensurePredecessorCollection();
}
};
TaskProcessor.prototype.calculateSharedTaskUniqueIds = function () {
var _loop_2 = function (i) {
var value = [];
value[0] = this_2.parent.getTaskIds()[i][0];
value[1] = this_2.parent.getTaskIds()[i].slice(1);
if (value[0] !== 'R') {
var sharedRecords_1 = [];
var ids_1 = [];
this_2.parent.flatData.filter(function (data) {
if (data.ganttProperties.taskId.toString() === value[1] && data.level !== 0) {
ids_1.push(data.ganttProperties.rowUniqueID);
sharedRecords_1.push(data);
}
});
for (var j = 0; j < sharedRecords_1.length; j++) {
sharedRecords_1[j].ganttProperties.sharedTaskUniqueIds = ids_1;
}
}
};
var this_2 = this;
for (var i = 0; i < this.parent.getTaskIds().length; i++) {
_loop_2(i);
}
};
TaskProcessor.prototype.prepareRecordCollection = function (data, level, parentItem) {
var _this = this;
var length = data.length;
var _loop_3 = function (i) {
var tempData = data[i];
if (!isNullOrUndefined(this_3.parent.taskFields.segmentId)) {
var segmentData = this_3.segmentCollection.
filter(function (x) { return x.key === tempData[_this.parent.taskFields.id]; });
if (segmentData.length > 0) {
tempData[this_3.parent.taskFields.segments] = segmentData[0].items;
}
}
if (this_3.parent.taskFields.hasChildMapping && tempData['parentUniqueID']) {
parentItem = this_3.parent.getTaskByUniqueID(tempData['parentUniqueID']);
}
if (!isNullOrUndefined(this_3.parent.taskFields.constraintDate) &&
!isNullOrUndefined(this_3.parent.taskFields.constraintType) &&
isNullOrUndefined(tempData[this_3.parent.taskFields.constraintDate]) &&
isNullOrUndefined(tempData[this_3.parent.taskFields.constraintType])) {
tempData[this_3.parent.taskFields.constraintType] = 0;
tempData[this_3.parent.taskFields.constraintDate] =
!isNullOrUndefined(tempData[this_3.parent.taskFields.startDate]) ?
tempData[this_3.parent.taskFields.startDate] : tempData[this_3.parent.taskFields.endDate];
}
var ganttData = this_3.createRecord(tempData, level, parentItem, true);
if (!this_3.parent.enableValidation || (!this_3.parent.autoCalculateDateScheduling || (this_3.parent.isLoad &&
this_3.parent.treeGrid.loadChildOnDemand && this_3.parent.taskFields.hasChildMapping))) {
this_3.updateTaskLeftWidth(ganttData);
}
ganttData.index = this_3.recordIndex++;
this_3.parent.ids[ganttData.index] = ganttData.ganttProperties.rowUniqueID;
this_3.parent.flatData.push(ganttData);
this_3.parent.setTaskIds(ganttData);
var childData = tempData[this_3.parent.taskFields.child] || (tempData['taskData'] && tempData['taskData'][this_3.parent.taskFields.child]);
if (this_3.parent.viewType === 'ResourceView' && isNullOrUndefined(childData)
&& isNullOrUndefined(ganttData.parentItem) && ganttData.level === 0) {
var ganttProp = ganttData.ganttProperties;
var parentData = ganttData;
this_3.parent.setRecordValue(ganttProp.isAutoSchedule ? 'startDate' : 'autoStartDate', null, parentData.ganttProperties, true);
this_3.parent.setRecordValue(ganttProp.isAutoSchedule ? 'endDate' : 'autoEndDate', null, parentData.ganttProperties, true);
var parentProgress = 0;
var parentProp = parentData.ganttProperties;
this_3.parent.setRecordValue('isMilestone', false, parentProp, true);
if (parentProp.isAutoSchedule) {
this_3.calculateDuration(parentData);
}
this_3.updateWorkWithDuration(parentData);
var parentWork = parentProp.work;
this_3.parent.setRecordValue('work', parentWork, parentProp, true);
this_3.parent.setRecordValue('taskType', 'FixedDuration', parentProp, true);
if (!isNullOrUndefined(this_3.parent.taskFields.type)) {
this_3.updateMappingData(parentData, 'type');
}
this_3.parent.setRecordValue('progress', Math.floor(parentProgress), parentProp, true);
this_3.parent.setRecordValue('totalProgress', 0, parentProp, true);
this_3.parent.setRecordValue('totalDuration', 0, parentProp, true);
if (!parentProp.isAutoSchedule) {
this_3.parent.setRecordValue('autoDuration', this_3.calculateAutoDuration(parentProp), parentProp, true);
this_3.updateAutoWidthLeft(parentData);
}
if (!this_3.parent.allowParentDependency) {
this_3.resetDependency(parentData);
}
this_3.updateWidthLeft(parentData);
this_3.updateTaskData(parentData);
}
if (this_3.parent.taskFields.hasChildMapping) {
parentItem = null;
}
if (!isNullOrUndefined(childData) && childData.length > 0) {
this_3.prepareRecordCollection(childData, ganttData.level + 1, ganttData);
}
};
var this_3 = this;
for (var i = 0; i < length; i++) {
_loop_3(i);
}
};
/**
* Method to update custom field values in gantt record
*
* @param {object} data .
* @param {IGanttData} ganttRecord .
* @returns {void} .
*/
TaskProcessor.prototype.addCustomFieldValue = function (data, ganttRecord) {
var columns = this.parent.ganttColumns;
var length = columns.length;
if (length) {
for (var i = 0; i < length; i++) {
var fieldName = ganttRecord[columns[i].field];
if (fieldName === undefined) {
this.parent.setRecordValue(columns[i].field, data[columns[i].field], ganttRecord);
}
}
}
};
TaskProcessor.prototype.getGanttUid = function (prefix) {
return prefix + this.uid++;
};
/**
* To populate Gantt record
*
* @param {object} data .
* @param {number} level .
* @param {IGanttData} parentItem .
* @param {boolean} isLoad .
* @returns {IGanttData} .
* @private
*/
TaskProcessor.prototype.createRecord = function (data, level, parentItem, isLoad) {
var taskSettings = this.parent.taskFields;
var resourceFields = this.parent.resourceFields;
var progress = data[taskSettings.progress];
var id = null;
var name = null;
var notes = data[taskSettings.notes];
progress = progress ? parseFloat(progress.toString()) ? parseFloat(progress.toString()) : 0 : 0;
progress = (100 < progress) ? 100 : progress;
var predecessors = data[taskSettings.dependency];
var baselineStartDate = this.getDateFromFormat(data[taskSettings.baselineStartDate], true);
var baselineEndDate = this.getDateFromFormat(data[taskSettings.baselineEndDate], true);
var ganttData;
var unModifiedData;
if (this.parent.loadChildOnDemand && taskSettings.hasChildMapping && !this.parent.enableVirtualization) {
ganttData = data;
unModifiedData = JSON.parse(JSON.stringify(data));
}
else {
ganttData = {};
}
var ganttProperties = {};
var autoSchedule = (this.parent.taskMode === 'Auto') ? true :
(this.parent.taskMode === 'Manual') ? false :
data[taskSettings.manual] === true ? false : true;
this.parent.setRecordValue('ganttProperties', ganttProperties, ganttData);
if (data['ganttProperties'] && data['ganttProperties'].predecessor && data['ganttProperties'].predecessor.length > 0 && this.parent.undoRedoModule && this.parent.undoRedoModule['isUndoRedoPerformed']) {
this.parent.setRecordValue('predecessor', data['ganttProperties'].predecessor, ganttProperties, true);
}
if (!isNullOrUndefined(data[taskSettings.id])) {
id = data[taskSettings.id];
if (typeof id !== 'number' && !(/^-?\d+$/.test(id))) {
this.isTaskIDInteger = false;
}
name = data[taskSettings.name];
var shouldLoadChild = (this.parent.loadChildOnDemand &&
taskSettings.hasChildMapping && data['taskData']) ? true : false;
if (shouldLoadChild) {
ganttData['taskData'] = data['taskData'];
}
else {
if (data['taskData'] && data['ganttProperties']) {
this.addTaskData(ganttData, data['taskData'], isLoad);
}
else {
this.addTaskData(ganttData, data, isLoad);
}
}
}
else if (!isNullOrUndefined(data[resourceFields.id])) {
id = data[resourceFields.id];
if (isNullOrUndefined(data[resourceFields.name]) && data['resourceName'] === 'Unassigned Task') {
name = data['resourceName'];
}
else {
name = data[resourceFields.name];
}
this.addTaskData(ganttData, data, false);
}
this.parent.setRecordValue('taskId', id, ganttProperties, true);
this.parent.setRecordValue('taskName', name, ganttProperties, true);
// eslint-disable-next-line
this.parent && taskSettings.parentID && this.parent.setRecordValue('parentId', data[taskSettings.parentID], ganttProperties, true);
this.addCustomFieldValue(data, ganttData);
this.parent.setRecordValue('isAutoSchedule', autoSchedule, ganttProperties, true);
if (!this.parent.undoRedoModule || (this.parent.undoRedoModule && !this.parent.undoRedoModule['isUndoRedoPerformed'])) {
this.parent.setRecordValue('resourceInfo', this.setResourceInfo(data), ganttProperties, true);
}
else if (data['ganttProperties']) {
this.parent.setRecordValue('resourceInfo', data['ganttProperties'].resourceInfo, ganttProperties, true);
}
this.parent.setRecordValue('isMilestone', false, ganttProperties, true);
this.parent.setRecordValue('indicators', data[taskSettings.indicators], ganttProperties, true);
this.updateResourceName(ganttData);
if ((!isNullOrUndefined(data[taskSettings.child]) && data[taskSettings.child].length > 0) ||
(data['taskData'] && data['taskData'][taskSettings.child] && data['taskData'][taskSettings.child].length > 0)) {
this.parent.setRecordValue('hasChildRecords', true, ganttData);
this.parent.setRecordValue('isMilestone', false, ganttProperties, true);
if (!this.parent.allowParentDependency) {
this.resetDependency(ganttData);
}
}
else {
if (this.parent.loadChildOnDemand && taskSettings.hasChildMapping && ganttData.taskData[taskSettings.hasChildMapping]) {
this.parent.setRecordValue('hasChildRecords', true, ganttData);
}
else {
this.parent.setRecordValue('hasChildRecords', false, ganttData);
}
}
var constraintType = data[taskSettings.constraintType];
if (ganttData.hasChildRecords) {
if (constraintType && (constraintType !== 0 && constraintType !== 4 && constraintType !== 7)) {
data[taskSettings.constraintType] = 0;
}
}
else if (constraintType && (constraintType < 0 || constraintType > 7)) {
data[taskSettings.constraintType] = 0;
}
this.parent.setRecordValue('constraintType', data[taskSettings.constraintType], ganttProperties, true);
this.parent.setRecordValue('constraintDate', data[taskSettings.constraintDate], ganttProperties, true);
this.calculateScheduledValues(ganttData, data, isLoad);
this.parent.setRecordValue('baselineStartDate', this.checkBaselineStartDate(baselineStartDate, ganttProperties), ganttProperties, true);
// set default end time, if hour is 0
var dayEndTime;
if (this.parent.weekWorkingTime.length > 0 && baselineEndDate) {
dayEndTime = this.parent['getEndTime'](baselineEndDate);
}
else {
dayEndTime = this.parent.defaultEndTime;
}
if (baselineEndDate && baselineEndDate.getHours() === 0 && dayEndTime !== 86400) {
this.setTime(dayEndTime, baselineEndDate);
}
if ((ganttProperties.baselineStartDate && baselineEndDate &&
(ganttProperties.baselineStartDate.getTime() > baselineEndDate.getTime())) ||
((!isNullOrUndefined(ganttProperties.baselineStartDate) && !isNullOrUndefined(ganttProperties.startDate)
&& (ganttProperties.baselineStartDate.getTime() === ganttProperties.startDate.getTime()))
&& (!isNullOrUndefined(baselineEndDate) && !isNullOrUndefined(ganttProperties.endDate)
&& (baselineEndDate.toLocaleDateString() === ganttProperties.endDate.toLocaleDateString())) &&
ganttProperties.isMilestone)) {
baselineEndDate = ganttProperties.baselineStartDate;
}
this.parent.setRecordValue('baselineEndDate', this.checkBaselineEndDate(baselineEndDate, ganttProperties), ganttProperties, true);
this.parent.setRecordValue('progress', progress, ganttProperties, true);
this.parent.setRecordValue('totalProgress', progress, ganttProperties, true);
if (data['ganttProperties'] && data['ganttProperties'].predecessorsName && this.parent.undoRedoModule && this.parent.undoRedoModule['isUndoRedoPerformed']) {
this.parent.setRecordValue('predecessorsName', data['ganttProperties'].predecessorsName, ganttProperties, true);
}
else {
this.parent.setRecordValue('predecessorsName', predecessors, ganttProperties, true);
}
this.parent.setRecordValue('notes', notes, ganttProperties, true);
this.parent.setRecordValue('cssClass', data[taskSettings.cssClass], ganttProperties, true);
this.parent.setRecordValue('parentItem', this.getCloneParent(parentItem), ganttData);
if (this.parent.loadChildOnDemand && taskSettings.hasChildMapping && this.parent.currentViewData.length > 0) {
this.parent.setRecordValue('parentItem', ganttData.parentItem, this.parent.currentViewData[this.taskIds.indexOf(data[taskSettings.id].toString())]);
}
var parentUniqId = ganttData.parentItem ? ganttData.parentItem.uniqueID : null;
this.parent.setRecordValue('parentUniqueID', parentUniqId, ganttData);
if (this.parent.viewType === 'ResourceView' && !isNullOrUndefined(taskSettings.parentID)
&& !isNullOrUndefined(ganttData.parentItem)) {
this.parent.setRecordValue('parentId', ganttData.parentItem.taskId, ganttProperties, true);
}
this.parent.setRecordValue('level', level, ganttData);
if (data['ganttProperties'] && this.parent.undoRedoModule && this.parent.undoRedoModule['isUndoRedoPerformed']) {
this.parent.setRecordValue('uniqueID', data['uniqueID'], ganttData);
}
else {
if (this.parent.loadChildOnDemand && taskSettings.hasChildMapping && data['uniqueID']) {
this.parent.setRecordValue('uniqueID', data['uniqueID'], ganttData);
}
else {
this.parent.setRecordValue('uniqueID', this.getGanttUid(this.parent.element.id + '_data_'), ganttData);
}
}
this.parent.setRecordValue('uniqueID', ganttData.uniqueID, ganttProperties, true);
this.parent.setRecordValue('childRecords', [], ganttData);
if (this.parent.dataSource instanceof Object && isCountRequired(this.parent) &&
!isNullOrUndefined(taskSettings.child)) {
this.parent.setRecordValue(taskSettings.child, [], ganttData);
}
if (ganttData.hasChildRecords) {
this.parent.setRecordValue('autoStartDate', ganttData.ganttProperties.startDate, ganttProperties);
this.parent.setRecordValue('autoEndDate', ganttData.ganttProperties.endDate, ganttProperties);
this.parent.setRecordValue('autoDuration', ganttData.ganttProperties.duration, ganttProperties);
}
this.parent.setRecordValue('expanded', (ganttData.hasChildRecords && this.parent.collapseAllParentTasks) ? false : true, ganttData);
if (isNullOrUndefined(unModifiedData)) {
this.updateExpandStateMappingValue(ganttData, data);
}
else {
this.updateExpandStateMappingValue(ganttData, unModifiedData);
}
if (!isLoad) {
this.parent.setRecordValue('width', this.calculateWidth(ganttData), ganttProperties, true);
this.parent.setRecordValue('left', this.calculateLeft(ganttProperties, ganttData), ganttProperties, true);
this.parent.setRecordValue('progressWidth', this.getProgressWidth(ganttProperties.width, progress), ganttProperties, true);
if (ganttProperties.baselineEndDate && ganttProperties.baselineStartDate) {
this.parent.setRecordValue('baselineLeft', this.calculateBaselineLeft(ganttProperties), ganttProperties, true);
this.parent.setRecordValue('baselineWidth', this.calculateBaselineWidth(ganttProperties), ganttProperties, true);
}
}
if (isNullOrUndefined(taskSettings.work)) {
this.updateWorkWithDuration(ganttData);
}
if (!isNullOrUndefined(taskSettings.manual)) {
this.parent.dataOperation.updateMappingData(ganttData, 'manual');
}
this.updateTaskData(ganttData);
if (predecessors) {
this.parent.predecessorsCollection.push(ganttData);
}
if (!isNullOrUndefined(parentItem)) {
parentItem.childRecords.push(ganttData);
if (this.parent.dataSource instanceof Object && isCountRequired(this.parent) &&
!isNullOrUndefined(this.parent.taskFields.child)) {
parentItem[this.parent.taskFields.child].push(ganttData.taskData);
}
}
if (this.parent.viewType === 'ProjectView') {
this.parent.setRecordValue('rowUniqueID', ganttProperties.taskId.toString(), ganttProperties, true);
}
else {
var uniqueId = ganttData.uniqueID.replace(this.parent.element.id + '_data_', '');
// if (this.parent.viewType === 'ResourceView' && typeof(ganttData.ganttProperties.taskId) === 'string') {
// uniqueId = ganttProperties.taskId.toString();
// }
this.parent.setRecordValue('rowUniqueID', uniqueId, ganttData);
this.parent.setRecordValue('rowUniqueID', uniqueId, ganttProperties, true);
this.parent.setRecordValue('sharedTaskUniqueIds', [], ganttProperties, true);
}
if (this.parent.allowUnscheduledTasks && ganttData.ganttProperties.startDate
&& (ganttData.ganttProperties.endDate || ganttData.ganttProperties.duration)) {
this.parent.setRecordValue('segments', this.setSegmentsInfo(ganttData, true), ganttProperties, true);
this.parent.dataOperation.updateMappingData(ganttData, 'segments');
if (!isLoad) {
this.updateWidthLeft(ganttData);
}
}
this.parent.chartRowsModule.updateSegment(ganttData.ganttProperties.segments, ganttData.ganttProperties.taskId);
return ganttData;
};
TaskProcessor.prototype.sortSegmentsData = function (segments, onLoad, ganttProp) {
var _this = this;
if (onLoad) {
segments.sort(function (a, b) {
var startDate = _this.parent.taskFields.startDate;
return _this.getDateFromFormat(a[startDate]).getTime() - _this.getDateFromFormat(b[startDate]).getTime();
});
}
else {
segments.sort(function (a, b) {
return a.startDate.getTime() - b.startDate.getTime();
});
}
return segments;
};
TaskProcessor.prototype.setSegmentsInfo = function (data, onLoad) {
var _this = this;
var taskSettings = this.parent.taskFields;
var ganttSegments = [];
var segments;
var sumOfDuration = 0;
var remainingDuration = 0;
var totalOffsetDuration = 0;
var predefinedProperties = [this.parent.taskFields.duration, this.parent.taskFields.endDate,
this.parent.taskFields.startDate, this.parent.taskFields.id];
var taskData = [];
if (!isNullOrUndefined(this.parent.taskFields.segments)) {
segments = onLoad ? data.taskData[this.parent.taskFields.segments] : data.ganttProperties.segments;
if (!onLoad) {
if (data.taskData[this.parent.taskFields.segments] && data.taskData[this.parent.taskFields.segments].length > 0) {
data.taskData[this.parent.taskFields.segments].forEach(function (segment) {
var cleanedObject = {};
var extraProperties = {};
for (var key in segment) {
if (predefinedProperties.indexOf(key) !== -1) {
cleanedObject[key] = segment[key];
}
else {
extraProperties[key] = segment[key];
}
}
_this.customSegmentProperties.push(extraProperties);
});
}
}
if (!isNullOrUndefined(segments) && segments.length > 1) {
this.sortSegmentsData(segments, onLoad, data.ganttProperties);
for (var i = 0; i < segments.length; i++) {
var segment = segments[i];
var startDate = onLoad ? segment[taskSettings.startDate] : segment.startDate;
var endDate = onLoad ? segment[taskSettings.endDate] : segment.endDate;
var duration = onLoad ? segment[taskSettings.duration] : segment.duration;
startDate = this.getDateFromFormat(startDate);
startDate = this.checkStartDate(startDate, data.ganttProperties, false);
if (!isNullOrUndefined(duration)) {
endDate = this.getEndDate(startDate, duration, data.ganttProperties.durationUnit, data.ganttProperties, false);
if (taskSettings.duration) {
remainingDuration = data.ganttProperties.duration - sumOfDuration;
if (remainingDuration <= 0) {
continue;
}
duration = i === segments.length - 1 ? remainingDuration : remainingDuration > 0 &&
duration > remainingDuration ? remainingDuration : duration;
endDate = this.getEndDate(startDate, duration, data.ganttProperties.durationUnit, data.ganttProperties, false);
}
else if (!taskSettings.duration && taskSettings.endDate && endDate) {
endDate = (!isNullOrUndefined(data.ganttProperties.endDate)) && endDate.getTime() >=
data.ganttProperties.endDate.getTime() && i === segments.length - 1 ? data.ganttProperties.endDate : endDate;
duration = this.getDuration(startDate, endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
if (ganttSegments.length > 0 && endDate.getTime() < startDate.getTime()
&& endDate.getTime() <= data.ganttProperties.endDate.getTime()) {
ganttSegments[i - 1].duration = this.getDuration(ganttSegments[i - 1].startDate, data.ganttProperties.endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
continue;
}
}
}
else {
endDate = this.getDateFromFormat(endDate);
if (endDate && (isNullOrUndefined(duration) || String(duration) === '')) {
var dayEndTime = void 0;
if (this.parent.weekWorkingTime.length > 0) {
dayEndTime = this.parent['getEndTime'](endDate);
}
else {
dayEndTime = this.parent.defaultEndTime;
}
if (endDate.getHours() === 0 && dayEndTime !== 86400) {
this.setTime(dayEndTime, endDate);
}
}
endDate = this.checkEndDate(endDate, data.ganttProperties, false);
duration = this.getDuration(startDate, endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
if (!isNullOrUndefined(ganttSegments[i - 1])) {
totalOffsetDuration += this.getDuration(ganttSegments[i - 1].endDate, startDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
totalOffsetDuration = (totalOffsetDuration < 1) ? 1 : totalOffsetDuration;
}
if (taskSettings.duration) {
remainingDuration = data.ganttProperties.duration - sumOfDuration - totalOffsetDuration;
if (remainingDuration <= 0) {
continue;
}
duration = i === segments.length - 1 ? remainingDuration : remainingDuration > 0 &&
duration > remainingDuration ? remainingDuration : duration;
endDate = this.getEndDate(startDate, duration, data.ganttProperties.durationUnit, data.ganttProperties, false);
}
else if (!taskSettings.duration && taskSettings.endDate && endDate) {
duration = this.getDuration(startDate, endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
if (ganttSegments.length > 0 && endDate.getTime() < startDate.getTime()
&& endDate.getTime() <= data.ganttProperties.endDate.getTime()) {
ganttSegments[i - 1].duration = this.getDuration(ganttSegments[i - 1].startDate, data.ganttProperties.endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
continue;
}
}
}
segment = {};
if (!(startDate && endDate) || !(startDate && !isNullOrUndefined(duration))) {
break;
}
sumOfDuration += Number(duration);
segment.startDate = startDate;
segment.endDate = endDate;
segment.duration = Number(duration);
segment.width = 0;
segment.left = 0;
segment.segmentIndex = i;
ganttSegments.push(segment);
if (!isNullOrUndefined(ganttSegments[i - 1])) {
var unit = void 0;
if (!isNullOrUndefined(this.parent.timelineSettings.bottomTier)) {
if (this.parent.timelineSettings.bottomTier.unit === 'Minutes') {
unit = 'minute';
}
else if (this.parent.timelineSettings.bottomTier.unit === 'Hour') {
unit = 'hour';
}
else {
unit = data.ganttProperties.durationUnit;
}
}
else {
unit = data.ganttProperties.durationUnit;
}
var offsetDuration = this.getDuration(ganttSegments[i - 1].endDate, ganttSegments[i].startDate, unit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
segment.offsetDuration = offsetDuration;
if (offsetDuration < 1) {
if (this.parent.weekWorkingTime.length === 0) {
segment.startDate = this.getEndDate(ganttSegments[i - 1].endDate, 1, data.ganttProperties.durationUnit, data.ganttProperties, false);
}
else {
var prevSegmentDate = new Date(ganttSegments[i - 1].endDate.getTime());
segment.startDate = new Date(prevSegmentDate.setHours(prevSegmentDate.getHours() + 24));
if (this.isOnHolidayOrWeekEnd(segment.startDate, true)) {
do {
segment.startDate.setDate(segment.startDate.getDate() + 1);
} while (this.isOnHolidayOrWeekEnd(segment.startDate, true));
}
if (!this.parent.includeWeekend) {
segment.startDate = this.getNextWorkingDay(segment.startDate);
}
var dayEndTime = this.parent['getEndTime'](ganttSegments[i - 1].endDate);
if (this.getSecondsInDecimal(ganttSegments[i - 1].endDate) === dayEndTime) {
this.setTime(this.parent['getEndTime'](segment.startDate), segment.startDate);
}
}
segment.startDate = this.checkStartDate(segment.startDate, data.ganttProperties, false);
segment.endDate = this.getEndDate(segment.startDate, segment.duration, data.ganttProperties.durationUnit, data.ganttProperties, false);
segment.endDate = !taskSettings.duration && taskSettings.endDate
&& segment.endDate > data.ganttProperties.endDate ? data.ganttProperties.endDate : segment.endDate;
segment.offsetDuration = 1;
}
}
else {
segment.offsetDuration = 0;
}
/* eslint-disable-next-line */
var segmentData = data[this.parent.taskFields.segments] ? data[this.parent.taskFields.segments] : segments;
taskData.push(this.setSegmentTaskData(segment, segmentData[i]));
}
this.parent.setRecordValue('duration', sumOfDuration, data.ganttProperties, true);
if (!isNullOrUndefined(ganttSegments[ganttSegments.length - 1])) {
this.parent.setRecordValue('endDate', ganttSegments[ganttSegments.length - 1].endDate, data.ganttProperties, true);
}
if (!isNullOrUndefined(taskSettings.endDate) && !isNullOrUndefined(ganttSegments[ganttSegments.length - 1])) {
this.parent.setRecordValue(this.parent.taskFields.endDate, ganttSegments[ganttSegments.length - 1].endDate, data, true);
}
if (!onLoad && taskData && taskData.length > 0) {
taskData.forEach(function (task, index) {
var mergedObject = Object.assign({}, task, _this.customSegmentProperties[index]);
taskData[index] = mergedObject;
});
}
this.parent.setRecordValue('taskData.' + this.parent.taskFields.segments, taskData, data);
}
}
if (ganttSegments.length > 1) {
this.parent.setRecordValue('segments', ganttSegments, data.ganttProperties, true);
this.parent.setRecordValue(this.parent.taskFields.segments, data.taskData[this.parent.taskFields.segments], data, true);
}
else {
ganttSegments = null;
}
return ganttSegments;
};
TaskProcessor.prototype.setSegmentTaskData = function (segments, segmenttaskData) {
var taskSettings = this.parent.taskFields;
var taskData = extend({}, {}, segmenttaskData, true);
if (!isNullOrUndefined(taskSettings.startDate)) {
taskData[this.parent.taskFields.startDate] = segments.startDate;
}
if (!isNullOrUndefined(taskSettings.endDate)) {
taskData[this.parent.taskFields.endDate] = segments.endDate;
}
if (!isNullOrUndefined(taskSettings.duration)) {
taskData[this.parent.taskFields.duration] = Number(segments.duration);
}
return taskData;
};
TaskProcessor.prototype.fetchResources = function (ganttData) {
if ((this.parent.editModule && this.parent.editModule.dialogModule &&
(this.parent.editModule.dialogModule['isFromAddDialog'] || this.parent.editModule.dialogModule['isFromEditDialog']))) {
return this.parent.editModule.dialogModule.ganttResources;
}
else {
return ganttData.ganttProperties.resourceInfo;
}
};
/**
* Method to calculate work based on resource unit and duration.
*
* @param {IGanttData} ganttData .
* @returns {void} .
*/
TaskProcessor.prototype.updateWorkWithDuration = function (ganttData) {
if (this.parent['triggeredColumnName'] === this.parent.taskFields.work && ganttData.ganttProperties.duration !== 0 &&
(isNullOrUndefined(ganttData.ganttProperties.resourceInfo) || ganttData.ganttProperties.resourceInfo.length !== 0) &&
!ganttData.hasChildRecords) {
return;
}
var resources = this.fetchResources(ganttData);
var work = 0;
var resourceOneDayWork;
if ((!isNullOrUndefined(resources) && resources.length > 0) && !ganttData.hasChildRecords) {
var resourcesLength = resources.length;
var index = void 0;
var resourceUnit = void 0;
var totSeconds = void 0;
if (this.parent.weekWorkingTime.length > 0) {
totSeconds = this.parent['getSecondsPerDay'](ganttData.ganttProperties.startDate ? ganttData.ganttProperties.startDate : ganttData.ganttProperties.endDate);
}
else {
totSeconds = this.parent.secondsPerDay;
}
var actualOneDayWork = (totSeconds) / 3600;
var durationInDay = this.getDurationInDay(ganttData.ganttProperties.duration, ganttData.ganttProperties.durationUnit);
for (index = 0; index < resourcesLength; index++) {
// const resource: any = ganttData.ganttProperties.resourceInfo ? ganttData.ganttProperties.resourceInfo : resources;
resourceUnit = resources[index][this.parent.resourceFields.unit]; //in percentage
resourceOneDayWork = (resourceUnit > 0 ? (actualOneDayWork * resourceUnit) / 100 : 0);
work += (resourceOneDayWork * durationInDay);
}
//Update work as per defined unit.
if (ganttData.ganttProperties.workUnit === 'minute') {
work = work * 60;
}
if (ganttData.ganttProperties.workUnit === 'day') {
work = work / actualOneDayWork;
}
//To check the decimal places.
if (work % 1 !== 0) {
work = parseFloat(work.toFixed(2));
}
}
else if (!ganttData.hasChildRecords && !isNullOrUndefined(ganttData.ganttProperties.work) &&
(!isNullOrUndefined(ganttData.ganttProperties.duration) && ganttData.ganttProperties.duration > 0)) {
work = ganttData.ganttProperties.work;
}
if (ganttData.childRecords) {
if (ganttDat