@progress/kendo-angular-gantt 0.2.1-dev.202112101349 → 0.3.0-dev.202201190830

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 (171) 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 +39 -8
  10. package/dist/es/editing/edit.service.js +92 -8
  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/gantt.component.js +408 -56
  14. package/dist/es/gantt.module.js +37 -9
  15. package/dist/es/index.js +9 -0
  16. package/dist/es/localization/gantt-localization.service.js +26 -0
  17. package/dist/es/localization/messages.js +45 -1
  18. package/dist/es/main.js +1 -0
  19. package/dist/es/models/dependency-type.enum.js +16 -0
  20. package/dist/es/models/events/{add-event.interface.js → dependency-add-event.interface.js} +0 -0
  21. package/dist/es/models/events/{edit-event.interface.js → task-add-event.interface.js} +0 -0
  22. package/dist/es/models/events/{remove-event.interface.js → task-delete-event.interface.js} +0 -0
  23. package/dist/es/models/models.js +1 -0
  24. package/dist/es/models/{toolbar-position.js → toolbar-settings.js} +0 -0
  25. package/dist/{es2015/models/events/add-event.interface.js → es/models/view-item.interface.js} +0 -0
  26. package/dist/{es2015/models/events/edit-event.interface.js → es/navigation/navigation-models.js} +0 -0
  27. package/dist/es/navigation/navigation.service.js +390 -0
  28. package/dist/es/navigation/utils.js +77 -0
  29. package/dist/es/package-metadata.js +1 -1
  30. package/dist/es/rendering/gantt-milestone-task.component.js +12 -6
  31. package/dist/es/rendering/gantt-summary-task.component.js +27 -6
  32. package/dist/es/rendering/gantt-task-base.js +84 -22
  33. package/dist/es/rendering/gantt-task.component.js +13 -8
  34. package/dist/es/rendering/gantt-tasks-table-body.component.js +13 -5
  35. package/dist/es/scrolling/drag-scroll-settings.js +20 -0
  36. package/dist/es/scrolling/timeline-scroll.directive.js +89 -0
  37. package/dist/es/scrolling/timeline-scroll.service.js +39 -0
  38. package/dist/es/scrolling/utils.js +80 -0
  39. package/dist/es/timeline/gantt-timeline.component.js +50 -4
  40. package/dist/es/toolbar/toolbar.component.js +20 -13
  41. package/dist/es/toolbar/view-selector.component.js +1 -1
  42. package/dist/es/utils.js +153 -12
  43. package/dist/es2015/common/touch-enabled.d.ts +9 -0
  44. package/dist/es2015/common/touch-enabled.js +9 -0
  45. package/dist/es2015/dependencies/utils.d.ts +15 -0
  46. package/dist/es2015/dependencies/utils.js +40 -5
  47. package/dist/es2015/dragging/dependency-drag-create.directive.d.ts +72 -0
  48. package/dist/es2015/dragging/dependency-drag-create.directive.js +324 -0
  49. package/dist/es2015/dragging/drag-validation-tooltip.component.d.ts +29 -0
  50. package/dist/es2015/dragging/drag-validation-tooltip.component.js +76 -0
  51. package/dist/es2015/editing/add-task.component.d.ts +45 -0
  52. package/dist/es2015/editing/add-task.component.js +102 -0
  53. package/dist/es2015/editing/dependencies-table.component.d.ts +39 -0
  54. package/dist/es2015/editing/dependencies-table.component.js +160 -0
  55. package/dist/es2015/editing/edit-dialog.component.d.ts +11 -4
  56. package/dist/es2015/editing/edit-dialog.component.js +66 -36
  57. package/dist/es2015/editing/edit.service.d.ts +24 -4
  58. package/dist/es2015/editing/edit.service.js +81 -11
  59. package/dist/es2015/editing/task-fields.component.d.ts +22 -0
  60. package/dist/es2015/editing/task-fields.component.js +67 -0
  61. package/dist/es2015/editing/{util.d.ts → utils.d.ts} +2 -2
  62. package/dist/es2015/editing/{util.js → utils.js} +0 -0
  63. package/dist/es2015/gantt.component.d.ts +134 -31
  64. package/dist/es2015/gantt.component.js +419 -61
  65. package/dist/es2015/gantt.module.js +37 -9
  66. package/dist/es2015/index.d.ts +9 -0
  67. package/dist/es2015/index.js +9 -0
  68. package/dist/es2015/index.metadata.json +1 -1
  69. package/dist/es2015/{models/events/edit-event.interface.d.ts → localization/gantt-localization.service.d.ts} +6 -10
  70. package/dist/es2015/localization/gantt-localization.service.js +25 -0
  71. package/dist/es2015/localization/messages.d.ts +46 -2
  72. package/dist/es2015/localization/messages.js +45 -1
  73. package/dist/es2015/main.d.ts +1 -0
  74. package/dist/es2015/main.js +1 -0
  75. package/dist/es2015/models/dependency-type.enum.d.ts +1 -1
  76. package/dist/es2015/models/dependency-type.enum.js +16 -0
  77. package/dist/es2015/models/events/dependency-add-event.interface.d.ts +26 -0
  78. package/dist/es2015/models/events/{remove-event.interface.js → dependency-add-event.interface.js} +0 -0
  79. package/dist/es2015/models/events/task-add-event.interface.d.ts +31 -0
  80. package/dist/es2015/models/{toolbar-position.js → events/task-add-event.interface.js} +0 -0
  81. package/dist/es2015/models/events/task-click-event.interface.d.ts +3 -3
  82. package/dist/es2015/models/events/task-delete-event.interface.d.ts +21 -0
  83. package/dist/es2015/models/events/task-delete-event.interface.js +4 -0
  84. package/dist/es2015/models/events/task-edit-event.interface.d.ts +36 -6
  85. package/dist/es2015/models/models.d.ts +6 -3
  86. package/dist/es2015/models/models.js +1 -0
  87. package/dist/es2015/models/toolbar-settings.d.ts +29 -0
  88. package/dist/es2015/models/toolbar-settings.js +4 -0
  89. package/dist/es2015/models/view-item.interface.d.ts +35 -0
  90. package/dist/es2015/models/view-item.interface.js +4 -0
  91. package/dist/es2015/navigation/navigation-models.d.ts +34 -0
  92. package/dist/es2015/navigation/navigation-models.js +4 -0
  93. package/dist/es2015/navigation/navigation.service.d.ts +126 -0
  94. package/dist/es2015/navigation/navigation.service.js +355 -0
  95. package/dist/es2015/navigation/utils.d.ts +26 -0
  96. package/dist/es2015/navigation/utils.js +69 -0
  97. package/dist/es2015/package-metadata.js +1 -1
  98. package/dist/es2015/rendering/gantt-milestone-task.component.d.ts +3 -1
  99. package/dist/es2015/rendering/gantt-milestone-task.component.js +35 -8
  100. package/dist/es2015/rendering/gantt-summary-task.component.d.ts +5 -1
  101. package/dist/es2015/rendering/gantt-summary-task.component.js +47 -8
  102. package/dist/es2015/rendering/gantt-task-base.d.ts +20 -6
  103. package/dist/es2015/rendering/gantt-task-base.js +75 -22
  104. package/dist/es2015/rendering/gantt-task.component.d.ts +4 -2
  105. package/dist/es2015/rendering/gantt-task.component.js +47 -13
  106. package/dist/es2015/rendering/gantt-tasks-table-body.component.d.ts +6 -3
  107. package/dist/es2015/rendering/gantt-tasks-table-body.component.js +27 -9
  108. package/dist/es2015/scrolling/drag-scroll-settings.d.ts +47 -0
  109. package/dist/es2015/scrolling/drag-scroll-settings.js +20 -0
  110. package/dist/es2015/scrolling/scroll-sync.service.d.ts +1 -1
  111. package/dist/es2015/scrolling/timeline-scroll.directive.d.ts +24 -0
  112. package/dist/es2015/scrolling/timeline-scroll.directive.js +78 -0
  113. package/dist/es2015/scrolling/timeline-scroll.service.d.ts +20 -0
  114. package/dist/es2015/scrolling/timeline-scroll.service.js +44 -0
  115. package/dist/es2015/scrolling/utils.d.ts +29 -0
  116. package/dist/es2015/scrolling/utils.js +80 -0
  117. package/dist/es2015/timeline/gantt-timeline.component.d.ts +29 -4
  118. package/dist/es2015/timeline/gantt-timeline.component.js +67 -5
  119. package/dist/es2015/toolbar/toolbar-template.directive.d.ts +1 -1
  120. package/dist/es2015/toolbar/toolbar.component.d.ts +6 -5
  121. package/dist/es2015/toolbar/toolbar.component.js +22 -13
  122. package/dist/es2015/toolbar/view-selector.component.js +3 -1
  123. package/dist/es2015/utils.d.ts +77 -8
  124. package/dist/es2015/utils.js +153 -12
  125. package/dist/fesm2015/index.js +5258 -3012
  126. package/dist/fesm5/index.js +2862 -733
  127. package/dist/npm/common/touch-enabled.js +11 -0
  128. package/dist/npm/dependencies/utils.js +40 -5
  129. package/dist/npm/dragging/dependency-drag-create.directive.js +349 -0
  130. package/dist/npm/dragging/drag-validation-tooltip.component.js +29 -0
  131. package/dist/npm/editing/add-task.component.js +96 -0
  132. package/dist/npm/editing/dependencies-table.component.js +133 -0
  133. package/dist/npm/editing/edit-dialog.component.js +38 -7
  134. package/dist/npm/editing/edit.service.js +91 -7
  135. package/dist/npm/editing/task-fields.component.js +45 -0
  136. package/dist/npm/editing/{util.js → utils.js} +0 -0
  137. package/dist/npm/gantt.component.js +409 -57
  138. package/dist/npm/gantt.module.js +35 -7
  139. package/dist/npm/index.js +18 -0
  140. package/dist/npm/localization/gantt-localization.service.js +28 -0
  141. package/dist/npm/localization/messages.js +45 -1
  142. package/dist/npm/main.js +2 -0
  143. package/dist/npm/models/dependency-type.enum.js +16 -0
  144. package/dist/npm/models/events/{add-event.interface.js → dependency-add-event.interface.js} +0 -0
  145. package/dist/npm/models/events/{edit-event.interface.js → task-add-event.interface.js} +0 -0
  146. package/dist/npm/models/events/{remove-event.interface.js → task-delete-event.interface.js} +0 -0
  147. package/dist/npm/models/models.js +2 -0
  148. package/dist/npm/models/{toolbar-position.js → toolbar-settings.js} +0 -0
  149. package/dist/npm/models/view-item.interface.js +6 -0
  150. package/dist/npm/navigation/navigation-models.js +6 -0
  151. package/dist/npm/navigation/navigation.service.js +392 -0
  152. package/dist/npm/navigation/utils.js +79 -0
  153. package/dist/npm/package-metadata.js +1 -1
  154. package/dist/npm/rendering/gantt-milestone-task.component.js +11 -5
  155. package/dist/npm/rendering/gantt-summary-task.component.js +26 -5
  156. package/dist/npm/rendering/gantt-task-base.js +84 -22
  157. package/dist/npm/rendering/gantt-task.component.js +12 -7
  158. package/dist/npm/rendering/gantt-tasks-table-body.component.js +13 -5
  159. package/dist/npm/scrolling/drag-scroll-settings.js +22 -0
  160. package/dist/npm/scrolling/timeline-scroll.directive.js +91 -0
  161. package/dist/npm/scrolling/timeline-scroll.service.js +41 -0
  162. package/dist/npm/scrolling/utils.js +83 -0
  163. package/dist/npm/timeline/gantt-timeline.component.js +49 -3
  164. package/dist/npm/toolbar/toolbar.component.js +18 -11
  165. package/dist/npm/toolbar/view-selector.component.js +1 -1
  166. package/dist/npm/utils.js +153 -12
  167. package/dist/systemjs/kendo-angular-gantt.js +1 -1
  168. package/package.json +7 -4
  169. package/dist/es2015/models/events/add-event.interface.d.ts +0 -16
  170. package/dist/es2015/models/events/remove-event.interface.d.ts +0 -16
  171. package/dist/es2015/models/toolbar-position.d.ts +0 -9
@@ -0,0 +1,39 @@
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 { EventEmitter } from '@angular/core';
6
+ import { FormArray, FormControl } from '@angular/forms';
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
+ export declare class DependenciesTableComponent {
14
+ mapper: MappingService;
15
+ editService: EditService;
16
+ private localizationService;
17
+ tasks: any[];
18
+ dependencies: any[];
19
+ dependencyType: 'predecessor' | 'successor';
20
+ dependenciesChange: EventEmitter<any>;
21
+ selectedKeys: any[];
22
+ formGroups: FormArray;
23
+ dependencyTypes: {
24
+ type: string;
25
+ id: number;
26
+ }[];
27
+ readonly taskId: number;
28
+ readonly dependencyIdField: string;
29
+ constructor(mapper: MappingService, editService: EditService, localizationService: GanttLocalizationService);
30
+ ngOnInit(): void;
31
+ getFormControl(dataItemIndex: number, field: string): FormControl;
32
+ getText(token: string): string;
33
+ getDependencyTypes(): {
34
+ type: string;
35
+ id: number;
36
+ }[];
37
+ addHandler(): void;
38
+ removeHandler(): void;
39
+ }
@@ -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
- onTaskDelete(): void;
27
+ handleTaskDelete(): void;
21
28
  }
@@ -3,34 +3,55 @@
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
  }
26
- onTaskDelete() {
27
- this.editService.showConfirmationDialog.next();
47
+ handleTaskDelete() {
48
+ this.editService.taskDelete.next(this.editService.dataItem);
28
49
  }
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,36 +63,44 @@ 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
- <button kendoButton (click)="onTaskDelete()">{{ getText('deleteButtonText') }}</button>
95
+ <button
96
+ kendoButton
97
+ [kendoEventsOutsideAngular]="{
98
+ click: handleTaskDelete
99
+ }"
100
+ [scope]="this"
101
+ >
102
+ {{ getText('deleteButtonText') }}
103
+ </button>
75
104
  <kendo-treelist-spacer></kendo-treelist-spacer>
76
105
  <button kendoButton [primary]="true" (click)="handleEditingResult('save')">{{ getText('saveButtonText') }}</button>
77
106
  <button kendoButton (click)="handleEditingResult('cancel')">{{ getText('cancelButtonText') }}</button>
@@ -81,6 +110,7 @@ EditDialogComponent = tslib_1.__decorate([
81
110
  }),
82
111
  tslib_1.__metadata("design:paramtypes", [MappingService,
83
112
  EditService,
113
+ ChangeDetectorRef,
84
114
  LocalizationService])
85
115
  ], EditDialogComponent);
86
116
  export { EditDialogComponent };
@@ -3,18 +3,38 @@
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 { GanttDependency, TaskAddEvent } from '../models/models';
7
8
  import { EditEvent, EditResultType } from '../models/events/task-edit-event.interface';
9
+ import { MappingService } from '../common/mapping.service';
8
10
  /**
9
11
  * @hidden
10
12
  */
11
13
  export declare class EditService {
14
+ private mapper;
12
15
  showEditingDialog: Subject<boolean>;
13
- showConfirmationDialog: Subject<any>;
16
+ taskDelete: Subject<object>;
14
17
  editEvent: Subject<EditEvent>;
15
- formGroup: FormGroup;
18
+ addEvent: Subject<TaskAddEvent>;
19
+ taskFormGroup: FormGroup;
16
20
  dataItem: any;
17
- createEditDialog(dataItem: any, formGroup: FormGroup): void;
21
+ getSelectedItem: () => any;
22
+ hasChildren: (node: any) => boolean;
23
+ fetchChildren: (node: any) => Observable<any[]> | any[];
24
+ dependencies: any[];
25
+ predecessors: GanttDependency[];
26
+ successors: GanttDependency[];
27
+ updatedItems: any[];
28
+ deletedItems: any[];
29
+ constructor(mapper: MappingService);
30
+ createEditDialog(dataItem: any, taskFormGroup: FormGroup, dependencies: any[]): void;
18
31
  closeEditDialog(): void;
19
32
  triggerEditEvent(editResultType: EditResultType): void;
33
+ updateDependencies(item: GanttDependency): void;
34
+ getCreatedDependencies(): any[];
35
+ deleteDependency(item: GanttDependency): void;
36
+ loadTasks(initialValues: any[], isInitializer?: boolean): Observable<any[]>;
37
+ private getElementById;
38
+ private itemIndex;
39
+ private isNew;
20
40
  }
@@ -4,38 +4,108 @@
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 { map, expand, reduce } from 'rxjs/operators';
9
+ import { MappingService } from '../common/mapping.service';
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
- this.showConfirmationDialog = new Subject();
18
+ this.taskDelete = new Subject();
18
19
  this.editEvent = new Subject();
20
+ this.addEvent = new Subject();
21
+ this.predecessors = [];
22
+ this.successors = [];
23
+ this.updatedItems = [];
24
+ this.deletedItems = [];
25
+ this.itemIndex = (item, data) => {
26
+ return data.findIndex(dataItem => this.mapper.extractFromTask(dataItem, 'id') === this.mapper.extractFromTask(item, 'id'));
27
+ };
19
28
  }
20
- createEditDialog(dataItem, formGroup) {
29
+ set dependencies(items) {
30
+ // Can this whole thing be moved to edit-dialog? Dependencies might not be needed here
31
+ const dataItemId = this.mapper.extractFromTask(this.dataItem, 'id');
32
+ this.predecessors = items.filter(item => this.mapper.extractFromDependency(item, 'toId') === dataItemId);
33
+ this.successors = items.filter(item => this.mapper.extractFromDependency(item, 'fromId') === dataItemId);
34
+ }
35
+ get dependencies() {
36
+ return [...this.predecessors, ...this.successors];
37
+ }
38
+ createEditDialog(dataItem, taskFormGroup, dependencies) {
21
39
  this.dataItem = dataItem;
22
- this.formGroup = formGroup;
40
+ this.taskFormGroup = taskFormGroup;
41
+ this.dependencies = dependencies;
23
42
  this.showEditingDialog.next(true);
24
43
  }
25
44
  closeEditDialog() {
26
45
  this.showEditingDialog.next(false);
27
46
  this.dataItem = undefined;
28
- this.formGroup = undefined;
47
+ this.taskFormGroup = undefined;
48
+ this.dependencies = [];
49
+ this.updatedItems = [];
50
+ this.deletedItems = [];
29
51
  }
30
52
  triggerEditEvent(editResultType) {
31
53
  this.editEvent.next({
32
- formGroup: this.formGroup,
54
+ taskFormGroup: this.taskFormGroup,
33
55
  dataItem: this.dataItem,
56
+ dependencies: {
57
+ createdItems: this.getCreatedDependencies(),
58
+ updatedItems: this.updatedItems,
59
+ deletedItems: this.deletedItems
60
+ },
34
61
  editResultType
35
62
  });
36
63
  }
64
+ updateDependencies(item) {
65
+ if (!this.isNew(item)) {
66
+ // update
67
+ const index = this.itemIndex(item, this.updatedItems);
68
+ if (index !== -1) {
69
+ this.updatedItems.splice(index, 1, item);
70
+ }
71
+ else {
72
+ this.updatedItems.push(item);
73
+ }
74
+ }
75
+ }
76
+ getCreatedDependencies() {
77
+ return this.dependencies.filter(item => this.mapper.extractFromDependency(item, 'id') === null);
78
+ }
79
+ deleteDependency(item) {
80
+ const updatedIndex = this.itemIndex(item, this.updatedItems);
81
+ if (updatedIndex !== -1) {
82
+ this.updatedItems.splice(updatedIndex, 1);
83
+ }
84
+ if (!this.isNew(item)) {
85
+ this.deletedItems.push(item);
86
+ }
87
+ }
88
+ loadTasks(initialValues, isInitializer = true) {
89
+ return forkJoin(initialValues.map(v => this.getElementById(v))).pipe(map((value) => value.reduce((acc, item) => acc = acc.concat(normalizeGanttData(item)), [])), expand(values => {
90
+ if (values.some(el => this.hasChildren(el))) {
91
+ return this.loadTasks(values, false);
92
+ }
93
+ return EMPTY;
94
+ }), reduce((acc, values) => acc.concat(values), isInitializer ? [...initialValues] : []));
95
+ }
96
+ getElementById(item) {
97
+ const children = this.fetchChildren(item);
98
+ if (isObservable(children)) {
99
+ return children;
100
+ }
101
+ return of(children);
102
+ }
103
+ isNew(item) {
104
+ return !isPresent(this.mapper.extractFromDependency(item, 'id'));
105
+ }
37
106
  };
38
107
  EditService = tslib_1.__decorate([
39
- Injectable()
108
+ Injectable(),
109
+ tslib_1.__metadata("design:paramtypes", [MappingService])
40
110
  ], EditService);
41
111
  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 };
@@ -2,8 +2,8 @@
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 { MappingService } from "../common/mapping.service";
6
- import { TaskEditItem } from "../models/events/task-edit-event.interface";
5
+ import { MappingService } from '../common/mapping.service';
6
+ import { TaskEditItem } from '../models/events/task-edit-event.interface';
7
7
  /**
8
8
  * @hidden
9
9
  */
File without changes