@progress/kendo-angular-gantt 0.3.0-dev.202201111723 → 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.
- package/dist/cdn/js/kendo-angular-gantt.js +2 -2
- package/dist/cdn/main.js +4 -10
- package/dist/es/common/touch-enabled.js +9 -0
- package/dist/es/dependencies/utils.js +34 -0
- package/dist/es/dragging/dependency-drag-create.directive.js +347 -0
- package/dist/es/dragging/drag-validation-tooltip.component.js +27 -0
- package/dist/es/editing/{util.js → utils.js} +0 -0
- package/dist/es/gantt.component.js +125 -7
- package/dist/es/gantt.module.js +23 -6
- package/dist/es/index.js +4 -0
- package/dist/es/main.js +1 -0
- package/dist/es/models/events/dependency-add-event.interface.js +4 -0
- package/dist/es/models/view-item.interface.js +4 -0
- package/dist/es/package-metadata.js +1 -1
- package/dist/es/rendering/gantt-milestone-task.component.js +7 -4
- package/dist/es/rendering/gantt-summary-task.component.js +7 -4
- package/dist/es/rendering/gantt-task-base.js +30 -19
- package/dist/es/rendering/gantt-task.component.js +8 -6
- package/dist/es/rendering/gantt-tasks-table-body.component.js +5 -1
- package/dist/es/scrolling/drag-scroll-settings.js +20 -0
- package/dist/es/scrolling/timeline-scroll.directive.js +89 -0
- package/dist/es/scrolling/timeline-scroll.service.js +39 -0
- package/dist/es/scrolling/utils.js +80 -0
- package/dist/es/timeline/gantt-timeline.component.js +45 -3
- package/dist/es/utils.js +143 -12
- package/dist/es2015/common/touch-enabled.d.ts +9 -0
- package/dist/es2015/common/touch-enabled.js +9 -0
- package/dist/es2015/dependencies/utils.d.ts +15 -0
- package/dist/es2015/dependencies/utils.js +34 -0
- package/dist/es2015/dragging/dependency-drag-create.directive.d.ts +72 -0
- package/dist/es2015/dragging/dependency-drag-create.directive.js +324 -0
- package/dist/es2015/dragging/drag-validation-tooltip.component.d.ts +29 -0
- package/dist/es2015/dragging/drag-validation-tooltip.component.js +76 -0
- package/dist/es2015/editing/{util.d.ts → utils.d.ts} +0 -0
- package/dist/es2015/editing/{util.js → utils.js} +0 -0
- package/dist/es2015/gantt.component.d.ts +39 -3
- package/dist/es2015/gantt.component.js +117 -6
- package/dist/es2015/gantt.module.js +23 -6
- package/dist/es2015/index.d.ts +4 -0
- package/dist/es2015/index.js +4 -0
- package/dist/es2015/index.metadata.json +1 -1
- package/dist/es2015/main.d.ts +1 -0
- package/dist/es2015/main.js +1 -0
- package/dist/es2015/models/events/dependency-add-event.interface.d.ts +26 -0
- package/dist/es2015/models/events/dependency-add-event.interface.js +4 -0
- package/dist/es2015/models/models.d.ts +2 -0
- package/dist/es2015/models/view-item.interface.d.ts +35 -0
- package/dist/es2015/models/view-item.interface.js +4 -0
- package/dist/es2015/package-metadata.js +1 -1
- package/dist/es2015/rendering/gantt-milestone-task.component.d.ts +2 -1
- package/dist/es2015/rendering/gantt-milestone-task.component.js +18 -5
- package/dist/es2015/rendering/gantt-summary-task.component.d.ts +2 -1
- package/dist/es2015/rendering/gantt-summary-task.component.js +18 -5
- package/dist/es2015/rendering/gantt-task-base.d.ts +11 -5
- package/dist/es2015/rendering/gantt-task-base.js +30 -19
- package/dist/es2015/rendering/gantt-task.component.d.ts +2 -1
- package/dist/es2015/rendering/gantt-task.component.js +19 -7
- package/dist/es2015/rendering/gantt-tasks-table-body.component.d.ts +1 -0
- package/dist/es2015/rendering/gantt-tasks-table-body.component.js +10 -3
- package/dist/es2015/scrolling/drag-scroll-settings.d.ts +47 -0
- package/dist/es2015/scrolling/drag-scroll-settings.js +20 -0
- package/dist/es2015/scrolling/timeline-scroll.directive.d.ts +24 -0
- package/dist/es2015/scrolling/timeline-scroll.directive.js +78 -0
- package/dist/es2015/scrolling/timeline-scroll.service.d.ts +20 -0
- package/dist/es2015/scrolling/timeline-scroll.service.js +44 -0
- package/dist/es2015/scrolling/utils.d.ts +29 -0
- package/dist/es2015/scrolling/utils.js +80 -0
- package/dist/es2015/timeline/gantt-timeline.component.d.ts +25 -2
- package/dist/es2015/timeline/gantt-timeline.component.js +56 -3
- package/dist/es2015/utils.d.ts +70 -8
- package/dist/es2015/utils.js +143 -12
- package/dist/fesm2015/index.js +1337 -372
- package/dist/fesm5/index.js +1206 -298
- package/dist/npm/common/touch-enabled.js +11 -0
- package/dist/npm/dependencies/utils.js +34 -0
- package/dist/npm/dragging/dependency-drag-create.directive.js +349 -0
- package/dist/npm/dragging/drag-validation-tooltip.component.js +29 -0
- package/dist/npm/editing/{util.js → utils.js} +0 -0
- package/dist/npm/gantt.component.js +127 -9
- package/dist/npm/gantt.module.js +22 -5
- package/dist/npm/index.js +8 -0
- package/dist/npm/main.js +2 -0
- package/dist/npm/models/events/dependency-add-event.interface.js +6 -0
- package/dist/npm/models/view-item.interface.js +6 -0
- package/dist/npm/package-metadata.js +1 -1
- package/dist/npm/rendering/gantt-milestone-task.component.js +6 -3
- package/dist/npm/rendering/gantt-summary-task.component.js +6 -3
- package/dist/npm/rendering/gantt-task-base.js +30 -19
- package/dist/npm/rendering/gantt-task.component.js +7 -5
- package/dist/npm/rendering/gantt-tasks-table-body.component.js +5 -1
- package/dist/npm/scrolling/drag-scroll-settings.js +22 -0
- package/dist/npm/scrolling/timeline-scroll.directive.js +91 -0
- package/dist/npm/scrolling/timeline-scroll.service.js +41 -0
- package/dist/npm/scrolling/utils.js +83 -0
- package/dist/npm/timeline/gantt-timeline.component.js +44 -2
- package/dist/npm/utils.js +143 -12
- package/dist/systemjs/kendo-angular-gantt.js +1 -1
- package/package.json +5 -4
package/dist/es2015/main.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export { GanttModule } from './gantt.module';
|
|
|
7
7
|
export { GanttHierarchyBindingDirective } from './binding-directives/hierarchy-binding.directive';
|
|
8
8
|
export { GanttFlatBindingDirective } from './binding-directives/flat-binding.directive';
|
|
9
9
|
export { GanttExpandableDirective } from './expanded-state/expandable.directive';
|
|
10
|
+
export { DependencyDragCreateDirective } from './dragging/dependency-drag-create.directive';
|
|
10
11
|
export { GanttTaskTemplateDirective } from './template-directives/task-template.directive';
|
|
11
12
|
export { GanttTaskContentTemplateDirective } from './template-directives/task-content-template.directive';
|
|
12
13
|
export { GanttSummaryTaskTemplateDirective } from './template-directives/summary-task-template.directive';
|
package/dist/es2015/main.js
CHANGED
|
@@ -7,6 +7,7 @@ export { GanttModule } from './gantt.module';
|
|
|
7
7
|
export { GanttHierarchyBindingDirective } from './binding-directives/hierarchy-binding.directive';
|
|
8
8
|
export { GanttFlatBindingDirective } from './binding-directives/flat-binding.directive';
|
|
9
9
|
export { GanttExpandableDirective } from './expanded-state/expandable.directive';
|
|
10
|
+
export { DependencyDragCreateDirective } from './dragging/dependency-drag-create.directive';
|
|
10
11
|
export { GanttTaskTemplateDirective } from './template-directives/task-template.directive';
|
|
11
12
|
export { GanttTaskContentTemplateDirective } from './template-directives/task-content-template.directive';
|
|
12
13
|
export { GanttSummaryTaskTemplateDirective } from './template-directives/summary-task-template.directive';
|
|
@@ -0,0 +1,26 @@
|
|
|
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 { DependencyType } from '../dependency-type.enum';
|
|
6
|
+
/**
|
|
7
|
+
* The event data of the [`dependencyAdd`]({% slug api_gantt_ganttcomponent %}#toc-dependencyadd) event.
|
|
8
|
+
*/
|
|
9
|
+
export interface DependencyAddEvent {
|
|
10
|
+
/**
|
|
11
|
+
* The task from which the dependency starts (predecessor).
|
|
12
|
+
*/
|
|
13
|
+
fromTask: any;
|
|
14
|
+
/**
|
|
15
|
+
* The task where the dependency ends (successor).
|
|
16
|
+
*/
|
|
17
|
+
toTask: any;
|
|
18
|
+
/**
|
|
19
|
+
* The dependency type of the linked tasks.
|
|
20
|
+
*/
|
|
21
|
+
type: DependencyType;
|
|
22
|
+
/**
|
|
23
|
+
* Specifies whether the dependency creation attempt is a valid link between the two targeted tasks.
|
|
24
|
+
*/
|
|
25
|
+
isValid: boolean;
|
|
26
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
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
|
+
*-------------------------------------------------------------------------------------------*/
|
|
@@ -31,6 +31,8 @@ export { TaskClickEvent } from './events/task-click-event.interface';
|
|
|
31
31
|
export { TaskAddEvent, GanttAddTaskActionItem } from './events/task-add-event.interface';
|
|
32
32
|
export { TaskEditEvent } from './events/task-edit-event.interface';
|
|
33
33
|
export { TaskEditItem } from './events/task-edit-event.interface';
|
|
34
|
+
export { DependencyAddEvent } from './events/dependency-add-event.interface';
|
|
35
|
+
export { DragScrollSettings } from '../scrolling/drag-scroll-settings';
|
|
34
36
|
export { ColumnLockedChangeEvent } from './events/column-locked-change-event.interface';
|
|
35
37
|
export { ColumnReorderEvent } from './events/column-reorder-event.interface';
|
|
36
38
|
export { ColumnResizeEvent } from './events/column-resize-event.interface';
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* @hidden
|
|
7
|
+
*
|
|
8
|
+
* Represents the item interface used by the treelist to map all rendered items.
|
|
9
|
+
*/
|
|
10
|
+
export interface ViewItem {
|
|
11
|
+
/**
|
|
12
|
+
* The original data item held by this entry.
|
|
13
|
+
*/
|
|
14
|
+
data: any;
|
|
15
|
+
/**
|
|
16
|
+
* The id field value of the current data item.
|
|
17
|
+
*/
|
|
18
|
+
id: any;
|
|
19
|
+
/**
|
|
20
|
+
* The item index as rendered in the TreeList.
|
|
21
|
+
*/
|
|
22
|
+
rowIndex: number;
|
|
23
|
+
/**
|
|
24
|
+
* The hierarchical level of the current data item.
|
|
25
|
+
*/
|
|
26
|
+
level: number;
|
|
27
|
+
/**
|
|
28
|
+
* Species whether the current data item has children.
|
|
29
|
+
*/
|
|
30
|
+
hasChildren: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* The ViewItem of the current data item parent.
|
|
33
|
+
*/
|
|
34
|
+
parent: ViewItem;
|
|
35
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
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
|
+
*-------------------------------------------------------------------------------------------*/
|
|
@@ -9,7 +9,7 @@ export const packageMetadata = {
|
|
|
9
9
|
name: '@progress/kendo-angular-gantt',
|
|
10
10
|
productName: 'Kendo UI for Angular',
|
|
11
11
|
productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
|
|
12
|
-
publishDate:
|
|
12
|
+
publishDate: 1642086647,
|
|
13
13
|
version: '',
|
|
14
14
|
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'
|
|
15
15
|
};
|
|
@@ -12,6 +12,7 @@ import { GanttTaskBase } from './gantt-task-base';
|
|
|
12
12
|
* @hidden
|
|
13
13
|
*/
|
|
14
14
|
export declare class GanttMilestoneTaskComponent extends GanttTaskBase {
|
|
15
|
+
touchEnabled: boolean;
|
|
15
16
|
milestoneWrapperClass: boolean;
|
|
16
|
-
constructor(mapper: MappingService, timelineViewService: TimelineViewService, dependencyDomService: DependencyDomService, optionChangesService: OptionChangesService, cdr: ChangeDetectorRef);
|
|
17
|
+
constructor(touchEnabled: boolean, mapper: MappingService, timelineViewService: TimelineViewService, dependencyDomService: DependencyDomService, optionChangesService: OptionChangesService, cdr: ChangeDetectorRef);
|
|
17
18
|
}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*-------------------------------------------------------------------------------------------*/
|
|
5
5
|
import * as tslib_1 from "tslib";
|
|
6
6
|
var GanttMilestoneTaskComponent_1;
|
|
7
|
-
import { Component, forwardRef, HostBinding, ChangeDetectorRef } from '@angular/core';
|
|
7
|
+
import { Component, forwardRef, HostBinding, ChangeDetectorRef, Inject } from '@angular/core';
|
|
8
8
|
import { MappingService } from '../common/mapping.service';
|
|
9
|
+
import { TOUCH_ENABLED } from '../common/touch-enabled';
|
|
9
10
|
import { DependencyDomService } from '../dependencies/dependency-dom.service';
|
|
10
11
|
import { OptionChangesService } from '../common/option-changes.service';
|
|
11
12
|
import { TimelineViewService } from './../timeline/timeline-view.service';
|
|
@@ -14,8 +15,9 @@ import { GanttTaskBase } from './gantt-task-base';
|
|
|
14
15
|
* @hidden
|
|
15
16
|
*/
|
|
16
17
|
let GanttMilestoneTaskComponent = GanttMilestoneTaskComponent_1 = class GanttMilestoneTaskComponent extends GanttTaskBase {
|
|
17
|
-
constructor(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr) {
|
|
18
|
+
constructor(touchEnabled, mapper, timelineViewService, dependencyDomService, optionChangesService, cdr) {
|
|
18
19
|
super(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr);
|
|
20
|
+
this.touchEnabled = touchEnabled;
|
|
19
21
|
this.milestoneWrapperClass = true;
|
|
20
22
|
}
|
|
21
23
|
};
|
|
@@ -37,15 +39,26 @@ GanttMilestoneTaskComponent = GanttMilestoneTaskComponent_1 = tslib_1.__decorate
|
|
|
37
39
|
#task
|
|
38
40
|
class="k-task k-task-milestone"
|
|
39
41
|
[ngClass]="taskClass(dataItem)"
|
|
40
|
-
[style.left.px]="taskOffset"
|
|
41
42
|
[attr.title]="mapper.extractFromTask(dataItem, 'title')"
|
|
42
43
|
[class.k-state-selected]="isSelected(dataItem)"
|
|
43
|
-
[attr.data-task-index]="index"
|
|
44
44
|
>
|
|
45
45
|
</div>
|
|
46
|
+
<ng-container *ngIf="renderDependencyDragClues">
|
|
47
|
+
<div
|
|
48
|
+
class="k-task-dot k-task-start k-touch-action-none"
|
|
49
|
+
[class.k-display-block]="touchEnabled"
|
|
50
|
+
>
|
|
51
|
+
</div>
|
|
52
|
+
<div
|
|
53
|
+
class="k-task-dot k-task-end k-touch-action-none"
|
|
54
|
+
[class.k-display-block]="touchEnabled"
|
|
55
|
+
>
|
|
56
|
+
</div>
|
|
57
|
+
</ng-container>
|
|
46
58
|
`
|
|
47
59
|
}),
|
|
48
|
-
tslib_1.
|
|
60
|
+
tslib_1.__param(0, Inject(TOUCH_ENABLED)),
|
|
61
|
+
tslib_1.__metadata("design:paramtypes", [Boolean, MappingService,
|
|
49
62
|
TimelineViewService,
|
|
50
63
|
DependencyDomService,
|
|
51
64
|
OptionChangesService,
|
|
@@ -12,7 +12,8 @@ import { GanttTaskBase } from './gantt-task-base';
|
|
|
12
12
|
* @hidden
|
|
13
13
|
*/
|
|
14
14
|
export declare class GanttSummaryTaskComponent extends GanttTaskBase {
|
|
15
|
+
touchEnabled: boolean;
|
|
15
16
|
summaryWrapperClass: boolean;
|
|
16
17
|
template: TemplateRef<any>;
|
|
17
|
-
constructor(mapper: MappingService, timelineViewService: TimelineViewService, dependencyDomService: DependencyDomService, optionChangesService: OptionChangesService, cdr: ChangeDetectorRef);
|
|
18
|
+
constructor(touchEnabled: boolean, mapper: MappingService, timelineViewService: TimelineViewService, dependencyDomService: DependencyDomService, optionChangesService: OptionChangesService, cdr: ChangeDetectorRef);
|
|
18
19
|
}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*-------------------------------------------------------------------------------------------*/
|
|
5
5
|
import * as tslib_1 from "tslib";
|
|
6
6
|
var GanttSummaryTaskComponent_1;
|
|
7
|
-
import { ChangeDetectorRef, Component, forwardRef, HostBinding, Input, TemplateRef } from '@angular/core';
|
|
7
|
+
import { ChangeDetectorRef, Component, forwardRef, HostBinding, Inject, Input, TemplateRef } from '@angular/core';
|
|
8
8
|
import { MappingService } from '../common/mapping.service';
|
|
9
|
+
import { TOUCH_ENABLED } from '../common/touch-enabled';
|
|
9
10
|
import { DependencyDomService } from '../dependencies/dependency-dom.service';
|
|
10
11
|
import { OptionChangesService } from '../common/option-changes.service';
|
|
11
12
|
import { TimelineViewService } from './../timeline/timeline-view.service';
|
|
@@ -14,8 +15,9 @@ import { GanttTaskBase } from './gantt-task-base';
|
|
|
14
15
|
* @hidden
|
|
15
16
|
*/
|
|
16
17
|
let GanttSummaryTaskComponent = GanttSummaryTaskComponent_1 = class GanttSummaryTaskComponent extends GanttTaskBase {
|
|
17
|
-
constructor(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr) {
|
|
18
|
+
constructor(touchEnabled, mapper, timelineViewService, dependencyDomService, optionChangesService, cdr) {
|
|
18
19
|
super(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr);
|
|
20
|
+
this.touchEnabled = touchEnabled;
|
|
19
21
|
this.summaryWrapperClass = true;
|
|
20
22
|
}
|
|
21
23
|
};
|
|
@@ -42,9 +44,7 @@ GanttSummaryTaskComponent = GanttSummaryTaskComponent_1 = tslib_1.__decorate([
|
|
|
42
44
|
class="k-task k-task-summary"
|
|
43
45
|
[ngClass]="taskClass(dataItem)"
|
|
44
46
|
[style.width.px]="taskWidth"
|
|
45
|
-
[style.left.px]="taskOffset"
|
|
46
47
|
[attr.title]="mapper.extractFromTask(dataItem, 'title')"
|
|
47
|
-
[attr.data-task-index]="index"
|
|
48
48
|
[class.k-state-selected]="isSelected(dataItem)"
|
|
49
49
|
>
|
|
50
50
|
<div *ngIf="!template; else summaryTemplate"
|
|
@@ -66,9 +66,22 @@ GanttSummaryTaskComponent = GanttSummaryTaskComponent_1 = tslib_1.__decorate([
|
|
|
66
66
|
>
|
|
67
67
|
</ng-template>
|
|
68
68
|
</div>
|
|
69
|
+
<ng-container *ngIf="renderDependencyDragClues">
|
|
70
|
+
<div
|
|
71
|
+
class="k-task-dot k-task-start k-touch-action-none"
|
|
72
|
+
[class.k-display-block]="touchEnabled"
|
|
73
|
+
>
|
|
74
|
+
</div>
|
|
75
|
+
<div
|
|
76
|
+
class="k-task-dot k-task-end k-touch-action-none"
|
|
77
|
+
[class.k-display-block]="touchEnabled"
|
|
78
|
+
>
|
|
79
|
+
</div>
|
|
80
|
+
</ng-container>
|
|
69
81
|
`
|
|
70
82
|
}),
|
|
71
|
-
tslib_1.
|
|
83
|
+
tslib_1.__param(0, Inject(TOUCH_ENABLED)),
|
|
84
|
+
tslib_1.__metadata("design:paramtypes", [Boolean, MappingService,
|
|
72
85
|
TimelineViewService,
|
|
73
86
|
DependencyDomService,
|
|
74
87
|
OptionChangesService,
|
|
@@ -20,11 +20,11 @@ export declare abstract class GanttTaskBase {
|
|
|
20
20
|
private cdr;
|
|
21
21
|
wrapperClass: boolean;
|
|
22
22
|
/**
|
|
23
|
-
* Points to the
|
|
23
|
+
* Points to the `.k-task` element of the template (present in all three task types).
|
|
24
24
|
*/
|
|
25
25
|
taskElement: ElementRef<HTMLElement>;
|
|
26
26
|
dataItem: any;
|
|
27
|
-
|
|
27
|
+
renderDependencyDragClues: boolean;
|
|
28
28
|
isSelected: (dataItem: object) => boolean;
|
|
29
29
|
activeView: TimelineViewType;
|
|
30
30
|
taskClass: TaskClassFn;
|
|
@@ -32,11 +32,17 @@ export declare abstract class GanttTaskBase {
|
|
|
32
32
|
readonly slotUnitDuration: number;
|
|
33
33
|
private readonly viewService;
|
|
34
34
|
readonly slotWidth: number;
|
|
35
|
+
readonly taskWidth: number;
|
|
36
|
+
/**
|
|
37
|
+
* The `left` style prop has to be applied to the host element (.k-task-wrap), as the drag clue elements are displayed on .k-task-wrap hover.
|
|
38
|
+
* Applying the `left` offset to the inner .k-task element leaves the .k-task-wrap element rendered with an offset of 0 somewhere on the left
|
|
39
|
+
* and hovering just the .k-task element doesn't expose the drag clues.
|
|
40
|
+
* Additionally, positioning the entire container takes care of positioning the hints as well.
|
|
41
|
+
*/
|
|
42
|
+
readonly taskOffset: number;
|
|
43
|
+
readonly completionOverlayWidth: number;
|
|
35
44
|
constructor(mapper: MappingService, // left public to be available for usage in the templates
|
|
36
45
|
timelineViewService: TimelineViewService, dependencyDomService: DependencyDomService, optionChangesService: OptionChangesService, cdr: ChangeDetectorRef);
|
|
37
46
|
ngOnChanges(changes: SimpleChanges): void;
|
|
38
47
|
ngOnDestroy(): void;
|
|
39
|
-
readonly taskWidth: number;
|
|
40
|
-
readonly taskOffset: number;
|
|
41
|
-
readonly completionOverlayWidth: number;
|
|
42
48
|
}
|
|
@@ -38,29 +38,18 @@ export class GanttTaskBase {
|
|
|
38
38
|
get slotWidth() {
|
|
39
39
|
return this.viewService.options.slotWidth;
|
|
40
40
|
}
|
|
41
|
-
ngOnChanges(changes) {
|
|
42
|
-
if (isPresent(changes.dataItem)) {
|
|
43
|
-
if (isPresent(changes.dataItem.previousValue)) {
|
|
44
|
-
this.dependencyDomService.unregisterTask(changes.dataItem.previousValue);
|
|
45
|
-
}
|
|
46
|
-
this.dependencyDomService.registerTask(this.dataItem, this.taskElement.nativeElement);
|
|
47
|
-
}
|
|
48
|
-
else if (isPresent(changes.activeView)) {
|
|
49
|
-
this.dependencyDomService.notifyChanges();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
ngOnDestroy() {
|
|
53
|
-
if (isPresent(this.dataItem)) {
|
|
54
|
-
this.dependencyDomService.unregisterTask(this.dataItem);
|
|
55
|
-
}
|
|
56
|
-
this.viewChangesSubscription.unsubscribe();
|
|
57
|
-
}
|
|
58
41
|
get taskWidth() {
|
|
59
42
|
const itemDuration = this.mapper.extractFromTask(this.dataItem, 'end') - this.mapper.extractFromTask(this.dataItem, 'start');
|
|
60
43
|
const durationInSlotUnits = itemDuration / this.slotUnitDuration;
|
|
61
44
|
const width = durationInSlotUnits * this.slotWidth;
|
|
62
45
|
return width;
|
|
63
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* The `left` style prop has to be applied to the host element (.k-task-wrap), as the drag clue elements are displayed on .k-task-wrap hover.
|
|
49
|
+
* Applying the `left` offset to the inner .k-task element leaves the .k-task-wrap element rendered with an offset of 0 somewhere on the left
|
|
50
|
+
* and hovering just the .k-task element doesn't expose the drag clues.
|
|
51
|
+
* Additionally, positioning the entire container takes care of positioning the hints as well.
|
|
52
|
+
*/
|
|
64
53
|
get taskOffset() {
|
|
65
54
|
const timeAfterViewStart = this.mapper.extractFromTask(this.dataItem, 'start') - this.viewService.viewStart;
|
|
66
55
|
const offsetInSlotUnits = timeAfterViewStart / this.slotUnitDuration;
|
|
@@ -72,6 +61,23 @@ export class GanttTaskBase {
|
|
|
72
61
|
// fall-back to 0 in case no completionRatio is provided
|
|
73
62
|
return isNumber(overlayWidth) ? overlayWidth : 0;
|
|
74
63
|
}
|
|
64
|
+
ngOnChanges(changes) {
|
|
65
|
+
if (isPresent(changes.dataItem)) {
|
|
66
|
+
if (isPresent(changes.dataItem.previousValue)) {
|
|
67
|
+
this.dependencyDomService.unregisterTask(changes.dataItem.previousValue);
|
|
68
|
+
}
|
|
69
|
+
this.dependencyDomService.registerTask(this.dataItem, this.taskElement.nativeElement);
|
|
70
|
+
}
|
|
71
|
+
else if (isPresent(changes.activeView)) {
|
|
72
|
+
this.dependencyDomService.notifyChanges();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
ngOnDestroy() {
|
|
76
|
+
if (isPresent(this.dataItem)) {
|
|
77
|
+
this.dependencyDomService.unregisterTask(this.dataItem);
|
|
78
|
+
}
|
|
79
|
+
this.viewChangesSubscription.unsubscribe();
|
|
80
|
+
}
|
|
75
81
|
}
|
|
76
82
|
tslib_1.__decorate([
|
|
77
83
|
HostBinding('class.k-task-wrap'),
|
|
@@ -87,8 +93,8 @@ tslib_1.__decorate([
|
|
|
87
93
|
], GanttTaskBase.prototype, "dataItem", void 0);
|
|
88
94
|
tslib_1.__decorate([
|
|
89
95
|
Input(),
|
|
90
|
-
tslib_1.__metadata("design:type",
|
|
91
|
-
], GanttTaskBase.prototype, "
|
|
96
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
97
|
+
], GanttTaskBase.prototype, "renderDependencyDragClues", void 0);
|
|
92
98
|
tslib_1.__decorate([
|
|
93
99
|
Input(),
|
|
94
100
|
tslib_1.__metadata("design:type", Function)
|
|
@@ -101,3 +107,8 @@ tslib_1.__decorate([
|
|
|
101
107
|
Input(),
|
|
102
108
|
tslib_1.__metadata("design:type", Function)
|
|
103
109
|
], GanttTaskBase.prototype, "taskClass", void 0);
|
|
110
|
+
tslib_1.__decorate([
|
|
111
|
+
HostBinding('style.left.px'),
|
|
112
|
+
tslib_1.__metadata("design:type", Number),
|
|
113
|
+
tslib_1.__metadata("design:paramtypes", [])
|
|
114
|
+
], GanttTaskBase.prototype, "taskOffset", null);
|
|
@@ -14,8 +14,9 @@ import { EditService } from '../editing/edit.service';
|
|
|
14
14
|
*/
|
|
15
15
|
export declare class GanttTaskComponent extends GanttTaskBase {
|
|
16
16
|
private editService;
|
|
17
|
+
touchEnabled: boolean;
|
|
17
18
|
taskContentTemplate: TemplateRef<any>;
|
|
18
19
|
taskTemplate: TemplateRef<any>;
|
|
19
|
-
constructor(mapper: MappingService, timelineViewService: TimelineViewService, dependencyDomService: DependencyDomService, optionChangesService: OptionChangesService, cdr: ChangeDetectorRef
|
|
20
|
+
constructor(editService: EditService, touchEnabled: boolean, mapper: MappingService, timelineViewService: TimelineViewService, dependencyDomService: DependencyDomService, optionChangesService: OptionChangesService, cdr: ChangeDetectorRef);
|
|
20
21
|
onTaskDelete(): void;
|
|
21
22
|
}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*-------------------------------------------------------------------------------------------*/
|
|
5
5
|
import * as tslib_1 from "tslib";
|
|
6
6
|
var GanttTaskComponent_1;
|
|
7
|
-
import { ChangeDetectorRef, Component, forwardRef, Input, TemplateRef } from '@angular/core';
|
|
7
|
+
import { ChangeDetectorRef, Component, forwardRef, Inject, Input, TemplateRef } from '@angular/core';
|
|
8
8
|
import { MappingService } from '../common/mapping.service';
|
|
9
|
+
import { TOUCH_ENABLED } from '../common/touch-enabled';
|
|
9
10
|
import { DependencyDomService } from '../dependencies/dependency-dom.service';
|
|
10
11
|
import { OptionChangesService } from '../common/option-changes.service';
|
|
11
12
|
import { TimelineViewService } from './../timeline/timeline-view.service';
|
|
@@ -15,9 +16,10 @@ import { EditService } from '../editing/edit.service';
|
|
|
15
16
|
* @hidden
|
|
16
17
|
*/
|
|
17
18
|
let GanttTaskComponent = GanttTaskComponent_1 = class GanttTaskComponent extends GanttTaskBase {
|
|
18
|
-
constructor(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr
|
|
19
|
+
constructor(editService, touchEnabled, mapper, timelineViewService, dependencyDomService, optionChangesService, cdr) {
|
|
19
20
|
super(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr);
|
|
20
21
|
this.editService = editService;
|
|
22
|
+
this.touchEnabled = touchEnabled;
|
|
21
23
|
}
|
|
22
24
|
onTaskDelete() {
|
|
23
25
|
this.editService.dataItem = this.dataItem;
|
|
@@ -47,9 +49,7 @@ GanttTaskComponent = GanttTaskComponent_1 = tslib_1.__decorate([
|
|
|
47
49
|
class="k-task k-task-single"
|
|
48
50
|
[ngClass]="taskClass(dataItem)"
|
|
49
51
|
[style.width.px]="taskWidth"
|
|
50
|
-
[style.left.px]="taskOffset"
|
|
51
52
|
[attr.title]="mapper.extractFromTask(dataItem, 'title')"
|
|
52
|
-
[attr.data-task-index]="index"
|
|
53
53
|
[class.k-state-selected]="isSelected(dataItem)"
|
|
54
54
|
>
|
|
55
55
|
<ng-container *ngIf="!taskTemplate">
|
|
@@ -89,13 +89,25 @@ GanttTaskComponent = GanttTaskComponent_1 = tslib_1.__decorate([
|
|
|
89
89
|
>
|
|
90
90
|
</ng-template>
|
|
91
91
|
</div>
|
|
92
|
+
<ng-container *ngIf="renderDependencyDragClues">
|
|
93
|
+
<div
|
|
94
|
+
class="k-task-dot k-task-start k-touch-action-none"
|
|
95
|
+
[class.k-display-block]="touchEnabled"
|
|
96
|
+
>
|
|
97
|
+
</div>
|
|
98
|
+
<div
|
|
99
|
+
class="k-task-dot k-task-end k-touch-action-none"
|
|
100
|
+
[class.k-display-block]="touchEnabled"
|
|
101
|
+
>
|
|
102
|
+
</div>
|
|
103
|
+
</ng-container>
|
|
92
104
|
`
|
|
93
105
|
}),
|
|
94
|
-
tslib_1.
|
|
106
|
+
tslib_1.__param(1, Inject(TOUCH_ENABLED)),
|
|
107
|
+
tslib_1.__metadata("design:paramtypes", [EditService, Boolean, MappingService,
|
|
95
108
|
TimelineViewService,
|
|
96
109
|
DependencyDomService,
|
|
97
110
|
OptionChangesService,
|
|
98
|
-
ChangeDetectorRef
|
|
99
|
-
EditService])
|
|
111
|
+
ChangeDetectorRef])
|
|
100
112
|
], GanttTaskComponent);
|
|
101
113
|
export { GanttTaskComponent };
|
|
@@ -22,6 +22,7 @@ export declare class GanttTasksTableBodyComponent {
|
|
|
22
22
|
taskClass: TaskClassFn;
|
|
23
23
|
hasChildren: (item: object) => boolean;
|
|
24
24
|
isTaskSelected: (item: object) => boolean;
|
|
25
|
+
renderDependencyDragClues: boolean;
|
|
25
26
|
constructor(dependencyDomService: DependencyDomService, mapper: MappingService);
|
|
26
27
|
isMileStone(task: any): boolean;
|
|
27
28
|
}
|
|
@@ -64,6 +64,10 @@ tslib_1.__decorate([
|
|
|
64
64
|
Input(),
|
|
65
65
|
tslib_1.__metadata("design:type", Function)
|
|
66
66
|
], GanttTasksTableBodyComponent.prototype, "isTaskSelected", void 0);
|
|
67
|
+
tslib_1.__decorate([
|
|
68
|
+
Input(),
|
|
69
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
70
|
+
], GanttTasksTableBodyComponent.prototype, "renderDependencyDragClues", void 0);
|
|
67
71
|
GanttTasksTableBodyComponent = tslib_1.__decorate([
|
|
68
72
|
Component({
|
|
69
73
|
selector: '[kendoGanttTasksTableBody]',
|
|
@@ -76,7 +80,8 @@ GanttTasksTableBodyComponent = tslib_1.__decorate([
|
|
|
76
80
|
[activeView]="activeView"
|
|
77
81
|
[taskClass]="taskClass"
|
|
78
82
|
[isSelected]="isTaskSelected"
|
|
79
|
-
[index]="index"
|
|
83
|
+
[attr.data-task-index]="index"
|
|
84
|
+
[renderDependencyDragClues]="renderDependencyDragClues"
|
|
80
85
|
>
|
|
81
86
|
</kendo-gantt-milestone-task>
|
|
82
87
|
<ng-template #task>
|
|
@@ -87,7 +92,8 @@ GanttTasksTableBodyComponent = tslib_1.__decorate([
|
|
|
87
92
|
[activeView]="activeView"
|
|
88
93
|
[taskClass]="taskClass"
|
|
89
94
|
[isSelected]="isTaskSelected"
|
|
90
|
-
[index]="index"
|
|
95
|
+
[attr.data-task-index]="index"
|
|
96
|
+
[renderDependencyDragClues]="renderDependencyDragClues"
|
|
91
97
|
>
|
|
92
98
|
</kendo-gantt-summary-task>
|
|
93
99
|
<kendo-gantt-task
|
|
@@ -98,7 +104,8 @@ GanttTasksTableBodyComponent = tslib_1.__decorate([
|
|
|
98
104
|
[activeView]="activeView"
|
|
99
105
|
[taskClass]="taskClass"
|
|
100
106
|
[isSelected]="isTaskSelected"
|
|
101
|
-
[index]="index"
|
|
107
|
+
[attr.data-task-index]="index"
|
|
108
|
+
[renderDependencyDragClues]="renderDependencyDragClues"
|
|
102
109
|
>
|
|
103
110
|
</kendo-gantt-task>
|
|
104
111
|
</ng-template>
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Specifies the settings for auto-scrolling during drag editing operations.
|
|
7
|
+
*/
|
|
8
|
+
export interface DragScrollSettings {
|
|
9
|
+
/**
|
|
10
|
+
* Specifies whether auto-scrolling during drag editing operations is enabled.
|
|
11
|
+
*
|
|
12
|
+
* @default true
|
|
13
|
+
*/
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Specifies the scrolling step in pixels.
|
|
17
|
+
*
|
|
18
|
+
* @default: 3
|
|
19
|
+
*/
|
|
20
|
+
step?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Specifies the scrolling interval in milliseconds.
|
|
23
|
+
*
|
|
24
|
+
* @default: 1
|
|
25
|
+
*/
|
|
26
|
+
interval?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Specifies the threshold (in pixels) at each end of the scrollable container which when reached will trigger scrolling.
|
|
29
|
+
*
|
|
30
|
+
* @default: 10
|
|
31
|
+
*/
|
|
32
|
+
threshold?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @hidden
|
|
36
|
+
*/
|
|
37
|
+
export declare enum ScrollDirection {
|
|
38
|
+
Backwards = -1,
|
|
39
|
+
Forward = 1
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @hidden
|
|
43
|
+
*/
|
|
44
|
+
export declare enum ScrollAxis {
|
|
45
|
+
Vertical = "scrollTop",
|
|
46
|
+
Horizontal = "scrollLeft"
|
|
47
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* @hidden
|
|
7
|
+
*/
|
|
8
|
+
export var ScrollDirection;
|
|
9
|
+
(function (ScrollDirection) {
|
|
10
|
+
ScrollDirection[ScrollDirection["Backwards"] = -1] = "Backwards";
|
|
11
|
+
ScrollDirection[ScrollDirection["Forward"] = 1] = "Forward";
|
|
12
|
+
})(ScrollDirection || (ScrollDirection = {}));
|
|
13
|
+
/**
|
|
14
|
+
* @hidden
|
|
15
|
+
*/
|
|
16
|
+
export var ScrollAxis;
|
|
17
|
+
(function (ScrollAxis) {
|
|
18
|
+
ScrollAxis["Vertical"] = "scrollTop";
|
|
19
|
+
ScrollAxis["Horizontal"] = "scrollLeft";
|
|
20
|
+
})(ScrollAxis || (ScrollAxis = {}));
|
|
@@ -0,0 +1,24 @@
|
|
|
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 { ElementRef, NgZone } from '@angular/core';
|
|
6
|
+
import { DragScrollSettings } from './drag-scroll-settings';
|
|
7
|
+
import { TimelineScrollService } from './timeline-scroll.service';
|
|
8
|
+
/**
|
|
9
|
+
* @hidden
|
|
10
|
+
*/
|
|
11
|
+
export declare class TimelineScrollableDirective {
|
|
12
|
+
private timelineScrollableContainer;
|
|
13
|
+
private scrollService;
|
|
14
|
+
private zone;
|
|
15
|
+
scrollSettings: DragScrollSettings;
|
|
16
|
+
private subscriptions;
|
|
17
|
+
private verticalScrollInterval;
|
|
18
|
+
private horizontalScrollInterval;
|
|
19
|
+
constructor(timelineScrollableContainer: ElementRef<Element>, scrollService: TimelineScrollService, zone: NgZone);
|
|
20
|
+
ngOnDestroy(): void;
|
|
21
|
+
private scrollHorizontallyTo;
|
|
22
|
+
private scrollVerticallyTo;
|
|
23
|
+
private cancelScroll;
|
|
24
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
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 { Directive, ElementRef, Input, NgZone } from '@angular/core';
|
|
7
|
+
import { Subscription } from 'rxjs';
|
|
8
|
+
import { isPresent } from '../utils';
|
|
9
|
+
import { ScrollAxis, ScrollDirection } from './drag-scroll-settings';
|
|
10
|
+
import { TimelineScrollService } from './timeline-scroll.service';
|
|
11
|
+
import { getViewportBoundaries, scrollElement } from './utils';
|
|
12
|
+
/**
|
|
13
|
+
* @hidden
|
|
14
|
+
*/
|
|
15
|
+
let TimelineScrollableDirective = class TimelineScrollableDirective {
|
|
16
|
+
constructor(timelineScrollableContainer, scrollService, zone) {
|
|
17
|
+
this.timelineScrollableContainer = timelineScrollableContainer;
|
|
18
|
+
this.scrollService = scrollService;
|
|
19
|
+
this.zone = zone;
|
|
20
|
+
this.subscriptions = new Subscription();
|
|
21
|
+
this.subscriptions.add(this.scrollService.horizontalScroll
|
|
22
|
+
.subscribe(this.scrollHorizontallyTo.bind(this)));
|
|
23
|
+
this.subscriptions.add(this.scrollService.verticalScroll
|
|
24
|
+
.subscribe(this.scrollVerticallyTo.bind(this)));
|
|
25
|
+
this.subscriptions.add(this.scrollService.scrollCancel
|
|
26
|
+
.subscribe(this.cancelScroll.bind(this)));
|
|
27
|
+
}
|
|
28
|
+
ngOnDestroy() {
|
|
29
|
+
this.subscriptions.unsubscribe();
|
|
30
|
+
}
|
|
31
|
+
scrollHorizontallyTo(left) {
|
|
32
|
+
this.zone.runOutsideAngular(() => {
|
|
33
|
+
const container = this.timelineScrollableContainer.nativeElement;
|
|
34
|
+
const visibleBoundaries = getViewportBoundaries(container);
|
|
35
|
+
if (left < visibleBoundaries.left + this.scrollSettings.threshold) {
|
|
36
|
+
this.horizontalScrollInterval = setInterval(() => scrollElement(container, this.scrollSettings.step, ScrollDirection.Backwards, ScrollAxis.Horizontal), this.scrollSettings.interval);
|
|
37
|
+
}
|
|
38
|
+
else if (left > visibleBoundaries.right - this.scrollSettings.threshold) {
|
|
39
|
+
this.horizontalScrollInterval = setInterval(() => scrollElement(container, this.scrollSettings.step, ScrollDirection.Forward, ScrollAxis.Horizontal), this.scrollSettings.interval);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
scrollVerticallyTo(top) {
|
|
44
|
+
this.zone.runOutsideAngular(() => {
|
|
45
|
+
const container = this.timelineScrollableContainer.nativeElement;
|
|
46
|
+
const visibleBoundaries = getViewportBoundaries(container);
|
|
47
|
+
if (top < visibleBoundaries.top + this.scrollSettings.threshold) {
|
|
48
|
+
this.verticalScrollInterval = setInterval(() => scrollElement(container, this.scrollSettings.step, ScrollDirection.Backwards, ScrollAxis.Vertical), this.scrollSettings.interval);
|
|
49
|
+
}
|
|
50
|
+
else if (top > visibleBoundaries.bottom - this.scrollSettings.threshold) {
|
|
51
|
+
this.verticalScrollInterval = setInterval(() => scrollElement(container, this.scrollSettings.step, ScrollDirection.Forward, ScrollAxis.Vertical), this.scrollSettings.interval);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
cancelScroll() {
|
|
56
|
+
if (isPresent(this.verticalScrollInterval)) {
|
|
57
|
+
clearInterval(this.verticalScrollInterval);
|
|
58
|
+
this.verticalScrollInterval = null;
|
|
59
|
+
}
|
|
60
|
+
if (isPresent(this.horizontalScrollInterval)) {
|
|
61
|
+
clearInterval(this.horizontalScrollInterval);
|
|
62
|
+
this.horizontalScrollInterval = null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
tslib_1.__decorate([
|
|
67
|
+
Input(),
|
|
68
|
+
tslib_1.__metadata("design:type", Object)
|
|
69
|
+
], TimelineScrollableDirective.prototype, "scrollSettings", void 0);
|
|
70
|
+
TimelineScrollableDirective = tslib_1.__decorate([
|
|
71
|
+
Directive({
|
|
72
|
+
selector: '[kendoGanttTimelineScrollable]'
|
|
73
|
+
}),
|
|
74
|
+
tslib_1.__metadata("design:paramtypes", [ElementRef,
|
|
75
|
+
TimelineScrollService,
|
|
76
|
+
NgZone])
|
|
77
|
+
], TimelineScrollableDirective);
|
|
78
|
+
export { TimelineScrollableDirective };
|