@syncfusion/ej2-gantt 20.1.58 → 20.2.36

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.
Files changed (105) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/ej2-gantt.umd.min.js +2 -2
  3. package/dist/ej2-gantt.umd.min.js.map +1 -1
  4. package/dist/es6/ej2-gantt.es2015.js +1100 -74
  5. package/dist/es6/ej2-gantt.es2015.js.map +1 -1
  6. package/dist/es6/ej2-gantt.es5.js +1099 -71
  7. package/dist/es6/ej2-gantt.es5.js.map +1 -1
  8. package/dist/global/ej2-gantt.min.js +2 -2
  9. package/dist/global/ej2-gantt.min.js.map +1 -1
  10. package/dist/global/index.d.ts +1 -1
  11. package/package.json +18 -18
  12. package/src/gantt/actions/actions.d.ts +1 -0
  13. package/src/gantt/actions/actions.js +1 -0
  14. package/src/gantt/actions/cell-edit.js +5 -3
  15. package/src/gantt/actions/connector-line-edit.js +20 -6
  16. package/src/gantt/actions/context-menu.js +3 -4
  17. package/src/gantt/actions/critical-path.d.ts +26 -0
  18. package/src/gantt/actions/critical-path.js +735 -0
  19. package/src/gantt/actions/dependency.js +3 -0
  20. package/src/gantt/actions/dialog-edit.js +1 -1
  21. package/src/gantt/actions/edit.js +29 -3
  22. package/src/gantt/actions/filter.js +1 -1
  23. package/src/gantt/actions/keyboard.js +2 -2
  24. package/src/gantt/actions/selection.js +3 -0
  25. package/src/gantt/actions/taskbar-edit.js +6 -4
  26. package/src/gantt/actions/toolbar.js +22 -4
  27. package/src/gantt/base/css-constants.d.ts +12 -0
  28. package/src/gantt/base/css-constants.js +12 -0
  29. package/src/gantt/base/date-processor.d.ts +1 -1
  30. package/src/gantt/base/date-processor.js +8 -2
  31. package/src/gantt/base/enum.d.ts +3 -1
  32. package/src/gantt/base/gantt-chart.js +6 -2
  33. package/src/gantt/base/gantt-model.d.ts +8 -1
  34. package/src/gantt/base/gantt.d.ts +32 -1
  35. package/src/gantt/base/gantt.js +133 -5
  36. package/src/gantt/base/interface.d.ts +16 -0
  37. package/src/gantt/base/splitter.js +4 -0
  38. package/src/gantt/base/task-processor.js +19 -6
  39. package/src/gantt/base/tree-grid.js +1 -1
  40. package/src/gantt/export/export-helper.js +19 -6
  41. package/src/gantt/export/pdf-base/pdf-style/gantt-theme.js +16 -0
  42. package/src/gantt/renderer/chart-rows.js +16 -5
  43. package/src/gantt/renderer/nonworking-day.js +5 -2
  44. package/src/gantt/renderer/timeline.js +35 -14
  45. package/src/global.js +1 -1
  46. package/styles/bootstrap-dark.css +272 -14
  47. package/styles/bootstrap.css +271 -14
  48. package/styles/bootstrap4.css +273 -12
  49. package/styles/bootstrap5-dark.css +272 -15
  50. package/styles/bootstrap5.css +272 -15
  51. package/styles/fabric-dark.css +270 -12
  52. package/styles/fabric.css +276 -18
  53. package/styles/fluent-dark.css +272 -14
  54. package/styles/fluent.css +272 -14
  55. package/styles/gantt/_bootstrap-dark-definition.scss +59 -16
  56. package/styles/gantt/_bootstrap-definition.scss +57 -14
  57. package/styles/gantt/_bootstrap4-definition.scss +65 -21
  58. package/styles/gantt/_bootstrap5-definition.scss +55 -12
  59. package/styles/gantt/_fabric-dark-definition.scss +58 -15
  60. package/styles/gantt/_fabric-definition.scss +58 -15
  61. package/styles/gantt/_fluent-definition.scss +53 -10
  62. package/styles/gantt/_fusionnew-definition.scss +212 -0
  63. package/styles/gantt/_highcontrast-definition.scss +57 -14
  64. package/styles/gantt/_highcontrast-light-definition.scss +55 -12
  65. package/styles/gantt/_layout.scss +293 -7
  66. package/styles/gantt/_material-dark-definition.scss +60 -16
  67. package/styles/gantt/_material-definition.scss +65 -21
  68. package/styles/gantt/_material3-definition.scss +213 -0
  69. package/styles/gantt/_tailwind-definition.scss +52 -8
  70. package/styles/gantt/_theme.scss +56 -1
  71. package/styles/gantt/bootstrap-dark.css +272 -14
  72. package/styles/gantt/bootstrap.css +271 -14
  73. package/styles/gantt/bootstrap4.css +273 -12
  74. package/styles/gantt/bootstrap5-dark.css +272 -15
  75. package/styles/gantt/bootstrap5.css +272 -15
  76. package/styles/gantt/fabric-dark.css +270 -12
  77. package/styles/gantt/fabric.css +276 -18
  78. package/styles/gantt/fluent-dark.css +272 -14
  79. package/styles/gantt/fluent.css +272 -14
  80. package/styles/gantt/highcontrast-light.css +260 -13
  81. package/styles/gantt/highcontrast.css +271 -13
  82. package/styles/gantt/icons/_bootstrap-dark.scss +12 -1
  83. package/styles/gantt/icons/_bootstrap.scss +12 -1
  84. package/styles/gantt/icons/_bootstrap4.scss +12 -1
  85. package/styles/gantt/icons/_bootstrap5.scss +12 -0
  86. package/styles/gantt/icons/_fabric-dark.scss +12 -0
  87. package/styles/gantt/icons/_fabric.scss +12 -0
  88. package/styles/gantt/icons/_fluent.scss +12 -0
  89. package/styles/gantt/icons/_fusionnew.scss +120 -0
  90. package/styles/gantt/icons/_highcontrast.scss +12 -0
  91. package/styles/gantt/icons/_material-dark.scss +12 -0
  92. package/styles/gantt/icons/_material.scss +12 -0
  93. package/styles/gantt/icons/_material3.scss +124 -0
  94. package/styles/gantt/icons/_tailwind-dark.scss +12 -0
  95. package/styles/gantt/icons/_tailwind.scss +12 -0
  96. package/styles/gantt/material-dark.css +277 -12
  97. package/styles/gantt/material.css +279 -14
  98. package/styles/gantt/tailwind-dark.css +279 -15
  99. package/styles/gantt/tailwind.css +276 -12
  100. package/styles/highcontrast-light.css +260 -13
  101. package/styles/highcontrast.css +271 -13
  102. package/styles/material-dark.css +277 -12
  103. package/styles/material.css +279 -14
  104. package/styles/tailwind-dark.css +279 -15
  105. package/styles/tailwind.css +276 -12
@@ -588,6 +588,9 @@ var Dependency = /** @class */ (function () {
588
588
  Dependency.prototype.updateConnectorLineObject = function (parentGanttRecord, childGanttRecord, predecessor) {
589
589
  var connectorObj = this.parent.connectorLineModule.createConnectorLineObject(parentGanttRecord, childGanttRecord, predecessor);
590
590
  if (connectorObj) {
591
+ if (childGanttRecord.isCritical && parentGanttRecord.isCritical) {
592
+ connectorObj.isCritical = true;
593
+ }
591
594
  if ((this.parent.connectorLineIds.length > 0 && this.parent.connectorLineIds.indexOf(connectorObj.connectorLineId) === -1) ||
592
595
  this.parent.connectorLineIds.length === 0) {
593
596
  this.parent.updatedConnectorLineCollection.push(connectorObj);
@@ -919,7 +919,7 @@ var DialogEdit = /** @class */ (function () {
919
919
  }
920
920
  else if (isScheduledTask(ganttProp) || !isNullOrUndefined(ganttProp.startDate)) {
921
921
  if (ganttData.ganttProperties.isMilestone && ganttData.ganttProperties.duration !== 0) {
922
- this.parent.dateValidationModule.calculateStartDate(ganttData);
922
+ this.parent.dateValidationModule.checkStartDate(ganttProp.startDate);
923
923
  }
924
924
  this.parent.dateValidationModule.calculateEndDate(ganttData);
925
925
  }
@@ -472,6 +472,9 @@ var Edit = /** @class */ (function () {
472
472
  }
473
473
  if ((key === tasks.baselineStartDate || key === tasks.baselineEndDate) &&
474
474
  (ganttData.ganttProperties.baselineStartDate && ganttData.ganttProperties.baselineEndDate)) {
475
+ ganttObj.setRecordValue('baselineStartDate', ganttObj.dataOperation.checkBaselineStartDate(ganttData.ganttProperties.baselineStartDate), ganttData.ganttProperties, true);
476
+ ganttObj.dataOperation.setTime(this.parent.defaultEndTime, ganttData.ganttProperties.baselineEndDate);
477
+ ganttObj.setRecordValue('baselineEndDate', ganttObj.dataOperation.checkBaselineEndDate(ganttData.ganttProperties.baselineEndDate), ganttData.ganttProperties, true);
475
478
  ganttObj.setRecordValue('baselineLeft', ganttObj.dataOperation.calculateBaselineLeft(ganttData.ganttProperties), ganttData.ganttProperties, true);
476
479
  ganttObj.setRecordValue('baselineWidth', ganttObj.dataOperation.calculateBaselineWidth(ganttData.ganttProperties), ganttData.ganttProperties, true);
477
480
  }
@@ -1234,6 +1237,11 @@ var Edit = /** @class */ (function () {
1234
1237
  eventArgs.taskBarEditAction = args.taskBarEditAction;
1235
1238
  }
1236
1239
  this.endEditAction(args);
1240
+ if (this.parent.enableCriticalPath) {
1241
+ var criticalModule = this.parent.criticalPathModule;
1242
+ criticalModule.showCriticalPath(true);
1243
+ criticalModule.criticalConnectorLine(criticalModule.criticalPathCollection, criticalModule.detailPredecessorCollection, true, criticalModule.predecessorCollectionTaskIds);
1244
+ }
1237
1245
  this.parent.trigger('actionComplete', eventArgs);
1238
1246
  }
1239
1247
  else {
@@ -1568,6 +1576,8 @@ var Edit = /** @class */ (function () {
1568
1576
  }
1569
1577
  else {
1570
1578
  this.deleteSelectedItems();
1579
+ var focusingElement = this.parent.element.querySelector('.e-treegrid');
1580
+ focusingElement.focus();
1571
1581
  }
1572
1582
  }
1573
1583
  };
@@ -2438,7 +2448,17 @@ var Edit = /** @class */ (function () {
2438
2448
  this.refreshRecordInImmutableMode();
2439
2449
  }
2440
2450
  };
2441
- Edit.prototype.refreshRecordInImmutableMode = function () {
2451
+ Edit.prototype.refreshRecordInImmutableMode = function (data, dragged) {
2452
+ if (!dragged && !isNullOrUndefined(data)) {
2453
+ for (var i = data[0].index + 1; i < this.parent.currentViewData.length; i++) {
2454
+ if (data[0].level < this.parent.currentViewData[i].level) {
2455
+ this.parent.modifiedRecords.push(this.parent.currentViewData[i]);
2456
+ }
2457
+ else {
2458
+ break;
2459
+ }
2460
+ }
2461
+ }
2442
2462
  var _loop_1 = function (i) {
2443
2463
  var originalData = this_1.parent.modifiedRecords[i];
2444
2464
  var treeIndex = this_1.parent.allowRowDragAndDrop ? 1 : 0;
@@ -2605,7 +2625,13 @@ var Edit = /** @class */ (function () {
2605
2625
  var insertCrud = data_2.insert(updatedData_2[addedRecords], null, query_2);
2606
2626
  insertCrud.then(function (e) {
2607
2627
  var changedRecords = 'changedRecords';
2608
- var addedRecords = e[0];
2628
+ var addedRecords;
2629
+ if (!isNullOrUndefined(e[0])) {
2630
+ addedRecords = e[0];
2631
+ }
2632
+ else {
2633
+ addedRecords = updatedData_2['addedRecords'][0];
2634
+ }
2609
2635
  /* tslint:disable-next-line */
2610
2636
  var updateCrud = data_2.update(_this.parent.taskFields.id, updatedData_2[changedRecords], null, query_2);
2611
2637
  updateCrud.then(function () {
@@ -3152,7 +3178,7 @@ var Edit = /** @class */ (function () {
3152
3178
  this.parent.treeGrid.parentData = [];
3153
3179
  this.parent.treeGrid.refresh();
3154
3180
  if (this.parent.enableImmutableMode) {
3155
- this.refreshRecordInImmutableMode();
3181
+ this.refreshRecordInImmutableMode(args.data, isDrag);
3156
3182
  }
3157
3183
  if (isDrag) {
3158
3184
  args.requestType = 'rowDropped';
@@ -191,7 +191,7 @@ var Filter = /** @class */ (function () {
191
191
  var ganttElement = closest(element, '#' + this.parent.element.id)
192
192
  || element.querySelector('#' + this.parent.element.id);
193
193
  if ((!(this.filterMenuElement.contains(element)) && !isNullOrUndefined(ganttElement)) || (!(this.filterMenuElement.contains(element)) && (isNullOrUndefined(datePickerElement))
194
- && (isNullOrUndefined(dateTimePickerElement)) && ((element.nodeName === 'DIV') || (element.nodeName === 'HTML')))) {
194
+ && (isNullOrUndefined(dateTimePickerElement)) && ((element.nodeName === 'DIV') || (element.nodeName === 'HTML') || (element.nodeName === 'SPAN') || (element.nodeName === 'BUTTON')))) {
195
195
  remove(this.filterMenuElement);
196
196
  this.parent.treeGrid.grid.notify('filter-menu-close', { isOpen: false });
197
197
  this.filterMenuElement = null;
@@ -170,8 +170,8 @@ var FocusModule = /** @class */ (function () {
170
170
  break;
171
171
  }
172
172
  case 'delete':
173
- if (ganttObj.selectionModule && ganttObj.editModule && (!ganttObj.editModule.dialogModule.dialogObj ||
174
- (ganttObj.editModule.dialogModule.dialogObj &&
173
+ if (ganttObj.selectionModule && ganttObj.editModule && ganttObj.editModule.dialogModule &&
174
+ (!ganttObj.editModule.dialogModule.dialogObj || (ganttObj.editModule.dialogModule.dialogObj &&
175
175
  !ganttObj.editModule.dialogModule.dialogObj.visible)) && (!ganttObj.editSettings.allowTaskbarEditing
176
176
  || (ganttObj.editSettings.allowTaskbarEditing && !ganttObj.editModule.taskbarEditModule.touchEdit))) {
177
177
  if ((ganttObj.selectionSettings.mode !== 'Cell' && ganttObj.selectionModule.selectedRowIndexes.length)
@@ -467,6 +467,9 @@ var Selection = /** @class */ (function () {
467
467
  this.popUpClickHandler(e);
468
468
  if (this.parent.selectionSettings.mode !== 'Cell' && isSelected) {
469
469
  if (closest(e.target, 'tr.e-chart-row')) {
470
+ if (this.parent.enableVirtualization) {
471
+ this.parent.treeGrid.grid.selectionModule.isInteracted = true;
472
+ }
470
473
  this.highlightSelectedRows(e, true);
471
474
  }
472
475
  else {
@@ -342,9 +342,7 @@ var TaskbarEdit = /** @class */ (function (_super) {
342
342
  addClass([element], [cls.activeParentTask]);
343
343
  }
344
344
  }
345
- if (isShowProgressResizer) {
346
- addClass(this.parent.ganttChartModule.scrollElement.querySelectorAll('.' + cls.connectorLineContainer), [cls.connectorLineZIndex]);
347
- }
345
+ addClass(this.parent.ganttChartModule.scrollElement.querySelectorAll('.' + cls.connectorLineContainer), [cls.connectorLineZIndex]);
348
346
  if (!isNullOrUndefined(this.parent.taskFields.dependency)
349
347
  && (element.querySelector('.' + cls.connectorPointLeft)
350
348
  || element.parentElement.querySelector('.' + cls.connectorPointLeft))
@@ -608,7 +606,7 @@ var TaskbarEdit = /** @class */ (function (_super) {
608
606
  this.timerCount = this.parent.ganttChartModule.scrollObject.previousScroll.left;
609
607
  this.startScrollTimer('left');
610
608
  }
611
- else if (isConnectorLineEdit && ((mouseY + 20) >
609
+ else if (isConnectorLineEdit && ((mouseY + 80) >
612
610
  containerPosition.top + this.parent.ganttChartModule.chartBodyContainer.offsetHeight)) {
613
611
  this.timerCount = this.parent.ganttChartModule.scrollObject.previousScroll.top;
614
612
  this.startScrollTimer('bottom');
@@ -1486,6 +1484,10 @@ var TaskbarEdit = /** @class */ (function (_super) {
1486
1484
  else {
1487
1485
  this.parent.isOnEdit = false;
1488
1486
  this.cancelTaskbarEditActionInMouseLeave();
1487
+ if (this.parent.enableCriticalPath && this.parent.criticalPathModule) {
1488
+ var criticalModule = this.parent.criticalPathModule;
1489
+ criticalModule.criticalConnectorLine(criticalModule.criticalPathCollection, criticalModule.detailPredecessorCollection, true, criticalModule.predecessorCollectionTaskIds);
1490
+ }
1489
1491
  }
1490
1492
  }
1491
1493
  if (this.parent.viewType === 'ResourceView' && this.parent.enableMultiTaskbar && !isNullOrUndefined(this.taskBarEditElement)) {
@@ -8,7 +8,7 @@ var Toolbar = /** @class */ (function () {
8
8
  this.predefinedItems = {};
9
9
  this.items = ['Add', 'Edit', 'Update', 'Delete', 'Cancel', 'ExpandAll', 'CollapseAll', 'Search',
10
10
  'PrevTimeSpan', 'NextTimeSpan', 'ZoomIn', 'ZoomOut', 'ZoomToFit', 'ExcelExport',
11
- 'CsvExport', 'PdfExport', 'Indent', 'Outdent'];
11
+ 'CsvExport', 'PdfExport', 'Indent', 'Outdent', 'CriticalPath'];
12
12
  this.parent = parent;
13
13
  this.id = this.parent.element.id;
14
14
  this.parent.on('ui-toolbarupdate', this.propertyChanged, this);
@@ -32,11 +32,19 @@ var Toolbar = /** @class */ (function () {
32
32
  }
33
33
  var preItems = ['Add', 'Edit', 'Update', 'Delete', 'Cancel', 'ExpandAll', 'CollapseAll',
34
34
  'PrevTimeSpan', 'NextTimeSpan', 'ZoomIn', 'ZoomOut', 'ZoomToFit', 'ExcelExport', 'CsvExport',
35
- 'PdfExport', 'Indent', 'Outdent'];
35
+ 'PdfExport', 'Indent', 'Outdent', 'CriticalPath'];
36
36
  for (var _i = 0, preItems_1 = preItems; _i < preItems_1.length; _i++) {
37
37
  var item = preItems_1[_i];
38
- var itemStr = item.toLowerCase();
39
- var localeName = item[0].toLowerCase() + item.slice(1);
38
+ var itemStr = void 0;
39
+ var localeName = void 0;
40
+ if (item === 'CriticalPath') {
41
+ itemStr = "critical-path";
42
+ localeName = "criticalPath";
43
+ }
44
+ else {
45
+ itemStr = item.toLowerCase();
46
+ localeName = item[0].toLowerCase() + item.slice(1);
47
+ }
40
48
  this.predefinedItems[item] = {
41
49
  id: this.parent.element.id + '_' + itemStr, prefixIcon: 'e-' + itemStr,
42
50
  text: this.parent.isAdaptive ? '' : this.parent.localeObj.getConstant(localeName),
@@ -240,6 +248,14 @@ var Toolbar = /** @class */ (function () {
240
248
  gObj.indent();
241
249
  }
242
250
  break;
251
+ case gID + '_critical-path':
252
+ if (gObj.enableCriticalPath) {
253
+ gObj.enableCriticalPath = false;
254
+ }
255
+ else {
256
+ gObj.enableCriticalPath = true;
257
+ }
258
+ break;
243
259
  case gID + '_outdent':
244
260
  if (gObj.editModule && gObj.selectionModule.getSelectedRecords().length) {
245
261
  gObj.outdent();
@@ -419,6 +435,8 @@ var Toolbar = /** @class */ (function () {
419
435
  disableItems.push(gID + '_edit');
420
436
  disableItems.push(gID + '_update');
421
437
  disableItems.push(gID + '_cancel');
438
+ disableItems.push(gID + '_indent');
439
+ disableItems.push(gID + '_outdent');
422
440
  }
423
441
  for (var e = 0; e < enableItems.length; e++) {
424
442
  var index = void 0;
@@ -36,8 +36,12 @@ export declare const parentProgressBarInnerDiv: string;
36
36
  export declare const taskLabel: string;
37
37
  export declare const childTaskBarInnerDiv: string;
38
38
  export declare const childProgressBarInnerDiv: string;
39
+ export declare const criticalChildTaskBarInnerDiv: string;
40
+ export declare const criticalChildProgressBarInnerDiv: string;
39
41
  export declare const milestoneTop: string;
40
42
  export declare const milestoneBottom: string;
43
+ export declare const criticalMilestoneTop: string;
44
+ export declare const criticalMilestoneBottom: string;
41
45
  export declare const baselineBar: string;
42
46
  export declare const baselineMilestoneContainer: string;
43
47
  export declare const baselineMilestoneDiv: string;
@@ -73,6 +77,7 @@ export declare const traceManualUnscheduledTask: string;
73
77
  export declare const traceParentTaskBar: string;
74
78
  export declare const traceParentProgressBar: string;
75
79
  export declare const traceUnscheduledTask: string;
80
+ export declare const criticalUnscheduledTask: string;
76
81
  export declare const taskIndicatorDiv: string;
77
82
  export declare const leftResizeGripper: string;
78
83
  export declare const rightResizeGripper: string;
@@ -95,13 +100,19 @@ export declare const unscheduledMilestoneBottom: string;
95
100
  export declare const dependencyViewContainer: string;
96
101
  export declare const connectorLineContainer: string;
97
102
  export declare const connectorLine: string;
103
+ export declare const criticalConnectorLine: string;
104
+ export declare const criticalConnectorLineRightArrow: string;
105
+ export declare const criticalConnectorLineLeftArrow: string;
98
106
  export declare const connectorLineRightArrow: string;
99
107
  export declare const connectorLineLeftArrow: string;
100
108
  export declare const connectorLineZIndex: string;
101
109
  export declare const connectorLineHover: string;
110
+ export declare const criticalConnectorLineHover: string;
102
111
  export declare const connectorLineHoverZIndex: string;
103
112
  export declare const connectorLineRightArrowHover: string;
104
113
  export declare const connectorLineLeftArrowHover: string;
114
+ export declare const criticalConnectorLineRightArrowHover: string;
115
+ export declare const criticalConnectorLineLeftArrowHover: string;
105
116
  export declare const connectorTouchPoint: string;
106
117
  export declare const connectorPointLeft: string;
107
118
  export declare const connectorPointRight: string;
@@ -127,6 +138,7 @@ export declare const editIcon: string;
127
138
  export declare const indentIcon: string;
128
139
  export declare const outdentIcon: string;
129
140
  export declare const addIcon: string;
141
+ export declare const criticalPathIcon: string;
130
142
  export declare const addAboveIcon: string;
131
143
  export declare const addBelowIcon: string;
132
144
  export declare const activeParentTask: string;
@@ -38,8 +38,12 @@ export var parentProgressBarInnerDiv = 'e-gantt-parent-progressbar-inner-div';
38
38
  export var taskLabel = 'e-task-label';
39
39
  export var childTaskBarInnerDiv = 'e-gantt-child-taskbar-inner-div';
40
40
  export var childProgressBarInnerDiv = 'e-gantt-child-progressbar-inner-div';
41
+ export var criticalChildTaskBarInnerDiv = 'e-gantt-child-critical-taskbar-inner-div';
42
+ export var criticalChildProgressBarInnerDiv = 'e-gantt-child-critical-progressbar-inner-div';
41
43
  export var milestoneTop = 'e-milestone-top';
42
44
  export var milestoneBottom = 'e-milestone-bottom';
45
+ export var criticalMilestoneTop = 'e-critical-milestone-top';
46
+ export var criticalMilestoneBottom = 'e-critical-milestone-bottom';
43
47
  export var baselineBar = 'e-baseline-bar';
44
48
  export var baselineMilestoneContainer = 'e-baseline-gantt-milestone-container';
45
49
  export var baselineMilestoneDiv = 'e-baseline-gantt-milestone';
@@ -75,6 +79,7 @@ export var traceManualUnscheduledTask = 'e-gantt-unscheduled-manualtask';
75
79
  export var traceParentTaskBar = 'e-gantt-parent-taskbar';
76
80
  export var traceParentProgressBar = 'e-gantt-parent-progressbar';
77
81
  export var traceUnscheduledTask = 'e-gantt-unscheduled-task';
82
+ export var criticalUnscheduledTask = 'e-gantt-critical-unscheduled-taskbar';
78
83
  export var taskIndicatorDiv = 'e-indicator-span';
79
84
  export var leftResizeGripper = 'e-left-resize-gripper';
80
85
  export var rightResizeGripper = 'e-right-resize-gripper';
@@ -102,13 +107,19 @@ export var unscheduledMilestoneBottom = 'e-unscheduled-milestone-bottom';
102
107
  export var dependencyViewContainer = 'e-gantt-dependency-view-container';
103
108
  export var connectorLineContainer = 'e-connector-line-container';
104
109
  export var connectorLine = 'e-line';
110
+ export var criticalConnectorLine = 'e-criticalconnector-line';
111
+ export var criticalConnectorLineRightArrow = 'e-criticalconnector-line-right-arrow';
112
+ export var criticalConnectorLineLeftArrow = 'e-criticalconnector-line-left-arrow';
105
113
  export var connectorLineRightArrow = 'e-connector-line-right-arrow';
106
114
  export var connectorLineLeftArrow = 'e-connector-line-left-arrow';
107
115
  export var connectorLineZIndex = 'e-connector-line-z-index';
108
116
  export var connectorLineHover = 'e-connector-line-hover';
117
+ export var criticalConnectorLineHover = 'e-critical-connector-line-hover';
109
118
  export var connectorLineHoverZIndex = 'e-connector-line-hover-z-index';
110
119
  export var connectorLineRightArrowHover = 'e-connector-line-right-arrow-hover';
111
120
  export var connectorLineLeftArrowHover = 'e-connector-line-left-arrow-hover';
121
+ export var criticalConnectorLineRightArrowHover = 'e-critical-connector-line-right-arrow-hover';
122
+ export var criticalConnectorLineLeftArrowHover = 'e-critical-connector-line-left-arrow-hover';
112
123
  export var connectorTouchPoint = 'e-connectortouchpoint';
113
124
  export var connectorPointLeft = 'e-connectorpoint-left';
114
125
  export var connectorPointRight = 'e-connectorpoint-right';
@@ -135,6 +146,7 @@ export var editIcon = 'e-edit';
135
146
  export var indentIcon = 'e-indent';
136
147
  export var outdentIcon = 'e-outdent';
137
148
  export var addIcon = 'e-add';
149
+ export var criticalPathIcon = 'e-critical-path';
138
150
  export var addAboveIcon = 'e-add-above';
139
151
  export var addBelowIcon = 'e-add-below';
140
152
  //Predecessor touch mode
@@ -48,7 +48,7 @@ export declare class DateProcessor {
48
48
  * @returns {Date} .
49
49
  * @private
50
50
  */
51
- checkBaselineEndDate(date: Date): Date;
51
+ checkBaselineEndDate(date: Date, ganttProp?: ITaskData): Date;
52
52
  /**
53
53
  * To calculate start date value from duration and end date
54
54
  *
@@ -189,7 +189,7 @@ var DateProcessor = /** @class */ (function () {
189
189
  * @returns {Date} .
190
190
  * @private
191
191
  */
192
- DateProcessor.prototype.checkBaselineEndDate = function (date) {
192
+ DateProcessor.prototype.checkBaselineEndDate = function (date, ganttProp) {
193
193
  if (isNullOrUndefined(date)) {
194
194
  return null;
195
195
  }
@@ -199,7 +199,7 @@ var DateProcessor = /** @class */ (function () {
199
199
  if (hour > this.parent.defaultEndTime) {
200
200
  this.setTime(this.parent.defaultEndTime, cloneDate);
201
201
  }
202
- else if (hour <= this.parent.defaultStartTime) {
202
+ else if (hour <= this.parent.defaultStartTime && !ganttProp.isMilestone) {
203
203
  cloneDate.setDate(cloneDate.getDate() - 1);
204
204
  this.setTime(this.parent.defaultEndTime, cloneDate);
205
205
  }
@@ -1188,6 +1188,12 @@ var DateProcessor = /** @class */ (function () {
1188
1188
  */
1189
1189
  DateProcessor.prototype.calculateProjectDates = function (editArgs) {
1190
1190
  var _this = this;
1191
+ if (this.parent.isLoad && this.parent.enablePersistence &&
1192
+ this.parent.cloneProjectStartDate && this.parent.cloneProjectEndDate) {
1193
+ this.parent.cloneProjectStartDate = this.getDateFromFormat(this.parent.cloneProjectStartDate);
1194
+ this.parent.cloneProjectEndDate = this.getDateFromFormat(this.parent.cloneProjectEndDate);
1195
+ return;
1196
+ }
1191
1197
  var sDate = typeof this.parent.projectStartDate === 'string' ?
1192
1198
  new Date(this.parent.projectStartDate) : this.parent.projectStartDate;
1193
1199
  var eDate = typeof this.parent.projectEndDate === 'string' ?
@@ -59,7 +59,9 @@ export declare type ToolbarItem =
59
59
  /** To indent a selected record */
60
60
  'Indent' |
61
61
  /** To outdent a selected record */
62
- 'Outdent';
62
+ 'Outdent' |
63
+ /** To enable critical path */
64
+ 'CriticalPath';
63
65
  /**
64
66
  * Defines the schedule header mode. They are
65
67
  * * none - Define the default mode header.
@@ -93,6 +93,10 @@ var GanttChart = /** @class */ (function () {
93
93
  this.parent.predecessorModule.createConnectorLinesCollection();
94
94
  }
95
95
  this.parent.connectorLineModule.renderConnectorLines(this.parent.updatedConnectorLineCollection);
96
+ if (this.parent.enableCriticalPath) {
97
+ var crtiticalModule = this.parent.criticalPathModule;
98
+ this.parent.criticalPathModule.criticalConnectorLine(crtiticalModule.criticalPathCollection, crtiticalModule.detailPredecessorCollection, this.parent.enableCriticalPath, crtiticalModule.predecessorCollectionTaskIds);
99
+ }
96
100
  if (this.parent.viewType === 'ResourceView' && this.parent.showOverAllocation) {
97
101
  this.renderOverAllocationContainer();
98
102
  }
@@ -968,7 +972,7 @@ var GanttChart = /** @class */ (function () {
968
972
  this.parent.treeGrid.grid.notify('key-pressed', e);
969
973
  }
970
974
  }
971
- if (!isInEditedState) {
975
+ if (!isNullOrUndefined(isInEditedState) && !this.parent.editModule.cellEditModule.isCellEdit) {
972
976
  if (nextElement) {
973
977
  if ($target.classList.contains('e-rowcell')) {
974
978
  this.manageFocus($target, 'remove', false);
@@ -976,7 +980,7 @@ var GanttChart = /** @class */ (function () {
976
980
  else {
977
981
  this.manageFocus($target, 'remove', true);
978
982
  }
979
- if (nextElement.classList.contains('e-rowcell') && $target.nextElementSibling) {
983
+ if ((nextElement.classList.contains('e-rowcell') && $target.nextElementSibling) || $target.classList.contains('e-right-label-container')) {
980
984
  if (!$target.classList.contains('e-rowcell')) {
981
985
  this.parent.treeGrid.grid.notify('key-pressed', e);
982
986
  var fmodule = getValue('focusModule', this.parent.treeGrid.grid);
@@ -1,4 +1,4 @@
1
- import { Component, createElement, Complex, addClass, removeClass, Event, EmitType, formatUnit, Browser } from '@syncfusion/ej2-base';import { Internationalization, extend, getValue, isObjectArray, isObject, setValue, isUndefined } from '@syncfusion/ej2-base';import { Property, NotifyPropertyChanges, INotifyPropertyChanged, L10n, ModuleDeclaration, EventHandler } from '@syncfusion/ej2-base';import { isNullOrUndefined, KeyboardEvents, KeyboardEventArgs, Collection, append, remove } from '@syncfusion/ej2-base';import { createSpinner, showSpinner, hideSpinner, Dialog } from '@syncfusion/ej2-popups';import { RowDragEventArgs } from '@syncfusion/ej2-grids';import { TaskProcessor } from './task-processor';import { GanttChart } from './gantt-chart';import { Timeline } from '../renderer/timeline';import { GanttTreeGrid } from './tree-grid';import { Toolbar } from '../actions/toolbar';import { IGanttData, IWorkingTimeRange, IQueryTaskbarInfoEventArgs, BeforeTooltipRenderEventArgs, IDependencyEventArgs } from './interface';import { DataStateChangeEventArgs } from '@syncfusion/ej2-treegrid';import { ITaskbarEditedEventArgs, IParent, ITaskData, PdfColumnHeaderQueryCellInfoEventArgs } from './interface';import { ICollapsingEventArgs, CellEditArgs, PdfQueryTimelineCellInfoEventArgs } from './interface';import { IConnectorLineObject, IValidateArgs, IValidateMode, ITaskAddedEventArgs, IKeyPressedEventArgs } from './interface';import { PdfExportProperties, ISplitterResizedEventArgs } from './interface';import { ZoomEventArgs, IActionBeginEventArgs, CellSelectingEventArgs, RowDeselectEventArgs, PdfQueryCellInfoEventArgs } from './interface';import { ITimeSpanEventArgs, ZoomTimelineSettings, QueryCellInfoEventArgs, RowDataBoundEventArgs, RowSelectEventArgs } from './interface';import { TaskFieldsModel, TimelineSettingsModel, SplitterSettingsModel, SortSettings, SortSettingsModel } from '../models/models';import { EventMarkerModel, AddDialogFieldSettingsModel, EditDialogFieldSettingsModel, EditSettingsModel } from '../models/models';import { HolidayModel, DayWorkingTimeModel, FilterSettingsModel, SelectionSettingsModel } from '../models/models';import { TaskFields, TimelineSettings, Holiday, EventMarker, DayWorkingTime, EditSettings, SelectionSettings } from '../models/models';import { FilterSettings, SplitterSettings, TooltipSettings, LabelSettings, LabelSettingsModel } from '../models/models';import { SearchSettingsModel, SearchSettings, ResourceFields, ResourceFieldsModel } from '../models/models';import { ItemModel, ClickEventArgs } from '@syncfusion/ej2-navigations';import { DateProcessor } from './date-processor';import { ChartRows } from '../renderer/chart-rows';import { Dependency } from '../actions/dependency';import * as cls from './css-constants';import { Query, DataManager } from '@syncfusion/ej2-data';import { Column, ColumnModel } from '../models/column';import { TreeGrid, FilterSettingsModel as TreeGridFilterSettingModel } from '@syncfusion/ej2-treegrid';import { Sort } from '../actions/sort';import { CellSelectEventArgs, ISelectedCell, ContextMenuItemModel } from '@syncfusion/ej2-grids';import { CellDeselectEventArgs, IIndex, FailureEventArgs } from '@syncfusion/ej2-grids';import { HeaderCellInfoEventArgs, ColumnMenuClickEventArgs, ColumnMenuOpenEventArgs } from '@syncfusion/ej2-grids';import { ColumnMenuItemModel, ExcelQueryCellInfoEventArgs } from '@syncfusion/ej2-grids';import { ExcelExportProperties, ExcelExportCompleteArgs, ExcelHeaderQueryCellInfoEventArgs } from '@syncfusion/ej2-grids';import { RowDD } from '../actions/rowdragdrop';import { Filter } from '../actions/filter';import { PageEventArgs, FilterEventArgs, SortEventArgs, ResizeArgs, ColumnDragEventArgs, getActualProperties } from '@syncfusion/ej2-grids';import { RenderDayCellEventArgs } from '@syncfusion/ej2-calendars';import { ConnectorLine } from '../renderer/connector-line';import { ConnectorLineEdit } from '../actions/connector-line-edit';import { Edit } from '../actions/edit';import { Splitter } from './splitter';import { ResizeEventArgs, ResizingEventArgs } from '@syncfusion/ej2-layouts';import { TooltipSettingsModel } from '../models/tooltip-settings-model';import { Tooltip } from '../renderer/tooltip';import { ToolbarItem, ColumnMenuItem, RowPosition, DurationUnit, SortDirection } from './enum';import { GridLine, ContextMenuItem, ScheduleMode, ViewType } from './enum';import { Selection } from '../actions/selection';import { ExcelExport } from '../actions/excel-export';import { DayMarkers } from '../actions/day-markers';import { ContextMenu } from './../actions/context-menu';import { RowSelectingEventArgs } from './interface';import { ContextMenuOpenEventArgs as CMenuOpenEventArgs, ContextMenuClickEventArgs as CMenuClickEventArgs } from './interface';import { ColumnMenu } from '../actions/column-menu';import { ITaskbarClickEventArgs, RecordDoubleClickEventArgs, IMouseMoveEventArgs } from './interface';import { PdfExport } from '../actions/pdf-export';import { WorkUnit, TaskType } from './enum';import { FocusModule } from '../actions/keyboard';import { VirtualScroll } from '../actions/virtual-scroll';import { isCountRequired } from './utils';import { TaskbarEdit } from '../actions/taskbar-edit';
1
+ import { Component, createElement, Complex, addClass, removeClass, Event, EmitType, formatUnit, Browser } from '@syncfusion/ej2-base';import { Internationalization, extend, getValue, isObjectArray, isObject, setValue, isUndefined } from '@syncfusion/ej2-base';import { Property, NotifyPropertyChanges, INotifyPropertyChanged, L10n, ModuleDeclaration, EventHandler } from '@syncfusion/ej2-base';import { isNullOrUndefined, KeyboardEvents, KeyboardEventArgs, Collection, append, remove } from '@syncfusion/ej2-base';import { createSpinner, showSpinner, hideSpinner, Dialog } from '@syncfusion/ej2-popups';import { RowDragEventArgs, GridColumn } from '@syncfusion/ej2-grids';import { TaskProcessor } from './task-processor';import { GanttChart } from './gantt-chart';import { Timeline } from '../renderer/timeline';import { GanttTreeGrid } from './tree-grid';import { Toolbar } from '../actions/toolbar';import { CriticalPath } from '../actions/critical-path';import { IGanttData, IWorkingTimeRange, IQueryTaskbarInfoEventArgs, BeforeTooltipRenderEventArgs, IDependencyEventArgs } from './interface';import { DataStateChangeEventArgs } from '@syncfusion/ej2-treegrid';import { ITaskbarEditedEventArgs, IParent, ITaskData, PdfColumnHeaderQueryCellInfoEventArgs } from './interface';import { ICollapsingEventArgs, CellEditArgs, PdfQueryTimelineCellInfoEventArgs } from './interface';import { IConnectorLineObject, IValidateArgs, IValidateMode, ITaskAddedEventArgs, IKeyPressedEventArgs } from './interface';import { PdfExportProperties, ISplitterResizedEventArgs } from './interface';import { ZoomEventArgs, IActionBeginEventArgs, CellSelectingEventArgs, RowDeselectEventArgs, PdfQueryCellInfoEventArgs } from './interface';import { ITimeSpanEventArgs, ZoomTimelineSettings, QueryCellInfoEventArgs, RowDataBoundEventArgs, RowSelectEventArgs } from './interface';import { TaskFieldsModel, TimelineSettingsModel, SplitterSettingsModel, SortSettings, SortSettingsModel } from '../models/models';import { EventMarkerModel, AddDialogFieldSettingsModel, EditDialogFieldSettingsModel, EditSettingsModel } from '../models/models';import { HolidayModel, DayWorkingTimeModel, FilterSettingsModel, SelectionSettingsModel } from '../models/models';import { TaskFields, TimelineSettings, Holiday, EventMarker, DayWorkingTime, EditSettings, SelectionSettings } from '../models/models';import { FilterSettings, SplitterSettings, TooltipSettings, LabelSettings, LabelSettingsModel } from '../models/models';import { SearchSettingsModel, SearchSettings, ResourceFields, ResourceFieldsModel } from '../models/models';import { ItemModel, ClickEventArgs } from '@syncfusion/ej2-navigations';import { DateProcessor } from './date-processor';import { ChartRows } from '../renderer/chart-rows';import { Dependency } from '../actions/dependency';import * as cls from './css-constants';import { Query, DataManager } from '@syncfusion/ej2-data';import { Column, ColumnModel } from '../models/column';import { TreeGrid, FilterSettingsModel as TreeGridFilterSettingModel } from '@syncfusion/ej2-treegrid';import { Sort } from '../actions/sort';import { CellSelectEventArgs, ISelectedCell, ContextMenuItemModel } from '@syncfusion/ej2-grids';import { CellDeselectEventArgs, IIndex, FailureEventArgs } from '@syncfusion/ej2-grids';import { HeaderCellInfoEventArgs, ColumnMenuClickEventArgs, ColumnMenuOpenEventArgs } from '@syncfusion/ej2-grids';import { ColumnMenuItemModel, ExcelQueryCellInfoEventArgs } from '@syncfusion/ej2-grids';import { ExcelExportProperties, ExcelExportCompleteArgs, ExcelHeaderQueryCellInfoEventArgs } from '@syncfusion/ej2-grids';import { RowDD } from '../actions/rowdragdrop';import { Filter } from '../actions/filter';import { PageEventArgs, FilterEventArgs, SortEventArgs, ResizeArgs, ColumnDragEventArgs, getActualProperties } from '@syncfusion/ej2-grids';import { RenderDayCellEventArgs } from '@syncfusion/ej2-calendars';import { ConnectorLine } from '../renderer/connector-line';import { ConnectorLineEdit } from '../actions/connector-line-edit';import { Edit } from '../actions/edit';import { Splitter } from './splitter';import { ResizeEventArgs, ResizingEventArgs } from '@syncfusion/ej2-layouts';import { TooltipSettingsModel } from '../models/tooltip-settings-model';import { Tooltip } from '../renderer/tooltip';import { ToolbarItem, ColumnMenuItem, RowPosition, DurationUnit, SortDirection } from './enum';import { GridLine, ContextMenuItem, ScheduleMode, ViewType } from './enum';import { Selection } from '../actions/selection';import { ExcelExport } from '../actions/excel-export';import { DayMarkers } from '../actions/day-markers';import { ContextMenu } from './../actions/context-menu';import { RowSelectingEventArgs } from './interface';import { ContextMenuOpenEventArgs as CMenuOpenEventArgs, ContextMenuClickEventArgs as CMenuClickEventArgs } from './interface';import { ColumnMenu } from '../actions/column-menu';import { ITaskbarClickEventArgs, RecordDoubleClickEventArgs, IMouseMoveEventArgs } from './interface';import { PdfExport } from '../actions/pdf-export';import { WorkUnit, TaskType } from './enum';import { FocusModule } from '../actions/keyboard';import { VirtualScroll } from '../actions/virtual-scroll';import { isCountRequired } from './utils';import { TaskbarEdit } from '../actions/taskbar-edit';
2
2
  import {ComponentModel} from '@syncfusion/ej2-base';
3
3
 
4
4
  /**
@@ -519,6 +519,13 @@ export interface GanttModel extends ComponentModel{
519
519
  */
520
520
  enableContextMenu?: boolean;
521
521
 
522
+ /**
523
+ * It highlights the critical tasks in the Gantt Chart that affect the project’s end date.
524
+ *
525
+ * @default false
526
+ */
527
+ enableCriticalPath?: boolean;
528
+
522
529
  /**
523
530
  * `contextMenuItems` defines both built-in and custom context menu items.
524
531
  * {% codeBlock src='gantt/contextMenuItems/index.md' %}{% endcodeBlock %}
@@ -10,6 +10,7 @@ import { GanttChart } from './gantt-chart';
10
10
  import { Timeline } from '../renderer/timeline';
11
11
  import { GanttTreeGrid } from './tree-grid';
12
12
  import { Toolbar } from '../actions/toolbar';
13
+ import { CriticalPath } from '../actions/critical-path';
13
14
  import { IGanttData, IWorkingTimeRange, IQueryTaskbarInfoEventArgs, BeforeTooltipRenderEventArgs, IDependencyEventArgs } from './interface';
14
15
  import { DataStateChangeEventArgs } from '@syncfusion/ej2-treegrid';
15
16
  import { ITaskbarEditedEventArgs, IParent, ITaskData, PdfColumnHeaderQueryCellInfoEventArgs } from './interface';
@@ -246,6 +247,10 @@ export declare class Gantt extends Component<HTMLElement> implements INotifyProp
246
247
  * The `dayMarkersModule` is used to manipulate event markers operation in Gantt.
247
248
  */
248
249
  dayMarkersModule: DayMarkers;
250
+ /**
251
+ * The `criticalPathModule` is used to determine the critical path in Gantt.
252
+ */
253
+ criticalPathModule: CriticalPath;
249
254
  /** @hidden */
250
255
  isConnectorLineUpdate: boolean;
251
256
  /** @hidden */
@@ -738,6 +743,12 @@ export declare class Gantt extends Component<HTMLElement> implements INotifyProp
738
743
  * @default false
739
744
  */
740
745
  enableContextMenu: boolean;
746
+ /**
747
+ * It highlights the critical tasks in the Gantt Chart that affect the project’s end date.
748
+ *
749
+ * @default false
750
+ */
751
+ enableCriticalPath: boolean;
741
752
  /**
742
753
  * `contextMenuItems` defines both built-in and custom context menu items.
743
754
  * {% codeBlock src='gantt/contextMenuItems/index.md' %}{% endcodeBlock %}
@@ -1374,6 +1385,7 @@ export declare class Gantt extends Component<HTMLElement> implements INotifyProp
1374
1385
  * @returns {string} .
1375
1386
  */
1376
1387
  getWorkString(work: number, workUnit: string): string;
1388
+ private updateTreeColumns;
1377
1389
  /**
1378
1390
  *
1379
1391
  * @param {object} args .
@@ -1398,12 +1410,14 @@ export declare class Gantt extends Component<HTMLElement> implements INotifyProp
1398
1410
  onPropertyChanged(newProp: GanttModel, oldProp: GanttModel): void;
1399
1411
  private updateOverAllocationCotainer;
1400
1412
  /**
1401
- * Get the properties to be maintained in the persisted state.
1413
+ * Returns the properties to be maintained in persisted state.
1402
1414
  *
1403
1415
  * @returns {string} .
1404
1416
  * @private
1405
1417
  */
1406
1418
  getPersistData(): string;
1419
+ private ignoreInArrays;
1420
+ private ignoreInColumn;
1407
1421
  /**
1408
1422
  * @returns {void} .
1409
1423
  * @private
@@ -1432,6 +1446,8 @@ export declare class Gantt extends Component<HTMLElement> implements INotifyProp
1432
1446
  * @returns {void} .
1433
1447
  */
1434
1448
  sortColumn(columnName: string, direction: SortDirection, isMultiSort?: boolean): void;
1449
+ private mergePersistGanttData;
1450
+ private mergeColumns;
1435
1451
  /**
1436
1452
  * Clears all the sorted columns of the Gantt.
1437
1453
  *
@@ -1781,6 +1797,21 @@ export declare class Gantt extends Component<HTMLElement> implements INotifyProp
1781
1797
  * @public
1782
1798
  */
1783
1799
  outdent(): void;
1800
+ /**
1801
+ * To render the critical path tasks in Gantt.
1802
+ *
1803
+ * @returns {void} .
1804
+ * @param {boolean} isCritical- whether to render critical path or not .
1805
+ * @public
1806
+ */
1807
+ private showCriticalPath;
1808
+ /**
1809
+ * To get all the critical tasks in Gantt.
1810
+ *
1811
+ * @returns {IGanttData[]} .
1812
+ * @public
1813
+ */
1814
+ getCriticalTasks(): IGanttData[];
1784
1815
  /**
1785
1816
  * To perform Zoom in action on Gantt timeline.
1786
1817
  *