@syncfusion/ej2-gantt
Version:
Essential JS 2 Gantt Component
943 lines • 215 kB
JavaScript
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
import { 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';
import { CalendarContext } from './calendar-context';
/**
* 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.validatedGanttData = new Map();
_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][resourceIdMapping].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);
}
}
}
}
var calendarField = this.parent.taskFields.calendarId;
if (calendarField) {
var calendarValue = data[calendarField];
if (calendarValue !== undefined) {
if (isLoad) {
ganttRecord[calendarField] = calendarValue;
}
else {
this.parent.setRecordValue(calendarField, calendarValue, 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 = 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);
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);
if (taskSettings.calendarId) {
if (data[taskSettings.child] || (taskSettings.parentID && data['Children'])) {
if (data[taskSettings.calendarId]) {
data[taskSettings.calendarId] = undefined;
}
}
var calendarValue = data[taskSettings.calendarId];
this.parent.setRecordValue('calendarId', calendarValue, ganttProperties, true);
if (calendarValue) {
if (!autoSchedule) {
calendarValue = undefined;
}
}
var calendarModel = this.parent.calendarModule.getCalendarById(calendarValue);
var context = new CalendarContext(this.parent, calendarModel);
this.parent.setRecordValue('calendarContext', context, ganttProperties, true);
}
else {
var calendarModel = this.parent.calendarSettings.projectCalendar;
var context = new CalendarContext(this.parent, calendarModel);
this.parent.setRecordValue('calendarContext', context, 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)) {
if (this.parent.taskFields.segments) {
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.getValidatedTaskData = function () {
var dataMapping = this.parent.taskFields;
var updateTaskData = [];
var validatedTasks = Array.from(this.validatedGanttData.values());
for (var _i = 0, validatedTasks_1 = validatedTasks; _i < validatedTasks_1.length; _i++) {
var ganttData = validatedTasks_1[_i];
if (!ganttData.taskData) {
continue;
}
var cloneTaskData = __assign({}, ganttData.taskData);
var ganttProperties = ganttData.ganttProperties;
if (cloneTaskData[dataMapping.startDate]) {
cloneTaskData[dataMapping.startDate] = ganttProperties.startDate;
}
if (cloneTaskData[dataMapping.endDate]) {
cloneTaskData[dataMapping.endDate] = ganttProperties.endDate;
}
if (cloneTaskData[dataMapping.duration]) {
cloneTaskData[dataMapping.duration] = ganttProperties.duration;
}
if (cloneTaskData[dataMapping.work]) {
cloneTaskData[dataMapping.work] = ganttProperties.work;
}
if (cloneTaskData[dataMapping.progress]) {
cloneTaskData[dataMapping.progress] = ganttProperties.progress;
}
if (cloneTaskData[dataMapping.constraintType]) {
cloneTaskData[dataMapping.constraintType] = ganttProperties.constraintType;
}
if (cloneTaskData[dataMapping.constraintDate]) {
cloneTaskData[dataMapping.constraintDate] = ganttProperties.constraintDate;
}
if (cloneTaskData[dataMapping.segments]) {
cloneTaskData[dataMapping.segments] = ganttData[dataMapping.segments];
}
if (cloneTaskData[dataMapping.baselineStartDate]) {
cloneTaskData[dataMapping.baselineStartDate] = ganttProperties.baselineStartDate;
}
if (cloneTaskData[dataMapping.baselineEndDate]) {
cloneTaskData[dataMapping.baselineEndDate] = ganttProperties.baselineEndDate;
}
updateTaskData.push(cloneTaskData);
}
return updateTaskData;
};
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 = [];
var calendarContext = data.ganttProperties.calendarContext;
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, undefined, calendarContext);
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, undefined, calendarContext);
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, undefined, calendarContext);
if (!isNullOrUndefined(ganttSegments[i - 1])) {
totalOffsetDuration += this.getDuration(ganttSegments[i - 1].endDate, startDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone, undefined, calendarContext);
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, undefined, calendarContext);
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, undefined, calendarContext);
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, undefined, calendarContext);
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, calendarContext)) {
do {
segment.startDate.setDate(segment.startDate.getDate() + 1);
} while (this.isOnHolidayOrWeekEnd(segment.startDate, true, calendarContext));
}
if ((!this.parent.includeWeekend || calendarContext.exceptionsRanges.length === 0)) {
segment.startDate = this.getNextWorkingDay(segment.startDate, calendarContext);
}
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,