UNPKG

@syncfusion/ej2-gantt

Version:
938 lines 204 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); import { 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