@syncfusion/ej2-gantt
Version:
Essential JS 2 Gantt Component
1,008 lines (1,007 loc) • 90 kB
JavaScript
import { isNullOrUndefined, getValue, setValue } from '@syncfusion/ej2-base';
import { ConstraintType } from './enum';
/**
* Date processor is used to handle date of task data.
*/
var DateProcessor = /** @class */ (function () {
function DateProcessor(parent) {
this.fromSegments = false;
this.mondayTimeRangeLength = 0;
this.tuesdayTimeRangeLength = 0;
this.wednesdayTimeRangeLength = 0;
this.thursdayTimeRangeLength = 0;
this.fridayTimeRangeLength = 0;
this.saturdayTimeRangeLength = 0;
this.sundayTimeRangeLength = 0;
this.parent = parent;
}
/**
* @param {ITaskData} ganttProp .
* @returns {boolean} .
*/
DateProcessor.prototype.isValidateNonWorkDays = function (ganttProp) {
return (!isNullOrUndefined(ganttProp) && ganttProp.isAutoSchedule &&
(!this.parent.includeWeekend || this.parent.totalHolidayDates.length > 0)) ||
(isNullOrUndefined(ganttProp) && (!this.parent.includeWeekend || this.parent.totalHolidayDates.length > 0));
};
/**
* Method to convert given date value as valid start date
*
* @param {Date} date .
* @param {ITaskData} ganttProp .
* @param {boolean} validateAsMilestone .
* @param {boolean} isLoad .
* @returns {Date} .
* @private
*/
DateProcessor.prototype.checkStartDate = function (date, ganttProp, validateAsMilestone, isLoad) {
if (isNullOrUndefined(date)) {
return null;
}
var currentDay = new Date(date.getTime());
var dayStartTime = this.parent['getCurrentDayStartTime'](currentDay);
var dayEndTime = this.parent['getCurrentDayEndTime'](currentDay);
var cloneStartDate = new Date(date.getTime());
var hour = this.getSecondsInDecimal(cloneStartDate);
validateAsMilestone = isNullOrUndefined(validateAsMilestone) ? !isNullOrUndefined(ganttProp) ?
ganttProp.isMilestone : false : validateAsMilestone;
if (hour < dayStartTime && (!validateAsMilestone || isLoad)) {
this.setTime(dayStartTime, cloneStartDate);
}
else if (hour < dayStartTime && validateAsMilestone) {
this.setTime(dayStartTime, cloneStartDate);
}
else if ((hour === dayEndTime && (!ganttProp || !validateAsMilestone)) || hour > dayEndTime) {
cloneStartDate.setDate(cloneStartDate.getDate() + 1);
dayStartTime = this.parent['getCurrentDayStartTime'](cloneStartDate);
this.setTime(dayStartTime, cloneStartDate);
}
else if (hour > dayStartTime && hour < dayEndTime) {
var workingRange = this.parent.workingTimeRanges;
if (this.parent.weekWorkingTime.length > 0) {
workingRange = this.parent['getWorkingRange'](cloneStartDate);
}
for (var index = 0; index < workingRange.length; index++) {
var value = workingRange[index];
if (hour >= value.to && (workingRange[index + 1] &&
hour < workingRange[index + 1].from)) {
// milestone can fall at end any interval time
if ((hour === value.to && (!ganttProp || !validateAsMilestone)) || hour !== value.to) {
this.setTime(workingRange[index + 1].from, cloneStartDate);
}
break;
}
}
}
var tStartDate;
if (this.parent.autoCalculateDateScheduling && !(this.parent.isLoad && this.parent.treeGrid.loadChildOnDemand &&
this.parent.taskFields.hasChildMapping)) {
do {
tStartDate = new Date(cloneStartDate.getTime());
var holidayLength = this.parent.totalHolidayDates.length;
// check holidays and weekends
if (this.isValidateNonWorkDays(ganttProp)) {
dayStartTime = this.parent['getCurrentDayStartTime'](tStartDate);
if (ganttProp) {
dayEndTime = this.parent['getCurrentDayEndTime'](ganttProp.endDate ? ganttProp.isAutoSchedule ? ganttProp.endDate : ganttProp.autoEndDate : tStartDate);
}
var startTime = (!validateAsMilestone || isLoad) ? dayStartTime : dayEndTime;
if (!this.parent.includeWeekend) {
var tempDate = new Date(cloneStartDate.getTime());
cloneStartDate = this.getNextWorkingDay(cloneStartDate);
startTime = this.parent['getCurrentDayStartTime'](cloneStartDate);
if (tempDate.getTime() !== cloneStartDate.getTime() && !validateAsMilestone) {
this.setTime(startTime, cloneStartDate);
}
}
for (var count = 0; count < holidayLength; count++) {
var holidayFrom = this.getDateFromFormat(new Date(this.parent.totalHolidayDates[count]));
var holidayTo = new Date(holidayFrom.getTime());
holidayFrom.setHours(0, 0, 0, 0);
holidayTo.setHours(23, 59, 59, 59);
if (cloneStartDate.getTime() >= holidayFrom.getTime() && cloneStartDate.getTime() < holidayTo.getTime()) {
cloneStartDate.setDate(cloneStartDate.getDate() + 1);
startTime = this.parent['getCurrentDayStartTime'](cloneStartDate);
this.setTime(startTime, cloneStartDate);
}
}
}
} while (tStartDate.getTime() !== cloneStartDate.getTime());
return new Date(cloneStartDate.getTime());
}
else {
return new Date(cloneStartDate.getTime());
}
};
DateProcessor.prototype.getDateByConstraint = function (ganttData, date, restrictConstraint, validPredecessor) {
var ganttProp = ganttData['ganttProperties'] ? ganttData['ganttProperties'] : ganttData;
var constraintDate = new Date(ganttProp.constraintDate);
var isLoad = this.parent.isLoad;
if (isNullOrUndefined(validPredecessor)) {
validPredecessor = true;
}
if ((!constraintDate || !date) && validPredecessor) {
return null;
}
constraintDate = this.parent['assignTimeToDate'](constraintDate, this.parent['getCurrentDayStartTime'](constraintDate));
switch (ganttProp.constraintType) {
case ConstraintType.AsSoonAsPossible:
if (isLoad) {
return date;
}
else {
ganttProp.constraintDate = null;
var parentRecord = this.parent.getRecordByID(ganttProp.taskId).parentItem;
if (ganttProp.predecessor && ganttProp.predecessor.length > 0) {
return this.parent['assignTimeToDate'](date, this.parent['getCurrentDayStartTime'](date));
}
else if (parentRecord) {
return this.parent.getRecordByID(parentRecord.taskId).ganttProperties.startDate;
}
else {
return this.parent.dateValidationModule.checkStartDate(new Date(this.parent.projectStartDate));
}
}
case ConstraintType.AsLateAsPossible:
if (isLoad) {
return date;
}
else {
var parentRecord = this.parent.getRecordByID(ganttProp.taskId).parentItem;
if (parentRecord) {
var checkedEnd = this.parent.dateValidationModule.checkEndDate(this.parent.getRecordByID(parentRecord.taskId).ganttProperties.endDate);
var start = this.parent.dateValidationModule.getStartDate(checkedEnd, ganttProp.duration, ganttProp.durationUnit, ganttProp);
return start;
}
else {
var checkedEnd = this.parent.dateValidationModule.checkEndDate(new Date(this.parent.projectEndDate));
var start = this.parent.dateValidationModule.getStartDate(checkedEnd, ganttProp.duration, ganttProp.durationUnit, ganttProp);
return start;
}
}
case ConstraintType.MustStartOn: {
var isViolation = constraintDate.getTime() !== ganttProp.startDate.getTime();
var constraintValue = void 0;
if (this.parent.editModule && this.parent.editModule.dialogModule) {
constraintValue = this.parent.editModule.dialogModule['dialogConstraintValue'];
}
var isConstraintTypeRestricted = isNullOrUndefined(constraintValue) ||
constraintValue === 2 ||
constraintValue === 3;
if (isViolation && !isLoad && isConstraintTypeRestricted) {
this.parent.constraintViolationType = 'MustStartOn';
}
constraintValue = null;
if (isLoad) {
return this.parent.dateValidationModule.checkStartDate(new Date(constraintDate));
}
else {
return this.parent['assignTimeToDate'](date, this.parent['getCurrentDayStartTime'](date));
}
}
case ConstraintType.MustFinishOn: {
var isViolation = constraintDate.getTime() !== ganttProp.endDate.getTime();
var endDate = new Date(constraintDate);
endDate.setDate(endDate.getDate() + 1);
var checkedEnd = this.parent.dateValidationModule.checkEndDate(endDate);
var start = this.parent.dateValidationModule.getStartDate(checkedEnd, ganttProp.duration, ganttProp.durationUnit, ganttProp);
if (isViolation && !isLoad) {
this.parent.constraintViolationType = 'MustFinishOn';
}
if (restrictConstraint) {
return date;
}
return start;
}
case ConstraintType.StartNoEarlierThan: {
if (constraintDate.getTime() < date.getTime() || !isLoad) {
return this.parent['assignTimeToDate'](date, this.parent['getCurrentDayStartTime'](date));
}
return this.parent.dateValidationModule.checkStartDate(new Date(constraintDate));
}
case ConstraintType.StartNoLaterThan: {
var isViolation = constraintDate.getTime() !== ganttProp.startDate.getTime();
if (isViolation && !isLoad) {
this.parent.constraintViolationType = 'StartNoLaterThan';
}
if (!isLoad) {
return this.parent['assignTimeToDate'](date, this.parent['getCurrentDayStartTime'](date));
}
return (ganttProp.predecessor && ganttProp.predecessor.length > 0)
? date
: this.parent.dateValidationModule.checkStartDate(new Date(this.parent.projectStartDate));
}
case ConstraintType.FinishNoEarlierThan: {
if (constraintDate.getTime() < date.getTime()) {
return this.parent['assignTimeToDate'](date, this.parent['getCurrentDayEndTime'](date));
}
else {
var adjustedDate = new Date(constraintDate);
adjustedDate.setDate(adjustedDate.getDate() + 1);
var checkedEnd = this.parent.dateValidationModule.checkEndDate(adjustedDate);
return this.parent.dateValidationModule.getStartDate(checkedEnd, ganttProp.duration, ganttProp.durationUnit, ganttProp);
}
}
case ConstraintType.FinishNoLaterThan: {
var isViolation = constraintDate.getTime() !== ganttProp.endDate.getTime();
if (isViolation && !isLoad) {
this.parent.constraintViolationType = 'FinishNoLaterThan';
}
if (!isLoad) {
return this.parent['assignTimeToDate'](date, this.parent['getCurrentDayEndTime'](date));
}
return (ganttProp.predecessor && ganttProp.predecessor.length > 0)
? date
: this.parent.dateValidationModule.checkStartDate(new Date(this.parent.projectStartDate));
}
default:
return date;
}
};
/**
* To update given date value to valid end date
*
* @param {Date} date .
* @param {ITaskData} ganttProp .
* @param {boolean} validateAsMilestone .
* @returns {Date} .
* @private
*/
DateProcessor.prototype.checkEndDate = function (date, ganttProp, validateAsMilestone) {
if (isNullOrUndefined(date)) {
return null;
}
var dayStartTime;
var dayEndTime;
if (this.parent.weekWorkingTime.length > 0) {
var currentDay = date;
if (!this.parent.includeWeekend && ganttProp && ganttProp.isAutoSchedule || (this.parent.editModule
&& this.parent.editModule.taskbarEditModule && this.parent.editModule.taskbarEditModule.taskBarEditRecord
&& !this.parent.editModule.taskbarEditModule.taskBarEditRecord.ganttProperties.isAutoSchedule)) {
currentDay = this.getNextWorkingDay(date);
}
dayStartTime = this.parent['getStartTime'](currentDay);
dayEndTime = this.parent['getEndTime'](currentDay);
}
else {
dayStartTime = this.parent.defaultStartTime;
dayEndTime = this.parent.defaultEndTime;
}
var cloneEndDate = new Date(date.getTime());
var hour = this.getSecondsInDecimal(cloneEndDate);
if (hour > dayEndTime) {
this.setTime(dayEndTime, cloneEndDate);
}
else if (hour <= dayStartTime && dayEndTime !== 86400 && !validateAsMilestone) {
var taskfields = this.parent.taskFields;
if (this.parent.editModule && this.parent.editModule['editedRecord'] && (!this.parent.editModule['editedRecord'][taskfields.startDate] && this.parent.editModule['editedRecord'][taskfields.endDate])) {
cloneEndDate.setDate(cloneEndDate.getDate());
}
else {
cloneEndDate.setDate(cloneEndDate.getDate() - 1);
}
dayEndTime = this.parent['getCurrentDayEndTime'](cloneEndDate);
this.setTime(dayEndTime, cloneEndDate);
}
else if (hour > dayStartTime && hour < dayEndTime) {
for (var index = 0; index < this.parent.workingTimeRanges.length; index++) {
var value = this.parent.workingTimeRanges[index];
if (hour > value.to && (this.parent.workingTimeRanges[index + 1] &&
hour <= this.parent.workingTimeRanges[index + 1].from)) {
this.setTime(this.parent.workingTimeRanges[index].to, cloneEndDate);
break;
}
}
}
var tempCheckDate;
if (this.parent.autoCalculateDateScheduling && !(this.parent.isLoad && this.parent.treeGrid.loadChildOnDemand &&
this.parent.taskFields.hasChildMapping)) {
do {
tempCheckDate = new Date(cloneEndDate.getTime());
var holidayLength = this.parent.totalHolidayDates.length;
if (this.isValidateNonWorkDays(ganttProp)) {
if (!this.parent.includeWeekend) {
var tempDate = new Date(cloneEndDate.getTime());
cloneEndDate = this.getPreviousWorkingDay(cloneEndDate);
dayEndTime = this.parent['getCurrentDayEndTime'](cloneEndDate);
if (tempDate.getTime() !== cloneEndDate.getTime()) {
this.setTime(dayEndTime, cloneEndDate);
}
}
for (var count = 0; count < holidayLength; count++) {
var holidayFrom = this.getDateFromFormat(new Date(this.parent.totalHolidayDates[count]));
var holidayTo = new Date(holidayFrom.getTime());
var tempHoliday = new Date(cloneEndDate.getTime());
tempHoliday.setMinutes(cloneEndDate.getMilliseconds() - 2);
holidayFrom.setHours(0, 0, 0, 0);
holidayTo.setHours(23, 59, 59, 59);
if (cloneEndDate.getTime() >= holidayFrom.getTime() && cloneEndDate.getTime() < holidayTo.getTime() ||
tempHoliday.getTime() >= holidayFrom.getTime() && tempHoliday.getTime() < holidayTo.getTime()) {
cloneEndDate.setDate(cloneEndDate.getDate() - 1);
dayEndTime = this.parent['getCurrentDayEndTime'](cloneEndDate);
if (!(cloneEndDate.getTime() === holidayFrom.getTime() && dayEndTime === 86400 &&
this.getSecondsInDecimal(cloneEndDate) === 0)) {
this.setTime(dayEndTime, cloneEndDate);
}
}
}
}
} while (tempCheckDate.getTime() !== cloneEndDate.getTime());
return new Date(cloneEndDate.getTime());
}
else {
if (!isNullOrUndefined(cloneEndDate) && this.parent.defaultEndTime !== 86400) {
dayEndTime = this.parent['getCurrentDayEndTime'](date);
this.setTime(dayEndTime, cloneEndDate);
}
return new Date(cloneEndDate.getTime());
}
};
/**
* To validate the baseline start date
*
* @param {Date} date .
* @param {ITaskData} ganttProp .
* @returns {Date} .
* @private
*/
DateProcessor.prototype.checkBaselineStartDate = function (date, ganttProp) {
if (isNullOrUndefined(date)) {
return null;
}
else {
var dayStartTime = this.parent['getCurrentDayStartTime'](date);
var dayEndTime = this.parent['getCurrentDayEndTime'](ganttProp ? ganttProp.endDate ? ganttProp.isAutoSchedule ? ganttProp.endDate : ganttProp.autoEndDate : date : date);
var cloneDate = new Date(date.getTime());
var hour = this.getSecondsInDecimal(cloneDate);
if (hour < dayStartTime) {
this.setTime(dayStartTime, cloneDate);
}
else if (hour > dayEndTime) {
cloneDate.setDate(cloneDate.getDate() + 1);
if (this.parent.weekWorkingTime.length > 0) {
dayStartTime = this.parent['getStartTime'](cloneDate);
}
else {
dayStartTime = this.parent.defaultStartTime;
}
this.setTime(dayStartTime, cloneDate);
}
else if (hour > dayStartTime && hour < dayEndTime) {
for (var i = 0; i < this.parent.workingTimeRanges.length; i++) {
var value = this.parent.workingTimeRanges[i];
if (hour > value.to && (this.parent.workingTimeRanges[i + 1] &&
hour < this.parent.workingTimeRanges[i + 1].from)) {
this.setTime(this.parent.workingTimeRanges[i + 1].from, cloneDate);
break;
}
}
}
return cloneDate;
}
};
/**
* To validate baseline end date
*
* @param {Date} date .
* @param {ITaskData} ganttProp .
* @returns {Date} .
* @private
*/
DateProcessor.prototype.checkBaselineEndDate = function (date, ganttProp) {
if (isNullOrUndefined(date)) {
return null;
}
else {
var dayEndTime = this.parent['getCurrentDayEndTime'](date);
var dayStartTime = this.parent['getCurrentDayStartTime'](ganttProp ? ganttProp.startDate ? ganttProp.isAutoSchedule ? ganttProp.startDate : ganttProp.autoStartDate : date : date);
var cloneDate = new Date(date.getTime());
var hour = this.getSecondsInDecimal(cloneDate);
if (hour > dayEndTime) {
this.setTime(dayEndTime, cloneDate);
}
else if (hour < dayStartTime && !isNullOrUndefined(ganttProp) && !ganttProp.isMilestone) {
cloneDate.setDate(cloneDate.getDate() - 1);
dayEndTime = this.parent['getCurrentDayEndTime'](cloneDate);
this.setTime(dayEndTime, cloneDate);
}
else if (hour > dayStartTime && hour < dayEndTime) {
for (var i = 0; i < this.parent.workingTimeRanges.length; i++) {
var value = this.parent.workingTimeRanges[i];
if (hour > value.to && (this.parent.workingTimeRanges[i + 1] && hour <= this.parent.workingTimeRanges[i + 1].from)) {
this.setTime(this.parent.workingTimeRanges[i].to, cloneDate);
break;
}
}
}
if (ganttProp && ganttProp.baselineStartDate && cloneDate &&
ganttProp.baselineStartDate.getTime() > cloneDate.getTime()) {
cloneDate.setDate(cloneDate.getDate() + 1);
}
return cloneDate;
}
};
/**
* To calculate start date value from duration and end date
*
* @param {IGanttData} ganttData - Defines the gantt data.
* @returns {void} .
* @private
*/
DateProcessor.prototype.calculateStartDate = function (ganttData) {
var ganttProp = ganttData.ganttProperties;
var tempStartDate = null;
if (!isNullOrUndefined(ganttProp.endDate) && !isNullOrUndefined(ganttProp.duration)) {
tempStartDate = this.getStartDate(ganttProp.endDate, ganttProp.duration, ganttProp.durationUnit, ganttProp);
}
this.parent.setRecordValue('startDate', tempStartDate, ganttProp, true);
if (this.parent.taskFields.startDate) {
this.parent.dataOperation.updateMappingData(ganttData, 'startDate');
}
};
/**
*
* @param {IGanttData} ganttData - Defines the gantt data.
* @returns {void} .
* @private
*/
DateProcessor.prototype.calculateEndDate = function (ganttData) {
var ganttProp = ganttData.ganttProperties;
var tempEndDate = null;
var dayStartTime;
var dayEndTime;
if (!isNullOrUndefined(ganttProp.startDate)) {
if (!isNullOrUndefined(ganttProp.endDate) && isNullOrUndefined(ganttProp.duration)) {
if (this.compareDates(ganttProp.startDate, ganttProp.endDate) === 1) {
this.parent.setRecordValue('startDate', new Date(ganttProp.endDate.getTime()), ganttProp, true);
dayStartTime = this.parent['getCurrentDayStartTime'](ganttProp.isAutoSchedule ? ganttProp.autoStartDate : ganttProp.startDate);
dayEndTime = this.parent['getCurrentDayEndTime'](ganttProp.isAutoSchedule ? ganttProp.autoEndDate : ganttProp.endDate);
this.setTime(dayStartTime, ganttProp.startDate);
}
this.calculateDuration(ganttData);
}
if (!isNullOrUndefined(ganttProp.duration)) {
var duration = !isNullOrUndefined(ganttProp.segments) && ganttProp.segments.length > 1 ?
this.totalDuration(ganttProp.segments) : ganttProp.duration;
tempEndDate = this.getEndDate(ganttProp.startDate, duration, ganttProp.durationUnit, ganttProp, false);
}
this.parent.setRecordValue('endDate', tempEndDate, ganttProp, true);
}
else {
tempEndDate = ganttData[this.parent.taskFields.endDate];
if (!isNullOrUndefined(tempEndDate)) {
dayEndTime = this.parent['getCurrentDayEndTime'](tempEndDate);
this.setTime(dayEndTime, tempEndDate);
}
this.parent.setRecordValue('endDate', tempEndDate, ganttProp, true);
}
if (this.parent.taskFields.endDate) {
this.parent.dataOperation.updateMappingData(ganttData, 'endDate');
}
};
DateProcessor.prototype.totalDuration = function (segments) {
var duration = 0;
for (var i = 0; i < segments.length; i++) {
duration += segments[i].duration + segments[i].offsetDuration;
}
return duration;
};
/**
* To calculate duration from start date and end date
*
* @param {IGanttData} ganttData - Defines the gantt data.
* @returns {void} .
*/
DateProcessor.prototype.calculateDuration = function (ganttData) {
var ganttProperties = ganttData.ganttProperties;
var tDuration;
if (!isNullOrUndefined(ganttProperties.segments) && ganttProperties.segments.length > 0 &&
!isNullOrUndefined(this.parent.editModule.taskbarEditModule)) {
tDuration = this.parent.editModule.taskbarEditModule.sumOfDuration(ganttProperties.segments);
}
else {
if ((!isNullOrUndefined(this.parent.taskFields.milestone)) && (!isNullOrUndefined(ganttProperties.startDate))
&& !isNullOrUndefined(ganttProperties.endDate) &&
(ganttProperties.startDate).getTime() === (ganttProperties.endDate).getTime()
&& (ganttData.taskData[this.parent.taskFields.milestone] === false)) {
tDuration = 1;
}
else {
tDuration = this.getDuration(ganttProperties.startDate, ganttProperties.endDate, ganttProperties.durationUnit, ganttProperties.isAutoSchedule, ganttProperties.isMilestone);
}
}
this.parent.setRecordValue('duration', tDuration, ganttProperties, true);
var col = this.parent.columnByField[this.parent.columnMapping.duration];
if (!isNullOrUndefined(this.parent.editModule) && !isNullOrUndefined(this.parent.editModule.cellEditModule) &&
!this.parent.editModule.cellEditModule.isCellEdit && !isNullOrUndefined(col)) {
if (!isNullOrUndefined(col.edit) && !isNullOrUndefined(col.edit.read)) {
var dialog = this.parent.editModule.dialogModule.dialog;
if (!isNullOrUndefined(dialog)) {
var textBox = dialog.querySelector('#' + this.parent.element.id + 'Duration')
.ej2_instances[0];
if (!isNullOrUndefined(textBox) && textBox.value !== tDuration.toString()) {
textBox.value = tDuration.toString();
textBox.dataBind();
}
}
}
if (this.parent.taskFields.duration) {
this.parent.dataOperation.updateMappingData(ganttData, 'duration');
if (this.parent.taskFields.durationUnit) {
this.parent.dataOperation.updateMappingData(ganttData, 'durationUnit');
}
}
}
};
/**
*
* @param {Date} sDate Method to get total nonworking time between two date values
* @param {Date} eDate .
* @param {boolean} isAutoSchedule .
* @param {boolean} isCheckTimeZone .
* @returns {number} .
*/
DateProcessor.prototype.getNonworkingTime = function (sDate, eDate, isAutoSchedule, isCheckTimeZone) {
isCheckTimeZone = isNullOrUndefined(isCheckTimeZone) ? true : isCheckTimeZone;
var weekendCount = (!this.parent.includeWeekend && this.parent.autoCalculateDateScheduling && !(this.parent.isLoad &&
this.parent.treeGrid.loadChildOnDemand && this.parent.taskFields.hasChildMapping)) && isAutoSchedule ?
this.getWeekendCount(sDate, eDate) : 0;
var totalHours = this.getNumberOfSeconds(sDate, eDate, isCheckTimeZone);
var holidaysCount = (isAutoSchedule && this.parent.autoCalculateDateScheduling &&
!(this.parent.isLoad && this.parent.treeGrid.loadChildOnDemand && this.parent.taskFields.hasChildMapping)) ? this.getHolidaysCount(sDate, eDate) : 0;
var totWorkDays = (totalHours - (weekendCount * 86400) - (holidaysCount * 86400)) / 86400; // working days between two dates
var nonWorkHours = this.getNonWorkingSecondsOnDate(sDate, eDate, isAutoSchedule);
var totalNonWorkTime = (this.parent.weekWorkingTime.length > 0 ?
this.nonWorkingSeconds(sDate, eDate, isAutoSchedule, totWorkDays) : (totWorkDays * (86400 - this.parent.secondsPerDay))) +
(weekendCount * 86400) + (holidaysCount * 86400) + nonWorkHours;
return totalNonWorkTime;
};
DateProcessor.prototype.nonWorkingSeconds = function (sDate, eDate, isAutoSchedule, workDays, fromDuration) {
var newStartDate = sDate.getTime() > eDate.getTime() ? new Date(eDate.getTime()) : new Date(sDate.getTime());
var newEndDate = sDate.getTime() > eDate.getTime() ? new Date(sDate.getTime()) : new Date(eDate.getTime());
var timeDiff = 0;
var count = 0;
if (fromDuration) {
var dayStartTime = this.parent['getCurrentDayStartTime'](newStartDate);
var dayEndTime = this.parent['getCurrentDayEndTime'](newStartDate);
if (!(newStartDate.getHours() < dayEndTime / 3600 && newStartDate.getHours() >= dayStartTime / 3600)) {
newStartDate.setDate(newStartDate.getDate() + 1);
}
}
else {
newStartDate.setDate(newStartDate.getDate() + 1);
newStartDate.setHours(0, 0, 0, 0);
newEndDate.setHours(0, 0, 0, 0);
}
if (workDays > 0 || isNullOrUndefined(workDays)) {
while ((fromDuration && newStartDate.getTime() <= newEndDate.getTime())
|| (!fromDuration && newStartDate.getTime() < newEndDate.getTime())) {
if (isAutoSchedule) {
if (this.isOnHolidayOrWeekEnd(newStartDate, true)) {
do {
newStartDate.setDate(newStartDate.getDate() + 1);
} while (this.isOnHolidayOrWeekEnd(newStartDate, true));
}
if (!this.parent.includeWeekend) {
this.getNextWorkingDay(newStartDate);
}
}
if (newStartDate.getTime() <= newEndDate.getTime()) {
count++;
var currentDaySeconds = this.parent['getSecondsPerDay'](newStartDate);
if (fromDuration) {
timeDiff += currentDaySeconds;
}
else {
timeDiff += 86400 - currentDaySeconds;
}
newStartDate.setDate(newStartDate.getDate() + 1);
if (isAutoSchedule) {
if (this.isOnHolidayOrWeekEnd(newStartDate, true)) {
do {
newStartDate.setDate(newStartDate.getDate() + 1);
} while (this.isOnHolidayOrWeekEnd(newStartDate, true));
}
if (!this.parent.includeWeekend) {
this.getNextWorkingDay(newStartDate);
}
}
}
}
}
else {
return 0;
}
if (fromDuration) {
if (timeDiff > 0) {
timeDiff = timeDiff / count;
}
else {
timeDiff = this.parent.secondsPerDay;
}
}
return timeDiff;
};
/**
*
* @param {Date} startDate .
* @param {Date} endDate .
* @param {string} durationUnit .
* @param {boolean} isAutoSchedule .
* @param {boolean} isMilestone .
* @param {boolean} isCheckTimeZone .
* @returns {number} .
* @private
*/
DateProcessor.prototype.getDuration = function (startDate, endDate, durationUnit, isAutoSchedule, isMilestone, isCheckTimeZone) {
if (isCheckTimeZone === void 0) { isCheckTimeZone = true; }
if (!startDate || !endDate) {
return null;
}
var durationValue = 0;
var isSameDay = this.parent.getFormatedDate(startDate) === this.parent.getFormatedDate(endDate);
var totSeconds;
if (this.parent.weekWorkingTime.length > 0) {
var tempStartDate = new Date(startDate);
totSeconds = this.nonWorkingSeconds(startDate, endDate, isAutoSchedule, undefined, true);
var totalDurationInDays = 0;
while (tempStartDate <= endDate) {
var currentDateString = this.parent.getFormatedDate(tempStartDate);
var dayWorkingSeconds = this.parent['getSecondsPerDay'](tempStartDate);
var currentStartDate = new Date(tempStartDate);
var currentEndDate = new Date(tempStartDate);
currentStartDate.setHours(0, 0, 0, 0);
currentEndDate.setHours(0, 0, 0, 0);
currentStartDate.setSeconds(this.parent['getCurrentDayStartTime'](tempStartDate));
currentEndDate.setSeconds(this.parent['getCurrentDayEndTime'](tempStartDate));
if (currentDateString === this.parent.getFormatedDate(startDate)) {
currentStartDate.setTime(startDate.getTime());
}
if (currentDateString === this.parent.getFormatedDate(endDate)) {
currentEndDate.setTime(endDate.getTime());
}
var timeDiffSeconds = this.getTimeDifference(currentStartDate, currentEndDate, isCheckTimeZone) / 1000;
var nonWorkSeconds = this.getNonworkingTime(currentStartDate, currentEndDate, isAutoSchedule, isCheckTimeZone);
totalDurationInDays += Math.max(0, timeDiffSeconds - nonWorkSeconds) / dayWorkingSeconds;
tempStartDate.setDate(tempStartDate.getDate() + 1);
}
if (!(isMilestone && isSameDay)) {
durationValue = this.calculateDurationValue(durationUnit, totalDurationInDays, totSeconds);
}
}
else {
totSeconds = this.parent.secondsPerDay;
var timeDiff = this.getTimeDifference(startDate, endDate, isCheckTimeZone) / 1000;
var nonWorkHours = this.getNonworkingTime(startDate, endDate, isAutoSchedule, isCheckTimeZone);
var durationHours = timeDiff - nonWorkHours;
if (!(isMilestone && isSameDay)) {
durationValue = this.calculateDurationValue(durationUnit, durationHours / totSeconds, totSeconds);
}
}
return parseFloat(durationValue.toString());
};
DateProcessor.prototype.calculateDurationValue = function (durationUnit, duration, totSeconds) {
if (!durationUnit || durationUnit === 'day') {
return duration;
}
else if (durationUnit === 'minute') {
return duration * (totSeconds / 60);
}
else {
return duration * (totSeconds / 3600);
}
};
/**
*
* @param {number} duration .
* @param {string} durationUnit .
* @param {Date} date .
* @returns {number} .
*/
DateProcessor.prototype.getDurationAsSeconds = function (duration, durationUnit, date) {
var value = 0;
var totSeconds;
if (this.parent.weekWorkingTime.length > 0) {
totSeconds = this.parent['getSecondsPerDay'](date);
}
else {
totSeconds = this.parent.secondsPerDay;
}
if (!durationUnit || durationUnit.toLocaleLowerCase() === 'day') {
value = totSeconds * duration;
}
else if (durationUnit.toLocaleLowerCase() === 'hour') {
value = duration * 3600;
}
else {
value = duration * 60;
}
return value;
};
/**
* To get date from start date and duration
*
* @param {Date} startDate .
* @param {number} duration .
* @param {string} durationUnit .
* @param {ITaskData} ganttProp .
* @param {boolean} validateAsMilestone .
* @returns {Date} .
* @private
*/
DateProcessor.prototype.getEndDate = function (startDate, duration, durationUnit, ganttProp, validateAsMilestone) {
var tempStart = new Date(startDate.getTime());
var endDate = new Date(startDate.getTime());
var sDate = new Date(startDate.getTime());
var secondDuration;
if (this.parent.weekWorkingTime.length > 0 && (!durationUnit || durationUnit.toLocaleLowerCase() === 'day')) {
secondDuration = this.calculateSecondDuration(duration, sDate, secondDuration, startDate, true);
}
else {
secondDuration = this.getDurationAsSeconds(duration, durationUnit, startDate);
}
var nonWork = 0;
var workHours = 0;
while (secondDuration > 0) {
endDate.setSeconds(endDate.getSeconds() + secondDuration);
nonWork = this.getNonworkingTime(tempStart, endDate, ganttProp.isAutoSchedule, true);
workHours = secondDuration - nonWork;
secondDuration = secondDuration - workHours;
if (secondDuration > 0) {
endDate = this.checkStartDate(endDate, ganttProp, validateAsMilestone);
}
tempStart = new Date(endDate.getTime());
}
return endDate;
};
/**
* Calculate start date based on end date and duration.
*
* @param {Date} endDate - To calculate start date value from end date and duration.
* @param {number} duration - The duration value.
* @param {string} durationUnit - The unit of duration.
* @param {ITaskData} ganttProp - The Gantt task properties.
* @param {boolean} fromValidation - A flag indicating if the calculation is from validation.
* @returns {Date} The calculated start date.
* @private
*/
DateProcessor.prototype.getStartDate = function (endDate, duration, durationUnit, ganttProp, fromValidation) {
var tempEnd = new Date(endDate.getTime());
var startDate = new Date(endDate.getTime());
var secondDuration;
var eDate = new Date(tempEnd.getTime());
if (this.parent.weekWorkingTime.length > 0) {
secondDuration = this.calculateSecondDuration(duration, eDate, secondDuration, tempEnd, false);
}
else {
secondDuration = this.getDurationAsSeconds(duration, durationUnit, tempEnd);
}
var nonWork = 0;
var workHours = 0;
while (secondDuration > 0) {
startDate.setSeconds(startDate.getSeconds() - secondDuration);
nonWork = this.getNonworkingTime(startDate, tempEnd, ganttProp.isAutoSchedule, true);
workHours = secondDuration - nonWork;
secondDuration = secondDuration - workHours;
if (secondDuration > 0) {
tempEnd = this.checkEndDate(startDate, ganttProp);
}
tempEnd = new Date(startDate.getTime());
}
/* To render the milestone in proper date while loading */
if (fromValidation && ganttProp.isMilestone) {
startDate.setDate(startDate.getDate() - 1);
var dayEndTime = this.parent['getCurrentDayEndTime'](ganttProp.endDate ? ganttProp.isAutoSchedule ? ganttProp.endDate : ganttProp.autoEndDate : startDate);
this.parent.dateValidationModule.setTime(dayEndTime, startDate);
startDate = this.parent.dateValidationModule.checkStartDate(startDate, ganttProp, true);
}
return startDate;
};
DateProcessor.prototype.calculateSecondDuration = function (duration, sDate, secondDuration, startDate, fromEndDate) {
if (duration < 1) {
secondDuration = this.parent['getSecondsPerDay'](sDate) * duration;
}
else {
secondDuration = 0;
var durationValue = duration;
var dayStartTime = this.parent['getCurrentDayStartTime'](sDate);
var dayEndTime = this.parent['getCurrentDayEndTime'](sDate);
if (!(sDate.getHours() < dayEndTime / 3600 && sDate.getHours() > dayStartTime / 3600) && this.fromSegments) {
if (fromEndDate) {
sDate.setDate(sDate.getDate() + 1);
}
else {
sDate.setDate(sDate.getDate() - 1);
}
}
while (durationValue > 0) {
if (this.isOnHolidayOrWeekEnd(sDate, true)) {
do {
if (fromEndDate) {
sDate.setDate(sDate.getDate() + 1);
}
else {
sDate.setDate(sDate.getDate() - 1);
}
} while (this.isOnHolidayOrWeekEnd(sDate, true));
}
if (!this.parent.includeWeekend) {
sDate = fromEndDate ? this.getNextWorkingDay(sDate) : this.getPreviousWorkingDay(sDate);
}
var totSeconds = this.parent['getSecondsPerDay'](sDate);
var num = 0;
if (this.getSecondsInDecimal(startDate) !== this.parent['getStartTime'](startDate) && !Number.isInteger(durationValue)) {
var deciNumber = duration.toString().split('.');
num = parseFloat('.' + deciNumber[1]);
totSeconds = totSeconds * num;
durationValue = durationValue - num;
}
if (durationValue < 1) {
totSeconds = totSeconds * durationValue;
}
secondDuration = secondDuration + totSeconds;
if (fromEndDate) {
sDate.setDate(sDate.getDate() + 1);
}
else {
sDate.setDate(sDate.getDate() - 1);
}
if (!num) {
durationValue--;
}
}
}
return secondDuration;
};
/**
* @param {ITaskData} ganttProp .
* @param {boolean} isLoad .
* @returns {Date} .
* @private
*/
DateProcessor.prototype.getProjectStartDate = function (ganttProp, isLoad) {
if (!isNullOrUndefined(this.parent.cloneProjectStartDate)) {
if (typeof this.parent.cloneProjectStartDate === 'string') {
this.parent.cloneProjectStartDate = this.getDateFromFormat(this.parent.cloneProjectStartDate);
}
var cloneStartDate = this.checkStartDate(this.parent.cloneProjectStartDate);
this.parent.cloneProjectStartDate = cloneStartDate;
return new Date(cloneStartDate.getTime());
}
else if (!isNullOrUndefined(this.parent.projectStartDate)) {
var cloneStartDate = this.getDateFromFormat(this.parent.projectStartDate);
this.parent.cloneProjectStartDate = this.checkStartDate(cloneStartDate);
}
else if (!isNullOrUndefined(isLoad)) {
var flatData = this.parent.flatData;
var minStartDate = void 0;
if (flatData.length > 0) {
minStartDate = flatData[0].ganttProperties.startDate;
}
else {
minStartDate = new Date();
minStartDate.setHours(0, 0, 0, 0);
}
for (var index = 1; index < flatData.length; index++) {
var startDate = flatData[index].ganttProperties.startDate;
if (!isNullOrUndefined(startDate) && this.compareDates(startDate, minStartDate) === -1) {
minStartDate = startDate;
}
}
this.parent.cloneProjectStartDate = this.checkStartDate(minStartDate, ganttProp);
}
else {
return null;
}
return new Date(this.parent.cloneProjectStartDate.getTime());
};
/**
* @param {ITaskData} ganttProp .
* @param {boolean} isAuto .
* @returns {Date} .
* @private
*/
DateProcessor.prototype.getValidStartDate = function (ganttProp, isAuto) {
var sDate = null;
var startDate = isAuto ? ganttProp.autoStartDate : ganttProp.startDate;
var endDate = isAuto ? ganttProp.autoEndDate : ganttProp.endDate;
var duration = !ganttProp.isAutoSchedule && ganttProp.autoDuration ? ganttProp.autoDuration : ganttProp.duration;
if (isNullOrUndefined(startDate)) {
if (!isNullOrUndefined(endDate)) {
sDate = new Date(endDate.getTime());
var dayStartTime = this.parent['getCurrentDayStartTime'](sDate);
this.setTime(dayStartTime, sDate);
}
else if (!isNullOrUndefined(duration)) {
var ganttTask = this.parent.getTaskByUniqueID(ganttProp.uniqueID);
if (this.parent.allowUnscheduledTasks && ganttTask &&
ganttTask.parentItem && isNullOrUndefined(startDate) && isNullOrUndefined(endDate)) {
var parentTask = this.parent.getParentTask(ganttTask.parentItem);
while (parentTask && !parentTask.ganttProperties.startDate) {
parentTask = this.parent.getParentTask(parentTask.parentItem);
}
sDate = (!parentTask || !parentTask.ganttProperties.startDate) ? this.parent.cloneProjectStartDate
: parentTask.ganttProperties.startDate;
}
else {
sDate = this.getProjectStartDate(ganttProp);
}
}
}
else {
sDate = new Date(startDate.getTime());
}
return sDate;
};
/**
*
* @param {ITaskData} ganttProp .
* @param {boolean} isAuto .
* @returns {Date} .
* @private
*/
DateProcessor.prototype.getValidEndDate = function (ganttProp, isAuto) {
var eDate = null;
var startDate = isAuto ? ganttProp.autoStartDate : ganttProp.startDate;
var endDate = isAuto ? ganttProp.autoEndDate : ganttProp.endDate;
var duration = isAuto ? ganttProp.autoDuration : ganttProp.duration;
if (isNullOrUndefined(endDate)) {
if (!isNullOrUndefined(startDate)) {
if (ganttProp.isMilestone) {
eDate = this.checkStartDate(startDate);
}
else {
eDate = new Date(startDate.getTime());
var dayEndTime = this.parent['getCurrentDayEndTime'](endDate ? endDate : eDate);
this.setTime(dayEndTime, eDate);
}
}
else if (!isNullOrUndefined(duration)) {
var sDate = this.getValidStartDate(ganttProp);
if (sDate) {
eDate = this.getEndDate(sDate, duration, ganttProp.durationUnit, ganttProp, false);
}
}
}
else {
eDate = new Date(endDate.getTime());
}
return eDate;
};
DateProcessor.prototype.getWorkingTime = function (day, currentRange, startDate, totalSeconds, count, nonWorkingHours, workingTimeRanges, nonWorkingTimeRanges) {
if (!isNullOrUndefined(currentRange.from) && !isNullOrUndefined(currentRange.to)) {
startDate.setHours(0, 0, 0, 0);
var tempDate = new Date(startDate.getTime());
startDate.setTime(startDate.getTime() + (currentRange.from * 3600000));
var startHour = new Date(startDate.getTime());
if (currentRange.to === 24) {
var currentRangeTo = 24 * 60 * 60 * 1000;
tempDate.setTime(tempDate.getTime() + (currentRangeTo));
}
else {
tempDate.setTime(tempDate.getTime() + (currentRange.to * 3600000));
}
var endHour = new Date(tempDate.getTime());
var timeDiff = endHour.getTime() - startHour.getTime();
var sdSeconds = this.getSecondsInDecimal(startHour);
var edSeconds = this.getSecondsInDecimal(endHour);
if (edSeconds === 0) {
edSeconds = 86400;
}
totalSeconds += timeDiff / 1000;
if (count === 0) {
this.parent.defaultStartTime = sdSeconds;
if (this.parent.weekWorkingTime.length > 0) {
this.assignStartTime(day, sdSeconds);
}
}
if (count === this[day.toLowerCase() + 'TimeRangeLength'] - 1 || day === '') {
this.parent.defaultEndTime = edSeconds;
if (this.parent.weekWorkingTime.length > 0) {
this.assignEndTime(day, edSeconds);
}
}
if (count > 0) {
if (day === '') {
nonWorkingHours.push(nonWorkingHours[nonWorkingHours.length - 1] +
sdSeconds - workingTimeRanges[count - 1].to);