@progress/kendo-angular-gantt 0.2.1-dev.202112091741 → 0.3.0-dev.202201131518

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 (158) hide show
  1. package/dist/cdn/js/kendo-angular-gantt.js +2 -2
  2. package/dist/cdn/main.js +4 -4
  3. package/dist/es/common/touch-enabled.js +9 -0
  4. package/dist/es/dependencies/utils.js +40 -5
  5. package/dist/es/dragging/dependency-drag-create.directive.js +347 -0
  6. package/dist/es/dragging/drag-validation-tooltip.component.js +27 -0
  7. package/dist/es/editing/add-task.component.js +94 -0
  8. package/dist/es/editing/dependencies-table.component.js +131 -0
  9. package/dist/es/editing/edit-dialog.component.js +37 -6
  10. package/dist/es/editing/edit.service.js +89 -7
  11. package/dist/es/editing/task-fields.component.js +43 -0
  12. package/dist/es/editing/{util.js → utils.js} +0 -0
  13. package/dist/es/expanded-state/expandable.directive.js +4 -6
  14. package/dist/es/gantt.component.js +230 -45
  15. package/dist/es/gantt.module.js +36 -10
  16. package/dist/es/index.js +8 -1
  17. package/dist/es/localization/gantt-localization.service.js +26 -0
  18. package/dist/es/localization/messages.js +45 -1
  19. package/dist/es/main.js +1 -0
  20. package/dist/es/models/dependency-type.enum.js +16 -0
  21. package/dist/es/models/events/{add-event.interface.js → dependency-add-event.interface.js} +0 -0
  22. package/dist/es/models/events/{edit-event.interface.js → task-add-event.interface.js} +0 -0
  23. package/dist/es/models/models.js +1 -0
  24. package/dist/es/models/{events/remove-event.interface.js → toolbar-settings.js} +0 -0
  25. package/dist/es/models/{toolbar-position.js → view-item.interface.js} +0 -0
  26. package/dist/es/package-metadata.js +1 -1
  27. package/dist/es/rendering/gantt-milestone-task.component.js +7 -4
  28. package/dist/es/rendering/gantt-summary-task.component.js +7 -4
  29. package/dist/es/rendering/gantt-task-base.js +30 -19
  30. package/dist/es/rendering/gantt-task.component.js +8 -6
  31. package/dist/es/rendering/gantt-tasks-table-body.component.js +5 -1
  32. package/dist/es/scrolling/drag-scroll-settings.js +20 -0
  33. package/dist/es/scrolling/timeline-scroll.directive.js +89 -0
  34. package/dist/es/scrolling/timeline-scroll.service.js +39 -0
  35. package/dist/es/scrolling/utils.js +80 -0
  36. package/dist/es/timeline/gantt-timeline.component.js +45 -3
  37. package/dist/es/toolbar/toolbar.component.js +9 -1
  38. package/dist/es/utils.js +143 -12
  39. package/dist/es2015/common/touch-enabled.d.ts +9 -0
  40. package/dist/es2015/common/touch-enabled.js +9 -0
  41. package/dist/es2015/dependencies/utils.d.ts +15 -0
  42. package/dist/es2015/dependencies/utils.js +40 -5
  43. package/dist/es2015/dragging/dependency-drag-create.directive.d.ts +72 -0
  44. package/dist/es2015/dragging/dependency-drag-create.directive.js +324 -0
  45. package/dist/es2015/dragging/drag-validation-tooltip.component.d.ts +29 -0
  46. package/dist/es2015/dragging/drag-validation-tooltip.component.js +76 -0
  47. package/dist/es2015/editing/add-task.component.d.ts +45 -0
  48. package/dist/es2015/editing/add-task.component.js +102 -0
  49. package/dist/es2015/editing/dependencies-table.component.d.ts +39 -0
  50. package/dist/es2015/editing/dependencies-table.component.js +160 -0
  51. package/dist/es2015/editing/edit-dialog.component.d.ts +10 -3
  52. package/dist/es2015/editing/edit-dialog.component.js +55 -33
  53. package/dist/es2015/editing/edit.service.d.ts +24 -3
  54. package/dist/es2015/editing/edit.service.js +78 -10
  55. package/dist/es2015/editing/task-fields.component.d.ts +22 -0
  56. package/dist/es2015/editing/task-fields.component.js +67 -0
  57. package/dist/es2015/editing/{util.d.ts → utils.d.ts} +0 -0
  58. package/dist/es2015/editing/{util.js → utils.js} +0 -0
  59. package/dist/es2015/expanded-state/expandable.directive.d.ts +1 -2
  60. package/dist/es2015/expanded-state/expandable.directive.js +2 -7
  61. package/dist/es2015/gantt.component.d.ts +62 -18
  62. package/dist/es2015/gantt.component.js +290 -43
  63. package/dist/es2015/gantt.module.js +36 -10
  64. package/dist/es2015/index.d.ts +8 -1
  65. package/dist/es2015/index.js +8 -1
  66. package/dist/es2015/index.metadata.json +1 -1
  67. package/dist/es2015/localization/{treelist-messages.directive.d.ts → gantt-localization.service.d.ts} +4 -3
  68. package/dist/es2015/localization/gantt-localization.service.js +25 -0
  69. package/dist/es2015/localization/messages.d.ts +46 -2
  70. package/dist/es2015/localization/messages.js +45 -1
  71. package/dist/es2015/main.d.ts +1 -0
  72. package/dist/es2015/main.js +1 -0
  73. package/dist/es2015/models/dependency-type.enum.d.ts +1 -1
  74. package/dist/es2015/models/dependency-type.enum.js +16 -0
  75. package/dist/es2015/models/events/dependency-add-event.interface.d.ts +26 -0
  76. package/dist/es2015/models/events/{add-event.interface.js → dependency-add-event.interface.js} +0 -0
  77. package/dist/es2015/models/events/task-add-event.interface.d.ts +31 -0
  78. package/dist/es2015/models/events/{edit-event.interface.js → task-add-event.interface.js} +0 -0
  79. package/dist/es2015/models/events/task-edit-event.interface.d.ts +17 -4
  80. package/dist/es2015/models/models.d.ts +4 -3
  81. package/dist/es2015/models/models.js +1 -0
  82. package/dist/es2015/models/toolbar-settings.d.ts +29 -0
  83. package/dist/es2015/models/{events/remove-event.interface.js → toolbar-settings.js} +0 -0
  84. package/dist/es2015/models/view-item.interface.d.ts +35 -0
  85. package/dist/es2015/models/{toolbar-position.js → view-item.interface.js} +0 -0
  86. package/dist/es2015/package-metadata.js +1 -1
  87. package/dist/es2015/rendering/gantt-milestone-task.component.d.ts +2 -1
  88. package/dist/es2015/rendering/gantt-milestone-task.component.js +18 -5
  89. package/dist/es2015/rendering/gantt-summary-task.component.d.ts +2 -1
  90. package/dist/es2015/rendering/gantt-summary-task.component.js +18 -5
  91. package/dist/es2015/rendering/gantt-task-base.d.ts +11 -5
  92. package/dist/es2015/rendering/gantt-task-base.js +30 -19
  93. package/dist/es2015/rendering/gantt-task.component.d.ts +2 -1
  94. package/dist/es2015/rendering/gantt-task.component.js +19 -7
  95. package/dist/es2015/rendering/gantt-tasks-table-body.component.d.ts +1 -0
  96. package/dist/es2015/rendering/gantt-tasks-table-body.component.js +10 -3
  97. package/dist/es2015/scrolling/drag-scroll-settings.d.ts +47 -0
  98. package/dist/es2015/scrolling/drag-scroll-settings.js +20 -0
  99. package/dist/es2015/scrolling/timeline-scroll.directive.d.ts +24 -0
  100. package/dist/es2015/scrolling/timeline-scroll.directive.js +78 -0
  101. package/dist/es2015/scrolling/timeline-scroll.service.d.ts +20 -0
  102. package/dist/es2015/scrolling/timeline-scroll.service.js +44 -0
  103. package/dist/es2015/scrolling/utils.d.ts +29 -0
  104. package/dist/es2015/scrolling/utils.js +80 -0
  105. package/dist/es2015/timeline/gantt-timeline.component.d.ts +25 -2
  106. package/dist/es2015/timeline/gantt-timeline.component.js +56 -3
  107. package/dist/es2015/toolbar/toolbar-template.directive.d.ts +1 -1
  108. package/dist/es2015/toolbar/toolbar.component.d.ts +2 -0
  109. package/dist/es2015/toolbar/toolbar.component.js +10 -0
  110. package/dist/es2015/utils.d.ts +70 -8
  111. package/dist/es2015/utils.js +143 -12
  112. package/dist/fesm2015/index.js +1981 -424
  113. package/dist/fesm5/index.js +1784 -391
  114. package/dist/npm/common/touch-enabled.js +11 -0
  115. package/dist/npm/dependencies/utils.js +40 -5
  116. package/dist/npm/dragging/dependency-drag-create.directive.js +349 -0
  117. package/dist/npm/dragging/drag-validation-tooltip.component.js +29 -0
  118. package/dist/npm/editing/add-task.component.js +96 -0
  119. package/dist/npm/editing/dependencies-table.component.js +133 -0
  120. package/dist/npm/editing/edit-dialog.component.js +36 -5
  121. package/dist/npm/editing/edit.service.js +88 -6
  122. package/dist/npm/editing/task-fields.component.js +45 -0
  123. package/dist/npm/editing/{util.js → utils.js} +0 -0
  124. package/dist/npm/expanded-state/expandable.directive.js +3 -5
  125. package/dist/npm/gantt.component.js +231 -46
  126. package/dist/npm/gantt.module.js +34 -8
  127. package/dist/npm/index.js +16 -2
  128. package/dist/npm/localization/gantt-localization.service.js +28 -0
  129. package/dist/npm/localization/messages.js +45 -1
  130. package/dist/npm/main.js +2 -0
  131. package/dist/npm/models/dependency-type.enum.js +16 -0
  132. package/dist/npm/models/events/{add-event.interface.js → dependency-add-event.interface.js} +0 -0
  133. package/dist/npm/models/events/{edit-event.interface.js → task-add-event.interface.js} +0 -0
  134. package/dist/npm/models/models.js +2 -0
  135. package/dist/npm/models/{events/remove-event.interface.js → toolbar-settings.js} +0 -0
  136. package/dist/npm/models/{toolbar-position.js → view-item.interface.js} +0 -0
  137. package/dist/npm/package-metadata.js +1 -1
  138. package/dist/npm/rendering/gantt-milestone-task.component.js +6 -3
  139. package/dist/npm/rendering/gantt-summary-task.component.js +6 -3
  140. package/dist/npm/rendering/gantt-task-base.js +30 -19
  141. package/dist/npm/rendering/gantt-task.component.js +7 -5
  142. package/dist/npm/rendering/gantt-tasks-table-body.component.js +5 -1
  143. package/dist/npm/scrolling/drag-scroll-settings.js +22 -0
  144. package/dist/npm/scrolling/timeline-scroll.directive.js +91 -0
  145. package/dist/npm/scrolling/timeline-scroll.service.js +41 -0
  146. package/dist/npm/scrolling/utils.js +83 -0
  147. package/dist/npm/timeline/gantt-timeline.component.js +44 -2
  148. package/dist/npm/toolbar/toolbar.component.js +9 -1
  149. package/dist/npm/utils.js +143 -12
  150. package/dist/systemjs/kendo-angular-gantt.js +1 -1
  151. package/package.json +9 -6
  152. package/dist/es/localization/treelist-messages.directive.js +0 -31
  153. package/dist/es2015/localization/treelist-messages.directive.js +0 -29
  154. package/dist/es2015/models/events/add-event.interface.d.ts +0 -16
  155. package/dist/es2015/models/events/edit-event.interface.d.ts +0 -19
  156. package/dist/es2015/models/events/remove-event.interface.d.ts +0 -16
  157. package/dist/es2015/models/toolbar-position.d.ts +0 -9
  158. package/dist/npm/localization/treelist-messages.directive.js +0 -33
@@ -0,0 +1,160 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import * as tslib_1 from "tslib";
6
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
7
+ import { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';
8
+ import { MappingService } from '../common/mapping.service';
9
+ import { GanttLocalizationService } from '../localization/gantt-localization.service';
10
+ import { DependencyType } from '../models/dependency-type.enum';
11
+ import { EditService } from './edit.service';
12
+ /**
13
+ * @hidden
14
+ */
15
+ let DependenciesTableComponent = class DependenciesTableComponent {
16
+ constructor(mapper, editService, localizationService) {
17
+ this.mapper = mapper;
18
+ this.editService = editService;
19
+ this.localizationService = localizationService;
20
+ this.dependenciesChange = new EventEmitter();
21
+ this.selectedKeys = [];
22
+ this.formGroups = new FormArray([]);
23
+ this.dependencyTypes = this.getDependencyTypes();
24
+ }
25
+ get taskId() {
26
+ return this.editService.dataItem.id;
27
+ }
28
+ // The target dependency id field
29
+ // e.g. if Predecessors, we have the `fromId` which is the currently edited task,
30
+ // while the `toId` is missing (needs to be selected by the user)
31
+ get dependencyIdField() {
32
+ return this.dependencyType === 'predecessor' ? 'fromId' : 'toId';
33
+ }
34
+ ngOnInit() {
35
+ // generate the FormGroups per each Grid row
36
+ if (this.formGroups.controls.length === 0) {
37
+ const fields = this.mapper.dependencyFields;
38
+ this.dependencies.forEach(item => {
39
+ const formGroup = new FormGroup({
40
+ [fields.id]: new FormControl(this.mapper.extractFromDependency(item, 'id')),
41
+ [fields.fromId]: new FormControl(this.mapper.extractFromDependency(item, 'fromId'), Validators.required),
42
+ [fields.toId]: new FormControl(this.mapper.extractFromDependency(item, 'toId'), Validators.required),
43
+ [fields.type]: new FormControl(this.mapper.extractFromDependency(item, 'type'), Validators.required)
44
+ });
45
+ this.formGroups.push(formGroup);
46
+ });
47
+ }
48
+ this.formGroups.valueChanges.subscribe(val => {
49
+ this.formGroups.controls.forEach(control => {
50
+ if (control.dirty) {
51
+ this.editService.updateDependencies(control.value);
52
+ }
53
+ });
54
+ this.dependenciesChange.emit(val);
55
+ });
56
+ }
57
+ getFormControl(dataItemIndex, field) {
58
+ // return the FormControl for the respective column editor
59
+ return this.formGroups.controls
60
+ .find((_control, index) => index === dataItemIndex)
61
+ .get(this.mapper.dependencyFields[field]);
62
+ }
63
+ getText(token) {
64
+ return this.localizationService.get(token);
65
+ }
66
+ getDependencyTypes() {
67
+ const types = Object.keys(DependencyType)
68
+ .filter(value => typeof DependencyType[value] === 'number')
69
+ .map(type => {
70
+ return {
71
+ type,
72
+ id: DependencyType[type]
73
+ };
74
+ });
75
+ return types;
76
+ }
77
+ addHandler() {
78
+ const fields = this.mapper.dependencyFields;
79
+ const formGroup = new FormGroup({
80
+ [fields.id]: new FormControl(),
81
+ [fields.fromId]: new FormControl(this.dependencyIdField === 'toId' ? this.taskId : null, Validators.required),
82
+ [fields.toId]: new FormControl(this.dependencyIdField === 'fromId' ? this.taskId : null, Validators.required),
83
+ [fields.type]: new FormControl(null, Validators.required)
84
+ });
85
+ this.formGroups.push(formGroup);
86
+ }
87
+ removeHandler() {
88
+ const [selectedIndex] = this.selectedKeys;
89
+ const item = this.formGroups.at(selectedIndex).value;
90
+ this.editService.deleteDependency(item);
91
+ this.formGroups.removeAt(selectedIndex);
92
+ }
93
+ };
94
+ tslib_1.__decorate([
95
+ Input(),
96
+ tslib_1.__metadata("design:type", Array)
97
+ ], DependenciesTableComponent.prototype, "tasks", void 0);
98
+ tslib_1.__decorate([
99
+ Input(),
100
+ tslib_1.__metadata("design:type", Array)
101
+ ], DependenciesTableComponent.prototype, "dependencies", void 0);
102
+ tslib_1.__decorate([
103
+ Input(),
104
+ tslib_1.__metadata("design:type", String)
105
+ ], DependenciesTableComponent.prototype, "dependencyType", void 0);
106
+ tslib_1.__decorate([
107
+ Output(),
108
+ tslib_1.__metadata("design:type", EventEmitter)
109
+ ], DependenciesTableComponent.prototype, "dependenciesChange", void 0);
110
+ DependenciesTableComponent = tslib_1.__decorate([
111
+ Component({
112
+ selector: 'kendo-gantt-dependencies-table',
113
+ template: `
114
+ <kendo-grid
115
+ [data]="dependencies"
116
+ [selectable]="{ mode: 'single' }"
117
+ [(selectedKeys)]="selectedKeys"
118
+ kendoGridSelectBy
119
+ [height]="295"
120
+ >
121
+ <ng-template kendoGridToolbarTemplate>
122
+ <button kendoButton (click)="addHandler()">
123
+ {{ getText('taskEditingDependenciesAddButtonText') }}
124
+ </button>
125
+ <button kendoButton (click)="removeHandler()" [disabled]="selectedKeys.length === 0">
126
+ {{ getText('taskEditingDependenciesRemoveButtonText') }}
127
+ </button>
128
+ </ng-template>
129
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridNameColumnTitle')" [field]="dependencyIdField">
130
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
131
+ <kendo-dropdownlist
132
+ [data]="tasks"
133
+ textField="title"
134
+ valueField="id"
135
+ [valuePrimitive]="true"
136
+ [formControl]="getFormControl(rowIndex, column.field)"
137
+ >
138
+ </kendo-dropdownlist>
139
+ </ng-template>
140
+ </kendo-grid-column>
141
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridTypeColumnTitle')" field="type">
142
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
143
+ <kendo-dropdownlist
144
+ [data]="dependencyTypes"
145
+ textField="type"
146
+ valueField="id"
147
+ [valuePrimitive]="true"
148
+ [formControl]="getFormControl(rowIndex, column.field)"
149
+ >
150
+ </kendo-dropdownlist>
151
+ </ng-template>
152
+ </kendo-grid-column>
153
+ </kendo-grid>
154
+ `
155
+ }),
156
+ tslib_1.__metadata("design:paramtypes", [MappingService,
157
+ EditService,
158
+ GanttLocalizationService])
159
+ ], DependenciesTableComponent);
160
+ export { DependenciesTableComponent };
@@ -2,9 +2,10 @@
2
2
  * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { FormGroup } from '@angular/forms';
5
+ import { ChangeDetectorRef } from '@angular/core';
6
6
  import { LocalizationService } from '@progress/kendo-angular-l10n';
7
7
  import { MappingService } from '../common/mapping.service';
8
+ import { GanttDependency } from '../models/models';
8
9
  import { EditService } from './edit.service';
9
10
  /**
10
11
  * @hidden
@@ -12,10 +13,16 @@ import { EditService } from './edit.service';
12
13
  export declare class EditDialogComponent {
13
14
  mapper: MappingService;
14
15
  editService: EditService;
16
+ cdr: ChangeDetectorRef;
15
17
  private localizationService;
16
- formGroup: FormGroup;
17
- constructor(mapper: MappingService, editService: EditService, localizationService: LocalizationService);
18
+ data: any[];
19
+ loadedTasks: any[];
20
+ constructor(mapper: MappingService, editService: EditService, cdr: ChangeDetectorRef, localizationService: LocalizationService);
21
+ ngOnInit(): void;
22
+ predecessors: GanttDependency[];
23
+ successors: GanttDependency[];
18
24
  getText(token: string): string;
25
+ getDependencyType(typeId: number): string;
19
26
  handleEditingResult(editResultType: 'save' | 'cancel'): void;
20
27
  onTaskDelete(): void;
21
28
  }
@@ -3,23 +3,44 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as tslib_1 from "tslib";
6
- import { Component, Input } from '@angular/core';
7
- import { FormGroup } from '@angular/forms';
6
+ import { ChangeDetectorRef, Component, Input } from '@angular/core';
8
7
  import { LocalizationService } from '@progress/kendo-angular-l10n';
9
8
  import { MappingService } from '../common/mapping.service';
9
+ import { DependencyType } from '../models/dependency-type.enum';
10
10
  import { EditService } from './edit.service';
11
11
  /**
12
12
  * @hidden
13
13
  */
14
14
  let EditDialogComponent = class EditDialogComponent {
15
- constructor(mapper, editService, localizationService) {
15
+ constructor(mapper, editService, cdr, localizationService) {
16
16
  this.mapper = mapper;
17
17
  this.editService = editService;
18
+ this.cdr = cdr;
18
19
  this.localizationService = localizationService;
19
20
  }
21
+ ngOnInit() {
22
+ this.editService.loadTasks(this.data).subscribe(value => {
23
+ this.loadedTasks = value;
24
+ });
25
+ }
26
+ get predecessors() {
27
+ return this.editService.predecessors;
28
+ }
29
+ set predecessors(items) {
30
+ this.editService.predecessors = items;
31
+ }
32
+ get successors() {
33
+ return this.editService.successors;
34
+ }
35
+ set successors(items) {
36
+ this.editService.successors = items;
37
+ }
20
38
  getText(token) {
21
39
  return this.localizationService.get(token);
22
40
  }
41
+ getDependencyType(typeId) {
42
+ return DependencyType[typeId];
43
+ }
23
44
  handleEditingResult(editResultType) {
24
45
  this.editService.triggerEditEvent(editResultType);
25
46
  }
@@ -29,8 +50,8 @@ let EditDialogComponent = class EditDialogComponent {
29
50
  };
30
51
  tslib_1.__decorate([
31
52
  Input(),
32
- tslib_1.__metadata("design:type", FormGroup)
33
- ], EditDialogComponent.prototype, "formGroup", void 0);
53
+ tslib_1.__metadata("design:type", Array)
54
+ ], EditDialogComponent.prototype, "data", void 0);
34
55
  EditDialogComponent = tslib_1.__decorate([
35
56
  Component({
36
57
  selector: 'kendo-gantt-edit-dialog',
@@ -42,34 +63,34 @@ EditDialogComponent = tslib_1.__decorate([
42
63
  (close)="handleEditingResult('cancel')">
43
64
  <kendo-dialog-messages
44
65
  [closeTitle]="getText('taskEditingDialogCloseTitle')"></kendo-dialog-messages>
45
- <form class="k-form" [formGroup]="formGroup">
46
- <kendo-formfield *ngIf="formGroup.contains(mapper.taskFields.title)">
47
- <kendo-label [for]="mapper.taskFields.title" [text]="getText('titleFieldInputLabel')"></kendo-label>
48
- <input class="k-textbox" [formControlName]="mapper.taskFields.title" />
49
- </kendo-formfield>
50
- <div class="k-hstack">
51
- <kendo-formfield [style.width.%]="49" *ngIf="formGroup.contains(mapper.taskFields.start)">
52
- <kendo-label [for]="mapper.taskFields.start" [text]="getText('startFieldInputLabel')"></kendo-label>
53
- <kendo-datetimepicker [formControlName]="mapper.taskFields.start"></kendo-datetimepicker>
54
- </kendo-formfield>
55
- <kendo-treelist-spacer></kendo-treelist-spacer>
56
- <kendo-formfield [style.width.%]="49" *ngIf="formGroup.contains(mapper.taskFields.end)">
57
- <kendo-label [for]="mapper.taskFields.end" [text]="getText('endFieldInputLabel')"></kendo-label>
58
- <kendo-datetimepicker [formControlName]="mapper.taskFields.end"></kendo-datetimepicker>
59
- </kendo-formfield>
60
- </div>
61
- <kendo-formfield [style.width.%]="49" *ngIf="formGroup.contains(mapper.taskFields.completionRatio)">
62
- <kendo-label [for]="mapper.taskFields.completionRatio" [text]="getText('completionRatioFieldInputLabel')"></kendo-label>
63
- <kendo-numerictextbox
64
- [formControlName]="mapper.taskFields.completionRatio"
65
- [min]="0"
66
- [max]="1"
67
- [decimals]="2"
68
- format="p2"
69
- [step]="0.01"
70
- ></kendo-numerictextbox>
71
- </kendo-formfield>
72
- </form>
66
+
67
+ <kendo-tabstrip [keepTabContent]="true">
68
+ <kendo-tabstrip-tab [title]="getText('taskEditingGeneralTabTitle')" [selected]="true">
69
+ <ng-template kendoTabContent>
70
+ <kendo-gantt-task-fields></kendo-gantt-task-fields>
71
+ </ng-template>
72
+ </kendo-tabstrip-tab>
73
+ <kendo-tabstrip-tab [title]="getText('taskEditingPredecessorsTabTitle')">
74
+ <ng-template kendoTabContent>
75
+ <kendo-gantt-dependencies-table
76
+ [tasks]="loadedTasks"
77
+ [(dependencies)]="predecessors"
78
+ dependencyType="predecessor"
79
+ >
80
+ </kendo-gantt-dependencies-table>
81
+ </ng-template>
82
+ </kendo-tabstrip-tab>
83
+ <kendo-tabstrip-tab [title]="getText('taskEditingSuccessorsTabTitle')">
84
+ <ng-template kendoTabContent>
85
+ <kendo-gantt-dependencies-table
86
+ [tasks]="loadedTasks"
87
+ [(dependencies)]="successors"
88
+ dependencyType="successor">
89
+ </kendo-gantt-dependencies-table>
90
+ </ng-template>
91
+ </kendo-tabstrip-tab>
92
+ </kendo-tabstrip>
93
+
73
94
  <kendo-dialog-actions layout="normal">
74
95
  <button kendoButton (click)="onTaskDelete()">{{ getText('deleteButtonText') }}</button>
75
96
  <kendo-treelist-spacer></kendo-treelist-spacer>
@@ -81,6 +102,7 @@ EditDialogComponent = tslib_1.__decorate([
81
102
  }),
82
103
  tslib_1.__metadata("design:paramtypes", [MappingService,
83
104
  EditService,
105
+ ChangeDetectorRef,
84
106
  LocalizationService])
85
107
  ], EditDialogComponent);
86
108
  export { EditDialogComponent };
@@ -3,18 +3,39 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { FormGroup } from '@angular/forms';
6
- import { Subject } from 'rxjs';
6
+ import { Observable, Subject } from 'rxjs';
7
+ import { TaskAddEvent } from '../models/events/task-add-event.interface';
8
+ import { GanttDependency } from '../main';
7
9
  import { EditEvent, EditResultType } from '../models/events/task-edit-event.interface';
10
+ import { MappingService } from '../common/mapping.service';
8
11
  /**
9
12
  * @hidden
10
13
  */
11
14
  export declare class EditService {
15
+ private mapper;
12
16
  showEditingDialog: Subject<boolean>;
13
17
  showConfirmationDialog: Subject<any>;
14
18
  editEvent: Subject<EditEvent>;
15
- formGroup: FormGroup;
19
+ addEvent: Subject<TaskAddEvent>;
20
+ taskFormGroup: FormGroup;
16
21
  dataItem: any;
17
- createEditDialog(dataItem: any, formGroup: FormGroup): void;
22
+ getSelectedItem: () => any;
23
+ hasChildren: (node: any) => boolean;
24
+ fetchChildren: (node: any) => Observable<any[]> | any[];
25
+ dependencies: any[];
26
+ predecessors: GanttDependency[];
27
+ successors: GanttDependency[];
28
+ updatedItems: any[];
29
+ deletedItems: any[];
30
+ constructor(mapper: MappingService);
31
+ createEditDialog(dataItem: any, taskFormGroup: FormGroup, dependencies: any[]): void;
18
32
  closeEditDialog(): void;
19
33
  triggerEditEvent(editResultType: EditResultType): void;
34
+ updateDependencies(item: GanttDependency): void;
35
+ getCreatedDependencies(): any[];
36
+ deleteDependency(item: GanttDependency): void;
37
+ loadTasks(initialValues: any[], isInitializer?: boolean): Observable<any[]>;
38
+ private getElementById;
39
+ private itemIndex;
40
+ private isNew;
20
41
  }
@@ -4,38 +4,106 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as tslib_1 from "tslib";
6
6
  import { Injectable } from '@angular/core';
7
- import { Subject } from 'rxjs';
7
+ import { EMPTY, forkJoin, isObservable, of, Subject } from 'rxjs';
8
+ import { MappingService } from '../common/mapping.service';
9
+ import { map, expand, reduce } from 'rxjs/operators';
10
+ import { isPresent, normalizeGanttData } from '../utils';
8
11
  /**
9
12
  * @hidden
10
13
  */
11
14
  let EditService = class EditService {
12
- /**
13
- * @hidden
14
- */
15
- constructor() {
15
+ constructor(mapper) {
16
+ this.mapper = mapper;
16
17
  this.showEditingDialog = new Subject();
17
18
  this.showConfirmationDialog = new Subject();
18
19
  this.editEvent = new Subject();
20
+ this.addEvent = new Subject();
21
+ this.updatedItems = [];
22
+ this.deletedItems = [];
23
+ this.itemIndex = (item, data) => {
24
+ return data.findIndex(dataItem => this.mapper.extractFromTask(dataItem, 'id') === this.mapper.extractFromTask(item, 'id'));
25
+ };
19
26
  }
20
- createEditDialog(dataItem, formGroup) {
27
+ set dependencies(items) {
28
+ // Can this whole thing be moved to edit-dialog? Dependencies might not be needed here
29
+ const dataItemId = this.mapper.extractFromTask(this.dataItem, 'id');
30
+ this.predecessors = items.filter(item => this.mapper.extractFromDependency(item, 'toId') === dataItemId);
31
+ this.successors = items.filter(item => this.mapper.extractFromDependency(item, 'fromId') === dataItemId);
32
+ }
33
+ get dependencies() {
34
+ return [...this.predecessors, ...this.successors];
35
+ }
36
+ createEditDialog(dataItem, taskFormGroup, dependencies) {
21
37
  this.dataItem = dataItem;
22
- this.formGroup = formGroup;
38
+ this.taskFormGroup = taskFormGroup;
39
+ this.dependencies = dependencies;
23
40
  this.showEditingDialog.next(true);
24
41
  }
25
42
  closeEditDialog() {
26
43
  this.showEditingDialog.next(false);
27
44
  this.dataItem = undefined;
28
- this.formGroup = undefined;
45
+ this.taskFormGroup = undefined;
46
+ this.dependencies = [];
47
+ this.updatedItems = [];
48
+ this.deletedItems = [];
29
49
  }
30
50
  triggerEditEvent(editResultType) {
31
51
  this.editEvent.next({
32
- formGroup: this.formGroup,
52
+ taskFormGroup: this.taskFormGroup,
33
53
  dataItem: this.dataItem,
54
+ dependencies: {
55
+ createdItems: this.getCreatedDependencies(),
56
+ updatedItems: this.updatedItems,
57
+ deletedItems: this.deletedItems
58
+ },
34
59
  editResultType
35
60
  });
36
61
  }
62
+ updateDependencies(item) {
63
+ if (!this.isNew(item)) {
64
+ // update
65
+ const index = this.itemIndex(item, this.updatedItems);
66
+ if (index !== -1) {
67
+ this.updatedItems.splice(index, 1, item);
68
+ }
69
+ else {
70
+ this.updatedItems.push(item);
71
+ }
72
+ }
73
+ }
74
+ getCreatedDependencies() {
75
+ return this.dependencies.filter(item => this.mapper.extractFromDependency(item, 'id') === null);
76
+ }
77
+ deleteDependency(item) {
78
+ const updatedIndex = this.itemIndex(item, this.updatedItems);
79
+ if (updatedIndex !== -1) {
80
+ this.updatedItems.splice(updatedIndex, 1);
81
+ }
82
+ if (!this.isNew(item)) {
83
+ this.deletedItems.push(item);
84
+ }
85
+ }
86
+ loadTasks(initialValues, isInitializer = true) {
87
+ return forkJoin(initialValues.map(v => this.getElementById(v))).pipe(map((value) => value.reduce((acc, item) => acc = acc.concat(normalizeGanttData(item)), [])), expand(values => {
88
+ if (values.some(el => this.hasChildren(el))) {
89
+ return this.loadTasks(values, false);
90
+ }
91
+ return EMPTY;
92
+ }), reduce((acc, values) => acc.concat(values), isInitializer ? [...initialValues] : []));
93
+ }
94
+ getElementById(item) {
95
+ const children = this.fetchChildren(item);
96
+ if (isObservable(children)) {
97
+ return children;
98
+ }
99
+ return of(children);
100
+ }
101
+ isNew(item) {
102
+ return !isPresent(this.mapper.extractFromDependency(item, 'id'));
103
+ }
37
104
  };
38
105
  EditService = tslib_1.__decorate([
39
- Injectable()
106
+ Injectable(),
107
+ tslib_1.__metadata("design:paramtypes", [MappingService])
40
108
  ], EditService);
41
109
  export { EditService };
@@ -0,0 +1,22 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import { FormGroup } from '@angular/forms';
6
+ import { MappingService } from '../common/mapping.service';
7
+ import { GanttLocalizationService } from '../localization/gantt-localization.service';
8
+ import { EditService } from './edit.service';
9
+ /**
10
+ * @hidden
11
+ */
12
+ export declare class TaskFieldsComponent {
13
+ mapper: MappingService;
14
+ private editService;
15
+ private localizationService;
16
+ constructor(mapper: MappingService, editService: EditService, localizationService: GanttLocalizationService);
17
+ /**
18
+ * @hidden
19
+ */
20
+ readonly formGroup: FormGroup;
21
+ getText(token: string): string;
22
+ }
@@ -0,0 +1,67 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import * as tslib_1 from "tslib";
6
+ import { Component } from '@angular/core';
7
+ import { MappingService } from '../common/mapping.service';
8
+ import { GanttLocalizationService } from '../localization/gantt-localization.service';
9
+ import { EditService } from './edit.service';
10
+ /**
11
+ * @hidden
12
+ */
13
+ let TaskFieldsComponent = class TaskFieldsComponent {
14
+ constructor(mapper, editService, localizationService) {
15
+ this.mapper = mapper;
16
+ this.editService = editService;
17
+ this.localizationService = localizationService;
18
+ }
19
+ /**
20
+ * @hidden
21
+ */
22
+ get formGroup() {
23
+ return this.editService.taskFormGroup;
24
+ }
25
+ getText(token) {
26
+ return this.localizationService.get(token);
27
+ }
28
+ };
29
+ TaskFieldsComponent = tslib_1.__decorate([
30
+ Component({
31
+ selector: 'kendo-gantt-task-fields',
32
+ template: `
33
+ <form class="k-form" [formGroup]="formGroup">
34
+ <kendo-formfield *ngIf="formGroup.contains(mapper.taskFields.title)">
35
+ <kendo-label [for]="mapper.taskFields.title" [text]="getText('titleFieldInputLabel')"></kendo-label>
36
+ <input class="k-textbox" [formControlName]="mapper.taskFields.title" />
37
+ </kendo-formfield>
38
+ <div class="k-hstack">
39
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.contains(mapper.taskFields.start)">
40
+ <kendo-label [for]="mapper.taskFields.start" [text]="getText('startFieldInputLabel')"></kendo-label>
41
+ <kendo-datetimepicker [formControlName]="mapper.taskFields.start"></kendo-datetimepicker>
42
+ </kendo-formfield>
43
+ <kendo-treelist-spacer></kendo-treelist-spacer>
44
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.contains(mapper.taskFields.end)">
45
+ <kendo-label [for]="mapper.taskFields.end" [text]="getText('endFieldInputLabel')"></kendo-label>
46
+ <kendo-datetimepicker [formControlName]="mapper.taskFields.end"></kendo-datetimepicker>
47
+ </kendo-formfield>
48
+ </div>
49
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.contains(mapper.taskFields.completionRatio)">
50
+ <kendo-label [for]="mapper.taskFields.completionRatio" [text]="getText('completionRatioFieldInputLabel')"></kendo-label>
51
+ <kendo-numerictextbox
52
+ [formControlName]="mapper.taskFields.completionRatio"
53
+ [min]="0"
54
+ [max]="1"
55
+ [decimals]="2"
56
+ format="p2"
57
+ [step]="0.01"
58
+ ></kendo-numerictextbox>
59
+ </kendo-formfield>
60
+ </form>
61
+ `
62
+ }),
63
+ tslib_1.__metadata("design:paramtypes", [MappingService,
64
+ EditService,
65
+ GanttLocalizationService])
66
+ ], TaskFieldsComponent);
67
+ export { TaskFieldsComponent };
File without changes
File without changes
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { ExpandableDirective, ExpandableTreeComponent } from '@progress/kendo-angular-treelist';
5
+ import { ExpandableDirective } from '@progress/kendo-angular-treelist';
6
6
  /**
7
7
  * A directive which controls the expanded state of the items.
8
8
  */
@@ -14,5 +14,4 @@ export declare class GanttExpandableDirective extends ExpandableDirective {
14
14
  *
15
15
  */
16
16
  expandBy: string | ((dataItem: any) => any);
17
- constructor(gantt: ExpandableTreeComponent);
18
17
  }
@@ -4,15 +4,11 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as tslib_1 from "tslib";
6
6
  import { Directive, Input } from '@angular/core';
7
- import { ExpandableDirective, ExpandableTreeComponent } from '@progress/kendo-angular-treelist';
7
+ import { ExpandableDirective } from '@progress/kendo-angular-treelist';
8
8
  /**
9
9
  * A directive which controls the expanded state of the items.
10
10
  */
11
11
  let GanttExpandableDirective = class GanttExpandableDirective extends ExpandableDirective {
12
- // fixes an injection error in some builds/ng-versions (e.g. StackBlitz)
13
- constructor(gantt) {
14
- super(gantt);
15
- }
16
12
  };
17
13
  tslib_1.__decorate([
18
14
  Input(),
@@ -22,7 +18,6 @@ GanttExpandableDirective = tslib_1.__decorate([
22
18
  Directive({
23
19
  exportAs: 'kendoGanttExpandable',
24
20
  selector: '[kendoGanttExpandable]'
25
- }),
26
- tslib_1.__metadata("design:paramtypes", [ExpandableTreeComponent])
21
+ })
27
22
  ], GanttExpandableDirective);
28
23
  export { GanttExpandableDirective };