@syncfusion/ej2-gantt 21.2.6 → 21.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -387,7 +387,7 @@ class DateProcessor {
387
387
  else if (hour > this.parent.defaultStartTime && hour < this.parent.defaultEndTime) {
388
388
  for (let i = 0; i < this.parent.workingTimeRanges.length; i++) {
389
389
  const value = this.parent.workingTimeRanges[i];
390
- if (hour >= value.to && (this.parent.workingTimeRanges[i + 1] &&
390
+ if (hour > value.to && (this.parent.workingTimeRanges[i + 1] &&
391
391
  hour < this.parent.workingTimeRanges[i + 1].from)) {
392
392
  this.setTime(this.parent.workingTimeRanges[i + 1].from, cloneDate);
393
393
  break;
@@ -1885,7 +1885,7 @@ class TaskProcessor extends DateProcessor {
1885
1885
  (this.parent.taskMode === 'Manual') ? false :
1886
1886
  data[taskSettings.manual] === true ? false : true;
1887
1887
  this.parent.setRecordValue('ganttProperties', ganttProperties, ganttData);
1888
- if (!isNullOrUndefined(data[taskSettings.id])) {
1888
+ if (!isNullOrUndefined(data[taskSettings.id]) && (!((this.parent.viewType === "ResourceView" && level == 0))) || data[taskSettings.name] === "Unassigned Task") {
1889
1889
  id = data[taskSettings.id];
1890
1890
  name = data[taskSettings.name];
1891
1891
  this.addTaskData(ganttData, data, isLoad);
@@ -2039,29 +2039,53 @@ class TaskProcessor extends DateProcessor {
2039
2039
  startDate = this.checkStartDate(startDate, data.ganttProperties, false);
2040
2040
  if (!isNullOrUndefined(duration)) {
2041
2041
  endDate = this.getEndDate(startDate, duration, data.ganttProperties.durationUnit, data.ganttProperties, false);
2042
+ if (taskSettings.duration) {
2043
+ remainingDuration = data.ganttProperties.duration - sumOfDuration;
2044
+ if (remainingDuration <= 0) {
2045
+ continue;
2046
+ }
2047
+ duration = i === segments.length - 1 ? remainingDuration : remainingDuration > 0 &&
2048
+ duration > remainingDuration ? remainingDuration : duration;
2049
+ endDate = this.getEndDate(startDate, duration, data.ganttProperties.durationUnit, data.ganttProperties, false);
2050
+ }
2051
+ else if (!taskSettings.duration && taskSettings.endDate) {
2052
+ endDate = (!isNullOrUndefined(data.ganttProperties.endDate)) && endDate.getTime() >
2053
+ data.ganttProperties.endDate.getTime() && i !== segments.length - 1 ? endDate : data.ganttProperties.endDate;
2054
+ duration = this.getDuration(startDate, endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
2055
+ if (ganttSegments.length > 0 && endDate.getTime() < startDate.getTime()
2056
+ && endDate.getTime() <= data.ganttProperties.endDate.getTime()) {
2057
+ ganttSegments[i - 1].duration = this.getDuration(ganttSegments[i - 1].startDate, data.ganttProperties.endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
2058
+ continue;
2059
+ }
2060
+ }
2042
2061
  }
2043
2062
  else {
2044
2063
  endDate = this.getDateFromFormat(endDate);
2064
+ if (endDate && (isNullOrUndefined(duration) || String(duration) === '')) {
2065
+ if (endDate.getHours() === 0 && this.parent.defaultEndTime !== 86400) {
2066
+ this.setTime(this.parent.defaultEndTime, endDate);
2067
+ }
2068
+ }
2045
2069
  endDate = this.checkEndDate(endDate, data.ganttProperties, false);
2046
2070
  duration = this.getDuration(startDate, endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
2047
- }
2048
- if (taskSettings.duration) {
2049
- remainingDuration = data.ganttProperties.duration - sumOfDuration;
2050
- if (remainingDuration <= 0) {
2051
- continue;
2071
+ if (taskSettings.duration) {
2072
+ remainingDuration = data.ganttProperties.duration - sumOfDuration - 1;
2073
+ if (remainingDuration <= 0) {
2074
+ continue;
2075
+ }
2076
+ duration = i === segments.length - 1 ? remainingDuration : remainingDuration > 0 &&
2077
+ duration > remainingDuration ? remainingDuration : duration;
2078
+ endDate = this.getEndDate(startDate, duration, data.ganttProperties.durationUnit, data.ganttProperties, false);
2052
2079
  }
2053
- duration = i === segments.length - 1 ? remainingDuration : remainingDuration > 0 &&
2054
- duration > remainingDuration ? remainingDuration : duration;
2055
- endDate = this.getEndDate(startDate, duration, data.ganttProperties.durationUnit, data.ganttProperties, false);
2056
- }
2057
- else if (!taskSettings.duration && taskSettings.endDate) {
2058
- endDate = (!isNullOrUndefined(data.ganttProperties.endDate)) && endDate.getTime() >
2059
- data.ganttProperties.endDate.getTime() && i !== segments.length - 1 ? endDate : data.ganttProperties.endDate;
2060
- duration = this.getDuration(startDate, endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
2061
- if (ganttSegments.length > 0 && endDate.getTime() < startDate.getTime()
2062
- && endDate.getTime() <= data.ganttProperties.endDate.getTime()) {
2063
- ganttSegments[i - 1].duration = this.getDuration(ganttSegments[i - 1].startDate, data.ganttProperties.endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
2064
- continue;
2080
+ else if (!taskSettings.duration && taskSettings.endDate) {
2081
+ endDate = (!isNullOrUndefined(data.ganttProperties.endDate)) && endDate.getTime() >
2082
+ data.ganttProperties.endDate.getTime() && i !== segments.length - 1 ? endDate : data.ganttProperties.endDate;
2083
+ duration = this.getDuration(startDate, endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
2084
+ if (ganttSegments.length > 0 && endDate.getTime() < startDate.getTime()
2085
+ && endDate.getTime() <= data.ganttProperties.endDate.getTime()) {
2086
+ ganttSegments[i - 1].duration = this.getDuration(ganttSegments[i - 1].startDate, data.ganttProperties.endDate, data.ganttProperties.durationUnit, data.ganttProperties.isAutoSchedule, data.ganttProperties.isMilestone);
2087
+ continue;
2088
+ }
2065
2089
  }
2066
2090
  }
2067
2091
  segment = {};
@@ -2302,7 +2326,7 @@ class TaskProcessor extends DateProcessor {
2302
2326
  startDate = this.getDateFromFormat(data[taskSettings.startDate], true);
2303
2327
  endDate = this.getDateFromFormat(data[taskSettings.endDate], true);
2304
2328
  }
2305
- const segments = taskSettings.segments ? (data[taskSettings.segments] ||
2329
+ const segments = taskSettings.segments && (!isNullOrUndefined(data[taskSettings.segments]) || !isNullOrUndefined(ganttData.taskData)) ? (data[taskSettings.segments] ||
2306
2330
  ganttData.taskData[taskSettings.segments]) : null;
2307
2331
  const isMileStone = taskSettings.milestone ? data[taskSettings.milestone] ? true : false : false;
2308
2332
  const durationMapping = data[taskSettings.durationUnit] ? data[taskSettings.durationUnit] : '';
@@ -3125,6 +3149,9 @@ class TaskProcessor extends DateProcessor {
3125
3149
  return resourceIdCollection;
3126
3150
  }
3127
3151
  resourceIdCollection = data[this.parent.taskFields.resourceInfo];
3152
+ if (resourceIdCollection != "" && typeof resourceIdCollection == "string") {
3153
+ resourceIdCollection = resourceIdCollection.split(',');
3154
+ }
3128
3155
  let resourceData;
3129
3156
  if (!isNullOrUndefined(this.parent.editModule) && !isNullOrUndefined(this.parent.editModule.dialogModule)
3130
3157
  && this.parent.editModule.dialogModule.isAddNewResource) {
@@ -3134,6 +3161,7 @@ class TaskProcessor extends DateProcessor {
3134
3161
  resourceData = this.parent.resources;
3135
3162
  }
3136
3163
  const resourceIDMapping = this.parent.resourceFields.id;
3164
+ const resourceNameMapping = this.parent.resourceFields.name;
3137
3165
  const resourceUnitMapping = this.parent.resourceFields.unit;
3138
3166
  const resourceGroup = this.parent.resourceFields.group;
3139
3167
  const resources = [];
@@ -3144,7 +3172,7 @@ class TaskProcessor extends DateProcessor {
3144
3172
  return true;
3145
3173
  }
3146
3174
  else {
3147
- return (resourceIdCollection[count] === resourceInfo[resourceIDMapping]);
3175
+ return (resourceIdCollection[count] === resourceInfo[resourceIDMapping]) || (resourceIdCollection[count] === resourceInfo[resourceNameMapping]);
3148
3176
  }
3149
3177
  });
3150
3178
  const ganttDataResource = extend({}, resource[0]);
@@ -3882,6 +3910,9 @@ class TaskProcessor extends DateProcessor {
3882
3910
  }
3883
3911
  }
3884
3912
  this.parent.setRecordValue('isMilestone', milestone, parentProp, true);
3913
+ if (!isNullOrUndefined(this.parent.taskFields.milestone)) {
3914
+ this.updateMappingData(parentData, 'milestone');
3915
+ }
3885
3916
  if (parentProp.isAutoSchedule) {
3886
3917
  this.calculateDuration(parentData);
3887
3918
  }
@@ -4612,7 +4643,7 @@ class GanttChart {
4612
4643
  setVirtualHeight() {
4613
4644
  if (this.parent.virtualScrollModule && this.parent.enableVirtualization) {
4614
4645
  const wrapper = getValue('virtualTrack', this.parent.ganttChartModule.virtualRender);
4615
- wrapper.style.height = this.parent.treeGrid.element.getElementsByClassName('e-virtualtable')[0].style.height;
4646
+ wrapper.style.height = this.parent.treeGrid.element.getElementsByClassName('e-virtualtrack')[0].style.height;
4616
4647
  const wrapper1 = getValue('wrapper', this.parent.ganttChartModule.virtualRender);
4617
4648
  const treegridVirtualHeight = this.parent.treeGrid.element.getElementsByClassName('e-virtualtable')[0].style.transform;
4618
4649
  wrapper1.style.transform = treegridVirtualHeight;
@@ -5301,7 +5332,13 @@ class GanttChart {
5301
5332
  * @private
5302
5333
  */
5303
5334
  getRecordByTaskBar(target) {
5304
- const item = this.parent.currentViewData[this.getIndexByTaskBar(target)];
5335
+ let item;
5336
+ if (this.parent.enableVirtualization && this.parent.enableMultiTaskbar) {
5337
+ item = this.parent.flatData[this.getIndexByTaskBar(target)];
5338
+ }
5339
+ else {
5340
+ item = this.parent.currentViewData[this.getIndexByTaskBar(target)];
5341
+ }
5305
5342
  return item;
5306
5343
  }
5307
5344
  /**
@@ -5659,7 +5696,12 @@ class GanttChart {
5659
5696
  else {
5660
5697
  const id = row.getAttribute('rowUniqueId');
5661
5698
  const record = this.parent.getRecordByID(id);
5662
- recordIndex = this.parent.currentViewData.indexOf(record);
5699
+ if (this.parent.enableVirtualization && this.parent.enableMultiTaskbar) {
5700
+ recordIndex = this.parent.flatData.indexOf(record);
5701
+ }
5702
+ else {
5703
+ recordIndex = this.parent.currentViewData.indexOf(record);
5704
+ }
5663
5705
  }
5664
5706
  return recordIndex;
5665
5707
  }
@@ -7063,9 +7105,11 @@ class Timeline {
7063
7105
  const validStartLeft = this.parent.dataOperation.getTaskLeft(validStartDate, false);
7064
7106
  const validEndLeft = this.parent.dataOperation.getTaskLeft(validEndDate, false);
7065
7107
  let isChanged;
7108
+ let taskbarModule = this.parent.editModule.taskbarEditModule;
7066
7109
  if (!isNullOrUndefined(maxStartLeft) && ((minStartDate < this.timelineStartDate) ||
7067
- (!isNullOrUndefined(this.parent.editModule.taskbarEditModule)) &&
7068
- (!isNullOrUndefined(this.parent.editModule.taskbarEditModule.taskBarEditAction))) && (maxStartLeft < this.bottomTierCellWidth || maxStartLeft <= validStartLeft)) {
7110
+ (!isNullOrUndefined(taskbarModule)) && (!isNullOrUndefined(taskbarModule.taskBarEditAction)
7111
+ && taskbarModule.taskBarEditAction !== 'ProgressResizing' &&
7112
+ taskbarModule.taskBarEditAction !== 'RightResizing')) && (maxStartLeft < this.bottomTierCellWidth || maxStartLeft <= validStartLeft)) {
7069
7113
  isChanged = 'prevTimeSpan';
7070
7114
  minStartDate = minStartDate > this.timelineStartDate ? this.timelineStartDate : minStartDate;
7071
7115
  }
@@ -7659,7 +7703,7 @@ class GanttTreeGrid {
7659
7703
  this.parent.columnByField = {};
7660
7704
  this.parent.customColumns = [];
7661
7705
  const tasksMapping = ['id', 'name', 'startDate', 'endDate', 'duration', 'dependency',
7662
- 'progress', 'baselineStartDate', 'baselineEndDate', 'resourceInfo', 'notes', 'work', 'manual', 'type'];
7706
+ 'progress', 'baselineStartDate', 'baselineEndDate', 'resourceInfo', 'notes', 'work', 'manual', 'type', 'milestone'];
7663
7707
  for (let i = 0; i < length; i++) {
7664
7708
  let column = {};
7665
7709
  if (typeof ganttObj.columns[i] === 'string') {
@@ -8001,7 +8045,7 @@ class GanttTreeGrid {
8001
8045
  }
8002
8046
  } // eslint-disable-next-line
8003
8047
  durationValueAccessor(field, data, column) {
8004
- const ganttProp = data.ganttProperties;
8048
+ const ganttProp = (!isNullOrUndefined(data)) ? data.ganttProperties : null;
8005
8049
  if (!isNullOrUndefined(ganttProp)) {
8006
8050
  return this.parent.dataOperation.getDurationString(ganttProp.duration, ganttProp.durationUnit);
8007
8051
  }
@@ -8725,7 +8769,7 @@ class ChartRows extends DateProcessor {
8725
8769
  if (this.taskLabelTemplateFunction && !isNullOrUndefined(progressDiv) && progressDiv.length > 0) {
8726
8770
  const taskLabelTemplateNode = this.taskLabelTemplateFunction(extend({ index: i }, data), this.parent, 'TaskLabelTemplate', this.getTemplateID('TaskLabelTemplate'), false, undefined, progressDiv[0]);
8727
8771
  if (taskLabelTemplateNode && taskLabelTemplateNode.length > 0) {
8728
- tempDiv.appendChild(taskLabelTemplateNode[0]);
8772
+ append(taskLabelTemplateNode, tempDiv);
8729
8773
  labelString = tempDiv.innerHTML;
8730
8774
  }
8731
8775
  }
@@ -8780,7 +8824,7 @@ class ChartRows extends DateProcessor {
8780
8824
  (isNullOrUndefined(data.ganttProperties.segments) || (!isNullOrUndefined(data.ganttProperties.segments) &&
8781
8825
  data.ganttProperties.segments.length === 0))) {
8782
8826
  if (template !== '' && !isNullOrUndefined(progressDiv) && progressDiv.length > 0) {
8783
- let templateElement = this.createDivElement(template)[0];
8827
+ const templateElement = this.createDivElement(template)[0];
8784
8828
  if (this.parent.disableHtmlEncode) {
8785
8829
  templateElement.innerText = labelString;
8786
8830
  }
@@ -8795,7 +8839,7 @@ class ChartRows extends DateProcessor {
8795
8839
  !this.isTemplate(childLabel) &&
8796
8840
  progressDiv[0].querySelectorAll('.e-task-label')[0].children[0])
8797
8841
  progressDiv[0].querySelectorAll('.e-task-label')[0].children[0].remove();
8798
- if (progressDiv[0].querySelectorAll('.e-task-label')[0].textContent == '' &&
8842
+ if (progressDiv[0].querySelectorAll('.e-task-label')[0].textContent === '' &&
8799
8843
  childLabel && !childLabel['elementRef'] && tempDiv.innerHTML !== '')
8800
8844
  progressDiv[0].querySelectorAll('.e-task-label')[0].textContent = childLabel;
8801
8845
  }
@@ -9280,7 +9324,7 @@ class ChartRows extends DateProcessor {
9280
9324
  if (leftLabelTemplateNode[0]['data'] === 'null') {
9281
9325
  leftLabelTemplateNode[0]['data'] = '';
9282
9326
  }
9283
- leftLabelNode[0].appendChild([].slice.call(leftLabelTemplateNode)[0]);
9327
+ append(leftLabelTemplateNode, leftLabelNode[0]);
9284
9328
  }
9285
9329
  if (this.parent.enableRtl) {
9286
9330
  leftLabelNode[0].style.paddingLeft = '25px';
@@ -9335,7 +9379,7 @@ class ChartRows extends DateProcessor {
9335
9379
  if (rightLabelTemplateNode[0]['data'] === 'null') {
9336
9380
  rightLabelTemplateNode[0]['data'] = '';
9337
9381
  }
9338
- rightLabelNode[0].appendChild([].slice.call(rightLabelTemplateNode)[0]);
9382
+ append(rightLabelTemplateNode, rightLabelNode[0]);
9339
9383
  }
9340
9384
  if (this.parent.enableRtl) {
9341
9385
  rightLabelNode[0].style.marginLeft = '0px';
@@ -9466,7 +9510,7 @@ class ChartRows extends DateProcessor {
9466
9510
  !this.isTemplate(parentLabel) &&
9467
9511
  progressBarInnerDiv[0].querySelectorAll('.e-task-label')[0].children[0])
9468
9512
  progressBarInnerDiv[0].querySelectorAll('.e-task-label')[0].children[0].remove();
9469
- if (progressBarInnerDiv[0].querySelectorAll('.e-task-label')[0].textContent == '' &&
9513
+ if (progressBarInnerDiv[0].querySelectorAll('.e-task-label')[0].textContent === '' &&
9470
9514
  parentLabel && !parentLabel['elementRef'] && div.innerHTML !== '')
9471
9515
  progressBarInnerDiv[0].querySelectorAll('.e-task-label')[0].textContent = parentLabel;
9472
9516
  }
@@ -9496,11 +9540,19 @@ class ChartRows extends DateProcessor {
9496
9540
  * @returns {NodeList} .
9497
9541
  * @private
9498
9542
  */
9499
- getTableTrNode() {
9543
+ getTableTrNode(i) {
9500
9544
  const table = createElement('table');
9501
9545
  const className = (this.parent.gridLines === 'Horizontal' || this.parent.gridLines === 'Both') ?
9502
9546
  'e-chart-row-border' : '';
9503
- table.innerHTML = '<tr class="' + this.getRowClassName(this.templateData) + ' ' + chartRow + '"' +
9547
+ const rows = this.parent.treeGrid.grid.contentModule.getRows()[i];
9548
+ let activecls;
9549
+ if (rows && rows.isSelected) {
9550
+ activecls = 'e-active';
9551
+ }
9552
+ else {
9553
+ activecls = '';
9554
+ }
9555
+ table.innerHTML = '<tr class="' + this.getRowClassName(this.templateData) + ' ' + chartRow + ' ' + (activecls) + '"' +
9504
9556
  'style="display:' + this.getExpandDisplayProp(this.templateData) + ';height:' +
9505
9557
  this.parent.rowHeight + 'px;">' +
9506
9558
  '<td class="' + chartRowCell + ' ' + className
@@ -9610,7 +9662,7 @@ class ChartRows extends DateProcessor {
9610
9662
  return this.createDivElement(template);
9611
9663
  }
9612
9664
  childTaskbarProgressResizer() {
9613
- let width = this.parent.enableRtl ? (this.templateData.ganttProperties.progressWidth + 8) : (this.templateData.ganttProperties.progressWidth - 6);
9665
+ const width = this.parent.enableRtl ? (this.templateData.ganttProperties.progressWidth + 8) : (this.templateData.ganttProperties.progressWidth - 6);
9614
9666
  const template = '<div class="' + childProgressResizer + '"' +
9615
9667
  'style="' + (this.parent.enableRtl ? 'right:' : 'left:') + width + 'px;margin-top:' +
9616
9668
  (this.taskBarHeight - 4) + 'px;"><div class="' + progressBarHandler + '"' +
@@ -9937,7 +9989,7 @@ class ChartRows extends DateProcessor {
9937
9989
  this.parent.renderTemplates();
9938
9990
  this.triggerQueryTaskbarInfo();
9939
9991
  this.parent.modifiedRecords = [];
9940
- if (this.parent.viewType == 'ResourceView' && this.parent.showOverAllocation) {
9992
+ if (this.parent.viewType === 'ResourceView' && this.parent.showOverAllocation) {
9941
9993
  this.updateOverlapped();
9942
9994
  }
9943
9995
  if (collapsedResourceRecord.length) {
@@ -9961,7 +10013,7 @@ class ChartRows extends DateProcessor {
9961
10013
  getGanttChartRow(i, tempTemplateData) {
9962
10014
  this.templateData = tempTemplateData;
9963
10015
  let taskBaselineTemplateNode = null;
9964
- const parentTrNode = this.getTableTrNode();
10016
+ const parentTrNode = this.getTableTrNode(i);
9965
10017
  const leftLabelNode = this.getLeftLabelNode(i);
9966
10018
  const taskbarContainerNode = this.taskbarContainer();
9967
10019
  taskbarContainerNode[0].setAttribute('aria-label', this.generateAriaLabel(this.templateData));
@@ -9991,12 +10043,12 @@ class ChartRows extends DateProcessor {
9991
10043
  }
9992
10044
  }
9993
10045
  if ((this.templateData.ganttProperties.autoDuration !== 0) && !this.templateData.ganttProperties.isMilestone && parentTaskbarTemplateNode && parentTaskbarTemplateNode.length > 0) {
9994
- taskbarContainerNode[0].appendChild([].slice.call(parentTaskbarTemplateNode)[0]);
10046
+ append(parentTaskbarTemplateNode, taskbarContainerNode[0]);
9995
10047
  }
9996
10048
  else if ((this.templateData.ganttProperties.duration === 0 && this.templateData.ganttProperties.isMilestone && this.templateData.ganttProperties.isAutoSchedule)) {
9997
10049
  const milestoneTemplateNode = this.getMilestoneNode(i, taskbarContainerNode);
9998
10050
  if (milestoneTemplateNode && milestoneTemplateNode.length > 0) {
9999
- taskbarContainerNode[0].appendChild([].slice.call(milestoneTemplateNode)[0]);
10051
+ append(milestoneTemplateNode, taskbarContainerNode[0]);
10000
10052
  }
10001
10053
  }
10002
10054
  if (this.parent.renderBaseline && this.templateData.ganttProperties.baselineStartDate &&
@@ -10050,7 +10102,7 @@ class ChartRows extends DateProcessor {
10050
10102
  }
10051
10103
  }
10052
10104
  else {
10053
- taskbarContainerNode[0].appendChild([].slice.call(childTaskbarTemplateNode)[0]);
10105
+ append(childTaskbarTemplateNode, taskbarContainerNode[0]);
10054
10106
  }
10055
10107
  }
10056
10108
  if (childTaskbarProgressResizeNode) {
@@ -10401,8 +10453,8 @@ class ChartRows extends DateProcessor {
10401
10453
  }
10402
10454
  // To update the row height when allow overallocation set to false
10403
10455
  updateDragDropRecords(data, tr) {
10404
- let childRecords = data.childRecords;
10405
- let rowIndex = this.parent.currentViewData.indexOf(data);
10456
+ const childRecords = data.childRecords;
10457
+ const rowIndex = this.parent.currentViewData.indexOf(data);
10406
10458
  let treeGridContentHeight = this.parent.enableRtl ? this.parent['element'].getElementsByClassName('e-content')[2].children[0]['offsetHeight'] :
10407
10459
  this.parent['element'].getElementsByClassName('e-content')[0].children[0]['offsetHeight'];
10408
10460
  if (!tr) {
@@ -10512,6 +10564,19 @@ class ChartRows extends DateProcessor {
10512
10564
  }
10513
10565
  }
10514
10566
  }
10567
+ updateResourceTaskbarElement(tRow, parentTr) {
10568
+ const cloneElement = tRow.querySelector('.e-taskbar-main-container');
10569
+ addClass([cloneElement], 'collpse-parent-border');
10570
+ const id = tRow.querySelector('.' + taskBarMainContainer).getAttribute('rowUniqueId');
10571
+ const ganttData = this.parent.getRecordByID(id);
10572
+ let zIndex = "";
10573
+ if (ganttData && !isNullOrUndefined(ganttData.ganttProperties.eOverlapIndex)) {
10574
+ zIndex = (ganttData.ganttProperties.eOverlapIndex).toString();
10575
+ }
10576
+ const cloneChildElement = cloneElement.cloneNode(true);
10577
+ cloneChildElement.style.zIndex = zIndex;
10578
+ parentTr[0].childNodes[0].childNodes[0].childNodes[0].appendChild(cloneChildElement);
10579
+ }
10515
10580
  getResourceParent(record) {
10516
10581
  const chartRows = this.parent.ganttChartModule.getChartRows();
10517
10582
  //Below code is for rendering taskbartemplate in resource view with multi taskbar
@@ -10535,20 +10600,19 @@ class ChartRows extends DateProcessor {
10535
10600
  parentTrNode[0].childNodes[0].childNodes[0].appendChild(collapseParent);
10536
10601
  const tasks = this.parent.dataOperation.setSortedChildTasks(record);
10537
10602
  this.parent.dataOperation.updateOverlappingIndex(tasks);
10538
- for (let i = 0; i < chartRows.length; i++) {
10539
- if (chartRows[i].classList.contains('gridrowtaskId'
10540
- + record.ganttProperties.rowUniqueID + 'level' + (record.level + 1))) {
10541
- const cloneElement = chartRows[i].querySelector('.e-taskbar-main-container');
10542
- addClass([cloneElement], 'collpse-parent-border');
10543
- const id = chartRows[i].querySelector('.' + taskBarMainContainer).getAttribute('rowUniqueId');
10544
- const ganttData = this.parent.getRecordByID(id);
10545
- let zIndex = "";
10546
- if (ganttData && !isNullOrUndefined(ganttData.ganttProperties.eOverlapIndex)) {
10547
- zIndex = (ganttData.ganttProperties.eOverlapIndex).toString();
10603
+ let tRow;
10604
+ if (this.parent.enableVirtualization) {
10605
+ for (let i = 0; i < record.childRecords.length; i++) {
10606
+ tRow = this.getGanttChartRow(record.childRecords[i].index, this.parent.flatData[record.childRecords[i].index]);
10607
+ this.updateResourceTaskbarElement(tRow, parentTrNode);
10608
+ }
10609
+ }
10610
+ else {
10611
+ for (let i = 0; i < chartRows.length; i++) {
10612
+ if (chartRows[i].classList.contains('gridrowtaskId'
10613
+ + record.ganttProperties.rowUniqueID + 'level' + (record.level + 1))) {
10614
+ this.updateResourceTaskbarElement(chartRows[i], parentTrNode);
10548
10615
  }
10549
- const cloneChildElement = cloneElement.cloneNode(true);
10550
- cloneChildElement.style.zIndex = zIndex;
10551
- parentTrNode[0].childNodes[0].childNodes[0].childNodes[0].appendChild(cloneChildElement);
10552
10616
  }
10553
10617
  }
10554
10618
  parentTrNode[0].childNodes[0].childNodes[0].appendChild([].slice.call(leftLabelNode)[0]);
@@ -11055,6 +11119,15 @@ class Dependency {
11055
11119
  for (let count = 0; count < totLength; count++) {
11056
11120
  if (flatData[count].ganttProperties.predecessorsName) {
11057
11121
  this.validatePredecessorDates(flatData[count]);
11122
+ let predecessorCollection = flatData[count].ganttProperties.predecessor;
11123
+ if (predecessorCollection && predecessorCollection.length > 1) {
11124
+ for (let i = 0; i < predecessorCollection.length; i++) {
11125
+ const validateRecord = this.parent.getRecordByID(predecessorCollection[i].to);
11126
+ if (validateRecord) {
11127
+ this.validatePredecessorDates(validateRecord);
11128
+ }
11129
+ }
11130
+ }
11058
11131
  if (flatData[count].hasChildRecords && this.parent.editModule && !this.parent.allowUnscheduledTasks
11059
11132
  && this.parent.allowParentDependency) {
11060
11133
  this.parent.editModule['updateChildItems'](flatData[count]);
@@ -19671,7 +19744,8 @@ class TaskbarEdit extends DateProcessor {
19671
19744
  this.dependencyCancel = true;
19672
19745
  }
19673
19746
  if ((this.taskBarEditAction === 'ConnectorPointLeftDrag' ||
19674
- this.taskBarEditAction === 'ConnectorPointRightDrag') && this.drawPredecessor) {
19747
+ this.taskBarEditAction === 'ConnectorPointRightDrag') && this.drawPredecessor && (!this.connectorSecondRecord.hasChildRecords ||
19748
+ this.connectorSecondRecord.hasChildRecords && this.parent.allowParentDependency)) {
19675
19749
  this.parent.connectorLineEditModule.updatePredecessor(this.connectorSecondRecord, this.finalPredecessor);
19676
19750
  if (this.parent.UpdateOffsetOnTaskbarEdit) {
19677
19751
  this.parent.connectorLineEditModule['calculateOffset'](this.connectorSecondRecord);
@@ -20004,7 +20078,9 @@ class TaskbarEdit extends DateProcessor {
20004
20078
  }
20005
20079
  this.showHideTaskBarEditingElements(element, this.highlightedSecondElement, true);
20006
20080
  }
20007
- if (isNullOrUndefined(this.connectorSecondAction) && !isNullOrUndefined(this.connectorSecondElement)) {
20081
+ if (isNullOrUndefined(this.connectorSecondAction) && !isNullOrUndefined(this.connectorSecondElement) &&
20082
+ (!this.connectorSecondRecord.hasChildRecords || this.connectorSecondRecord.hasChildRecords &&
20083
+ this.parent.allowParentDependency)) {
20008
20084
  this.editTooltip.showHideTaskbarEditTooltip(false, this.segmentIndex);
20009
20085
  removeClass([this.connectorSecondElement.querySelector('.' + connectorPointLeft)], [connectorPointAllowBlock]);
20010
20086
  removeClass([this.connectorSecondElement.querySelector('.' + connectorPointRight)], [connectorPointAllowBlock]);
@@ -23464,6 +23540,7 @@ class Edit$2 {
23464
23540
  this.isFromDeleteMethod = false;
23465
23541
  this.targetedRecords = [];
23466
23542
  this.isNewRecordAdded = false;
23543
+ this.isValidatedEditedRecord = false;
23467
23544
  /** @hidden */
23468
23545
  this.updateParentRecords = [];
23469
23546
  /** @hidden */
@@ -24116,8 +24193,9 @@ class Edit$2 {
24116
24193
  (isNullOrUndefined(taskData.startDate) && !isNullOrUndefined(prevStart)) ||
24117
24194
  (isNullOrUndefined(taskData.endDate) && !isNullOrUndefined(prevEnd)) ||
24118
24195
  (prevStart && prevStart.getTime() !== taskData.startDate.getTime())
24119
- && (prevEnd && prevEnd.getTime() !== taskData.endDate.getTime())
24120
- || (!isNullOrUndefined(prevDuration) && prevDuration !== taskData.duration &&
24196
+ || (prevEnd && prevEnd.getTime() !== taskData.endDate.getTime())
24197
+ || (!isNullOrUndefined(prevDuration) && prevDuration !== taskData.duration)
24198
+ || (!isNullOrUndefined(prevDuration) && prevDuration === taskData.duration &&
24121
24199
  prevDurationUnit !== taskData.durationUnit)) {
24122
24200
  isMoved = true;
24123
24201
  }
@@ -24230,6 +24308,11 @@ class Edit$2 {
24230
24308
  this.parent.connectorLineEditModule.openValidationDialog(validateObject);
24231
24309
  }
24232
24310
  else {
24311
+ if (this.parent.editModule && this.parent.editModule.dialogModule &&
24312
+ this.parent.editModule.dialogModule['isEdit'] && this.predecessorUpdated) {
24313
+ this.isValidatedEditedRecord = true;
24314
+ this.parent.predecessorModule.validatePredecessor(args.data, [], '');
24315
+ }
24233
24316
  this.parent.connectorLineEditModule.applyPredecessorOption();
24234
24317
  }
24235
24318
  }
@@ -24293,7 +24376,10 @@ class Edit$2 {
24293
24376
  if (this.taskbarMoved) {
24294
24377
  this.parent.editedTaskBarItem = ganttRecord;
24295
24378
  }
24296
- this.parent.predecessorModule.validatePredecessor(ganttRecord, [], '');
24379
+ if (!this.isValidatedEditedRecord) {
24380
+ this.parent.predecessorModule.validatePredecessor(ganttRecord, [], '');
24381
+ }
24382
+ this.isValidatedEditedRecord = false;
24297
24383
  this.parent.predecessorModule.isValidatedParentTaskID = '';
24298
24384
  }
24299
24385
  if (this.parent.allowParentDependency && ganttRecord.hasChildRecords && this.parent.previousRecords[ganttRecord.uniqueID].ganttProperties.startDate &&
@@ -26312,6 +26398,7 @@ class Edit$2 {
26312
26398
  let args = {};
26313
26399
  args = this.constructTaskAddedEventArgs(cAddedRecord, this.parent.editedRecords, 'beforeAdd');
26314
26400
  this.parent.trigger('actionBegin', args, (args) => {
26401
+ this.parent.previousRecords = {};
26315
26402
  if (!isNullOrUndefined(this.parent.loadingIndicator) && this.parent.loadingIndicator.indicatorType === "Shimmer") {
26316
26403
  this.parent.showMaskRow();
26317
26404
  }
@@ -30306,7 +30393,7 @@ class ContextMenu$2 {
30306
30393
  this.parent.ganttChartModule.targetElement;
30307
30394
  // Closed edited cell before opening context menu
30308
30395
  // eslint-disable-next-line
30309
- if (!isNullOrUndefined(this.parent.editModule) && this.parent.editModule.cellEditModule && this.parent.editModule.cellEditModule.isCellEdit && target.parentElement.classList.contains('e-row')) {
30396
+ if (!isNullOrUndefined(this.parent.editModule) && this.parent.editModule.cellEditModule && this.parent.editModule.cellEditModule.isCellEdit && target.parentElement.classList.contains('e-row') || target.parentElement.classList.contains('e-treecolumn-container')) {
30310
30397
  this.parent.treeGrid.closeEdit();
30311
30398
  }
30312
30399
  if (!isNullOrUndefined(args.element) && args.element.id === this.parent.element.id + '_contextmenu') {
@@ -34319,7 +34406,10 @@ class ExportHelper {
34319
34406
  const footerBrush = new PdfSolidBrush(this.ganttStyle.footer.backgroundColor);
34320
34407
  footer.graphics.drawRectangle(pen, footerBrush, 0, 0, pdfDoc.pageSettings.width, 35);
34321
34408
  /* eslint-disable-next-line */
34322
- const font = new PdfStandardFont(this.ganttStyle.fontFamily, this.ganttStyle.footer.fontSize, this.ganttStyle.footer.fontStyle);
34409
+ let font = new PdfStandardFont(this.ganttStyle.fontFamily, this.ganttStyle.footer.fontSize, this.ganttStyle.footer.fontStyle);
34410
+ if (this.ganttStyle.font) {
34411
+ font = this.ganttStyle.font;
34412
+ }
34323
34413
  const brush = new PdfSolidBrush(this.ganttStyle.footer.fontColor);
34324
34414
  const pageNumber = new PdfPageNumberField(font);
34325
34415
  const count = new PdfPageCountField(font, brush);
@@ -34983,11 +35073,22 @@ class PdfGanttPredecessor {
34983
35073
  this.parent = parent;
34984
35074
  this.pdfGantt = pdfGantt;
34985
35075
  }
34986
- findindex(num) {
35076
+ findindex(num, pdfExportProperties) {
34987
35077
  var dataindex;
34988
- this.parent.currentViewData.map((data, index) => { if (data.index == num) {
34989
- dataindex = index;
34990
- } });
35078
+ if (pdfExportProperties.exportType === 'CurrentViewData') {
35079
+ this.parent.currentViewData.map(function (data, index) {
35080
+ if (data.index == num) {
35081
+ dataindex = index;
35082
+ }
35083
+ });
35084
+ }
35085
+ else {
35086
+ this.parent.flatData.map(function (data, index) {
35087
+ if (data.index == num) {
35088
+ dataindex = index;
35089
+ }
35090
+ });
35091
+ }
34991
35092
  return dataindex;
34992
35093
  }
34993
35094
  /**
@@ -34997,11 +35098,11 @@ class PdfGanttPredecessor {
34997
35098
  * @returns {void}
34998
35099
  * @private
34999
35100
  */
35000
- drawPredecessor(pdfGantt) {
35101
+ drawPredecessor(pdfGantt, pdfExportProperties) {
35001
35102
  this.pdfGantt = pdfGantt;
35002
35103
  const pages = pdfGantt.result.page.section.getPages();
35003
- const parentTask = pdfGantt.taskbarCollection[this.findindex(this.parentIndex)];
35004
- const childTask = pdfGantt.taskbarCollection[this.findindex(this.childIndex)];
35104
+ const parentTask = pdfGantt.taskbarCollection[this.findindex(this.parentIndex, pdfExportProperties)];
35105
+ const childTask = pdfGantt.taskbarCollection[this.findindex(this.childIndex, pdfExportProperties)];
35005
35106
  let startPage = new PdfPage();
35006
35107
  let endPage = new PdfPage();
35007
35108
  let predecessorType = '';
@@ -35011,7 +35112,7 @@ class PdfGanttPredecessor {
35011
35112
  let childY = 0;
35012
35113
  switch (this.type) {
35013
35114
  case 'FS':
35014
- if (childTask.startPage > -1 && parentTask.endPage > -1) {
35115
+ if ((!isNullOrUndefined(childTask) && childTask.startPage > -1) && (!isNullOrUndefined(parentTask) && parentTask.endPage > -1)) {
35015
35116
  startPage = pages[parentTask.endPage];
35016
35117
  endPage = pages[childTask.startPage];
35017
35118
  parentPageData = pdfGantt.pdfPageDetail[parentTask.endPage - pdfGantt.chartPageIndex];
@@ -35038,7 +35139,7 @@ class PdfGanttPredecessor {
35038
35139
  }
35039
35140
  break;
35040
35141
  case 'SF':
35041
- if (childTask.endPage > -1 && parentTask.startPage > -1) {
35142
+ if ((!isNullOrUndefined(childTask) && childTask.endPage > -1) && (!isNullOrUndefined(parentTask) && parentTask.startPage > -1)) {
35042
35143
  startPage = pages[parentTask.startPage];
35043
35144
  endPage = pages[childTask.endPage];
35044
35145
  parentPageData = pdfGantt.pdfPageDetail[parentTask.endPage - pdfGantt.chartPageIndex];
@@ -35065,7 +35166,7 @@ class PdfGanttPredecessor {
35065
35166
  }
35066
35167
  break;
35067
35168
  case 'FF':
35068
- if (childTask.endPage > -1 && parentTask.endPage > -1) {
35169
+ if ((!isNullOrUndefined(childTask) && childTask.endPage > -1) && (!isNullOrUndefined(parentTask) && parentTask.endPage > -1)) {
35069
35170
  startPage = pages[parentTask.endPage];
35070
35171
  endPage = pages[childTask.endPage];
35071
35172
  parentPageData = pdfGantt.pdfPageDetail[parentTask.endPage - pdfGantt.chartPageIndex];
@@ -35092,7 +35193,7 @@ class PdfGanttPredecessor {
35092
35193
  }
35093
35194
  break;
35094
35195
  case 'SS':
35095
- if (childTask.startPage > -1 && parentTask.startPage > -1) {
35196
+ if ((!isNullOrUndefined(childTask) && childTask.startPage > -1) && (!isNullOrUndefined(parentTask) && parentTask.startPage > -1)) {
35096
35197
  startPage = pages[parentTask.startPage];
35097
35198
  endPage = pages[childTask.startPage];
35098
35199
  parentPageData = pdfGantt.pdfPageDetail[parentTask.startPage - pdfGantt.chartPageIndex];
@@ -35419,12 +35520,12 @@ class PdfGantt extends PdfTreeGrid {
35419
35520
  }
35420
35521
  return this.taskbars;
35421
35522
  }
35422
- drawChart(result) {
35523
+ drawChart(result, pdfExportProperties) {
35423
35524
  this.result = result;
35424
35525
  this.totalPages = this.result.page.section.count;
35425
35526
  this.perColumnPages = this.totalPages / this.layouter.columnRanges.length;
35426
35527
  this.calculateRange();
35427
- this.drawGantttChart();
35528
+ this.drawGantttChart(pdfExportProperties);
35428
35529
  this.drawPageBorder();
35429
35530
  }
35430
35531
  //Calcualte the header range for each pdf page based on schedule start and end date.
@@ -35573,7 +35674,7 @@ class PdfGantt extends PdfTreeGrid {
35573
35674
  }
35574
35675
  }
35575
35676
  //Draw the gantt chart side
35576
- drawGantttChart() {
35677
+ drawGantttChart(pdfExportProperties) {
35577
35678
  let taskbarPoint = this.startPoint;
35578
35679
  const pagePoint = new PointF();
35579
35680
  let pageStartX = 0;
@@ -35647,7 +35748,7 @@ class PdfGantt extends PdfTreeGrid {
35647
35748
  // Draw predecessor line.
35648
35749
  for (let i = 0; i < this.predecessorCollection.length; i++) {
35649
35750
  const predecessor = this.predecessorCollection[i];
35650
- predecessor.drawPredecessor(this);
35751
+ predecessor.drawPredecessor(this, pdfExportProperties);
35651
35752
  }
35652
35753
  }
35653
35754
  }
@@ -35760,7 +35861,7 @@ class PdfExport {
35760
35861
  const format = new PdfTreeGridLayoutFormat();
35761
35862
  format.break = PdfLayoutBreakType.FitElement;
35762
35863
  const layouter = this.gantt.drawGrid(pdfPage, 0, 0, format);
35763
- this.gantt.drawChart(layouter);
35864
+ this.gantt.drawChart(layouter, pdfExportProperties);
35764
35865
  if (!isMultipleExport) {
35765
35866
  if (!this.isBlob) {
35766
35867
  // save the PDF