@progress/kendo-angular-gantt 0.2.1-dev.202112091019 → 0.3.0-dev.202201111723

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 (96) hide show
  1. package/dist/cdn/js/kendo-angular-gantt.js +2 -2
  2. package/dist/cdn/main.js +10 -4
  3. package/dist/es/dependencies/utils.js +6 -5
  4. package/dist/es/editing/add-task.component.js +94 -0
  5. package/dist/es/editing/dependencies-table.component.js +131 -0
  6. package/dist/es/editing/edit-dialog.component.js +37 -6
  7. package/dist/es/editing/edit.service.js +89 -7
  8. package/dist/es/editing/task-fields.component.js +43 -0
  9. package/dist/es/expanded-state/expandable.directive.js +4 -6
  10. package/dist/es/gantt.component.js +116 -45
  11. package/dist/es/gantt.module.js +13 -4
  12. package/dist/es/index.js +5 -1
  13. package/dist/es/localization/gantt-localization.service.js +26 -0
  14. package/dist/es/localization/messages.js +45 -1
  15. package/dist/es/models/dependency-type.enum.js +16 -0
  16. package/dist/es/models/events/{add-event.interface.js → task-add-event.interface.js} +0 -0
  17. package/dist/es/models/models.js +2 -0
  18. package/dist/es/models/{events/edit-event.interface.js → toolbar-settings.js} +0 -0
  19. package/dist/es/package-metadata.js +1 -1
  20. package/dist/es/timeline/timeline-base-view.service.js +12 -3
  21. package/dist/es/toolbar/toolbar.component.js +9 -1
  22. package/dist/es2015/dependencies/utils.js +6 -5
  23. package/dist/es2015/editing/add-task.component.d.ts +45 -0
  24. package/dist/es2015/editing/add-task.component.js +102 -0
  25. package/dist/es2015/editing/dependencies-table.component.d.ts +39 -0
  26. package/dist/es2015/editing/dependencies-table.component.js +160 -0
  27. package/dist/es2015/editing/edit-dialog.component.d.ts +10 -3
  28. package/dist/es2015/editing/edit-dialog.component.js +55 -33
  29. package/dist/es2015/editing/edit.service.d.ts +24 -3
  30. package/dist/es2015/editing/edit.service.js +78 -10
  31. package/dist/es2015/editing/task-fields.component.d.ts +22 -0
  32. package/dist/es2015/editing/task-fields.component.js +67 -0
  33. package/dist/es2015/expanded-state/expandable.directive.d.ts +1 -2
  34. package/dist/es2015/expanded-state/expandable.directive.js +2 -7
  35. package/dist/es2015/gantt.component.d.ts +29 -18
  36. package/dist/es2015/gantt.component.js +183 -43
  37. package/dist/es2015/gantt.module.js +13 -4
  38. package/dist/es2015/index.d.ts +5 -1
  39. package/dist/es2015/index.js +5 -1
  40. package/dist/es2015/index.metadata.json +1 -1
  41. package/dist/es2015/localization/{treelist-messages.directive.d.ts → gantt-localization.service.d.ts} +4 -3
  42. package/dist/es2015/localization/gantt-localization.service.js +25 -0
  43. package/dist/es2015/localization/messages.d.ts +46 -2
  44. package/dist/es2015/localization/messages.js +45 -1
  45. package/dist/es2015/models/dependency-type.enum.d.ts +1 -1
  46. package/dist/es2015/models/dependency-type.enum.js +16 -0
  47. package/dist/es2015/models/events/cell-close-event.interface.d.ts +1 -1
  48. package/dist/es2015/models/events/task-add-event.interface.d.ts +31 -0
  49. package/dist/{es/models/events/remove-event.interface.js → es2015/models/events/task-add-event.interface.js} +0 -0
  50. package/dist/es2015/models/events/task-edit-event.interface.d.ts +15 -2
  51. package/dist/es2015/models/models.d.ts +5 -3
  52. package/dist/es2015/models/models.js +2 -0
  53. package/dist/es2015/models/toolbar-settings.d.ts +29 -0
  54. package/dist/{es/models/toolbar-position.js → es2015/models/toolbar-settings.js} +0 -0
  55. package/dist/es2015/package-metadata.js +1 -1
  56. package/dist/es2015/timeline/timeline-base-view.service.d.ts +12 -0
  57. package/dist/es2015/timeline/timeline-base-view.service.js +12 -3
  58. package/dist/es2015/toolbar/toolbar-template.directive.d.ts +1 -1
  59. package/dist/es2015/toolbar/toolbar.component.d.ts +2 -0
  60. package/dist/es2015/toolbar/toolbar.component.js +10 -0
  61. package/dist/fesm2015/index.js +757 -115
  62. package/dist/fesm5/index.js +627 -88
  63. package/dist/npm/dependencies/utils.js +6 -5
  64. package/dist/npm/editing/add-task.component.js +96 -0
  65. package/dist/npm/editing/dependencies-table.component.js +133 -0
  66. package/dist/npm/editing/edit-dialog.component.js +36 -5
  67. package/dist/npm/editing/edit.service.js +88 -6
  68. package/dist/npm/editing/task-fields.component.js +45 -0
  69. package/dist/npm/expanded-state/expandable.directive.js +3 -5
  70. package/dist/npm/gantt.component.js +116 -45
  71. package/dist/npm/gantt.module.js +12 -3
  72. package/dist/npm/index.js +10 -2
  73. package/dist/npm/localization/gantt-localization.service.js +28 -0
  74. package/dist/npm/localization/messages.js +45 -1
  75. package/dist/npm/models/dependency-type.enum.js +16 -0
  76. package/dist/npm/models/events/{add-event.interface.js → task-add-event.interface.js} +0 -0
  77. package/dist/npm/models/models.js +4 -0
  78. package/dist/npm/models/{events/edit-event.interface.js → toolbar-settings.js} +0 -0
  79. package/dist/npm/package-metadata.js +1 -1
  80. package/dist/npm/timeline/timeline-base-view.service.js +17 -8
  81. package/dist/npm/toolbar/toolbar.component.js +9 -1
  82. package/dist/systemjs/kendo-angular-gantt.js +1 -1
  83. package/package.json +5 -3
  84. package/dist/es/localization/treelist-messages.directive.js +0 -31
  85. package/dist/es2015/localization/treelist-messages.directive.js +0 -29
  86. package/dist/es2015/models/events/add-event.interface.d.ts +0 -16
  87. package/dist/es2015/models/events/add-event.interface.js +0 -4
  88. package/dist/es2015/models/events/edit-event.interface.d.ts +0 -19
  89. package/dist/es2015/models/events/edit-event.interface.js +0 -4
  90. package/dist/es2015/models/events/remove-event.interface.d.ts +0 -16
  91. package/dist/es2015/models/events/remove-event.interface.js +0 -4
  92. package/dist/es2015/models/toolbar-position.d.ts +0 -9
  93. package/dist/es2015/models/toolbar-position.js +0 -4
  94. package/dist/npm/localization/treelist-messages.directive.js +0 -33
  95. package/dist/npm/models/events/remove-event.interface.js +0 -6
  96. package/dist/npm/models/toolbar-position.js +0 -6
@@ -6,22 +6,24 @@ import { __extends, __decorate, __metadata, __param, __assign } from 'tslib';
6
6
  import { Input, Injectable, EventEmitter, Directive, Optional, TemplateRef, QueryList, ContentChildren, ContentChild, Component, forwardRef, SkipSelf, Host, Injector, NgZone, isDevMode, ViewChild, HostBinding, Output, Renderer2, ElementRef, ChangeDetectorRef, NgModule } from '@angular/core';
7
7
  import { ColumnBase, ColumnComponent, ColumnGroupComponent, SpanColumnComponent, TreeListComponent, DataBoundTreeComponent, ExpandableTreeComponent, FlatBindingDirective, HierarchyBindingDirective, ExpandableDirective, TreeListModule } from '@progress/kendo-angular-treelist';
8
8
  import { cloneDate, addWeeks, firstDayInWeek, addDays, getDate, lastDayOfMonth, firstDayOfMonth, addMonths, isEqual, MS_PER_HOUR, MS_PER_DAY } from '@progress/kendo-date-math';
9
- import { of, fromEvent, Subject, Subscription } from 'rxjs';
9
+ import { of, fromEvent, Subject, Subscription, forkJoin, EMPTY, isObservable } from 'rxjs';
10
10
  import { validatePackage } from '@progress/kendo-licensing';
11
11
  import { isDocumentAvailable, closestInScope, matchesClasses, anyChanged, hasObservers, EventsModule } from '@progress/kendo-angular-common';
12
12
  import { IntlService } from '@progress/kendo-angular-intl';
13
13
  import { orderBy } from '@progress/kendo-data-query';
14
14
  import { getter } from '@progress/kendo-common';
15
- import { map, distinctUntilChanged, take, filter, switchMap } from 'rxjs/operators';
15
+ import { map, distinctUntilChanged, take, expand, reduce, filter, switchMap } from 'rxjs/operators';
16
16
  import { LocalizationService, ComponentMessages, L10N_PREFIX } from '@progress/kendo-angular-l10n';
17
17
  import { CommonModule } from '@angular/common';
18
- import { SplitterModule } from '@progress/kendo-angular-layout';
18
+ import { SplitterModule, TabStripModule } from '@progress/kendo-angular-layout';
19
19
  import { ButtonsModule } from '@progress/kendo-angular-buttons';
20
20
  import { DialogModule } from '@progress/kendo-angular-dialog';
21
- import { FormGroup, ReactiveFormsModule } from '@angular/forms';
21
+ import { FormGroup, FormControl, Validators, FormArray, ReactiveFormsModule } from '@angular/forms';
22
22
  import { LabelModule } from '@progress/kendo-angular-label';
23
23
  import { InputsModule } from '@progress/kendo-angular-inputs';
24
24
  import { DateInputsModule } from '@progress/kendo-angular-dateinputs';
25
+ import { GridModule } from '@progress/kendo-angular-grid';
26
+ import { DropDownsModule } from '@progress/kendo-angular-dropdowns';
25
27
 
26
28
  /**
27
29
  * @hidden
@@ -30,7 +32,7 @@ var packageMetadata = {
30
32
  name: '@progress/kendo-angular-gantt',
31
33
  productName: 'Kendo UI for Angular',
32
34
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
33
- publishDate: 1639044748,
35
+ publishDate: 1641921322,
34
36
  version: '',
35
37
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
36
38
  };
@@ -789,8 +791,17 @@ var isClearButton = function (contender, gantt) {
789
791
  return isPresent(clearButtonContainer);
790
792
  };
791
793
 
794
+ /**
795
+ * @hidden
796
+ */
792
797
  var DAY_FORMAT = 'E d/MM';
798
+ /**
799
+ * @hidden
800
+ */
793
801
  var HOUR_FORMAT = 'HH:mm aa';
802
+ /**
803
+ * @hidden
804
+ */
794
805
  var MONTH_FORMAT = 'MMM';
795
806
  /**
796
807
  * @hidden
@@ -1371,30 +1382,109 @@ var DependencyDomService = /** @class */ (function () {
1371
1382
  * @hidden
1372
1383
  */
1373
1384
  var EditService = /** @class */ (function () {
1374
- function EditService() {
1385
+ function EditService(mapper) {
1386
+ var _this = this;
1387
+ this.mapper = mapper;
1375
1388
  this.showEditingDialog = new Subject();
1376
1389
  this.showConfirmationDialog = new Subject();
1377
1390
  this.editEvent = new Subject();
1391
+ this.addEvent = new Subject();
1392
+ this.updatedItems = [];
1393
+ this.deletedItems = [];
1394
+ this.itemIndex = function (item, data) {
1395
+ return data.findIndex(function (dataItem) { return _this.mapper.extractFromTask(dataItem, 'id') === _this.mapper.extractFromTask(item, 'id'); });
1396
+ };
1378
1397
  }
1379
- EditService.prototype.createEditDialog = function (dataItem, formGroup) {
1398
+ Object.defineProperty(EditService.prototype, "dependencies", {
1399
+ get: function () {
1400
+ return this.predecessors.concat(this.successors);
1401
+ },
1402
+ set: function (items) {
1403
+ var _this = this;
1404
+ // Can this whole thing be moved to edit-dialog? Dependencies might not be needed here
1405
+ var dataItemId = this.mapper.extractFromTask(this.dataItem, 'id');
1406
+ this.predecessors = items.filter(function (item) { return _this.mapper.extractFromDependency(item, 'toId') === dataItemId; });
1407
+ this.successors = items.filter(function (item) { return _this.mapper.extractFromDependency(item, 'fromId') === dataItemId; });
1408
+ },
1409
+ enumerable: true,
1410
+ configurable: true
1411
+ });
1412
+ EditService.prototype.createEditDialog = function (dataItem, taskFormGroup, dependencies) {
1380
1413
  this.dataItem = dataItem;
1381
- this.formGroup = formGroup;
1414
+ this.taskFormGroup = taskFormGroup;
1415
+ this.dependencies = dependencies;
1382
1416
  this.showEditingDialog.next(true);
1383
1417
  };
1384
1418
  EditService.prototype.closeEditDialog = function () {
1385
1419
  this.showEditingDialog.next(false);
1386
1420
  this.dataItem = undefined;
1387
- this.formGroup = undefined;
1421
+ this.taskFormGroup = undefined;
1422
+ this.dependencies = [];
1423
+ this.updatedItems = [];
1424
+ this.deletedItems = [];
1388
1425
  };
1389
1426
  EditService.prototype.triggerEditEvent = function (editResultType) {
1390
1427
  this.editEvent.next({
1391
- formGroup: this.formGroup,
1428
+ taskFormGroup: this.taskFormGroup,
1392
1429
  dataItem: this.dataItem,
1430
+ dependencies: {
1431
+ createdItems: this.getCreatedDependencies(),
1432
+ updatedItems: this.updatedItems,
1433
+ deletedItems: this.deletedItems
1434
+ },
1393
1435
  editResultType: editResultType
1394
1436
  });
1395
1437
  };
1438
+ EditService.prototype.updateDependencies = function (item) {
1439
+ if (!this.isNew(item)) {
1440
+ // update
1441
+ var index = this.itemIndex(item, this.updatedItems);
1442
+ if (index !== -1) {
1443
+ this.updatedItems.splice(index, 1, item);
1444
+ }
1445
+ else {
1446
+ this.updatedItems.push(item);
1447
+ }
1448
+ }
1449
+ };
1450
+ EditService.prototype.getCreatedDependencies = function () {
1451
+ var _this = this;
1452
+ return this.dependencies.filter(function (item) { return _this.mapper.extractFromDependency(item, 'id') === null; });
1453
+ };
1454
+ EditService.prototype.deleteDependency = function (item) {
1455
+ var updatedIndex = this.itemIndex(item, this.updatedItems);
1456
+ if (updatedIndex !== -1) {
1457
+ this.updatedItems.splice(updatedIndex, 1);
1458
+ }
1459
+ if (!this.isNew(item)) {
1460
+ this.deletedItems.push(item);
1461
+ }
1462
+ };
1463
+ EditService.prototype.loadTasks = function (initialValues, isInitializer) {
1464
+ var _this = this;
1465
+ if (isInitializer === void 0) { isInitializer = true; }
1466
+ return forkJoin(initialValues.map(function (v) { return _this.getElementById(v); })).pipe(map(function (value) {
1467
+ return value.reduce(function (acc, item) { return acc = acc.concat(normalizeGanttData(item)); }, []);
1468
+ }), expand(function (values) {
1469
+ if (values.some(function (el) { return _this.hasChildren(el); })) {
1470
+ return _this.loadTasks(values, false);
1471
+ }
1472
+ return EMPTY;
1473
+ }), reduce(function (acc, values) { return acc.concat(values); }, isInitializer ? initialValues.slice() : []));
1474
+ };
1475
+ EditService.prototype.getElementById = function (item) {
1476
+ var children = this.fetchChildren(item);
1477
+ if (isObservable(children)) {
1478
+ return children;
1479
+ }
1480
+ return of(children);
1481
+ };
1482
+ EditService.prototype.isNew = function (item) {
1483
+ return !isPresent(this.mapper.extractFromDependency(item, 'id'));
1484
+ };
1396
1485
  EditService = __decorate([
1397
- Injectable()
1486
+ Injectable(),
1487
+ __metadata("design:paramtypes", [MappingService])
1398
1488
  ], EditService);
1399
1489
  return EditService;
1400
1490
  }());
@@ -1707,6 +1797,25 @@ var mapPath = function (item) { return ({
1707
1797
  parent: item.parent.data ? mapPath(item.parent) : null
1708
1798
  }); };
1709
1799
 
1800
+ /**
1801
+ * @hidden
1802
+ *
1803
+ * Needed to keep the Gantt's LocalizationService reference and be able to use it component's inside the TabStrip
1804
+ */
1805
+ var GanttLocalizationService = /** @class */ (function () {
1806
+ function GanttLocalizationService(localizationService) {
1807
+ this.localizationService = localizationService;
1808
+ }
1809
+ GanttLocalizationService.prototype.get = function (token) {
1810
+ return this.localizationService.get(token);
1811
+ };
1812
+ GanttLocalizationService = __decorate([
1813
+ Injectable(),
1814
+ __metadata("design:paramtypes", [LocalizationService])
1815
+ ], GanttLocalizationService);
1816
+ return GanttLocalizationService;
1817
+ }());
1818
+
1710
1819
  var TREELIST_GROUP_COLUMNS_CLASS = 'k-gantt-treelist-nested-columns';
1711
1820
  var DEFAULT_VIEW = 'week';
1712
1821
  /**
@@ -1797,7 +1906,7 @@ var GanttComponent = /** @class */ (function () {
1797
1906
  /**
1798
1907
  * Provides a callback that determines if the given task is selected ([see example]({% slug selection_gantt %}#toc-custom-selection))
1799
1908
  *
1800
- * > The [`selectable`]({% slug gantt_api_ganttcomponent %}#toc-selectable) prop has to be set to `true` in order for this callback to be executed.
1909
+ * > The [`selectable`]({% slug api_gantt_ganttcomponent %}#toc-selectable) prop has to be set to `true` in order for this callback to be executed.
1801
1910
  */
1802
1911
  this.isSelected = isSelected;
1803
1912
  /**
@@ -1811,29 +1920,10 @@ var GanttComponent = /** @class */ (function () {
1811
1920
  /**
1812
1921
  * Enables or disables the Gantt selection mechanism ([see example]({% slug selection_gantt %}#toc-custom-selection)).
1813
1922
  *
1814
- * > When set to `true`, the [`isSelected`]({% slug gantt_api_ganttcomponent %}#toc-isselected) callback has to be provided.
1923
+ * > When set to `true`, the [`isSelected`]({% slug api_gantt_ganttcomponent %}#toc-isselected) callback has to be provided.
1815
1924
  * > When applied, the [`SelectableDirective`]({% slug api_gantt_selectabledirective %}) sets `selectable` to `true` internally.
1816
1925
  */
1817
1926
  this.selectable = false;
1818
- /**
1819
- * The position of the toolbar.
1820
- *
1821
- * The possible values are:
1822
- * - `top`—Positions the toolbar above the Gantt panes.
1823
- * - `bottom`—Positions the toolbar below the Gantt panes.
1824
- * - `both`—Displays two toolbar instances. Positions the first one above,
1825
- * and the second one - below the Gantt panes.
1826
- * - `none`—No toolbar is rendered.
1827
- */
1828
- this.toolbarPosition = 'top';
1829
- /**
1830
- * Gets or sets the callback function that retrieves the child items for a particular item.
1831
- */
1832
- this.fetchChildren = fetchChildren;
1833
- /**
1834
- * Gets or sets the callback function that indicates if a particular item has child items.
1835
- */
1836
- this.hasChildren = hasChildren;
1837
1927
  /**
1838
1928
  * Defines the dependencies that will be drawn between the rendered tasks.
1839
1929
  *
@@ -1935,6 +2025,10 @@ var GanttComponent = /** @class */ (function () {
1935
2025
  * Fires when the user saves an edited task.
1936
2026
  */
1937
2027
  this.save = new EventEmitter();
2028
+ /**
2029
+ * Fires when the user adds a task.
2030
+ */
2031
+ this.taskAdd = new EventEmitter();
1938
2032
  /**
1939
2033
  * Fires when the sorting of the Gantt is changed.
1940
2034
  * You have to handle the event yourself and sort the data.
@@ -2012,6 +2106,13 @@ var GanttComponent = /** @class */ (function () {
2012
2106
  this._rowClass = rowClassCallback;
2013
2107
  this._taskClass = taskClassCallback;
2014
2108
  this._activeView = DEFAULT_VIEW;
2109
+ this._toolbarSettings = {
2110
+ position: 'top',
2111
+ addTaskTool: 'none',
2112
+ viewSelectorTool: 'top'
2113
+ };
2114
+ this._fetchChildren = fetchChildren;
2115
+ this._hasChildren = hasChildren;
2015
2116
  this.rtl = false;
2016
2117
  this.optionChangesSubscriptions = new Subscription();
2017
2118
  this.editServiceSubscription = new Subscription();
@@ -2022,18 +2123,27 @@ var GanttComponent = /** @class */ (function () {
2022
2123
  this.optionChangesSubscriptions.add(this.optionChangesService.columnChanges.subscribe(function () {
2023
2124
  _this.treeList.columns.notifyOnChanges();
2024
2125
  }));
2126
+ this.editService.getSelectedItem = this.getFirstSelectedItem.bind(this);
2025
2127
  this.editServiceSubscription.add(this.editService.showEditingDialog.subscribe(function (show) { return _this.showEditingDialog = show; }));
2026
2128
  this.editServiceSubscription.add(this.editService.showConfirmationDialog.subscribe(function () { return _this.taskDelete.emit(); }));
2027
2129
  this.editServiceSubscription.add(this.editService.editEvent.subscribe(function (args) {
2028
2130
  _this[args.editResultType].emit({
2029
- formGroup: args.formGroup,
2131
+ taskFormGroup: args.taskFormGroup,
2030
2132
  item: getEditItem(args.dataItem, _this.treeList.view.data, _this.mapper),
2133
+ dependencies: args.dependencies,
2031
2134
  sender: _this
2032
2135
  });
2033
2136
  _this.showConfirmationDialog = _this.showEditingDialog = false;
2034
- _this.editService.dataItem = _this.editService.formGroup = null;
2137
+ _this.editService.dataItem = _this.editService.taskFormGroup = null;
2138
+ _this.updateView();
2139
+ }));
2140
+ this.editServiceSubscription.add(this.editService.addEvent.subscribe(function (args) {
2141
+ var selectedItem = _this.getFirstSelectedItem();
2142
+ _this.taskAdd.emit({
2143
+ actionType: args.actionType,
2144
+ selectedItem: selectedItem ? getEditItem(selectedItem, _this.treeList.view.data, _this.mapper) : null
2145
+ });
2035
2146
  _this.updateView();
2036
- _this.dependencyDomService.notifyChanges();
2037
2147
  }));
2038
2148
  this.localizationSubscription = this.localizationService.changes.subscribe(function (_a) {
2039
2149
  var rtl = _a.rtl;
@@ -2139,6 +2249,61 @@ var GanttComponent = /** @class */ (function () {
2139
2249
  enumerable: true,
2140
2250
  configurable: true
2141
2251
  });
2252
+ Object.defineProperty(GanttComponent.prototype, "toolbarSettings", {
2253
+ get: function () {
2254
+ return this._toolbarSettings;
2255
+ },
2256
+ /**
2257
+ * The toolbar configuration. Defines the position and content of the toolbar(s).
2258
+ * The available properties are `position`, `addTaskTool`, and `viewSelectorTool`.
2259
+ * All are optional and default to `top`.
2260
+ *
2261
+ * The possible values for each option are:
2262
+ * - `top`—Positions the toolbar above the Gantt panes. Renders the respective tool in the top toolbar.
2263
+ * - `bottom`—Positions the toolbar below the Gantt panes. Renders the respective tool in the bottom toolbar.
2264
+ * - `both`—Displays two toolbar instances. Positions the first one above,
2265
+ * and the second one - below the Gantt panes. Renders the respective tool in the both toolbars.
2266
+ * - `none`—No toolbar is rendered when used for setting `position`.
2267
+ * No add task or view selector tool is rendered when used for setting `addTaskTool` or `viewSelectorTool`.
2268
+ */
2269
+ set: function (value) {
2270
+ this._toolbarSettings = {
2271
+ position: value.position || 'top',
2272
+ addTaskTool: value.addTaskTool || 'none',
2273
+ viewSelectorTool: value.viewSelectorTool || 'top'
2274
+ };
2275
+ },
2276
+ enumerable: true,
2277
+ configurable: true
2278
+ });
2279
+ Object.defineProperty(GanttComponent.prototype, "fetchChildren", {
2280
+ get: function () {
2281
+ return this._fetchChildren;
2282
+ },
2283
+ /**
2284
+ * Gets or sets the callback function that retrieves the child items for a particular item.
2285
+ */
2286
+ set: function (fn) {
2287
+ this._fetchChildren = fn;
2288
+ this.editService.fetchChildren = fn;
2289
+ },
2290
+ enumerable: true,
2291
+ configurable: true
2292
+ });
2293
+ Object.defineProperty(GanttComponent.prototype, "hasChildren", {
2294
+ get: function () {
2295
+ return this._hasChildren;
2296
+ },
2297
+ /**
2298
+ * Gets or sets the callback function that indicates if a particular item has child items.
2299
+ */
2300
+ set: function (fn) {
2301
+ this._hasChildren = fn;
2302
+ this.editService.hasChildren = fn;
2303
+ },
2304
+ enumerable: true,
2305
+ configurable: true
2306
+ });
2142
2307
  Object.defineProperty(GanttComponent.prototype, "timelinePaneOptions", {
2143
2308
  get: function () {
2144
2309
  return __assign({}, this._timelinePaneOptions, { size: this.treeListPaneOptions.collapsed ? '100%' : this._timelinePaneOptions.size });
@@ -2290,16 +2455,6 @@ var GanttComponent = /** @class */ (function () {
2290
2455
  enumerable: true,
2291
2456
  configurable: true
2292
2457
  });
2293
- Object.defineProperty(GanttComponent.prototype, "editDialogFormGroup", {
2294
- /**
2295
- * @hidden
2296
- */
2297
- get: function () {
2298
- return this.editService.formGroup;
2299
- },
2300
- enumerable: true,
2301
- configurable: true
2302
- });
2303
2458
  GanttComponent.prototype.ngOnChanges = function (changes) {
2304
2459
  if (anyChanged(['data', 'activeView', 'workWeekStart', 'workWeekEnd', 'workDayStart', 'workDayEnd'], changes)) {
2305
2460
  this.loadTimelineData();
@@ -2373,19 +2528,30 @@ var GanttComponent = /** @class */ (function () {
2373
2528
  }
2374
2529
  };
2375
2530
  /**
2376
- * Updates the data of the Gantt and forces row-related callbacks to be called anew.
2531
+ * Forces the TreeList to evaluate if some data items have changed and re-renders the rows information, if needed.
2532
+ * Recalculates and re-renders the Timeline period, if needed.
2533
+ * Redraws changed dependencies, if needed.
2534
+ * Executes all row-related callbacks anew.
2377
2535
  */
2378
2536
  GanttComponent.prototype.updateView = function () {
2379
2537
  if (isPresent(this.treeList)) {
2380
2538
  this.treeList.updateView();
2381
2539
  }
2540
+ this.loadTimelineData();
2541
+ this.dependencyDomService.notifyChanges();
2382
2542
  };
2383
2543
  /**
2384
2544
  * Opens the task editing dialog.
2385
2545
  */
2386
2546
  GanttComponent.prototype.editTask = function (dataItem, formGroup) {
2547
+ var _this = this;
2387
2548
  if (!this.showEditingDialog) {
2388
- this.editService.createEditDialog(dataItem, formGroup);
2549
+ var taskId_1 = this.mapper.extractFromTask(dataItem, 'id');
2550
+ var dependencies = this.dependencies.filter(function (item) {
2551
+ return _this.mapper.extractFromDependency(item, 'toId') === taskId_1
2552
+ || _this.mapper.extractFromDependency(item, 'fromId') === taskId_1;
2553
+ });
2554
+ this.editService.createEditDialog(dataItem, formGroup, dependencies);
2389
2555
  }
2390
2556
  };
2391
2557
  /**
@@ -2458,7 +2624,7 @@ var GanttComponent = /** @class */ (function () {
2458
2624
  * @hidden
2459
2625
  */
2460
2626
  GanttComponent.prototype.showToolbar = function (position) {
2461
- return this.toolbarPosition !== 'none' && ([position, 'both'].indexOf(this.toolbarPosition) > -1);
2627
+ return this.toolbarSettings.position !== 'none' && ([position, 'both'].indexOf(this.toolbarSettings.position) > -1);
2462
2628
  };
2463
2629
  /**
2464
2630
  * @hidden
@@ -2626,7 +2792,7 @@ var GanttComponent = /** @class */ (function () {
2626
2792
  items: [dataItem],
2627
2793
  sender: this
2628
2794
  });
2629
- this.updateView();
2795
+ this.treeList.updateView();
2630
2796
  };
2631
2797
  GanttComponent.prototype.updateTreeListGroupClass = function (columns) {
2632
2798
  if (columns === void 0) { columns = this.columns; }
@@ -2666,6 +2832,11 @@ var GanttComponent = /** @class */ (function () {
2666
2832
  var shouldToggleSelection = ctrlKey || metaKey;
2667
2833
  return (shouldToggleSelection && this.isSelected(dataItem)) ? 'remove' : 'select';
2668
2834
  };
2835
+ GanttComponent.prototype.getFirstSelectedItem = function () {
2836
+ var isSelectedCallback = this.isSelected || isSelected;
2837
+ var loadedItems = this.renderedTreeListItems || [];
2838
+ return loadedItems.find(isSelectedCallback);
2839
+ };
2669
2840
  var GanttComponent_1;
2670
2841
  __decorate([
2671
2842
  ViewChild(TreeListComponent, { static: true }),
@@ -2739,16 +2910,19 @@ var GanttComponent = /** @class */ (function () {
2739
2910
  ], GanttComponent.prototype, "selectable", void 0);
2740
2911
  __decorate([
2741
2912
  Input(),
2742
- __metadata("design:type", String)
2743
- ], GanttComponent.prototype, "toolbarPosition", void 0);
2913
+ __metadata("design:type", Object),
2914
+ __metadata("design:paramtypes", [Object])
2915
+ ], GanttComponent.prototype, "toolbarSettings", null);
2744
2916
  __decorate([
2745
2917
  Input(),
2746
- __metadata("design:type", Function)
2747
- ], GanttComponent.prototype, "fetchChildren", void 0);
2918
+ __metadata("design:type", Function),
2919
+ __metadata("design:paramtypes", [Function])
2920
+ ], GanttComponent.prototype, "fetchChildren", null);
2748
2921
  __decorate([
2749
2922
  Input(),
2750
- __metadata("design:type", Function)
2751
- ], GanttComponent.prototype, "hasChildren", void 0);
2923
+ __metadata("design:type", Function),
2924
+ __metadata("design:paramtypes", [Function])
2925
+ ], GanttComponent.prototype, "hasChildren", null);
2752
2926
  __decorate([
2753
2927
  Input(),
2754
2928
  __metadata("design:type", Array)
@@ -2861,6 +3035,10 @@ var GanttComponent = /** @class */ (function () {
2861
3035
  Output(),
2862
3036
  __metadata("design:type", EventEmitter)
2863
3037
  ], GanttComponent.prototype, "save", void 0);
3038
+ __decorate([
3039
+ Output(),
3040
+ __metadata("design:type", EventEmitter)
3041
+ ], GanttComponent.prototype, "taskAdd", void 0);
2864
3042
  __decorate([
2865
3043
  Output(),
2866
3044
  __metadata("design:type", EventEmitter)
@@ -2918,6 +3096,7 @@ var GanttComponent = /** @class */ (function () {
2918
3096
  selector: 'kendo-gantt',
2919
3097
  exportAs: 'kendoGantt',
2920
3098
  providers: [
3099
+ GanttLocalizationService,
2921
3100
  LocalizationService,
2922
3101
  {
2923
3102
  provide: DataBoundTreeComponent,
@@ -2937,7 +3116,7 @@ var GanttComponent = /** @class */ (function () {
2937
3116
  OptionChangesService,
2938
3117
  EditService
2939
3118
  ],
2940
- template: "\n <ng-container kendoGanttLocalizedMessages\n i18n-taskDeleteLabel=\"kendo.gantt.taskDeleteLabel|The label of the task delete icon\"\n taskDeleteLabel=\"Delete\"\n\n i18n-taskEditingDialogTitle=\"kendo.gantt.taskEditingDialogTitle|The title of the task editing dialog\"\n taskEditingDialogTitle=\"Editing Task\"\n\n i18n-taskEditingDialogCloseTitle=\"kendo.gantt.taskEditingDialogCloseTitle|The title of the task editing dialog close button\"\n taskEditingDialogCloseTitle=\"Close\"\n\n i18n-confirmationDialogCloseTitle=\"kendo.gantt.confirmationDialogCloseTitle|The title of the confirmation dialog close button\"\n confirmationDialogCloseTitle=\"Close\"\n\n i18n-confirmationDialogTitle=\"kendo.gantt.confirmationDialogTitle|The title of the delete task confirmation dialog\"\n confirmationDialogTitle=\"Delete Task\"\n\n i18n-confirmationDialogContent=\"kendo.gantt.confirmationDialogContent|The content of the delete task confirmation dialog\"\n confirmationDialogContent=\"Are you sure you want to delete this task?\"\n\n i18n-deleteButtonText=\"kendo.gantt.deleteButtonText|The text of the task editing dialog 'Delete' button\"\n deleteButtonText=\"Delete\"\n\n i18n-cancelButtonText=\"kendo.gantt.cancelButtonText|The text of the task editing dialog 'Cancel' button\"\n cancelButtonText=\"Cancel\"\n\n i18n-saveButtonText=\"kendo.gantt.saveButtonText|The text of the task editing dialog 'Save' button\"\n saveButtonText=\"Save\"\n\n i18n-titleFieldInputLabel=\"kendo.gantt.titleFieldInputLabel|The label of the 'title' field input in editing mode\"\n titleFieldInputLabel=\"Title\"\n\n i18n-startFieldInputLabel=\"kendo.gantt.startFieldInputLabel|The label of the 'start' field input in editing mode\"\n startFieldInputLabel=\"Start\"\n\n i18n-endFieldInputLabel=\"kendo.gantt.endFieldInputLabel|The label of the 'end' field input in editing mode\"\n endFieldInputLabel=\"End\"\n\n i18n-completionRatioFieldInputLabel=\"kendo.gantt.completionRatioFieldInputLabel|The label of the 'completionRatio' field input in editing mode\"\n completionRatioFieldInputLabel=\"Progress\"\n\n i18n-dayViewText=\"kendo.gantt.dayViewText|The text of the day view in the ViewSelector component\"\n dayViewText=\"Day\"\n\n i18n-weekViewText=\"kendo.gantt.weekViewText|The text of the week view in the ViewSelector component\"\n weekViewText=\"Week\"\n\n i18n-monthViewText=\"kendo.gantt.monthViewText|The text of the month view in the ViewSelector component\"\n monthViewText=\"Month\"\n\n i18n-yearViewText-disabled=\"kendo.gantt.yearViewText|The text of the year view in the ViewSelector component\"\n yearViewText=\"Year\"\n\n i18n-noRecords=\"kendo.gantt.noRecords|The label visible in the TreeList when there are no records\"\n noRecords=\"No records available.\"\n\n i18n-filter=\"kendo.gantt.filter|The label of the filter cell or icon\"\n filter=\"Filter\"\n\n i18n-filterEqOperator=\"kendo.gantt.filterEqOperator|The text of the equal filter operator\"\n filterEqOperator=\"Is equal to\"\n\n i18n-filterNotEqOperator=\"kendo.gantt.filterNotEqOperator|The text of the not equal filter operator\"\n filterNotEqOperator=\"Is not equal to\"\n\n i18n-filterIsNullOperator=\"kendo.gantt.filterIsNullOperator|The text of the is null filter operator\"\n filterIsNullOperator=\"Is null\"\n\n i18n-filterIsNotNullOperator=\"kendo.gantt.filterIsNotNullOperator|The text of the is not null filter operator\"\n filterIsNotNullOperator=\"Is not null\"\n\n i18n-filterIsEmptyOperator=\"kendo.gantt.filterIsEmptyOperator|The text of the is empty filter operator\"\n filterIsEmptyOperator=\"Is empty\"\n\n i18n-filterIsNotEmptyOperator=\"kendo.gantt.filterIsNotEmptyOperator|The text of the is not empty filter operator\"\n filterIsNotEmptyOperator=\"Is not empty\"\n\n i18n-filterStartsWithOperator=\"kendo.gantt.filterStartsWithOperator|The text of the starts with filter operator\"\n filterStartsWithOperator=\"Starts with\"\n\n i18n-filterContainsOperator=\"kendo.gantt.filterContainsOperator|The text of the contains filter operator\"\n filterContainsOperator=\"Contains\"\n\n i18n-filterNotContainsOperator=\"kendo.gantt.filterNotContainsOperator|The text of the does not contain filter operator\"\n filterNotContainsOperator=\"Does not contain\"\n\n i18n-filterEndsWithOperator=\"kendo.gantt.filterEndsWithOperator|The text of the ends with filter operator\"\n filterEndsWithOperator=\"Ends with\"\n\n i18n-filterGteOperator=\"kendo.gantt.filterGteOperator|The text of the greater than or equal filter operator\"\n filterGteOperator=\"Is greater than or equal to\"\n\n i18n-filterGtOperator=\"kendo.gantt.filterGtOperator|The text of the greater than filter operator\"\n filterGtOperator=\"Is greater than\"\n\n i18n-filterLteOperator=\"kendo.gantt.filterLteOperator|The text of the less than or equal filter operator\"\n filterLteOperator=\"Is less than or equal to\"\n\n i18n-filterLtOperator=\"kendo.gantt.filterLtOperator|The text of the less than filter operator\"\n filterLtOperator=\"Is less than\"\n\n i18n-filterIsTrue=\"kendo.gantt.filterIsTrue|The text of the IsTrue boolean filter option\"\n filterIsTrue=\"Is True\"\n\n i18n-filterIsFalse=\"kendo.gantt.filterIsFalse|The text of the IsFalse boolean filter option\"\n filterIsFalse=\"Is False\"\n\n i18n-filterBooleanAll=\"kendo.gantt.filterBooleanAll|The text of the (All) boolean filter option\"\n filterBooleanAll=\"(All)\"\n\n i18n-filterAfterOrEqualOperator=\"kendo.gantt.filterAfterOrEqualOperator|The text of the after or equal date filter operator\"\n filterAfterOrEqualOperator=\"Is after or equal to\"\n\n i18n-filterAfterOperator=\"kendo.gantt.filterAfterOperator|The text of the after date filter operator\"\n filterAfterOperator=\"Is after\"\n\n i18n-filterBeforeOperator=\"kendo.gantt.filterBeforeOperator|The text of the before date filter operator\"\n filterBeforeOperator=\"Is before\"\n\n i18n-filterBeforeOrEqualOperator=\"kendo.gantt.filterBeforeOrEqualOperator|The text of the before or equal date filter operator\"\n filterBeforeOrEqualOperator=\"Is before or equal to\"\n\n i18n-filterFilterButton=\"kendo.gantt.filterFilterButton|The text of the filter button\"\n filterFilterButton=\"Filter\"\n\n i18n-filterClearButton=\"kendo.gantt.filterClearButton|The text of the clear filter button\"\n filterClearButton=\"Clear\"\n\n i18n-filterAndLogic=\"kendo.gantt.filterAndLogic|The text of the And filter logic\"\n filterAndLogic=\"And\"\n\n i18n-filterOrLogic=\"kendo.gantt.filterOrLogic|The text of the Or filter logic\"\n filterOrLogic=\"Or\"\n\n i18n-loading=\"kendo.gantt.loading|The loading text\"\n loading=\"Loading\"\n\n i18n-columnMenu=\"kendo.gantt.columnMenu|The title of the column menu icon\"\n columnMenu=\"Column Menu\"\n\n i18n-columns=\"kendo.gantt.columns|The text shown in the column menu for the columns item\"\n columns=\"Columns\"\n\n i18n-lock-disabled=\"kendo.gantt.lock|The text shown in the column menu for the lock item\"\n lock-disabled=\"Lock\"\n\n i18n-unlock-disabled=\"kendo.gantt.unlock|The text shown in the column menu for the unlock item\"\n unlock-disabled=\"Unlock\"\n\n i18n-sortable=\"kendo.gantt.sortable|The label of the sort icon\"\n sortable=\"Sortable\"\n\n i18n-sortAscending=\"kendo.gantt.sortAscending|The text shown in the column menu for the sort ascending item\"\n sortAscending=\"Sort Ascending\"\n\n i18n-sortDescending=\"kendo.gantt.sortDescending|The text shown in the column menu for the sort descending item\"\n sortDescending=\"Sort Descending\"\n\n i18n-sortedAscending=\"kendo.gantt.sortedAscending|The status announcement when a column is sorted ascending\"\n sortedAscending=\"Sorted Ascending\"\n\n i18n-sortedDescending=\"kendo.gantt.sortedDescending|The status announcement when a column is sorted descending\"\n sortedDescending=\"Sorted Descending\"\n\n i18n-sortedDefault=\"kendo.gantt.sortedDefault|The status announcement when a column is no longer sorted\"\n sortedDefault=\"Not Sorted\"\n\n i18n-columnsApply=\"kendo.gantt.columnsApply|The text shown in the column menu or column chooser for the columns apply button\"\n columnsApply=\"Apply\"\n\n i18n-columnsReset=\"kendo.gantt.columnsReset|The text shown in the column menu or column chooser for the columns reset button\"\n columnsReset=\"Reset\"></ng-container>\n <kendo-gantt-toolbar\n *ngIf=\"showToolbar('top')\"\n class=\"k-gantt-header k-toolbar k-gantt-toolbar\"\n position=\"top\"></kendo-gantt-toolbar>\n <div class=\"k-gantt-content\">\n <kendo-splitter [style.border]=\"0\">\n <kendo-splitter-pane\n class=\"k-gantt-treelist k-gantt-treelist-scrollable\"\n [collapsible]=\"treeListPaneOptions?.collapsible\"\n [collapsed]=\"treeListPaneOptions?.collapsed\"\n (collapsedChange)=\"onTreeListCollapsedChange($event)\"\n [scrollable]=\"false\">\n <kendo-treelist\n [idField]=\"taskIdField\"\n [columns]=\"columns\"\n [data]=\"data\"\n [hasChildren]=\"hasChildren\"\n [fetchChildren]=\"fetchChildren\"\n [isExpanded]=\"isExpanded\"\n [autoSize]=\"columnsAutoSize\"\n [columnMenu]=\"columnMenu\"\n [reorderable]=\"columnsReorderable\"\n [resizable]=\"columnsResizable\"\n [rowClass]=\"rowClass\"\n [isSelected]=\"isSelected\"\n [selectable]=\"selectable\"\n [sortable]=\"sortable\"\n [sort]=\"sort\"\n [filterable]=\"filterMenu\"\n [filter]=\"filter\"\n (filterChange)=\"filterChange.emit($event)\"\n (sortChange)=\"sortChange.emit($event)\"\n (dataStateChange)=\"dataStateChange.emit({\n filter: $event.filter,\n sort: $event.sort\n })\"\n (expandStateChange)=\"expandStateChange.emit($event)\"\n (expand)=\"rowExpand.emit({ dataItem: $event.dataItem })\"\n (collapse)=\"rowCollapse.emit({ dataItem: $event.dataItem })\"\n (columnReorder)=\"columnReorder.emit($event)\"\n (columnResize)=\"columnResize.emit($event)\"\n (columnVisibilityChange)=\"handleColumnVisibilityChange($event)\"\n (columnLockedChange)=\"columnLockedChange.emit($event)\"\n (selectionChange)=\"handleTreeListSelectionChange($event)\"\n (cellClick)=\"handleTreeListCellClick($event)\"\n (cellClose)=\"handleCellClose($event)\"\n [kendoEventsOutsideAngular]=\"{\n dblclick: handleTreeListDoubleClick\n }\"\n [scope]=\"this\"\n >\n <kendo-treelist-messages [kendoGanttTreeListMessages]=\"localizationService\"></kendo-treelist-messages>\n </kendo-treelist>\n </kendo-splitter-pane>\n <kendo-splitter-pane\n [collapsible]=\"timelinePaneOptions?.collapsible\"\n [resizable]=\"timelinePaneOptions?.resizable\"\n [collapsed]=\"timelinePaneOptions?.collapsed\"\n [min]=\"timelinePaneOptions?.min\"\n [max]=\"timelinePaneOptions?.max\"\n [size]=\"timelinePaneOptions?.size\"\n (collapsedChange)=\"onTimelineCollapsedChange($event)\"\n (sizeChange)=\"onTimelinePaneSizeChange($event)\"\n [scrollable]=\"false\">\n <kendo-gantt-timeline\n *ngIf=\"views && views.length\"\n [rows]=\"renderedTreeListItems\"\n [slots]=\"timelineSlots\"\n [groupSlots]=\"timelineGroupSlots\"\n [tableWidth]=\"tableWidth\"\n [activeView]=\"activeView\"\n [taskContentTemplate]=\"taskContentTemplate?.templateRef\"\n [taskTemplate]=\"taskTemplate?.templateRef\"\n [summaryTaskTemplate]=\"summaryTaskTemplate?.templateRef\"\n [taskClass]=\"taskClass\"\n [dependencies]=\"dependencies\"\n [hasChildren]=\"hasChildren\"\n [isTaskSelected]=\"isTaskSelected\"\n [kendoEventsOutsideAngular]=\"{\n click: handleTimelineClick,\n contextmenu: handleTimelineRightClick,\n dblclick: handleTimelineDblClick,\n mousedown: handleTimelineMouseDown\n }\"\n [scope]=\"this\"\n ></kendo-gantt-timeline>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n <kendo-gantt-toolbar\n *ngIf=\"showToolbar('bottom')\"\n class=\"k-gantt-footer k-toolbar k-gantt-toolbar\"\n position=\"bottom\"></kendo-gantt-toolbar>\n <kendo-gantt-edit-dialog *ngIf=\"showEditingDialog\" [formGroup]=\"editDialogFormGroup\"></kendo-gantt-edit-dialog>\n <kendo-dialog\n *ngIf=\"showConfirmationDialog\"\n [width]=\"575\"\n [height]=\"170\"\n [title]=\"getText('confirmationDialogTitle')\"\n (close)=\"showConfirmationDialog = false;\">\n <span>{{getText('confirmationDialogContent')}}</span>\n <kendo-dialog-actions layout=\"normal\">\n <kendo-treelist-spacer></kendo-treelist-spacer>\n <button kendoButton [primary]=\"true\" (click)=\"handleDeleteConfirmation()\">{{ getText('deleteButtonText') }}</button>\n <button kendoButton (click)=\"showConfirmationDialog = false;\">{{ getText('cancelButtonText') }}</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n "
3119
+ template: "\n <ng-container kendoGanttLocalizedMessages\n i18n-taskEditingGeneralTabTitle=\"kendo.gantt.taskEditingGeneralTabTitle|The title of the 'General' tab of the editing dialog TabStrip\"\n taskEditingGeneralTabTitle=\"General\"\n\n i18n-taskEditingPredecessorsTabTitle=\"kendo.gantt.taskEditingPredecessorsTabTitle|The title of the 'Predecessors' dependencies tab of the editing dialog TabStrip\"\n taskEditingPredecessorsTabTitle=\"Predecessors\"\n\n i18n-taskEditingSuccessorsTabTitle=\"kendo.gantt.taskEditingSuccessorsTabTitle|The title of the 'Successors' dependencies tab of the editing dialog TabStrip\"\n taskEditingSuccessorsTabTitle=\"Successors\"\n\n i18n-taskEditingDependenciesAddButtonText=\"kendo.gantt.taskEditingDependenciesAddButtonText|The text of the 'Add' button in the dependencies tabs of the editing dialog TabStrip\"\n taskEditingDependenciesAddButtonText=\"Add\"\n\n i18n-taskEditingDependenciesRemoveButtonText=\"kendo.gantt.taskEditingDependenciesRemoveButtonText|The text of the 'Remove' button in the dependencies tabs of the editing dialog TabStrip\"\n taskEditingDependenciesRemoveButtonText=\"Remove\"\n\n i18n-taskEditingDependenciesGridNameColumnTitle=\"kendo.gantt.taskEditingDependenciesGridNameColumnTitle|The title of the 'Task Title' Grid column in the dependencies tabs of the editing dialog TabStrip\"\n taskEditingDependenciesGridNameColumnTitle=\"Task Title\"\n\n i18n-taskEditingDependenciesGridTypeColumnTitle=\"kendo.gantt.taskEditingDependenciesGridTypeColumnTitle|The title of the 'Type' Grid column in the dependencies tabs of the editing dialog TabStrip\"\n taskEditingDependenciesGridTypeColumnTitle=\"Type\"\n\n i18n-taskDeleteLabel=\"kendo.gantt.taskDeleteLabel|The label of the task delete icon\"\n taskDeleteLabel=\"Delete\"\n\n i18n-taskEditingDialogTitle=\"kendo.gantt.taskEditingDialogTitle|The title of the task editing dialog\"\n taskEditingDialogTitle=\"Editing Task\"\n\n i18n-taskEditingDialogCloseTitle=\"kendo.gantt.taskEditingDialogCloseTitle|The title of the task editing dialog close button\"\n taskEditingDialogCloseTitle=\"Close\"\n\n i18n-confirmationDialogCloseTitle=\"kendo.gantt.confirmationDialogCloseTitle|The title of the confirmation dialog close button\"\n confirmationDialogCloseTitle=\"Close\"\n\n i18n-confirmationDialogTitle=\"kendo.gantt.confirmationDialogTitle|The title of the delete task confirmation dialog\"\n confirmationDialogTitle=\"Delete Task\"\n\n i18n-confirmationDialogContent=\"kendo.gantt.confirmationDialogContent|The content of the delete task confirmation dialog\"\n confirmationDialogContent=\"Are you sure you want to delete this task?\"\n\n i18n-deleteButtonText=\"kendo.gantt.deleteButtonText|The text of the task editing dialog 'Delete' button\"\n deleteButtonText=\"Delete\"\n\n i18n-cancelButtonText=\"kendo.gantt.cancelButtonText|The text of the task editing dialog 'Cancel' button\"\n cancelButtonText=\"Cancel\"\n\n i18n-saveButtonText=\"kendo.gantt.saveButtonText|The text of the task editing dialog 'Save' button\"\n saveButtonText=\"Save\"\n\n i18n-titleFieldInputLabel=\"kendo.gantt.titleFieldInputLabel|The label of the 'title' field input in editing mode\"\n titleFieldInputLabel=\"Title\"\n\n i18n-startFieldInputLabel=\"kendo.gantt.startFieldInputLabel|The label of the 'start' field input in editing mode\"\n startFieldInputLabel=\"Start\"\n\n i18n-endFieldInputLabel=\"kendo.gantt.endFieldInputLabel|The label of the 'end' field input in editing mode\"\n endFieldInputLabel=\"End\"\n\n i18n-completionRatioFieldInputLabel=\"kendo.gantt.completionRatioFieldInputLabel|The label of the 'completionRatio' field input in editing mode\"\n completionRatioFieldInputLabel=\"Progress\"\n\n i18n-dayViewText=\"kendo.gantt.dayViewText|The text of the day view in the ViewSelector component\"\n dayViewText=\"Day\"\n\n i18n-weekViewText=\"kendo.gantt.weekViewText|The text of the week view in the ViewSelector component\"\n weekViewText=\"Week\"\n\n i18n-monthViewText=\"kendo.gantt.monthViewText|The text of the month view in the ViewSelector component\"\n monthViewText=\"Month\"\n\n i18n-yearViewText-disabled=\"kendo.gantt.yearViewText|The text of the year view in the ViewSelector component\"\n yearViewText=\"Year\"\n\n i18n-addTaskText=\"kendo.gantt.addTaskText|The text of the DropDownButton in the AddTask component\"\n addTaskText=\"Add Task\"\n\n i18n-addChildText=\"kendo.gantt.addChildText|The text of the 'Add Child' option in the AddTask component\"\n addChildText=\"Add Child\"\n\n i18n-addAboveText=\"kendo.gantt.addAboveText|The text of the 'Add Above' option in the AddTask component\"\n addAboveText=\"Add Above\"\n\n i18n-addBelowText=\"kendo.gantt.addBelowText|The text of the 'Add Below' option in the AddTask component\"\n addBelowText=\"Add Below\"\n\n i18n-noRecords=\"kendo.gantt.noRecords|The label visible in the TreeList when there are no records\"\n noRecords=\"No records available.\"\n\n i18n-filter=\"kendo.gantt.filter|The label of the filter cell or icon\"\n filter=\"Filter\"\n\n i18n-filterEqOperator=\"kendo.gantt.filterEqOperator|The text of the equal filter operator\"\n filterEqOperator=\"Is equal to\"\n\n i18n-filterNotEqOperator=\"kendo.gantt.filterNotEqOperator|The text of the not equal filter operator\"\n filterNotEqOperator=\"Is not equal to\"\n\n i18n-filterIsNullOperator=\"kendo.gantt.filterIsNullOperator|The text of the is null filter operator\"\n filterIsNullOperator=\"Is null\"\n\n i18n-filterIsNotNullOperator=\"kendo.gantt.filterIsNotNullOperator|The text of the is not null filter operator\"\n filterIsNotNullOperator=\"Is not null\"\n\n i18n-filterIsEmptyOperator=\"kendo.gantt.filterIsEmptyOperator|The text of the is empty filter operator\"\n filterIsEmptyOperator=\"Is empty\"\n\n i18n-filterIsNotEmptyOperator=\"kendo.gantt.filterIsNotEmptyOperator|The text of the is not empty filter operator\"\n filterIsNotEmptyOperator=\"Is not empty\"\n\n i18n-filterStartsWithOperator=\"kendo.gantt.filterStartsWithOperator|The text of the starts with filter operator\"\n filterStartsWithOperator=\"Starts with\"\n\n i18n-filterContainsOperator=\"kendo.gantt.filterContainsOperator|The text of the contains filter operator\"\n filterContainsOperator=\"Contains\"\n\n i18n-filterNotContainsOperator=\"kendo.gantt.filterNotContainsOperator|The text of the does not contain filter operator\"\n filterNotContainsOperator=\"Does not contain\"\n\n i18n-filterEndsWithOperator=\"kendo.gantt.filterEndsWithOperator|The text of the ends with filter operator\"\n filterEndsWithOperator=\"Ends with\"\n\n i18n-filterGteOperator=\"kendo.gantt.filterGteOperator|The text of the greater than or equal filter operator\"\n filterGteOperator=\"Is greater than or equal to\"\n\n i18n-filterGtOperator=\"kendo.gantt.filterGtOperator|The text of the greater than filter operator\"\n filterGtOperator=\"Is greater than\"\n\n i18n-filterLteOperator=\"kendo.gantt.filterLteOperator|The text of the less than or equal filter operator\"\n filterLteOperator=\"Is less than or equal to\"\n\n i18n-filterLtOperator=\"kendo.gantt.filterLtOperator|The text of the less than filter operator\"\n filterLtOperator=\"Is less than\"\n\n i18n-filterIsTrue=\"kendo.gantt.filterIsTrue|The text of the IsTrue boolean filter option\"\n filterIsTrue=\"Is True\"\n\n i18n-filterIsFalse=\"kendo.gantt.filterIsFalse|The text of the IsFalse boolean filter option\"\n filterIsFalse=\"Is False\"\n\n i18n-filterBooleanAll=\"kendo.gantt.filterBooleanAll|The text of the (All) boolean filter option\"\n filterBooleanAll=\"(All)\"\n\n i18n-filterAfterOrEqualOperator=\"kendo.gantt.filterAfterOrEqualOperator|The text of the after or equal date filter operator\"\n filterAfterOrEqualOperator=\"Is after or equal to\"\n\n i18n-filterAfterOperator=\"kendo.gantt.filterAfterOperator|The text of the after date filter operator\"\n filterAfterOperator=\"Is after\"\n\n i18n-filterBeforeOperator=\"kendo.gantt.filterBeforeOperator|The text of the before date filter operator\"\n filterBeforeOperator=\"Is before\"\n\n i18n-filterBeforeOrEqualOperator=\"kendo.gantt.filterBeforeOrEqualOperator|The text of the before or equal date filter operator\"\n filterBeforeOrEqualOperator=\"Is before or equal to\"\n\n i18n-filterFilterButton=\"kendo.gantt.filterFilterButton|The text of the filter button\"\n filterFilterButton=\"Filter\"\n\n i18n-filterClearButton=\"kendo.gantt.filterClearButton|The text of the clear filter button\"\n filterClearButton=\"Clear\"\n\n i18n-filterAndLogic=\"kendo.gantt.filterAndLogic|The text of the And filter logic\"\n filterAndLogic=\"And\"\n\n i18n-filterOrLogic=\"kendo.gantt.filterOrLogic|The text of the Or filter logic\"\n filterOrLogic=\"Or\"\n\n i18n-loading=\"kendo.gantt.loading|The loading text\"\n loading=\"Loading\"\n\n i18n-columnMenu=\"kendo.gantt.columnMenu|The title of the column menu icon\"\n columnMenu=\"Column Menu\"\n\n i18n-columns=\"kendo.gantt.columns|The text shown in the column menu for the columns item\"\n columns=\"Columns\"\n\n i18n-lock-disabled=\"kendo.gantt.lock|The text shown in the column menu for the lock item\"\n lock-disabled=\"Lock\"\n\n i18n-unlock-disabled=\"kendo.gantt.unlock|The text shown in the column menu for the unlock item\"\n unlock-disabled=\"Unlock\"\n\n i18n-sortable=\"kendo.gantt.sortable|The label of the sort icon\"\n sortable=\"Sortable\"\n\n i18n-sortAscending=\"kendo.gantt.sortAscending|The text shown in the column menu for the sort ascending item\"\n sortAscending=\"Sort Ascending\"\n\n i18n-sortDescending=\"kendo.gantt.sortDescending|The text shown in the column menu for the sort descending item\"\n sortDescending=\"Sort Descending\"\n\n i18n-sortedAscending=\"kendo.gantt.sortedAscending|The status announcement when a column is sorted ascending\"\n sortedAscending=\"Sorted Ascending\"\n\n i18n-sortedDescending=\"kendo.gantt.sortedDescending|The status announcement when a column is sorted descending\"\n sortedDescending=\"Sorted Descending\"\n\n i18n-sortedDefault=\"kendo.gantt.sortedDefault|The status announcement when a column is no longer sorted\"\n sortedDefault=\"Not Sorted\"\n\n i18n-columnsApply=\"kendo.gantt.columnsApply|The text shown in the column menu or column chooser for the columns apply button\"\n columnsApply=\"Apply\"\n\n i18n-columnsReset=\"kendo.gantt.columnsReset|The text shown in the column menu or column chooser for the columns reset button\"\n columnsReset=\"Reset\"></ng-container>\n <kendo-gantt-toolbar\n *ngIf=\"showToolbar('top')\"\n [showAddTask]=\"toolbarSettings.addTaskTool === 'top' || toolbarSettings.addTaskTool === 'both'\"\n [showViewSelector]=\"toolbarSettings.viewSelectorTool === 'top' || toolbarSettings.viewSelectorTool === 'both'\"\n class=\"k-gantt-header k-toolbar k-gantt-toolbar\"\n position=\"top\"></kendo-gantt-toolbar>\n <div class=\"k-gantt-content\">\n <kendo-splitter [style.border]=\"0\">\n <kendo-splitter-pane\n class=\"k-gantt-treelist k-gantt-treelist-scrollable\"\n [collapsible]=\"treeListPaneOptions?.collapsible\"\n [collapsed]=\"treeListPaneOptions?.collapsed\"\n (collapsedChange)=\"onTreeListCollapsedChange($event)\"\n [scrollable]=\"false\">\n <kendo-treelist\n [idField]=\"taskIdField\"\n [columns]=\"columns\"\n [data]=\"data\"\n [hasChildren]=\"hasChildren\"\n [fetchChildren]=\"fetchChildren\"\n [isExpanded]=\"isExpanded\"\n [autoSize]=\"columnsAutoSize\"\n [columnMenu]=\"columnMenu\"\n [reorderable]=\"columnsReorderable\"\n [resizable]=\"columnsResizable\"\n [rowClass]=\"rowClass\"\n [isSelected]=\"isSelected\"\n [selectable]=\"selectable\"\n [sortable]=\"sortable\"\n [sort]=\"sort\"\n [filterable]=\"filterMenu\"\n [filter]=\"filter\"\n (filterChange)=\"filterChange.emit($event)\"\n (sortChange)=\"sortChange.emit($event)\"\n (dataStateChange)=\"dataStateChange.emit({\n filter: $event.filter,\n sort: $event.sort\n })\"\n (expandStateChange)=\"expandStateChange.emit($event)\"\n (expand)=\"rowExpand.emit({ dataItem: $event.dataItem })\"\n (collapse)=\"rowCollapse.emit({ dataItem: $event.dataItem })\"\n (columnReorder)=\"columnReorder.emit($event)\"\n (columnResize)=\"columnResize.emit($event)\"\n (columnVisibilityChange)=\"handleColumnVisibilityChange($event)\"\n (columnLockedChange)=\"columnLockedChange.emit($event)\"\n (selectionChange)=\"handleTreeListSelectionChange($event)\"\n (cellClick)=\"handleTreeListCellClick($event)\"\n (cellClose)=\"handleCellClose($event)\"\n [kendoEventsOutsideAngular]=\"{\n dblclick: handleTreeListDoubleClick\n }\"\n [scope]=\"this\"\n >\n <kendo-treelist-messages\n [noRecords]=\"getText('noRecords')\"\n [filter]=\"getText('filter')\"\n [filterEqOperator]=\"getText('filterEqOperator')\"\n [filterNotEqOperator]=\"getText('filterNotEqOperator')\"\n [filterIsNullOperator]=\"getText('filterIsNullOperator')\"\n [filterIsNotNullOperator]=\"getText('filterIsNotNullOperator')\"\n [filterIsEmptyOperator]=\"getText('filterIsEmptyOperator')\"\n [filterIsNotEmptyOperator]=\"getText('filterIsNotEmptyOperator')\"\n [filterStartsWithOperator]=\"getText('filterStartsWithOperator')\"\n [filterContainsOperator]=\"getText('filterContainsOperator')\"\n [filterNotContainsOperator]=\"getText('filterNotContainsOperator')\"\n [filterEndsWithOperator]=\"getText('filterEndsWithOperator')\"\n [filterGteOperator]=\"getText('filterGteOperator')\"\n [filterGtOperator]=\"getText('filterGtOperator')\"\n [filterLteOperator]=\"getText('filterLteOperator')\"\n [filterLtOperator]=\"getText('filterLtOperator')\"\n [filterIsTrue]=\"getText('filterIsTrue')\"\n [filterIsFalse]=\"getText('filterIsFalse')\"\n [filterBooleanAll]=\"getText('filterBooleanAll')\"\n [filterAfterOrEqualOperator]=\"getText('filterAfterOrEqualOperator')\"\n [filterAfterOperator]=\"getText('filterAfterOperator')\"\n [filterBeforeOperator]=\"getText('filterBeforeOperator')\"\n [filterBeforeOrEqualOperator]=\"getText('filterBeforeOrEqualOperator')\"\n [filterFilterButton]=\"getText('filterFilterButton')\"\n [filterClearButton]=\"getText('filterClearButton')\"\n [filterAndLogic]=\"getText('filterAndLogic')\"\n [filterOrLogic]=\"getText('filterOrLogic')\"\n [loading]=\"getText('loading')\"\n [columnMenu]=\"getText('columnMenu')\"\n [columns]=\"getText('columns')\"\n [sortable]=\"getText('sortable')\"\n [sortAscending]=\"getText('sortAscending')\"\n [sortDescending]=\"getText('sortDescending')\"\n [sortedAscending]=\"getText('sortedAscending')\"\n [sortedDescending]=\"getText('sortedDescending')\"\n [sortedDefault]=\"getText('sortedDefault')\"\n [columnsApply]=\"getText('columnsApply')\"\n [columnsReset]=\"getText('columnsReset')\"\n >\n </kendo-treelist-messages>\n </kendo-treelist>\n </kendo-splitter-pane>\n <kendo-splitter-pane\n [collapsible]=\"timelinePaneOptions?.collapsible\"\n [resizable]=\"timelinePaneOptions?.resizable\"\n [collapsed]=\"timelinePaneOptions?.collapsed\"\n [min]=\"timelinePaneOptions?.min\"\n [max]=\"timelinePaneOptions?.max\"\n [size]=\"timelinePaneOptions?.size\"\n (collapsedChange)=\"onTimelineCollapsedChange($event)\"\n (sizeChange)=\"onTimelinePaneSizeChange($event)\"\n [scrollable]=\"false\">\n <kendo-gantt-timeline\n *ngIf=\"views && views.length\"\n [rows]=\"renderedTreeListItems\"\n [slots]=\"timelineSlots\"\n [groupSlots]=\"timelineGroupSlots\"\n [tableWidth]=\"tableWidth\"\n [activeView]=\"activeView\"\n [taskContentTemplate]=\"taskContentTemplate?.templateRef\"\n [taskTemplate]=\"taskTemplate?.templateRef\"\n [summaryTaskTemplate]=\"summaryTaskTemplate?.templateRef\"\n [taskClass]=\"taskClass\"\n [dependencies]=\"dependencies\"\n [hasChildren]=\"hasChildren\"\n [isTaskSelected]=\"isTaskSelected\"\n [kendoEventsOutsideAngular]=\"{\n click: handleTimelineClick,\n contextmenu: handleTimelineRightClick,\n dblclick: handleTimelineDblClick,\n mousedown: handleTimelineMouseDown\n }\"\n [scope]=\"this\"\n ></kendo-gantt-timeline>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n <kendo-gantt-toolbar\n *ngIf=\"showToolbar('bottom')\"\n [showAddTask]=\"toolbarSettings.addTaskTool === 'bottom' || toolbarSettings.addTaskTool === 'both'\"\n [showViewSelector]=\"toolbarSettings.viewSelectorTool === 'bottom' || toolbarSettings.viewSelectorTool === 'both'\"\n class=\"k-gantt-footer k-toolbar k-gantt-toolbar\"\n position=\"bottom\"></kendo-gantt-toolbar>\n <kendo-gantt-edit-dialog\n *ngIf=\"showEditingDialog\"\n [data]=\"data\">\n </kendo-gantt-edit-dialog>\n <kendo-dialog\n *ngIf=\"showConfirmationDialog\"\n [width]=\"575\"\n [height]=\"170\"\n [title]=\"getText('confirmationDialogTitle')\"\n (close)=\"showConfirmationDialog = false;\">\n <span>{{ getText('confirmationDialogContent') }}</span>\n <kendo-dialog-actions layout=\"normal\">\n <kendo-treelist-spacer></kendo-treelist-spacer>\n <button kendoButton [primary]=\"true\" (click)=\"handleDeleteConfirmation()\">{{ getText('deleteButtonText') }}</button>\n <button kendoButton (click)=\"showConfirmationDialog = false;\">{{ getText('cancelButtonText') }}</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n "
2941
3120
  }),
2942
3121
  __metadata("design:paramtypes", [TimelineViewService,
2943
3122
  ScrollSyncService,
@@ -3467,9 +3646,8 @@ var GanttHierarchyBindingDirective = /** @class */ (function (_super) {
3467
3646
  */
3468
3647
  var GanttExpandableDirective = /** @class */ (function (_super) {
3469
3648
  __extends(GanttExpandableDirective, _super);
3470
- // fixes an injection error in some builds/ng-versions (e.g. StackBlitz)
3471
- function GanttExpandableDirective(gantt) {
3472
- return _super.call(this, gantt) || this;
3649
+ function GanttExpandableDirective() {
3650
+ return _super !== null && _super.apply(this, arguments) || this;
3473
3651
  }
3474
3652
  __decorate([
3475
3653
  Input(),
@@ -3479,8 +3657,7 @@ var GanttExpandableDirective = /** @class */ (function (_super) {
3479
3657
  Directive({
3480
3658
  exportAs: 'kendoGanttExpandable',
3481
3659
  selector: '[kendoGanttExpandable]'
3482
- }),
3483
- __metadata("design:paramtypes", [ExpandableTreeComponent])
3660
+ })
3484
3661
  ], GanttExpandableDirective);
3485
3662
  return GanttExpandableDirective;
3486
3663
  }(ExpandableDirective));
@@ -3658,6 +3835,14 @@ var ToolbarComponent = /** @class */ (function () {
3658
3835
  this.gantt.activeViewChange.emit(e);
3659
3836
  this.scrollSyncService.resetTimelineScrollLeft();
3660
3837
  };
3838
+ __decorate([
3839
+ Input(),
3840
+ __metadata("design:type", Boolean)
3841
+ ], ToolbarComponent.prototype, "showAddTask", void 0);
3842
+ __decorate([
3843
+ Input(),
3844
+ __metadata("design:type", Boolean)
3845
+ ], ToolbarComponent.prototype, "showViewSelector", void 0);
3661
3846
  __decorate([
3662
3847
  Input(),
3663
3848
  __metadata("design:type", String),
@@ -3666,7 +3851,7 @@ var ToolbarComponent = /** @class */ (function () {
3666
3851
  ToolbarComponent = __decorate([
3667
3852
  Component({
3668
3853
  selector: 'kendo-gantt-toolbar',
3669
- template: "\n <ng-container *ngIf=\"!renderTemplate\">\n <span class=\"k-spacer k-toolbar-spacer\"></span>\n <kendo-gantt-view-selector\n [views]=\"gantt.viewTypes\"\n [activeView]=\"gantt.activeView\"\n (activeViewChange)=\"onViewChange($event)\"></kendo-gantt-view-selector>\n </ng-container>\n <ng-template\n *ngIf=\"renderTemplate\"\n [ngTemplateOutlet]=\"toolbarTemplateRef\"\n [ngTemplateOutletContext]=\"context\"\n >\n </ng-template>\n "
3854
+ template: "\n <ng-container *ngIf=\"!renderTemplate\">\n <kendo-gantt-add-task *ngIf=\"showAddTask\"></kendo-gantt-add-task>\n <span class=\"k-spacer k-toolbar-spacer\"></span>\n <kendo-gantt-view-selector\n *ngIf=\"showViewSelector\"\n [views]=\"gantt.viewTypes\"\n [activeView]=\"gantt.activeView\"\n (activeViewChange)=\"onViewChange($event)\"></kendo-gantt-view-selector>\n </ng-container>\n <ng-template\n *ngIf=\"renderTemplate\"\n [ngTemplateOutlet]=\"toolbarTemplateRef\"\n [ngTemplateOutletContext]=\"context\"\n >\n </ng-template>\n "
3670
3855
  }),
3671
3856
  __metadata("design:paramtypes", [GanttComponent,
3672
3857
  ScrollSyncService])
@@ -3731,6 +3916,23 @@ var ViewSelectorComponent = /** @class */ (function () {
3731
3916
  return ViewSelectorComponent;
3732
3917
  }());
3733
3918
 
3919
+ /**
3920
+ * The dependency type when two tasks are connected.
3921
+ *
3922
+ * The supported values are:
3923
+ * * `FF`&mdash;from 'finish' to 'finish'
3924
+ * * `FS`&mdash;from 'finish' to 'start'
3925
+ * * `SS`&mdash;from 'start' to 'start'
3926
+ * * `SF`&mdash;from 'start' to 'finish'
3927
+ */
3928
+ var DependencyType;
3929
+ (function (DependencyType) {
3930
+ DependencyType[DependencyType["FF"] = 0] = "FF";
3931
+ DependencyType[DependencyType["FS"] = 1] = "FS";
3932
+ DependencyType[DependencyType["SF"] = 2] = "SF";
3933
+ DependencyType[DependencyType["SS"] = 3] = "SS"; // task B can't start before task A starts
3934
+ })(DependencyType || (DependencyType = {}));
3935
+
3734
3936
  /**
3735
3937
  * @hidden
3736
3938
  *
@@ -3774,9 +3976,9 @@ var dependencyCoordinates = function (from, to, rowHeight, type, minDistanceBefo
3774
3976
  | |
3775
3977
  [[[]]]- -[[[]]]
3776
3978
  */
3777
- if (type === 0 /* FF */ || type === 3 /* SS */) {
3979
+ if (type === DependencyType.FF || type === DependencyType.SS) {
3778
3980
  // polyline start from first task
3779
- var dir = type === 3 /* SS */ ? 'left' : 'right';
3981
+ var dir = type === DependencyType.SS ? 'left' : 'right';
3780
3982
  top = from.top;
3781
3983
  left = from[dir];
3782
3984
  points.push({ top: top, left: left });
@@ -3802,9 +4004,9 @@ var dependencyCoordinates = function (from, to, rowHeight, type, minDistanceBefo
3802
4004
  |
3803
4005
  -[[[]]]
3804
4006
  */
3805
- var startDir = type === 2 /* SF */ ? 'left' : 'right';
3806
- var endDir = type === 2 /* SF */ ? 'right' : 'left';
3807
- var additionalTurn = type === 2 /* SF */
4007
+ var startDir = type === DependencyType.SF ? 'left' : 'right';
4008
+ var endDir = type === DependencyType.SF ? 'right' : 'left';
4009
+ var additionalTurn = type === DependencyType.SF
3808
4010
  ? from[startDir] - minDistanceBeforeTurn * 2 < to[endDir]
3809
4011
  : from[startDir] + minDistanceBeforeTurn * 2 > to[endDir];
3810
4012
  // polyline start from first task
@@ -4057,14 +4259,44 @@ var TimelineMonthViewComponent = /** @class */ (function (_super) {
4057
4259
  * @hidden
4058
4260
  */
4059
4261
  var EditDialogComponent = /** @class */ (function () {
4060
- function EditDialogComponent(mapper, editService, localizationService) {
4262
+ function EditDialogComponent(mapper, editService, cdr, localizationService) {
4061
4263
  this.mapper = mapper;
4062
4264
  this.editService = editService;
4265
+ this.cdr = cdr;
4063
4266
  this.localizationService = localizationService;
4064
4267
  }
4268
+ EditDialogComponent.prototype.ngOnInit = function () {
4269
+ var _this = this;
4270
+ this.editService.loadTasks(this.data).subscribe(function (value) {
4271
+ _this.loadedTasks = value;
4272
+ });
4273
+ };
4274
+ Object.defineProperty(EditDialogComponent.prototype, "predecessors", {
4275
+ get: function () {
4276
+ return this.editService.predecessors;
4277
+ },
4278
+ set: function (items) {
4279
+ this.editService.predecessors = items;
4280
+ },
4281
+ enumerable: true,
4282
+ configurable: true
4283
+ });
4284
+ Object.defineProperty(EditDialogComponent.prototype, "successors", {
4285
+ get: function () {
4286
+ return this.editService.successors;
4287
+ },
4288
+ set: function (items) {
4289
+ this.editService.successors = items;
4290
+ },
4291
+ enumerable: true,
4292
+ configurable: true
4293
+ });
4065
4294
  EditDialogComponent.prototype.getText = function (token) {
4066
4295
  return this.localizationService.get(token);
4067
4296
  };
4297
+ EditDialogComponent.prototype.getDependencyType = function (typeId) {
4298
+ return DependencyType[typeId];
4299
+ };
4068
4300
  EditDialogComponent.prototype.handleEditingResult = function (editResultType) {
4069
4301
  this.editService.triggerEditEvent(editResultType);
4070
4302
  };
@@ -4073,15 +4305,16 @@ var EditDialogComponent = /** @class */ (function () {
4073
4305
  };
4074
4306
  __decorate([
4075
4307
  Input(),
4076
- __metadata("design:type", FormGroup)
4077
- ], EditDialogComponent.prototype, "formGroup", void 0);
4308
+ __metadata("design:type", Array)
4309
+ ], EditDialogComponent.prototype, "data", void 0);
4078
4310
  EditDialogComponent = __decorate([
4079
4311
  Component({
4080
4312
  selector: 'kendo-gantt-edit-dialog',
4081
- template: "\n <kendo-dialog\n [title]=\"getText('taskEditingDialogTitle')\"\n [width]=\"575\"\n [height]=\"470\"\n (close)=\"handleEditingResult('cancel')\">\n <kendo-dialog-messages\n [closeTitle]=\"getText('taskEditingDialogCloseTitle')\"></kendo-dialog-messages>\n <form class=\"k-form\" [formGroup]=\"formGroup\">\n <kendo-formfield *ngIf=\"formGroup.contains(mapper.taskFields.title)\">\n <kendo-label [for]=\"mapper.taskFields.title\" [text]=\"getText('titleFieldInputLabel')\"></kendo-label>\n <input class=\"k-textbox\" [formControlName]=\"mapper.taskFields.title\" />\n </kendo-formfield>\n <div class=\"k-hstack\">\n <kendo-formfield [style.width.%]=\"49\" *ngIf=\"formGroup.contains(mapper.taskFields.start)\">\n <kendo-label [for]=\"mapper.taskFields.start\" [text]=\"getText('startFieldInputLabel')\"></kendo-label>\n <kendo-datetimepicker [formControlName]=\"mapper.taskFields.start\"></kendo-datetimepicker>\n </kendo-formfield>\n <kendo-treelist-spacer></kendo-treelist-spacer>\n <kendo-formfield [style.width.%]=\"49\" *ngIf=\"formGroup.contains(mapper.taskFields.end)\">\n <kendo-label [for]=\"mapper.taskFields.end\" [text]=\"getText('endFieldInputLabel')\"></kendo-label>\n <kendo-datetimepicker [formControlName]=\"mapper.taskFields.end\"></kendo-datetimepicker>\n </kendo-formfield>\n </div>\n <kendo-formfield [style.width.%]=\"49\" *ngIf=\"formGroup.contains(mapper.taskFields.completionRatio)\">\n <kendo-label [for]=\"mapper.taskFields.completionRatio\" [text]=\"getText('completionRatioFieldInputLabel')\"></kendo-label>\n <kendo-numerictextbox\n [formControlName]=\"mapper.taskFields.completionRatio\"\n [min]=\"0\"\n [max]=\"1\"\n [decimals]=\"2\"\n format=\"p2\"\n [step]=\"0.01\"\n ></kendo-numerictextbox>\n </kendo-formfield>\n </form>\n <kendo-dialog-actions layout=\"normal\">\n <button kendoButton (click)=\"onTaskDelete()\">{{ getText('deleteButtonText') }}</button>\n <kendo-treelist-spacer></kendo-treelist-spacer>\n <button kendoButton [primary]=\"true\" (click)=\"handleEditingResult('save')\">{{ getText('saveButtonText') }}</button>\n <button kendoButton (click)=\"handleEditingResult('cancel')\">{{ getText('cancelButtonText') }}</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n "
4313
+ template: "\n <kendo-dialog\n [title]=\"getText('taskEditingDialogTitle')\"\n [width]=\"575\"\n [height]=\"470\"\n (close)=\"handleEditingResult('cancel')\">\n <kendo-dialog-messages\n [closeTitle]=\"getText('taskEditingDialogCloseTitle')\"></kendo-dialog-messages>\n\n <kendo-tabstrip [keepTabContent]=\"true\">\n <kendo-tabstrip-tab [title]=\"getText('taskEditingGeneralTabTitle')\" [selected]=\"true\">\n <ng-template kendoTabContent>\n <kendo-gantt-task-fields></kendo-gantt-task-fields>\n </ng-template>\n </kendo-tabstrip-tab>\n <kendo-tabstrip-tab [title]=\"getText('taskEditingPredecessorsTabTitle')\">\n <ng-template kendoTabContent>\n <kendo-gantt-dependencies-table\n [tasks]=\"loadedTasks\"\n [(dependencies)]=\"predecessors\"\n dependencyType=\"predecessor\"\n >\n </kendo-gantt-dependencies-table>\n </ng-template>\n </kendo-tabstrip-tab>\n <kendo-tabstrip-tab [title]=\"getText('taskEditingSuccessorsTabTitle')\">\n <ng-template kendoTabContent>\n <kendo-gantt-dependencies-table\n [tasks]=\"loadedTasks\"\n [(dependencies)]=\"successors\"\n dependencyType=\"successor\">\n </kendo-gantt-dependencies-table>\n </ng-template>\n </kendo-tabstrip-tab>\n </kendo-tabstrip>\n\n <kendo-dialog-actions layout=\"normal\">\n <button kendoButton (click)=\"onTaskDelete()\">{{ getText('deleteButtonText') }}</button>\n <kendo-treelist-spacer></kendo-treelist-spacer>\n <button kendoButton [primary]=\"true\" (click)=\"handleEditingResult('save')\">{{ getText('saveButtonText') }}</button>\n <button kendoButton (click)=\"handleEditingResult('cancel')\">{{ getText('cancelButtonText') }}</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n "
4082
4314
  }),
4083
4315
  __metadata("design:paramtypes", [MappingService,
4084
4316
  EditService,
4317
+ ChangeDetectorRef,
4085
4318
  LocalizationService])
4086
4319
  ], EditDialogComponent);
4087
4320
  return EditDialogComponent;
@@ -4095,6 +4328,38 @@ var Messages = /** @class */ (function (_super) {
4095
4328
  function Messages() {
4096
4329
  return _super !== null && _super.apply(this, arguments) || this;
4097
4330
  }
4331
+ __decorate([
4332
+ Input(),
4333
+ __metadata("design:type", String)
4334
+ ], Messages.prototype, "taskEditingGeneralTabTitle", void 0);
4335
+ __decorate([
4336
+ Input(),
4337
+ __metadata("design:type", String)
4338
+ ], Messages.prototype, "taskEditingPredecessorsTabTitle", void 0);
4339
+ __decorate([
4340
+ Input(),
4341
+ __metadata("design:type", String)
4342
+ ], Messages.prototype, "taskEditingSuccessorsTabTitle", void 0);
4343
+ __decorate([
4344
+ Input(),
4345
+ __metadata("design:type", String)
4346
+ ], Messages.prototype, "taskEditingDependenciesAddButtonText", void 0);
4347
+ __decorate([
4348
+ Input(),
4349
+ __metadata("design:type", String)
4350
+ ], Messages.prototype, "taskEditingDependenciesRemoveButtonText", void 0);
4351
+ __decorate([
4352
+ Input(),
4353
+ __metadata("design:type", String)
4354
+ ], Messages.prototype, "taskEditingDependenciesGridNameColumnTitle", void 0);
4355
+ __decorate([
4356
+ Input(),
4357
+ __metadata("design:type", String)
4358
+ ], Messages.prototype, "taskEditingDependenciesGridTypeColumnTitle", void 0);
4359
+ __decorate([
4360
+ Input(),
4361
+ __metadata("design:type", String)
4362
+ ], Messages.prototype, "deleteButtonText", void 0);
4098
4363
  __decorate([
4099
4364
  Input(),
4100
4365
  __metadata("design:type", String)
@@ -4118,7 +4383,19 @@ var Messages = /** @class */ (function (_super) {
4118
4383
  __decorate([
4119
4384
  Input(),
4120
4385
  __metadata("design:type", String)
4121
- ], Messages.prototype, "deleteButtonText", void 0);
4386
+ ], Messages.prototype, "addTaskText", void 0);
4387
+ __decorate([
4388
+ Input(),
4389
+ __metadata("design:type", String)
4390
+ ], Messages.prototype, "addChildText", void 0);
4391
+ __decorate([
4392
+ Input(),
4393
+ __metadata("design:type", String)
4394
+ ], Messages.prototype, "addAboveText", void 0);
4395
+ __decorate([
4396
+ Input(),
4397
+ __metadata("design:type", String)
4398
+ ], Messages.prototype, "addBelowText", void 0);
4122
4399
  __decorate([
4123
4400
  Input(),
4124
4401
  __metadata("design:type", String)
@@ -4389,28 +4666,244 @@ var LocalizedMessagesDirective = /** @class */ (function (_super) {
4389
4666
  return LocalizedMessagesDirective;
4390
4667
  }(Messages));
4391
4668
 
4669
+ /**
4670
+ * The UI for adding new items to the Gantt.
4671
+ * Use it within a toolbar template to provide a custom icon or list of options.
4672
+ */
4673
+ var GanttAddTaskComponent = /** @class */ (function () {
4674
+ function GanttAddTaskComponent(localizationService, editService, ngZone) {
4675
+ this.localizationService = localizationService;
4676
+ this.editService = editService;
4677
+ this.ngZone = ngZone;
4678
+ /**
4679
+ * Sets the data of the DropDownButton.
4680
+ * > The data has to be provided in an array-like list.
4681
+ */
4682
+ this.data = [{
4683
+ text: this.getText('addChildText'),
4684
+ type: 'addChild'
4685
+ }, {
4686
+ text: this.getText('addAboveText'),
4687
+ type: 'addAbove'
4688
+ }, {
4689
+ text: this.getText('addBelowText'),
4690
+ type: 'addBelow'
4691
+ }];
4692
+ /**
4693
+ * Defines the name of an existing icon in a Kendo UI theme.
4694
+ * @default 'plus'
4695
+ */
4696
+ this.icon = 'plus';
4697
+ }
4698
+ /**
4699
+ * @hidden
4700
+ */
4701
+ GanttAddTaskComponent.prototype.getText = function (message) {
4702
+ return this.localizationService.get(message);
4703
+ };
4704
+ /**
4705
+ * @hidden
4706
+ */
4707
+ GanttAddTaskComponent.prototype.handleOpen = function (e) {
4708
+ if (!this.editService.getSelectedItem()) {
4709
+ e.preventDefault();
4710
+ }
4711
+ };
4712
+ /**
4713
+ * @hidden
4714
+ */
4715
+ GanttAddTaskComponent.prototype.handleMouseClick = function () {
4716
+ var _this = this;
4717
+ if (!this.editService.getSelectedItem()) {
4718
+ this.ngZone.run(function () {
4719
+ _this.editService.addEvent.next({
4720
+ selectedItem: null,
4721
+ actionType: 'addTask'
4722
+ });
4723
+ });
4724
+ }
4725
+ };
4726
+ /**
4727
+ * @hidden
4728
+ */
4729
+ GanttAddTaskComponent.prototype.handleItemClick = function (e) {
4730
+ this.editService.addEvent.next({
4731
+ actionType: e.type,
4732
+ selectedItem: null
4733
+ });
4734
+ };
4735
+ __decorate([
4736
+ Input(),
4737
+ __metadata("design:type", Array)
4738
+ ], GanttAddTaskComponent.prototype, "data", void 0);
4739
+ __decorate([
4740
+ Input(),
4741
+ __metadata("design:type", String)
4742
+ ], GanttAddTaskComponent.prototype, "icon", void 0);
4743
+ GanttAddTaskComponent = __decorate([
4744
+ Component({
4745
+ selector: 'kendo-gantt-add-task',
4746
+ template: "\n <kendo-dropdownbutton\n [data]=\"data\"\n [icon]=\"icon\"\n [kendoEventsOutsideAngular]=\"{ click: handleMouseClick }\"\n [scope]=\"this\"\n (itemClick)=\"handleItemClick($event)\"\n (open)=\"handleOpen($event)\">\n {{ getText('addTaskText') }}\n </kendo-dropdownbutton>\n "
4747
+ }),
4748
+ __metadata("design:paramtypes", [LocalizationService,
4749
+ EditService,
4750
+ NgZone])
4751
+ ], GanttAddTaskComponent);
4752
+ return GanttAddTaskComponent;
4753
+ }());
4754
+
4392
4755
  /**
4393
4756
  * @hidden
4394
4757
  */
4395
- var GanttTreeListMessagesDirective = /** @class */ (function () {
4396
- function GanttTreeListMessagesDirective(localizationService) {
4758
+ var DependenciesTableComponent = /** @class */ (function () {
4759
+ function DependenciesTableComponent(mapper, editService, localizationService) {
4760
+ this.mapper = mapper;
4761
+ this.editService = editService;
4397
4762
  this.localizationService = localizationService;
4763
+ this.dependenciesChange = new EventEmitter();
4764
+ this.selectedKeys = [];
4765
+ this.formGroups = new FormArray([]);
4766
+ this.dependencyTypes = this.getDependencyTypes();
4398
4767
  }
4399
- GanttTreeListMessagesDirective.prototype.ngAfterViewInit = function () {
4768
+ Object.defineProperty(DependenciesTableComponent.prototype, "taskId", {
4769
+ get: function () {
4770
+ return this.editService.dataItem.id;
4771
+ },
4772
+ enumerable: true,
4773
+ configurable: true
4774
+ });
4775
+ Object.defineProperty(DependenciesTableComponent.prototype, "dependencyIdField", {
4776
+ // The target dependency id field
4777
+ // e.g. if Predecessors, we have the `fromId` which is the currently edited task,
4778
+ // while the `toId` is missing (needs to be selected by the user)
4779
+ get: function () {
4780
+ return this.dependencyType === 'predecessor' ? 'fromId' : 'toId';
4781
+ },
4782
+ enumerable: true,
4783
+ configurable: true
4784
+ });
4785
+ DependenciesTableComponent.prototype.ngOnInit = function () {
4400
4786
  var _this = this;
4401
- var treeListServiceDictionary = this.localizationService.dictionary;
4402
- Object.keys(treeListServiceDictionary)
4403
- .forEach(function (token) { return treeListServiceDictionary[token] = _this.kendoGanttTreeListMessages.get(token.replace('kendo.treelist.', '')); });
4787
+ // generate the FormGroups per each Grid row
4788
+ if (this.formGroups.controls.length === 0) {
4789
+ var fields_1 = this.mapper.dependencyFields;
4790
+ this.dependencies.forEach(function (item) {
4791
+ var _a;
4792
+ var formGroup = new FormGroup((_a = {},
4793
+ _a[fields_1.id] = new FormControl(_this.mapper.extractFromDependency(item, 'id')),
4794
+ _a[fields_1.fromId] = new FormControl(_this.mapper.extractFromDependency(item, 'fromId'), Validators.required),
4795
+ _a[fields_1.toId] = new FormControl(_this.mapper.extractFromDependency(item, 'toId'), Validators.required),
4796
+ _a[fields_1.type] = new FormControl(_this.mapper.extractFromDependency(item, 'type'), Validators.required),
4797
+ _a));
4798
+ _this.formGroups.push(formGroup);
4799
+ });
4800
+ }
4801
+ this.formGroups.valueChanges.subscribe(function (val) {
4802
+ _this.formGroups.controls.forEach(function (control) {
4803
+ if (control.dirty) {
4804
+ _this.editService.updateDependencies(control.value);
4805
+ }
4806
+ });
4807
+ _this.dependenciesChange.emit(val);
4808
+ });
4809
+ };
4810
+ DependenciesTableComponent.prototype.getFormControl = function (dataItemIndex, field) {
4811
+ // return the FormControl for the respective column editor
4812
+ return this.formGroups.controls
4813
+ .find(function (_control, index) { return index === dataItemIndex; })
4814
+ .get(this.mapper.dependencyFields[field]);
4815
+ };
4816
+ DependenciesTableComponent.prototype.getText = function (token) {
4817
+ return this.localizationService.get(token);
4818
+ };
4819
+ DependenciesTableComponent.prototype.getDependencyTypes = function () {
4820
+ var types = Object.keys(DependencyType)
4821
+ .filter(function (value) { return typeof DependencyType[value] === 'number'; })
4822
+ .map(function (type) {
4823
+ return {
4824
+ type: type,
4825
+ id: DependencyType[type]
4826
+ };
4827
+ });
4828
+ return types;
4829
+ };
4830
+ DependenciesTableComponent.prototype.addHandler = function () {
4831
+ var _a;
4832
+ var fields = this.mapper.dependencyFields;
4833
+ var formGroup = new FormGroup((_a = {},
4834
+ _a[fields.id] = new FormControl(),
4835
+ _a[fields.fromId] = new FormControl(this.dependencyIdField === 'toId' ? this.taskId : null, Validators.required),
4836
+ _a[fields.toId] = new FormControl(this.dependencyIdField === 'fromId' ? this.taskId : null, Validators.required),
4837
+ _a[fields.type] = new FormControl(null, Validators.required),
4838
+ _a));
4839
+ this.formGroups.push(formGroup);
4840
+ };
4841
+ DependenciesTableComponent.prototype.removeHandler = function () {
4842
+ var selectedIndex = this.selectedKeys[0];
4843
+ var item = this.formGroups.at(selectedIndex).value;
4844
+ this.editService.deleteDependency(item);
4845
+ this.formGroups.removeAt(selectedIndex);
4404
4846
  };
4405
4847
  __decorate([
4406
4848
  Input(),
4407
- __metadata("design:type", LocalizationService)
4408
- ], GanttTreeListMessagesDirective.prototype, "kendoGanttTreeListMessages", void 0);
4409
- GanttTreeListMessagesDirective = __decorate([
4410
- Directive({ selector: '[kendoGanttTreeListMessages]' }),
4411
- __metadata("design:paramtypes", [LocalizationService])
4412
- ], GanttTreeListMessagesDirective);
4413
- return GanttTreeListMessagesDirective;
4849
+ __metadata("design:type", Array)
4850
+ ], DependenciesTableComponent.prototype, "tasks", void 0);
4851
+ __decorate([
4852
+ Input(),
4853
+ __metadata("design:type", Array)
4854
+ ], DependenciesTableComponent.prototype, "dependencies", void 0);
4855
+ __decorate([
4856
+ Input(),
4857
+ __metadata("design:type", String)
4858
+ ], DependenciesTableComponent.prototype, "dependencyType", void 0);
4859
+ __decorate([
4860
+ Output(),
4861
+ __metadata("design:type", EventEmitter)
4862
+ ], DependenciesTableComponent.prototype, "dependenciesChange", void 0);
4863
+ DependenciesTableComponent = __decorate([
4864
+ Component({
4865
+ selector: 'kendo-gantt-dependencies-table',
4866
+ template: "\n <kendo-grid\n [data]=\"dependencies\"\n [selectable]=\"{ mode: 'single' }\"\n [(selectedKeys)]=\"selectedKeys\"\n kendoGridSelectBy\n [height]=\"295\"\n >\n <ng-template kendoGridToolbarTemplate>\n <button kendoButton (click)=\"addHandler()\">\n {{ getText('taskEditingDependenciesAddButtonText') }}\n </button>\n <button kendoButton (click)=\"removeHandler()\" [disabled]=\"selectedKeys.length === 0\">\n {{ getText('taskEditingDependenciesRemoveButtonText') }}\n </button>\n </ng-template>\n <kendo-grid-column [title]=\"getText('taskEditingDependenciesGridNameColumnTitle')\" [field]=\"dependencyIdField\">\n <ng-template kendoGridCellTemplate let-dataItem=\"dataItem\" let-column=\"column\" let-rowIndex=\"rowIndex\">\n <kendo-dropdownlist\n [data]=\"tasks\"\n textField=\"title\"\n valueField=\"id\"\n [valuePrimitive]=\"true\"\n [formControl]=\"getFormControl(rowIndex, column.field)\"\n >\n </kendo-dropdownlist>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column [title]=\"getText('taskEditingDependenciesGridTypeColumnTitle')\" field=\"type\">\n <ng-template kendoGridCellTemplate let-dataItem=\"dataItem\" let-column=\"column\" let-rowIndex=\"rowIndex\">\n <kendo-dropdownlist\n [data]=\"dependencyTypes\"\n textField=\"type\"\n valueField=\"id\"\n [valuePrimitive]=\"true\"\n [formControl]=\"getFormControl(rowIndex, column.field)\"\n >\n </kendo-dropdownlist>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n "
4867
+ }),
4868
+ __metadata("design:paramtypes", [MappingService,
4869
+ EditService,
4870
+ GanttLocalizationService])
4871
+ ], DependenciesTableComponent);
4872
+ return DependenciesTableComponent;
4873
+ }());
4874
+
4875
+ /**
4876
+ * @hidden
4877
+ */
4878
+ var TaskFieldsComponent = /** @class */ (function () {
4879
+ function TaskFieldsComponent(mapper, editService, localizationService) {
4880
+ this.mapper = mapper;
4881
+ this.editService = editService;
4882
+ this.localizationService = localizationService;
4883
+ }
4884
+ Object.defineProperty(TaskFieldsComponent.prototype, "formGroup", {
4885
+ /**
4886
+ * @hidden
4887
+ */
4888
+ get: function () {
4889
+ return this.editService.taskFormGroup;
4890
+ },
4891
+ enumerable: true,
4892
+ configurable: true
4893
+ });
4894
+ TaskFieldsComponent.prototype.getText = function (token) {
4895
+ return this.localizationService.get(token);
4896
+ };
4897
+ TaskFieldsComponent = __decorate([
4898
+ Component({
4899
+ selector: 'kendo-gantt-task-fields',
4900
+ template: "\n <form class=\"k-form\" [formGroup]=\"formGroup\">\n <kendo-formfield *ngIf=\"formGroup.contains(mapper.taskFields.title)\">\n <kendo-label [for]=\"mapper.taskFields.title\" [text]=\"getText('titleFieldInputLabel')\"></kendo-label>\n <input class=\"k-textbox\" [formControlName]=\"mapper.taskFields.title\" />\n </kendo-formfield>\n <div class=\"k-hstack\">\n <kendo-formfield [style.width.%]=\"49\" *ngIf=\"formGroup.contains(mapper.taskFields.start)\">\n <kendo-label [for]=\"mapper.taskFields.start\" [text]=\"getText('startFieldInputLabel')\"></kendo-label>\n <kendo-datetimepicker [formControlName]=\"mapper.taskFields.start\"></kendo-datetimepicker>\n </kendo-formfield>\n <kendo-treelist-spacer></kendo-treelist-spacer>\n <kendo-formfield [style.width.%]=\"49\" *ngIf=\"formGroup.contains(mapper.taskFields.end)\">\n <kendo-label [for]=\"mapper.taskFields.end\" [text]=\"getText('endFieldInputLabel')\"></kendo-label>\n <kendo-datetimepicker [formControlName]=\"mapper.taskFields.end\"></kendo-datetimepicker>\n </kendo-formfield>\n </div>\n <kendo-formfield [style.width.%]=\"49\" *ngIf=\"formGroup.contains(mapper.taskFields.completionRatio)\">\n <kendo-label [for]=\"mapper.taskFields.completionRatio\" [text]=\"getText('completionRatioFieldInputLabel')\"></kendo-label>\n <kendo-numerictextbox\n [formControlName]=\"mapper.taskFields.completionRatio\"\n [min]=\"0\"\n [max]=\"1\"\n [decimals]=\"2\"\n format=\"p2\"\n [step]=\"0.01\"\n ></kendo-numerictextbox>\n </kendo-formfield>\n </form>\n "
4901
+ }),
4902
+ __metadata("design:paramtypes", [MappingService,
4903
+ EditService,
4904
+ GanttLocalizationService])
4905
+ ], TaskFieldsComponent);
4906
+ return TaskFieldsComponent;
4414
4907
  }());
4415
4908
 
4416
4909
  var IMPORTED_MODULES = [
@@ -4424,7 +4917,10 @@ var IMPORTED_MODULES = [
4424
4917
  TreeListModule,
4425
4918
  ButtonsModule,
4426
4919
  DialogModule,
4427
- EventsModule
4920
+ EventsModule,
4921
+ TabStripModule,
4922
+ GridModule,
4923
+ DropDownsModule
4428
4924
  ];
4429
4925
  var DECLARATIONS = [
4430
4926
  GanttComponent,
@@ -4461,7 +4957,9 @@ var DECLARATIONS = [
4461
4957
  EditDialogComponent,
4462
4958
  CustomMessagesComponent,
4463
4959
  LocalizedMessagesDirective,
4464
- GanttTreeListMessagesDirective
4960
+ GanttAddTaskComponent,
4961
+ DependenciesTableComponent,
4962
+ TaskFieldsComponent
4465
4963
  ];
4466
4964
  /**
4467
4965
  * Represents the [NgModule]({{ site.data.urls.angular['ngmoduleapi'] }})
@@ -4511,8 +5009,49 @@ var GanttModule = /** @class */ (function () {
4511
5009
  return GanttModule;
4512
5010
  }());
4513
5011
 
5012
+ /**
5013
+ * @hidden
5014
+ */
5015
+ var PreventableEvent = /** @class */ (function () {
5016
+ function PreventableEvent() {
5017
+ this.prevented = false;
5018
+ }
5019
+ /**
5020
+ * Prevents the default action for a specified event.
5021
+ * In this way, the source component suppresses
5022
+ * the built-in behavior that follows the event.
5023
+ */
5024
+ PreventableEvent.prototype.preventDefault = function () {
5025
+ this.prevented = true;
5026
+ };
5027
+ /**
5028
+ * Returns `true` if the event was prevented
5029
+ * by any of its subscribers.
5030
+ *
5031
+ * @returns `true` if the default action was prevented.
5032
+ * Otherwise, returns `false`.
5033
+ */
5034
+ PreventableEvent.prototype.isDefaultPrevented = function () {
5035
+ return this.prevented;
5036
+ };
5037
+ return PreventableEvent;
5038
+ }());
5039
+
5040
+ /**
5041
+ * Called every time a user leaves an edited cell.
5042
+ */
5043
+ var CellCloseEvent = /** @class */ (function (_super) {
5044
+ __extends(CellCloseEvent, _super);
5045
+ function CellCloseEvent(options) {
5046
+ var _this = _super.call(this) || this;
5047
+ Object.assign(_this, options);
5048
+ return _this;
5049
+ }
5050
+ return CellCloseEvent;
5051
+ }(PreventableEvent));
5052
+
4514
5053
  /**
4515
5054
  * Generated bundle index. Do not edit.
4516
5055
  */
4517
5056
 
4518
- export { MappingService, OptionChangesService, DependencyDomService, GanttDependencyDirective, EditDialogComponent, EditService, CustomMessagesComponent, LocalizedMessagesDirective, Messages, GanttTreeListMessagesDirective, GanttHeaderTableBodyComponent, GanttMilestoneTaskComponent, GanttSummaryTaskComponent, GanttTaskBase, GanttTaskComponent, GanttTasksTableBodyComponent, ScrollSyncService, GanttTimelineComponent, TimelineBaseViewService, TimelineDayViewComponent, TimelineDayViewService, TimelineMonthViewComponent, TimelineMonthViewService, TimelineViewService, TimelineWeekViewComponent, TimelineWeekViewService, ViewBase, ToolbarComponent, ViewSelectorComponent, GanttComponent, GanttModule, GanttHierarchyBindingDirective, GanttFlatBindingDirective, GanttExpandableDirective, GanttTaskTemplateDirective, GanttTaskContentTemplateDirective, GanttSummaryTaskTemplateDirective, ToolbarTemplateDirective, SelectableDirective, GanttColumnBase, GanttColumnComponent, GanttColumnGroupComponent, GanttSpanColumnComponent, CellTemplateDirective, HeaderTemplateDirective, FooterTemplateDirective, ColumnMenuTemplateDirective, FilterCellTemplateDirective, FilterMenuTemplateDirective, EditTemplateDirective };
5057
+ export { MappingService, OptionChangesService, DependencyDomService, GanttDependencyDirective, GanttAddTaskComponent, DependenciesTableComponent, EditDialogComponent, EditService, TaskFieldsComponent, CustomMessagesComponent, GanttLocalizationService, LocalizedMessagesDirective, Messages, PreventableEvent, GanttHeaderTableBodyComponent, GanttMilestoneTaskComponent, GanttSummaryTaskComponent, GanttTaskBase, GanttTaskComponent, GanttTasksTableBodyComponent, ScrollSyncService, GanttTimelineComponent, TimelineBaseViewService, TimelineDayViewComponent, TimelineDayViewService, TimelineMonthViewComponent, TimelineMonthViewService, TimelineViewService, TimelineWeekViewComponent, TimelineWeekViewService, ViewBase, ToolbarComponent, ViewSelectorComponent, GanttComponent, GanttModule, GanttHierarchyBindingDirective, GanttFlatBindingDirective, GanttExpandableDirective, GanttTaskTemplateDirective, GanttTaskContentTemplateDirective, GanttSummaryTaskTemplateDirective, ToolbarTemplateDirective, SelectableDirective, DependencyType, CellCloseEvent, GanttColumnBase, GanttColumnComponent, GanttColumnGroupComponent, GanttSpanColumnComponent, CellTemplateDirective, HeaderTemplateDirective, FooterTemplateDirective, ColumnMenuTemplateDirective, FilterCellTemplateDirective, FilterMenuTemplateDirective, EditTemplateDirective };