@syncfusion/ej2-gantt
Version:
Essential JS 2 Gantt Component
938 lines • 204 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.processedParentItems = new Set();
_this.isBaseline = false;
_this.uid = 0;
_this.isTaskIDInteger = true;
_this.cache = {};
_this.offsetUpdateParentList = [];
_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)) {
var key = groupData.key.toString();
index = this.taskIds[key] !== undefined ? this.taskIds[key] : -1;
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])) {
var taskId = tempData[taskIdMapping].toString();
this.taskIds[taskId] = i;
}
}
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);
}
};
/**
* Appends a Gantt record to the end of the flatData array and updates the flatDataMap.
* @param {IGanttData} ganttData - The Gantt data record to append, containing ganttProperties with a rowUniqueID.
* @returns {void}.
* @private
*/
TaskProcessor.prototype.appendGanttRecord = function (ganttData) {
this.parent.flatData.push(ganttData);
};
TaskProcessor.prototype.prepareRecordCollection = function (data, level, parentItem) {
var _this = this;
if (!Array.isArray(data)) {
return;
}
var taskFields = this.parent.taskFields;
var hasChildMapping = taskFields.hasChildMapping;
var segmentId = taskFields.segmentId;
var constraintDate = taskFields.constraintDate;
var constraintType = taskFields.constraintType;
var enableValidation = this.parent.enableValidation;
var autoCalculateDateScheduling = this.parent.autoCalculateDateScheduling;
var isLoad = this.parent.isLoad;
var loadChildOnDemand = this.parent.treeGrid.loadChildOnDemand;
var viewType = this.parent.viewType;
var allowParentDependency = this.parent.allowParentDependency;
var shouldProcess = this.parent.dataSource instanceof Object &&
isCountRequired(this.parent) &&
!isNullOrUndefined(taskFields.child);
data.forEach(function (tempData) {
if (segmentId && _this.segmentCollection) {
var segmentData = _this.segmentCollection.find(function (x) { return x.key === tempData[(taskFields.id)]; });
if (segmentData && segmentData['items'] && segmentData['items'].length) {
tempData[taskFields.segments] = segmentData['items'];
}
}
if (hasChildMapping && tempData['parentUniqueID']) {
parentItem = _this.parent.getTaskByUniqueID(tempData['parentUniqueID']);
}
if (constraintDate && constraintType && !tempData['constraintDate'] && !tempData[constraintType]) {
tempData[constraintType] = 0;
tempData[constraintDate] = tempData[taskFields.startDate] || tempData[taskFields.endDate];
}
var ganttData = _this.createRecord(tempData, level, parentItem, true, shouldProcess);
if (!enableValidation || ((isLoad && loadChildOnDemand && hasChildMapping))) {
_this.updateTaskLeftWidth(ganttData);
}
ganttData.index = _this.recordIndex++;
_this.parent.ids[ganttData.index] = ganttData.ganttProperties.rowUniqueID;
_this.appendGanttRecord(ganttData);
_this.parent.setTaskIds(ganttData);
var childData = tempData[taskFields.child] || (tempData['taskData'] && tempData['taskData'][taskFields.child]);
if (viewType === 'ResourceView' && (!childData || childData.length === 0) && !ganttData.parentItem && ganttData.level === 0) {
var ganttProp = ganttData.ganttProperties;
var parentData = ganttData;
_this.parent.setRecordValue(ganttProp.isAutoSchedule ? 'startDate' : 'autoStartDate', null, ganttProp, true);
_this.parent.setRecordValue(ganttProp.isAutoSchedule ? 'endDate' : 'autoEndDate', null, ganttProp, true);
_this.parent.setRecordValue('isMilestone', false, ganttProp, true);
if (ganttProp.isAutoSchedule) {
_this.calculateDuration(parentData);
}
_this.updateWorkWithDuration(parentData);
_this.parent.setRecordValue('work', ganttProp.work, ganttProp, true);
_this.parent.setRecordValue('taskType', 'FixedDuration', ganttProp, true);
if (taskFields.type) {
_this.updateMappingData(parentData, 'type');
}
_this.parent.setRecordValue('progress', 0, ganttProp, true);
_this.parent.setRecordValue('totalProgress', 0, ganttProp, true);
_this.parent.setRecordValue('totalDuration', 0, ganttProp, true);
if (!ganttProp.isAutoSchedule) {
_this.parent.setRecordValue('autoDuration', _this.calculateAutoDuration(ganttProp), ganttProp, true);
_this.updateAutoWidthLeft(parentData);
}
if (!allowParentDependency) {
_this.resetDependency(parentData);
}
_this.updateWidthLeft(parentData);
_this.updateTaskData(parentData);
}
if (hasChildMapping) {
parentItem = null;
}
if (childData && childData.length > 0) {
_this.prepareRecordCollection(childData, ganttData.level + 1, ganttData);
}
});
};
/**
* Method to update custom field values in gantt record
*
* @param {object} data .
* @param {IGanttData} ganttRecord .
* @param {boolean} [isLoad] .
* @returns {void} .
*/
TaskProcessor.prototype.addCustomFieldValue = function (data, ganttRecord, isLoad) {
var columns = this.parent.ganttColumns;
var length = columns.length;
if (length) {
for (var i = 0; i < length; i++) {
var column = columns[i];
var fieldName = ganttRecord[column.field];
if (fieldName === undefined) {
if (isLoad) {
// Direct assignment during load for better performance
ganttRecord[column.field] = data[column.field] !== undefined ? data[column.field] : null;
}
else {
// Use setRecordValue for normal operations (triggers events, validation, etc.)
this.parent.setRecordValue(column.field, data[column.field], ganttRecord);
}
}
}
}
};
TaskProcessor.prototype.getGanttUid = function (prefix) {
return "" + prefix + this.uid++;
};
TaskProcessor.prototype.processCustomColumns = function (data) {
var _this = this;
if (!this.parent.customColumns || this.parent.customColumns.length === 0) {
return;
}
this.parent.customColumns.forEach(function (column) {
var currentColumn = _this.parent.getColumnByField(column, _this.parent.ganttColumns);
if (currentColumn && currentColumn.type === 'date' || currentColumn.type === 'datetime') {
var value = data[column];
if (value == null) {
return;
}
var isValidDateString = (typeof value === 'string') && _this.isValidDateString(value);
var isValidDateObject = value instanceof Date && !isNaN(value.getTime());
if (isValidDateString || isValidDateObject) {
var dateValue = isValidDateString ? new Date(value) : value;
data[column] = _this.getDateFromFormat(dateValue, true);
}
}
});
};
TaskProcessor.prototype.isValidDateString = function (str) {
var trimmed = str.trim();
if (!trimmed) {
return false;
}
// Block pure numeric strings
if (/^\d+$/.test(trimmed)) {
return false;
}
// Final check: must parse to a real date
return !isNaN(Date.parse(trimmed));
};
/**
* To populate Gantt record
*
* @param {object} data .
* @param {number} level .
* @param {IGanttData} parentItem .
* @param {boolean} isLoad .
* @param {boolean} shouldProcess .
* @returns {IGanttData} .
* @private
*/
TaskProcessor.prototype.createRecord = function (data, level, parentItem, isLoad, shouldProcess) {
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 = this.formatProgressValue(progress, taskSettings.progress);
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);
this.processCustomColumns(data);
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, isLoad);
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);
if (!isLoad) {
this.parent.setRecordValue('baselineStartDate', this.checkBaselineStartDate(baselineStartDate, ganttProperties), ganttProperties, true);
if (!data[taskSettings.baselineEndDate]) {
this.parent.setRecordValue('baselineEndDate', this.checkBaselineEndDate(baselineEndDate, ganttProperties), ganttProperties, true);
}
else {
this.parent.setRecordValue('baselineEndDate', data[taskSettings.baselineEndDate], ganttProperties, true);
}
}
this.calculateScheduledValues(ganttData, data, isLoad);
this.calculateScheduledValuesforBaseline(ganttData, data, isLoad);
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) {
var index = this.taskIds[data[taskSettings.id].toString()];
this.parent.setRecordValue('parentItem', ganttData.parentItem, this.parent.currentViewData[index]);
}
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 (shouldProcess) {
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 (shouldProcess) {
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;
};
// Checks if decimal progress is enabled for the given field.
TaskProcessor.prototype.isDecimalProgress = function (progressField) {
var progressColumn = this.parent.columnByField[progressField];
var hasDecimalEdit = !isNullOrUndefined(progressColumn) &&
!isNullOrUndefined(progressColumn.edit) &&
progressColumn.hasOwnProperty('edit') &&
!isNullOrUndefined(progressColumn.edit.params) &&
progressColumn.edit.hasOwnProperty('params') &&
!isNullOrUndefined(progressColumn.edit.params.decimals) &&
progressColumn.edit.params.decimals > 0;
return hasDecimalEdit;
};
// Extracts the number of decimal places from the column format.
TaskProcessor.prototype.getDecimalPlaces = function (progressField) {
var progressColumn = this.parent.columnByField[progressField];
if (progressColumn && typeof progressColumn.format === 'string' &&
progressColumn.format.match(/^[ncp](\d*)$/i)) {
var match = progressColumn.format.match(/^[ncp](\d*)$/i);
if (match) {
return parseInt(match[1], 10);
}
}
return 0; // default decimal places
};
// Formats the progress value based on decimal settings and caps it at 100.
TaskProcessor.prototype.formatProgressValue = function (value, progressField) {
var hasDecimalEdit = this.isDecimalProgress(progressField);
var parsed = value ? parseFloat(value.toString()) || 0 : 0;
var formattedValue;
if (hasDecimalEdit) {
var decimalPlaces = this.getDecimalPlaces(progressField);
formattedValue = Number(parsed.toFixed(decimalPlaces));
}
else {
formattedValue = Math.floor(parsed);
}
return (formattedValue);
};
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.f