@progress/kendo-angular-gantt 16.5.0 → 16.6.0-develop.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/NOTICE.txt +12 -19
  2. package/binding-directives/flat-binding.directive.d.ts +1 -1
  3. package/binding-directives/hierarchy-binding.directive.d.ts +1 -1
  4. package/columns/cell-template.directive.d.ts +1 -1
  5. package/columns/column-group.component.d.ts +1 -1
  6. package/columns/column-menu-template.directive.d.ts +1 -1
  7. package/columns/column.component.d.ts +1 -1
  8. package/columns/edit-template.directive.d.ts +1 -1
  9. package/columns/filter-cell-template.directive.d.ts +1 -1
  10. package/columns/filter-menu-template.directive.d.ts +1 -1
  11. package/columns/footer-template.directive.d.ts +1 -1
  12. package/columns/header-template.directive.d.ts +1 -1
  13. package/columns/span-column.component.d.ts +1 -1
  14. package/dependencies/gantt-dependency.directive.d.ts +1 -1
  15. package/directives.d.ts +29 -0
  16. package/dragging/dependency-drag-create.directive.d.ts +1 -1
  17. package/dragging/drag-validation-tooltip.component.d.ts +1 -1
  18. package/editing/add-task.component.d.ts +1 -1
  19. package/editing/dependencies-table.component.d.ts +1 -1
  20. package/editing/edit-dialog.component.d.ts +1 -1
  21. package/editing/task-fields.component.d.ts +1 -1
  22. package/esm2020/binding-directives/flat-binding.directive.mjs +3 -2
  23. package/esm2020/binding-directives/hierarchy-binding.directive.mjs +3 -2
  24. package/esm2020/columns/cell-template.directive.mjs +3 -2
  25. package/esm2020/columns/column-group.component.mjs +3 -2
  26. package/esm2020/columns/column-menu-template.directive.mjs +3 -2
  27. package/esm2020/columns/column.component.mjs +3 -2
  28. package/esm2020/columns/edit-template.directive.mjs +3 -2
  29. package/esm2020/columns/filter-cell-template.directive.mjs +3 -2
  30. package/esm2020/columns/filter-menu-template.directive.mjs +3 -2
  31. package/esm2020/columns/footer-template.directive.mjs +3 -2
  32. package/esm2020/columns/header-template.directive.mjs +3 -2
  33. package/esm2020/columns/span-column.component.mjs +3 -2
  34. package/esm2020/dependencies/gantt-dependency.directive.mjs +3 -2
  35. package/esm2020/directives.mjs +57 -0
  36. package/esm2020/dragging/dependency-drag-create.directive.mjs +3 -2
  37. package/esm2020/dragging/drag-validation-tooltip.component.mjs +3 -2
  38. package/esm2020/editing/add-task.component.mjs +7 -5
  39. package/esm2020/editing/dependencies-table.component.mjs +9 -7
  40. package/esm2020/editing/edit-dialog.component.mjs +12 -10
  41. package/esm2020/editing/task-fields.component.mjs +12 -9
  42. package/esm2020/expanded-state/expandable.directive.mjs +3 -2
  43. package/esm2020/gantt.component.mjs +23 -16
  44. package/esm2020/gantt.module.mjs +90 -222
  45. package/esm2020/index.mjs +1 -0
  46. package/esm2020/localization/custom-messages.component.mjs +3 -2
  47. package/esm2020/localization/localized-messages.directive.mjs +3 -2
  48. package/esm2020/package-metadata.mjs +2 -2
  49. package/esm2020/rendering/gantt-header-table-body.component.mjs +6 -4
  50. package/esm2020/rendering/gantt-milestone-task.component.mjs +12 -13
  51. package/esm2020/rendering/gantt-summary-task.component.mjs +12 -13
  52. package/esm2020/rendering/gantt-task.component.mjs +14 -15
  53. package/esm2020/rendering/gantt-tasks-table-body.component.mjs +9 -7
  54. package/esm2020/scrolling/timeline-scroll.directive.mjs +3 -2
  55. package/esm2020/selection/selectable.directive.mjs +3 -2
  56. package/esm2020/template-directives/summary-task-template.directive.mjs +3 -2
  57. package/esm2020/template-directives/task-content-template.directive.mjs +3 -2
  58. package/esm2020/template-directives/task-template.directive.mjs +3 -2
  59. package/esm2020/timeline/gantt-timeline.component.mjs +12 -10
  60. package/esm2020/timeline/timeline-day-view.component.mjs +3 -2
  61. package/esm2020/timeline/timeline-month-view.component.mjs +3 -2
  62. package/esm2020/timeline/timeline-week-view.component.mjs +3 -2
  63. package/esm2020/timeline/timeline-year-view.component.mjs +3 -2
  64. package/esm2020/toolbar/toolbar-template.directive.mjs +3 -2
  65. package/esm2020/toolbar/toolbar.component.mjs +8 -6
  66. package/esm2020/toolbar/view-selector.component.mjs +9 -6
  67. package/expanded-state/expandable.directive.d.ts +1 -1
  68. package/fesm2015/progress-kendo-angular-gantt.mjs +1812 -1867
  69. package/fesm2020/progress-kendo-angular-gantt.mjs +1963 -2012
  70. package/gantt.component.d.ts +1 -1
  71. package/gantt.module.d.ts +25 -54
  72. package/index.d.ts +1 -0
  73. package/localization/custom-messages.component.d.ts +1 -1
  74. package/localization/localized-messages.directive.d.ts +1 -1
  75. package/package.json +15 -15
  76. package/rendering/gantt-header-table-body.component.d.ts +1 -1
  77. package/rendering/gantt-milestone-task.component.d.ts +3 -3
  78. package/rendering/gantt-summary-task.component.d.ts +3 -3
  79. package/rendering/gantt-task.component.d.ts +3 -3
  80. package/rendering/gantt-tasks-table-body.component.d.ts +1 -1
  81. package/schematics/ngAdd/index.js +7 -7
  82. package/scrolling/timeline-scroll.directive.d.ts +1 -1
  83. package/selection/selectable.directive.d.ts +1 -1
  84. package/template-directives/summary-task-template.directive.d.ts +1 -1
  85. package/template-directives/task-content-template.directive.d.ts +1 -1
  86. package/template-directives/task-template.directive.d.ts +1 -1
  87. package/timeline/gantt-timeline.component.d.ts +1 -1
  88. package/timeline/timeline-day-view.component.d.ts +1 -1
  89. package/timeline/timeline-month-view.component.d.ts +1 -1
  90. package/timeline/timeline-week-view.component.d.ts +1 -1
  91. package/timeline/timeline-year-view.component.d.ts +1 -1
  92. package/toolbar/toolbar-template.directive.d.ts +1 -1
  93. package/toolbar/toolbar.component.d.ts +1 -1
  94. package/toolbar/view-selector.component.d.ts +1 -1
  95. package/common/touch-enabled.d.ts +0 -9
  96. package/esm2020/common/touch-enabled.mjs +0 -9
@@ -3,47 +3,35 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as i0 from '@angular/core';
6
- import { Injectable, InjectionToken, Inject, LOCALE_ID, EventEmitter, Directive, HostBinding, ViewChild, Input, forwardRef, Component, ViewContainerRef, Output, Optional, QueryList, SkipSelf, Host, ContentChildren, ContentChild, HostListener, isDevMode, NgModule } from '@angular/core';
7
- import * as i14 from '@progress/kendo-angular-treelist';
8
- import { ColumnBase, ColumnComponent, ColumnGroupComponent, SpanColumnComponent, DataBoundTreeComponent, ExpandableTreeComponent, TreeListComponent, FlatBindingDirective, HierarchyBindingDirective, ExpandableDirective, TreeListModule } from '@progress/kendo-angular-treelist';
6
+ import { Injectable, Directive, Input, Inject, LOCALE_ID, EventEmitter, HostBinding, ViewChild, forwardRef, Component, ViewContainerRef, Output, Optional, QueryList, SkipSelf, Host, ContentChildren, ContentChild, HostListener, isDevMode, NgModule } from '@angular/core';
7
+ import { TableDirective, ColumnBase, ColumnComponent, ColumnGroupComponent, SpanColumnComponent, TreeListSpacerComponent, DataBoundTreeComponent, ExpandableTreeComponent, TreeListComponent, CustomMessagesComponent as CustomMessagesComponent$2, FlatBindingDirective, HierarchyBindingDirective, ExpandableDirective, ColumnResizingService } from '@progress/kendo-angular-treelist';
9
8
  import { Subject, Subscription, fromEvent, forkJoin, EMPTY, isObservable, of } from 'rxjs';
10
9
  import { validatePackage } from '@progress/kendo-licensing';
11
- import * as i11 from '@progress/kendo-angular-common';
12
- import { Keys, isDocumentAvailable, closestInScope, matchesClasses, PreventableEvent, anyChanged, closest, isFocusable, focusableSelector, isVisible, shouldShowValidationUI, hasObservers, EventsModule, DraggableModule, WatermarkModule } from '@progress/kendo-angular-common';
13
- import { map, distinctUntilChanged, take, expand, reduce, switchMap, filter } from 'rxjs/operators';
10
+ import { Keys, isDocumentAvailable, closestInScope, matchesClasses, EventsOutsideAngularDirective, DraggableDirective, PreventableEvent, anyChanged, closest, isFocusable, focusableSelector, isVisible, shouldShowValidationUI, hasObservers, WatermarkOverlayComponent, ResizeBatchService } from '@progress/kendo-angular-common';
11
+ import { switchMap, take, map, distinctUntilChanged, expand, reduce, filter } from 'rxjs/operators';
14
12
  import { cloneDate, addWeeks, firstDayInWeek, addDays, lastDayOfMonth, getDate, firstDayOfMonth, addMonths, lastMonthOfYear, MS_PER_HOUR, MS_PER_DAY, isEqual } from '@progress/kendo-date-math';
15
13
  import { getter, touchEnabled } from '@progress/kendo-common';
16
- import * as i6 from '@angular/common';
17
- import { CommonModule } from '@angular/common';
18
14
  import { __decorate, __param, __metadata } from 'tslib';
19
15
  import * as i1 from '@progress/kendo-angular-intl';
20
- import { IntlService, IntlModule } from '@progress/kendo-angular-intl';
16
+ import { IntlService } from '@progress/kendo-angular-intl';
21
17
  import { orderBy } from '@progress/kendo-data-query';
22
18
  import { xIcon, plusIcon, minusIcon, saveIcon, cancelOutlineIcon, trashIcon } from '@progress/kendo-svg-icons';
23
- import * as i9 from '@progress/kendo-angular-icons';
24
- import { IconsModule } from '@progress/kendo-angular-icons';
19
+ import { NgClass, NgIf, NgTemplateOutlet, NgFor } from '@angular/common';
20
+ import { IconWrapperComponent, IconsService } from '@progress/kendo-angular-icons';
25
21
  import * as i1$1 from '@progress/kendo-angular-l10n';
26
22
  import { ComponentMessages, LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
27
- import * as i4 from '@progress/kendo-angular-buttons';
28
- import { ButtonsModule } from '@progress/kendo-angular-buttons';
29
- import * as i8$1 from '@progress/kendo-angular-layout';
30
- import { SplitterModule, TabStripModule } from '@progress/kendo-angular-layout';
31
- import * as i7$2 from '@progress/kendo-angular-dialog';
32
- import { DialogModule } from '@progress/kendo-angular-dialog';
33
- import * as i5 from '@angular/forms';
23
+ import * as i4 from '@angular/forms';
34
24
  import { FormArray, FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angular/forms';
35
- import * as i6$1 from '@progress/kendo-angular-grid';
36
- import { GridModule } from '@progress/kendo-angular-grid';
37
- import * as i7 from '@progress/kendo-angular-dropdowns';
38
- import { DropDownsModule } from '@progress/kendo-angular-dropdowns';
39
- import * as i6$2 from '@progress/kendo-angular-label';
40
- import { LabelModule } from '@progress/kendo-angular-label';
41
- import * as i7$1 from '@progress/kendo-angular-inputs';
42
- import { InputsModule } from '@progress/kendo-angular-inputs';
43
- import * as i8 from '@progress/kendo-angular-dateinputs';
44
- import { DateInputsModule } from '@progress/kendo-angular-dateinputs';
25
+ import { GridComponent, SelectionDirective, ToolbarTemplateDirective as ToolbarTemplateDirective$1, ColumnComponent as ColumnComponent$1, CellTemplateDirective as CellTemplateDirective$1 } from '@progress/kendo-angular-grid';
26
+ import { ButtonComponent, ButtonGroupComponent, DropDownButtonComponent } from '@progress/kendo-angular-buttons';
27
+ import { DropDownListComponent } from '@progress/kendo-angular-dropdowns';
28
+ import { FormFieldComponent, TextBoxDirective, NumericTextBoxComponent } from '@progress/kendo-angular-inputs';
29
+ import { LabelComponent } from '@progress/kendo-angular-label';
30
+ import { DateTimePickerComponent, CalendarDOMService, CenturyViewService, DecadeViewService, MonthViewService, YearViewService, WeekNamesService, NavigationService as NavigationService$1, TimePickerDOMService, HoursService, MinutesService, SecondsService, MillisecondsService, DayPeriodService } from '@progress/kendo-angular-dateinputs';
31
+ import { DialogComponent, CustomMessagesComponent as CustomMessagesComponent$1, DialogActionsComponent, DialogContainerService, DialogService, WindowService, WindowContainerService } from '@progress/kendo-angular-dialog';
32
+ import { TabStripComponent, TabStripTabComponent, TabContentDirective, SplitterComponent, SplitterPaneComponent } from '@progress/kendo-angular-layout';
45
33
  import * as i3 from '@progress/kendo-angular-popup';
46
- import { PopupModule } from '@progress/kendo-angular-popup';
34
+ import { PopupService } from '@progress/kendo-angular-popup';
47
35
 
48
36
  /**
49
37
  * @hidden
@@ -52,8 +40,8 @@ const packageMetadata = {
52
40
  name: '@progress/kendo-angular-gantt',
53
41
  productName: 'Kendo UI for Angular',
54
42
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
55
- publishDate: 1721814434,
56
- version: '16.5.0',
43
+ publishDate: 1722607229,
44
+ version: '16.6.0-develop.10',
57
45
  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'
58
46
  };
59
47
 
@@ -446,76 +434,194 @@ const elementFromPoint = (clientX, clientY) => {
446
434
 
447
435
  /**
448
436
  * @hidden
437
+ *
438
+ * Gets the offset (top and left values) relative to a target element.
449
439
  */
450
- class ScrollSyncService {
451
- constructor(ngZone) {
452
- this.ngZone = ngZone;
453
- this.changes = new Subject();
454
- this.elements = [];
455
- this.subscriptions = new Subscription();
456
- this.subscriptions.add(this.changes.subscribe(args => {
457
- this.scroll(args);
458
- }));
459
- }
460
- registerElement(el, sourceType) {
461
- this.elements.push({ element: el, sourceType });
462
- if (sourceType === "timeline" || sourceType === "treelist") {
463
- this.ngZone.runOutsideAngular(() => {
464
- const obs = fromEvent(el, 'scroll').pipe(map(({ target: { scrollTop, scrollLeft } }) => ({
465
- scrollTop,
466
- scrollLeft,
467
- sourceType
468
- })));
469
- const comparisonFn = sourceType === 'timeline' ?
470
- (x, y) => (x.scrollTop === y.scrollTop) && (x.scrollLeft === y.scrollLeft) :
471
- (x, y) => (x.scrollTop === y.scrollTop);
472
- this.subscriptions.add(obs.pipe(distinctUntilChanged(comparisonFn))
473
- .subscribe((event) => this.changes.next(event)));
474
- });
475
- }
476
- }
477
- ngOnDestroy() {
478
- this.subscriptions.unsubscribe();
479
- this.elements = null;
440
+ const getOffsetRelativeToParent = (element, targetParent) => {
441
+ const offset = {
442
+ top: 0,
443
+ left: 0
444
+ };
445
+ if (!targetParent.contains(element)) {
446
+ return offset;
480
447
  }
481
- syncScrollTop(sourceType, targetType) {
482
- const source = this.elements.find(element => element.sourceType === sourceType);
483
- const target = this.elements.find(element => element.sourceType === targetType);
484
- // Need to wait for the splitter pane's content to be rendered
485
- this.ngZone.onStable.pipe(take(1)).subscribe(() => target.element.scrollTop = source.element.scrollTop);
448
+ let offsetParent = element;
449
+ while (offsetParent && offsetParent !== targetParent) {
450
+ offset.top += offsetParent.offsetTop;
451
+ offset.left += offsetParent.offsetLeft;
452
+ offsetParent = offsetParent.offsetParent;
486
453
  }
487
- resetTimelineScrollLeft() {
488
- const source = this.elements.find(element => element.sourceType === 'timeline');
489
- source.element.scrollLeft = 0;
454
+ return offset;
455
+ };
456
+ /**
457
+ * @hidden
458
+ */
459
+ const getElementRect = (element, relativeContainer) => {
460
+ const { top, left } = getOffsetRelativeToParent(element, relativeContainer);
461
+ return {
462
+ top: top + element.offsetHeight / 2,
463
+ left: left,
464
+ right: left + element.offsetWidth
465
+ };
466
+ };
467
+ /**
468
+ * @hidden
469
+ */
470
+ const dependencyCoordinates = (from, to, rowHeight, type, minDistanceBeforeTurn, arrowSize) => {
471
+ const points = [];
472
+ const minTurnHeight = Math.floor(rowHeight / 2);
473
+ const drawingDown = from.top < to.top;
474
+ let top, left;
475
+ // FF and SS are composed of 4 connected polyline points (not counting the arrow)
476
+ /*
477
+ [[[]]]- -[[[]]]
478
+ | |
479
+ [[[]]]- -[[[]]]
480
+ */
481
+ if (type === DependencyType.FF || type === DependencyType.SS) {
482
+ // polyline start from first task
483
+ const dir = type === DependencyType.SS ? 'left' : 'right';
484
+ top = from.top;
485
+ left = from[dir];
486
+ points.push({ top, left });
487
+ // first turn point
488
+ left = Math[dir === 'left' ? 'min' : 'max'](from[dir], to[dir]);
489
+ left = dir === 'left' ? left - minDistanceBeforeTurn : left + minDistanceBeforeTurn;
490
+ points.push({ top, left });
491
+ // second turn point
492
+ top = to.top;
493
+ points.push({ top, left });
494
+ // second task reached
495
+ left = dir === 'left' ? to[dir] - arrowSize : to[dir] + arrowSize;
496
+ points.push({ top, left });
497
+ // arrow pointing to the second task
498
+ points.push(...getArrow(top, left, dir !== 'left', arrowSize));
490
499
  }
491
- scroll({ scrollTop, scrollLeft, sourceType }) {
492
- this.ngZone.runOutsideAngular(() => {
493
- if (sourceType === 'timeline') {
494
- const header = this.elements.find(element => element.sourceType === 'header').element;
495
- header.scrollLeft = scrollLeft;
496
- if (!this.syncingTimeline) {
497
- this.syncingTreeList = true;
498
- const treelist = this.elements.find(element => element.sourceType === 'treelist').element;
499
- treelist.scrollTop = scrollTop;
500
- }
501
- this.syncingTimeline = false;
502
- }
503
- if (sourceType === 'treelist') {
504
- if (!this.syncingTreeList) {
505
- this.syncingTimeline = true;
506
- const timeline = this.elements.find(element => element.sourceType === 'timeline').element;
507
- timeline.scrollTop = scrollTop;
508
- }
509
- this.syncingTreeList = false;
510
- }
511
- });
500
+ else {
501
+ // FS and SF are composed of 4 or 6 connected polyline points (not counting the arrow), depending on the position of the tasks
502
+ /*
503
+ [[[]]]- [[[]]]-
504
+ | |
505
+ -[[[]]] -----
506
+ |
507
+ -[[[]]]
508
+ */
509
+ const startDir = type === DependencyType.SF ? 'left' : 'right';
510
+ const endDir = type === DependencyType.SF ? 'right' : 'left';
511
+ const additionalTurn = type === DependencyType.SF
512
+ ? from[startDir] - minDistanceBeforeTurn * 2 < to[endDir]
513
+ : from[startDir] + minDistanceBeforeTurn * 2 > to[endDir];
514
+ // polyline start from first task
515
+ top = from.top;
516
+ left = from[startDir];
517
+ points.push({ top, left });
518
+ // first turn point
519
+ left = startDir === 'left'
520
+ ? left - minDistanceBeforeTurn
521
+ : left + minDistanceBeforeTurn;
522
+ points.push({ top, left });
523
+ // if second task start is before the first task end in FS
524
+ // if second task end is after the first task start in SF
525
+ if (additionalTurn) {
526
+ // additional turn start
527
+ top = drawingDown
528
+ ? top + minTurnHeight
529
+ : top - minTurnHeight;
530
+ points.push({ top, left });
531
+ // additional turn end
532
+ left = startDir === 'left'
533
+ ? to[endDir] + minDistanceBeforeTurn
534
+ : to[endDir] - minDistanceBeforeTurn;
535
+ points.push({ top, left });
536
+ }
537
+ // second task level reached
538
+ top = to.top;
539
+ points.push({ top, left });
540
+ // second task element reached
541
+ left = endDir === 'left' ? to[endDir] - arrowSize : to[endDir] + arrowSize;
542
+ points.push({ top, left });
543
+ // arrow pointing to the second task
544
+ points.push(...getArrow(top, left, endDir !== 'left', arrowSize));
512
545
  }
513
- }
514
- ScrollSyncService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ScrollSyncService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
515
- ScrollSyncService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ScrollSyncService });
516
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ScrollSyncService, decorators: [{
517
- type: Injectable
518
- }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
546
+ return points;
547
+ };
548
+ const getArrow = (top, left, isArrowWest, arrowSize) => {
549
+ const points = isArrowWest
550
+ ? getArrowWest(top, left, arrowSize)
551
+ : getArrowEast(top, left, arrowSize);
552
+ return points;
553
+ };
554
+ const getArrowWest = (top, left, arrowSize) => {
555
+ const points = [];
556
+ points.push({
557
+ top: top - arrowSize / 2,
558
+ left
559
+ });
560
+ points.push({
561
+ top,
562
+ left: left - arrowSize + 1
563
+ });
564
+ points.push({
565
+ top: top + arrowSize / 2,
566
+ left
567
+ });
568
+ points.push({
569
+ top,
570
+ left
571
+ });
572
+ return points;
573
+ };
574
+ const getArrowEast = (top, left, arrowSize) => {
575
+ const points = [];
576
+ points.push({
577
+ top: top + arrowSize / 2,
578
+ left
579
+ });
580
+ points.push({
581
+ top,
582
+ left: left + arrowSize - 1
583
+ });
584
+ points.push({
585
+ top: top - arrowSize / 2,
586
+ left
587
+ });
588
+ points.push({
589
+ top,
590
+ left
591
+ });
592
+ return points;
593
+ };
594
+ /**
595
+ * @hidden
596
+ *
597
+ * Translates the provided client `left` and `top` coords to coords relative to the provided container.
598
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/CSSOM_View/Coordinate_systems#standard_cssom_coordinate_systems
599
+ */
600
+ const clientToOffsetCoords = (clientLeft, clientTop, offsetContainer) => {
601
+ // client (viewport) coordinates of the target container
602
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#value
603
+ const offsetContainerClientRect = offsetContainer.getBoundingClientRect();
604
+ return {
605
+ left: clientLeft - offsetContainerClientRect.left + offsetContainer.scrollLeft,
606
+ top: clientTop - offsetContainerClientRect.top + offsetContainer.scrollTop
607
+ };
608
+ };
609
+ /**
610
+ * @hidden
611
+ *
612
+ * Retrieves the `left` and `top` values of the center of the provided element.
613
+ * The retrieved values are relative to the current viewport (client values).
614
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/CSSOM_View/Coordinate_systems#standard_cssom_coordinate_systems
615
+ */
616
+ const getElementClientCenterCoords = (element) => {
617
+ // client (viewport) coordinates of the targeted element
618
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#value
619
+ const { left, top, width, height } = element.getBoundingClientRect();
620
+ return {
621
+ left: left + (width / 2),
622
+ top: top + (height / 2)
623
+ };
624
+ };
519
625
 
520
626
  /**
521
627
  * @hidden
@@ -657,87 +763,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
657
763
  type: Injectable
658
764
  }], ctorParameters: function () { return [{ type: MappingService }]; } });
659
765
 
660
- const MS_PER_SECOND = 1000;
661
- const MS_PER_MINUTE = 60 * MS_PER_SECOND;
662
766
  /**
663
- * @hidden
767
+ * Defines the size of the arrow that will be drawn at the end of each Gantt dependency.
664
768
  */
665
- class CurrentTimeMarkerService {
666
- constructor(renderer, cdr) {
667
- this.renderer = renderer;
668
- this.cdr = cdr;
669
- this.slots = [];
670
- this.rows = [];
671
- this.now = new Date(Date.now());
672
- this.createTimeMarker = () => {
673
- if (!isDocumentAvailable()) {
674
- return;
675
- }
676
- this.removeTimeMarker();
677
- if (this.slotIndex >= 0) {
678
- this.now = new Date(Date.now());
679
- this.timeMarkerDiv = this.renderer.createElement('div');
680
- this.renderer.addClass(this.timeMarkerDiv, 'k-current-time');
681
- this.renderer.setStyle(this.timeMarkerDiv, 'width', '1px');
682
- this.renderer.setStyle(this.timeMarkerDiv, 'top', '0px');
683
- this.renderer.setStyle(this.timeMarkerDiv, `${this.rtl ? 'right' : 'left'}`, this.deltaOffset + 'px');
684
- this.renderer.appendChild(this.container.nativeElement, this.timeMarkerDiv);
685
- this.renderer.setStyle(this.timeMarkerDiv, 'height', this.height + 'px');
686
- this.currentTimeTimeout = setTimeout(this.createTimeMarker, this.interval || MS_PER_MINUTE);
687
- }
688
- };
689
- }
690
- get deltaOffset() {
691
- if (this.slotIndex >= 0) {
692
- const total = this.slots[this.slotIndex].end.getTime() - this.slots[this.slotIndex].start.getTime();
693
- if (total > 0) {
694
- const currentTimeValue = this.now.getTime() - this.slots[this.slotIndex].start.getTime();
695
- const fractionInsideCell = currentTimeValue / total;
696
- const deltaOffsetToSlot = this.slotIndex * this.slotWidth;
697
- const deltaOffsetInsideSlot = fractionInsideCell * this.slotWidth;
698
- return deltaOffsetToSlot + deltaOffsetInsideSlot;
699
- }
700
- return 0;
701
- }
702
- }
703
- get slotWidth() {
704
- var _a;
705
- return (_a = this.slots[0]) === null || _a === void 0 ? void 0 : _a.slotWidth;
769
+ const ARROW_SIZE = 4;
770
+ /**
771
+ * Defines the distance the polyline will cover from the task element before making a turn.
772
+ */
773
+ const MIN_DISTANCE_BEFORE_TURN = 10;
774
+ /**
775
+ * @hidden
776
+ */
777
+ class GanttDependencyDirective {
778
+ constructor(polyline, zone, renderer, mapper, dependencyDomService) {
779
+ this.polyline = polyline;
780
+ this.zone = zone;
781
+ this.renderer = renderer;
782
+ this.mapper = mapper;
783
+ this.dependencyDomService = dependencyDomService;
784
+ this.subscriptions = new Subscription();
785
+ this.subscriptions.add(dependencyDomService.taskChanges
786
+ .pipe(switchMap(changes =>
787
+ // reacts only on the very last event emission,
788
+ // ensures that the tasks are drawn in the DOM
789
+ this.zone.onStable.pipe(take(1), map(() => changes))))
790
+ .subscribe(changes => this.updatePoints(changes)));
706
791
  }
707
- get slotIndex() {
708
- return this.slots.indexOf(this.slots.find((slot) => slot.start <= this.now && slot.end > this.now));
792
+ ngOnDestroy() {
793
+ this.subscriptions.unsubscribe();
709
794
  }
710
- get height() {
711
- return this.rows.length * this.rowHeight;
795
+ ngOnChanges(changes) {
796
+ if (isPresent(changes['dependency'])) {
797
+ this.updatePoints(this.dependencyDomService.dependencyDomArgs);
798
+ }
712
799
  }
713
- get interval() {
714
- var _a;
715
- if (typeof (this.currentTimeMarker) === 'boolean') {
716
- return MS_PER_MINUTE;
800
+ updatePoints({ timelineRow, contentContainer, tasks }) {
801
+ if (!isPresent(timelineRow) || !isPresent(contentContainer) ||
802
+ !isPresent(tasks) || tasks.size === 0 ||
803
+ !tasks.has(this.mapper.extractFromDependency(this.dependency, 'fromId')) || !tasks.has(this.mapper.extractFromDependency(this.dependency, 'toId'))) {
804
+ this.clearPoints();
805
+ return;
717
806
  }
718
- return ((_a = this.currentTimeMarker) === null || _a === void 0 ? void 0 : _a.updateInterval) || MS_PER_MINUTE;
807
+ const fromCoordinates = getElementRect(tasks.get(this.mapper.extractFromDependency(this.dependency, 'fromId')), contentContainer);
808
+ const toCoordinates = getElementRect(tasks.get(this.mapper.extractFromDependency(this.dependency, 'toId')), contentContainer);
809
+ const timelineRowHeight = isDocumentAvailable() ? timelineRow.getBoundingClientRect().height : 0;
810
+ const points = dependencyCoordinates(fromCoordinates, toCoordinates, timelineRowHeight, this.dependency.type, MIN_DISTANCE_BEFORE_TURN, ARROW_SIZE);
811
+ this.drawPoints(points);
719
812
  }
720
- ngOnDestroy() {
721
- clearTimeout(this.currentTimeTimeout);
813
+ clearPoints() {
814
+ this.renderer.setAttribute(this.polyline.nativeElement, 'points', '');
722
815
  }
723
- removeTimeMarker() {
724
- if (this.timeMarkerDiv) {
725
- this.renderer.removeChild(this.container.nativeElement, this.timeMarkerDiv);
726
- clearTimeout(this.currentTimeTimeout);
727
- this.cdr.detectChanges();
816
+ drawPoints(points) {
817
+ if (!isPresent(points) || points.length === 0) {
818
+ this.clearPoints();
819
+ return;
728
820
  }
821
+ const parsedCoords = points.map(({ left, top }) => `${left},${top}`).join(' ');
822
+ this.renderer.setAttribute(this.polyline.nativeElement, 'points', parsedCoords);
729
823
  }
730
824
  }
731
- CurrentTimeMarkerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrentTimeMarkerService, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Injectable });
732
- CurrentTimeMarkerServiceprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrentTimeMarkerService });
733
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrentTimeMarkerService, decorators: [{
734
- type: Injectable
735
- }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; } });
736
-
737
- /**
738
- * @hidden
739
- */
740
- const TOUCH_ENABLED = new InjectionToken('gantt-touch-enabled');
825
+ GanttDependencyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttDependencyDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: MappingService }, { token: DependencyDomService }], target: i0.ɵɵFactoryTarget.Directive });
826
+ GanttDependencyDirectivedir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttDependencyDirective, isStandalone: true, selector: "[kendoGanttDependency]", inputs: { dependency: "dependency" }, usesOnChanges: true, ngImport: i0 });
827
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttDependencyDirective, decorators: [{
828
+ type: Directive,
829
+ args: [{
830
+ selector: '[kendoGanttDependency]',
831
+ standalone: true
832
+ }]
833
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: MappingService }, { type: DependencyDomService }]; }, propDecorators: { dependency: [{
834
+ type: Input
835
+ }] } });
741
836
 
742
837
  const setTime = (origin, candidate) => {
743
838
  const date = cloneDate(origin);
@@ -1227,6 +1322,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1227
1322
  type: Injectable
1228
1323
  }] });
1229
1324
 
1325
+ /**
1326
+ * @hidden
1327
+ */
1328
+ class ScrollSyncService {
1329
+ constructor(ngZone) {
1330
+ this.ngZone = ngZone;
1331
+ this.changes = new Subject();
1332
+ this.elements = [];
1333
+ this.subscriptions = new Subscription();
1334
+ this.subscriptions.add(this.changes.subscribe(args => {
1335
+ this.scroll(args);
1336
+ }));
1337
+ }
1338
+ registerElement(el, sourceType) {
1339
+ this.elements.push({ element: el, sourceType });
1340
+ if (sourceType === "timeline" || sourceType === "treelist") {
1341
+ this.ngZone.runOutsideAngular(() => {
1342
+ const obs = fromEvent(el, 'scroll').pipe(map(({ target: { scrollTop, scrollLeft } }) => ({
1343
+ scrollTop,
1344
+ scrollLeft,
1345
+ sourceType
1346
+ })));
1347
+ const comparisonFn = sourceType === 'timeline' ?
1348
+ (x, y) => (x.scrollTop === y.scrollTop) && (x.scrollLeft === y.scrollLeft) :
1349
+ (x, y) => (x.scrollTop === y.scrollTop);
1350
+ this.subscriptions.add(obs.pipe(distinctUntilChanged(comparisonFn))
1351
+ .subscribe((event) => this.changes.next(event)));
1352
+ });
1353
+ }
1354
+ }
1355
+ ngOnDestroy() {
1356
+ this.subscriptions.unsubscribe();
1357
+ this.elements = null;
1358
+ }
1359
+ syncScrollTop(sourceType, targetType) {
1360
+ const source = this.elements.find(element => element.sourceType === sourceType);
1361
+ const target = this.elements.find(element => element.sourceType === targetType);
1362
+ // Need to wait for the splitter pane's content to be rendered
1363
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => target.element.scrollTop = source.element.scrollTop);
1364
+ }
1365
+ resetTimelineScrollLeft() {
1366
+ const source = this.elements.find(element => element.sourceType === 'timeline');
1367
+ source.element.scrollLeft = 0;
1368
+ }
1369
+ scroll({ scrollTop, scrollLeft, sourceType }) {
1370
+ this.ngZone.runOutsideAngular(() => {
1371
+ if (sourceType === 'timeline') {
1372
+ const header = this.elements.find(element => element.sourceType === 'header').element;
1373
+ header.scrollLeft = scrollLeft;
1374
+ if (!this.syncingTimeline) {
1375
+ this.syncingTreeList = true;
1376
+ const treelist = this.elements.find(element => element.sourceType === 'treelist').element;
1377
+ treelist.scrollTop = scrollTop;
1378
+ }
1379
+ this.syncingTimeline = false;
1380
+ }
1381
+ if (sourceType === 'treelist') {
1382
+ if (!this.syncingTreeList) {
1383
+ this.syncingTimeline = true;
1384
+ const timeline = this.elements.find(element => element.sourceType === 'timeline').element;
1385
+ timeline.scrollTop = scrollTop;
1386
+ }
1387
+ this.syncingTreeList = false;
1388
+ }
1389
+ });
1390
+ }
1391
+ }
1392
+ ScrollSyncService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ScrollSyncService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
1393
+ ScrollSyncService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ScrollSyncService });
1394
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ScrollSyncService, decorators: [{
1395
+ type: Injectable
1396
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
1397
+
1230
1398
  /**
1231
1399
  * @hidden
1232
1400
  */
@@ -1748,19 +1916,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1748
1916
  * @hidden
1749
1917
  */
1750
1918
  class GanttTaskComponent extends GanttTaskBase {
1751
- constructor(editService, touchEnabled, mapper, timelineViewService, dependencyDomService, optionChangesService, cdr, navigationService) {
1919
+ constructor(editService, mapper, timelineViewService, dependencyDomService, optionChangesService, cdr, navigationService) {
1752
1920
  super(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr, navigationService);
1753
1921
  this.editService = editService;
1754
- this.touchEnabled = touchEnabled;
1755
1922
  this.xIcon = xIcon;
1923
+ this.touchEnabled = touchEnabled;
1756
1924
  }
1757
1925
  onTaskDelete() {
1758
1926
  this.editService.dataItem = this.dataItem;
1759
1927
  this.editService.taskDelete.next(this.dataItem);
1760
1928
  }
1761
1929
  }
1762
- GanttTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskComponent, deps: [{ token: EditService }, { token: TOUCH_ENABLED }, { token: MappingService }, { token: TimelineViewService }, { token: DependencyDomService }, { token: OptionChangesService }, { token: i0.ChangeDetectorRef }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
1763
- GanttTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttTaskComponent, selector: "kendo-gantt-task", inputs: { taskContentTemplate: "taskContentTemplate", taskTemplate: "taskTemplate" }, providers: [
1930
+ GanttTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskComponent, deps: [{ token: EditService }, { token: MappingService }, { token: TimelineViewService }, { token: DependencyDomService }, { token: OptionChangesService }, { token: i0.ChangeDetectorRef }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
1931
+ GanttTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttTaskComponent, isStandalone: true, selector: "kendo-gantt-task", inputs: { taskContentTemplate: "taskContentTemplate", taskTemplate: "taskTemplate" }, providers: [
1764
1932
  {
1765
1933
  provide: GanttTaskBase,
1766
1934
  useExisting: forwardRef(() => GanttTaskComponent)
@@ -1836,7 +2004,7 @@ GanttTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ver
1836
2004
  >
1837
2005
  </div>
1838
2006
  </ng-container>
1839
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i11.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { kind: "component", type: i9.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
2007
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
1840
2008
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskComponent, decorators: [{
1841
2009
  type: Component,
1842
2010
  args: [{
@@ -1918,14 +2086,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1918
2086
  >
1919
2087
  </div>
1920
2088
  </ng-container>
1921
- `
2089
+ `,
2090
+ standalone: true,
2091
+ imports: [NgClass, NgIf, NgTemplateOutlet, EventsOutsideAngularDirective, IconWrapperComponent]
1922
2092
  }]
1923
- }], ctorParameters: function () {
1924
- return [{ type: EditService }, { type: undefined, decorators: [{
1925
- type: Inject,
1926
- args: [TOUCH_ENABLED]
1927
- }] }, { type: MappingService }, { type: TimelineViewService }, { type: DependencyDomService }, { type: OptionChangesService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }];
1928
- }, propDecorators: { taskContentTemplate: [{
2093
+ }], ctorParameters: function () { return [{ type: EditService }, { type: MappingService }, { type: TimelineViewService }, { type: DependencyDomService }, { type: OptionChangesService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }]; }, propDecorators: { taskContentTemplate: [{
1929
2094
  type: Input
1930
2095
  }], taskTemplate: [{
1931
2096
  type: Input
@@ -1935,10 +2100,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1935
2100
  * @hidden
1936
2101
  */
1937
2102
  class GanttSummaryTaskComponent extends GanttTaskBase {
1938
- constructor(touchEnabled, mapper, timelineViewService, dependencyDomService, optionChangesService, cdr, navigationService) {
2103
+ constructor(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr, navigationService) {
1939
2104
  super(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr, navigationService);
1940
- this.touchEnabled = touchEnabled;
1941
2105
  this.summaryWrapperClass = true;
2106
+ this.touchEnabled = touchEnabled;
1942
2107
  }
1943
2108
  get ariaExpanded() {
1944
2109
  // if no callback is provided, all child items are displayed and the item is regarded as expanded
@@ -1947,8 +2112,8 @@ class GanttSummaryTaskComponent extends GanttTaskBase {
1947
2112
  return String(isExpanded);
1948
2113
  }
1949
2114
  }
1950
- GanttSummaryTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSummaryTaskComponent, deps: [{ token: TOUCH_ENABLED }, { token: MappingService }, { token: TimelineViewService }, { token: DependencyDomService }, { token: OptionChangesService }, { token: i0.ChangeDetectorRef }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
1951
- GanttSummaryTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttSummaryTaskComponent, selector: "kendo-gantt-summary-task", inputs: { template: "template", isExpanded: "isExpanded" }, host: { properties: { "class.k-summary-wrap": "this.summaryWrapperClass" } }, providers: [
2115
+ GanttSummaryTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSummaryTaskComponent, deps: [{ token: MappingService }, { token: TimelineViewService }, { token: DependencyDomService }, { token: OptionChangesService }, { token: i0.ChangeDetectorRef }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
2116
+ GanttSummaryTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttSummaryTaskComponent, isStandalone: true, selector: "kendo-gantt-summary-task", inputs: { template: "template", isExpanded: "isExpanded" }, host: { properties: { "class.k-summary-wrap": "this.summaryWrapperClass" } }, providers: [
1952
2117
  {
1953
2118
  provide: GanttTaskBase,
1954
2119
  useExisting: forwardRef(() => GanttSummaryTaskComponent)
@@ -1997,7 +2162,7 @@ GanttSummaryTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.
1997
2162
  >
1998
2163
  </div>
1999
2164
  </ng-container>
2000
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
2165
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
2001
2166
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSummaryTaskComponent, decorators: [{
2002
2167
  type: Component,
2003
2168
  args: [{
@@ -2052,14 +2217,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2052
2217
  >
2053
2218
  </div>
2054
2219
  </ng-container>
2055
- `
2220
+ `,
2221
+ standalone: true,
2222
+ imports: [NgClass, NgIf, NgTemplateOutlet]
2056
2223
  }]
2057
- }], ctorParameters: function () {
2058
- return [{ type: undefined, decorators: [{
2059
- type: Inject,
2060
- args: [TOUCH_ENABLED]
2061
- }] }, { type: MappingService }, { type: TimelineViewService }, { type: DependencyDomService }, { type: OptionChangesService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }];
2062
- }, propDecorators: { summaryWrapperClass: [{
2224
+ }], ctorParameters: function () { return [{ type: MappingService }, { type: TimelineViewService }, { type: DependencyDomService }, { type: OptionChangesService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }]; }, propDecorators: { summaryWrapperClass: [{
2063
2225
  type: HostBinding,
2064
2226
  args: ['class.k-summary-wrap']
2065
2227
  }], template: [{
@@ -2072,14 +2234,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2072
2234
  * @hidden
2073
2235
  */
2074
2236
  class GanttMilestoneTaskComponent extends GanttTaskBase {
2075
- constructor(touchEnabled, mapper, timelineViewService, dependencyDomService, optionChangesService, cdr, navigationService) {
2237
+ constructor(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr, navigationService) {
2076
2238
  super(mapper, timelineViewService, dependencyDomService, optionChangesService, cdr, navigationService);
2077
- this.touchEnabled = touchEnabled;
2078
2239
  this.milestoneWrapperClass = true;
2240
+ this.touchEnabled = touchEnabled;
2079
2241
  }
2080
2242
  }
2081
- GanttMilestoneTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttMilestoneTaskComponent, deps: [{ token: TOUCH_ENABLED }, { token: MappingService }, { token: TimelineViewService }, { token: DependencyDomService }, { token: OptionChangesService }, { token: i0.ChangeDetectorRef }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
2082
- GanttMilestoneTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttMilestoneTaskComponent, selector: "kendo-gantt-milestone-task", host: { properties: { "class.k-milestone-wrap": "this.milestoneWrapperClass" } }, providers: [
2243
+ GanttMilestoneTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttMilestoneTaskComponent, deps: [{ token: MappingService }, { token: TimelineViewService }, { token: DependencyDomService }, { token: OptionChangesService }, { token: i0.ChangeDetectorRef }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
2244
+ GanttMilestoneTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttMilestoneTaskComponent, isStandalone: true, selector: "kendo-gantt-milestone-task", host: { properties: { "class.k-milestone-wrap": "this.milestoneWrapperClass" } }, providers: [
2083
2245
  {
2084
2246
  provide: GanttTaskBase,
2085
2247
  useExisting: forwardRef(() => GanttMilestoneTaskComponent)
@@ -2108,7 +2270,7 @@ GanttMilestoneTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.
2108
2270
  >
2109
2271
  </div>
2110
2272
  </ng-container>
2111
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
2273
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
2112
2274
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttMilestoneTaskComponent, decorators: [{
2113
2275
  type: Component,
2114
2276
  args: [{
@@ -2143,14 +2305,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2143
2305
  >
2144
2306
  </div>
2145
2307
  </ng-container>
2146
- `
2308
+ `,
2309
+ standalone: true,
2310
+ imports: [NgClass, NgIf]
2147
2311
  }]
2148
- }], ctorParameters: function () {
2149
- return [{ type: undefined, decorators: [{
2150
- type: Inject,
2151
- args: [TOUCH_ENABLED]
2152
- }] }, { type: MappingService }, { type: TimelineViewService }, { type: DependencyDomService }, { type: OptionChangesService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }];
2153
- }, propDecorators: { milestoneWrapperClass: [{
2312
+ }], ctorParameters: function () { return [{ type: MappingService }, { type: TimelineViewService }, { type: DependencyDomService }, { type: OptionChangesService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }]; }, propDecorators: { milestoneWrapperClass: [{
2154
2313
  type: HostBinding,
2155
2314
  args: ['class.k-milestone-wrap']
2156
2315
  }] } });
@@ -2175,7 +2334,7 @@ class GanttTasksTableBodyComponent {
2175
2334
  }
2176
2335
  }
2177
2336
  GanttTasksTableBodyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTasksTableBodyComponent, deps: [{ token: DependencyDomService }, { token: MappingService }], target: i0.ɵɵFactoryTarget.Component });
2178
- GanttTasksTableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttTasksTableBodyComponent, selector: "[kendoGanttTasksTableBody]", inputs: { selectable: "selectable", rows: "rows", activeView: "activeView", taskContentTemplate: "taskContentTemplate", taskTemplate: "taskTemplate", summaryTaskTemplate: "summaryTaskTemplate", taskClass: "taskClass", isExpanded: "isExpanded", isTaskSelected: "isTaskSelected", renderDependencyDragClues: "renderDependencyDragClues" }, viewQueries: [{ propertyName: "timelineRow", first: true, predicate: ["timelineRow"], descendants: true }], ngImport: i0, template: `
2337
+ GanttTasksTableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttTasksTableBodyComponent, isStandalone: true, selector: "[kendoGanttTasksTableBody]", inputs: { selectable: "selectable", rows: "rows", activeView: "activeView", taskContentTemplate: "taskContentTemplate", taskTemplate: "taskTemplate", summaryTaskTemplate: "summaryTaskTemplate", taskClass: "taskClass", isExpanded: "isExpanded", isTaskSelected: "isTaskSelected", renderDependencyDragClues: "renderDependencyDragClues" }, viewQueries: [{ propertyName: "timelineRow", first: true, predicate: ["timelineRow"], descendants: true }], ngImport: i0, template: `
2179
2338
  <tr class="k-table-row" #timelineRow *ngFor="let item of rows; let index = index">
2180
2339
  <td class="k-table-td">
2181
2340
  <kendo-gantt-milestone-task
@@ -2222,7 +2381,7 @@ GanttTasksTableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14
2222
2381
  </ng-template>
2223
2382
  </td>
2224
2383
  </tr>
2225
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: GanttTaskComponent, selector: "kendo-gantt-task", inputs: ["taskContentTemplate", "taskTemplate"] }, { kind: "component", type: GanttSummaryTaskComponent, selector: "kendo-gantt-summary-task", inputs: ["template", "isExpanded"] }, { kind: "component", type: GanttMilestoneTaskComponent, selector: "kendo-gantt-milestone-task" }] });
2384
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: GanttMilestoneTaskComponent, selector: "kendo-gantt-milestone-task" }, { kind: "component", type: GanttSummaryTaskComponent, selector: "kendo-gantt-summary-task", inputs: ["template", "isExpanded"] }, { kind: "component", type: GanttTaskComponent, selector: "kendo-gantt-task", inputs: ["taskContentTemplate", "taskTemplate"] }] });
2226
2385
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTasksTableBodyComponent, decorators: [{
2227
2386
  type: Component,
2228
2387
  args: [{
@@ -2275,7 +2434,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2275
2434
  </ng-template>
2276
2435
  </td>
2277
2436
  </tr>
2278
- `
2437
+ `,
2438
+ standalone: true,
2439
+ imports: [NgFor, NgIf, GanttMilestoneTaskComponent, GanttSummaryTaskComponent, GanttTaskComponent]
2279
2440
  }]
2280
2441
  }], ctorParameters: function () { return [{ type: DependencyDomService }, { type: MappingService }]; }, propDecorators: { timelineRow: [{
2281
2442
  type: ViewChild,
@@ -2305,434 +2466,131 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2305
2466
  /**
2306
2467
  * @hidden
2307
2468
  */
2308
- class GanttHeaderTableBodyComponent {
2309
- constructor() {
2310
- this.tbodyClass = true;
2311
- }
2312
- }
2313
- GanttHeaderTableBodyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHeaderTableBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2314
- GanttHeaderTableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttHeaderTableBodyComponent, selector: "[kendoGanttHeaderTableBody]", inputs: { groupSlots: "groupSlots", slots: "slots" }, host: { properties: { "class.k-table-tbody": "this.tbodyClass" } }, ngImport: i0, template: `
2315
- <tr class="k-table-row">
2316
- <td *ngFor="let item of groupSlots" [attr.colspan]="item.span" class="k-header k-table-td">{{ item.text }}</td>
2317
- </tr>
2318
-
2319
- <tr class="k-table-row">
2320
- <td *ngFor="let item of slots" class="k-header k-table-td" [attr.colspan]="item.span === 7 ? item.span : 1" [attr.title]="item.text">{{ item.text }}</td>
2321
- </tr>
2322
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2323
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHeaderTableBodyComponent, decorators: [{
2324
- type: Component,
2325
- args: [{
2326
- // eslint-disable-next-line @angular-eslint/component-selector
2327
- selector: '[kendoGanttHeaderTableBody]',
2328
- template: `
2329
- <tr class="k-table-row">
2330
- <td *ngFor="let item of groupSlots" [attr.colspan]="item.span" class="k-header k-table-td">{{ item.text }}</td>
2331
- </tr>
2332
-
2333
- <tr class="k-table-row">
2334
- <td *ngFor="let item of slots" class="k-header k-table-td" [attr.colspan]="item.span === 7 ? item.span : 1" [attr.title]="item.text">{{ item.text }}</td>
2335
- </tr>
2336
- `
2337
- }]
2338
- }], propDecorators: { tbodyClass: [{
2339
- type: HostBinding,
2340
- args: ['class.k-table-tbody']
2341
- }], groupSlots: [{
2342
- type: Input
2343
- }], slots: [{
2344
- type: Input
2345
- }] } });
2469
+ var ScrollDirection;
2470
+ (function (ScrollDirection) {
2471
+ ScrollDirection[ScrollDirection["Backwards"] = -1] = "Backwards";
2472
+ ScrollDirection[ScrollDirection["Forward"] = 1] = "Forward";
2473
+ })(ScrollDirection || (ScrollDirection = {}));
2474
+ /**
2475
+ * @hidden
2476
+ */
2477
+ var ScrollAxis;
2478
+ (function (ScrollAxis) {
2479
+ ScrollAxis["Vertical"] = "scrollTop";
2480
+ ScrollAxis["Horizontal"] = "scrollLeft";
2481
+ })(ScrollAxis || (ScrollAxis = {}));
2346
2482
 
2347
2483
  /**
2348
2484
  * @hidden
2349
2485
  *
2350
- * Gets the offset (top and left values) relative to a target element.
2486
+ * Checks if the beginning of the scrollable element is reached (top/left).
2487
+ * Floors the top value.
2351
2488
  */
2352
- const getOffsetRelativeToParent = (element, targetParent) => {
2353
- const offset = {
2354
- top: 0,
2355
- left: 0
2356
- };
2357
- if (!targetParent.contains(element)) {
2358
- return offset;
2359
- }
2360
- let offsetParent = element;
2361
- while (offsetParent && offsetParent !== targetParent) {
2362
- offset.top += offsetParent.offsetTop;
2363
- offset.left += offsetParent.offsetLeft;
2364
- offsetParent = offsetParent.offsetParent;
2365
- }
2366
- return offset;
2367
- };
2489
+ const isUpperLimitReached = (element, axis) => Math.floor(element[axis]) <= 0;
2368
2490
  /**
2369
2491
  * @hidden
2492
+ *
2493
+ * Checks if the end of the scrollable element is reached (bottom/right).
2494
+ * Ceils the top value.
2370
2495
  */
2371
- const getElementRect = (element, relativeContainer) => {
2372
- const { top, left } = getOffsetRelativeToParent(element, relativeContainer);
2373
- return {
2374
- top: top + element.offsetHeight / 2,
2375
- left: left,
2376
- right: left + element.offsetWidth
2377
- };
2496
+ const isBottomLimitReached = (element, axis) => {
2497
+ const elementSize = axis === ScrollAxis.Horizontal ?
2498
+ element.scrollWidth - element.clientWidth :
2499
+ element.scrollHeight - element.clientHeight;
2500
+ return Math.ceil(element[axis]) >= elementSize;
2378
2501
  };
2379
2502
  /**
2380
2503
  * @hidden
2504
+ *
2505
+ * Scrolls the element in the given direction by the provided step in the provided scroll axis.
2506
+ *
2507
+ * If the targeted scroll incrementation doesn't yield any result due to device pixel ratio issues (https://github.com/dimitar-pechev/RenderingIndependentScrollOffsets#readme),
2508
+ * increments the step with 1px and again attempts to change the scrollTop of the element, until the content is actually scrolled.
2509
+ *
2510
+ * Cuts the operation short after 20 unsuccessful attempts to prevent infinite loops in possible corner-case scenarios.
2381
2511
  */
2382
- const dependencyCoordinates = (from, to, rowHeight, type, minDistanceBeforeTurn, arrowSize) => {
2383
- const points = [];
2384
- const minTurnHeight = Math.floor(rowHeight / 2);
2385
- const drawingDown = from.top < to.top;
2386
- let top, left;
2387
- // FF and SS are composed of 4 connected polyline points (not counting the arrow)
2388
- /*
2389
- [[[]]]- -[[[]]]
2390
- | |
2391
- [[[]]]- -[[[]]]
2392
- */
2393
- if (type === DependencyType.FF || type === DependencyType.SS) {
2394
- // polyline start from first task
2395
- const dir = type === DependencyType.SS ? 'left' : 'right';
2396
- top = from.top;
2397
- left = from[dir];
2398
- points.push({ top, left });
2399
- // first turn point
2400
- left = Math[dir === 'left' ? 'min' : 'max'](from[dir], to[dir]);
2401
- left = dir === 'left' ? left - minDistanceBeforeTurn : left + minDistanceBeforeTurn;
2402
- points.push({ top, left });
2403
- // second turn point
2404
- top = to.top;
2405
- points.push({ top, left });
2406
- // second task reached
2407
- left = dir === 'left' ? to[dir] - arrowSize : to[dir] + arrowSize;
2408
- points.push({ top, left });
2409
- // arrow pointing to the second task
2410
- points.push(...getArrow(top, left, dir !== 'left', arrowSize));
2512
+ const scrollElement = (element, step, direction, scrollAxis) => {
2513
+ if (!(isPresent(element) && isDocumentAvailable())) {
2514
+ return;
2411
2515
  }
2412
- else {
2413
- // FS and SF are composed of 4 or 6 connected polyline points (not counting the arrow), depending on the position of the tasks
2414
- /*
2415
- [[[]]]- [[[]]]-
2416
- | |
2417
- -[[[]]] -----
2418
- |
2419
- -[[[]]]
2420
- */
2421
- const startDir = type === DependencyType.SF ? 'left' : 'right';
2422
- const endDir = type === DependencyType.SF ? 'right' : 'left';
2423
- const additionalTurn = type === DependencyType.SF
2424
- ? from[startDir] - minDistanceBeforeTurn * 2 < to[endDir]
2425
- : from[startDir] + minDistanceBeforeTurn * 2 > to[endDir];
2426
- // polyline start from first task
2427
- top = from.top;
2428
- left = from[startDir];
2429
- points.push({ top, left });
2430
- // first turn point
2431
- left = startDir === 'left'
2432
- ? left - minDistanceBeforeTurn
2433
- : left + minDistanceBeforeTurn;
2434
- points.push({ top, left });
2435
- // if second task start is before the first task end in FS
2436
- // if second task end is after the first task start in SF
2437
- if (additionalTurn) {
2438
- // additional turn start
2439
- top = drawingDown
2440
- ? top + minTurnHeight
2441
- : top - minTurnHeight;
2442
- points.push({ top, left });
2443
- // additional turn end
2444
- left = startDir === 'left'
2445
- ? to[endDir] + minDistanceBeforeTurn
2446
- : to[endDir] - minDistanceBeforeTurn;
2447
- points.push({ top, left });
2448
- }
2449
- // second task level reached
2450
- top = to.top;
2451
- points.push({ top, left });
2452
- // second task element reached
2453
- left = endDir === 'left' ? to[endDir] - arrowSize : to[endDir] + arrowSize;
2454
- points.push({ top, left });
2455
- // arrow pointing to the second task
2456
- points.push(...getArrow(top, left, endDir !== 'left', arrowSize));
2516
+ const initialScrollPosition = element[scrollAxis];
2517
+ let currentStep = step;
2518
+ let iterations = 0;
2519
+ while (initialScrollPosition === element[scrollAxis] &&
2520
+ !(direction === ScrollDirection.Backwards && isUpperLimitReached(element, scrollAxis)) &&
2521
+ !(direction === ScrollDirection.Forward && isBottomLimitReached(element, scrollAxis)) &&
2522
+ iterations < 20 // cut the operation short in 20 attempts - in case of a wild corner case
2523
+ ) {
2524
+ element[scrollAxis] += (currentStep * direction);
2525
+ // try with a larger step if the current one doesn't update the scroll position successfully
2526
+ currentStep += 1;
2527
+ iterations += 1;
2457
2528
  }
2458
- return points;
2459
- };
2460
- const getArrow = (top, left, isArrowWest, arrowSize) => {
2461
- const points = isArrowWest
2462
- ? getArrowWest(top, left, arrowSize)
2463
- : getArrowEast(top, left, arrowSize);
2464
- return points;
2465
- };
2466
- const getArrowWest = (top, left, arrowSize) => {
2467
- const points = [];
2468
- points.push({
2469
- top: top - arrowSize / 2,
2470
- left
2471
- });
2472
- points.push({
2473
- top,
2474
- left: left - arrowSize + 1
2475
- });
2476
- points.push({
2477
- top: top + arrowSize / 2,
2478
- left
2479
- });
2480
- points.push({
2481
- top,
2482
- left
2483
- });
2484
- return points;
2485
- };
2486
- const getArrowEast = (top, left, arrowSize) => {
2487
- const points = [];
2488
- points.push({
2489
- top: top + arrowSize / 2,
2490
- left
2491
- });
2492
- points.push({
2493
- top,
2494
- left: left + arrowSize - 1
2495
- });
2496
- points.push({
2497
- top: top - arrowSize / 2,
2498
- left
2499
- });
2500
- points.push({
2501
- top,
2502
- left
2503
- });
2504
- return points;
2505
2529
  };
2506
2530
  /**
2507
2531
  * @hidden
2508
2532
  *
2509
- * Translates the provided client `left` and `top` coords to coords relative to the provided container.
2510
- * https://developer.mozilla.org/en-US/docs/Web/CSS/CSSOM_View/Coordinate_systems#standard_cssom_coordinate_systems
2533
+ * As client coordinates are not restricted to the range 0px - {viewportSize}px, but can have negative starting values or ending values greater than the viewport size,
2534
+ * this function extracts the visible boundaries of the provided element - fall-backing to 0 when the top/left are below 0,
2535
+ * and fall-backing to the actual visible size of the container for bottom/right.
2511
2536
  */
2512
- const clientToOffsetCoords = (clientLeft, clientTop, offsetContainer) => {
2513
- // client (viewport) coordinates of the target container
2514
- // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#value
2515
- const offsetContainerClientRect = offsetContainer.getBoundingClientRect();
2537
+ const getViewportBoundaries = (element) => {
2538
+ const elementRect = element.getBoundingClientRect();
2539
+ // if the beginning of the scrollable container is above/before the current viewport, fall-back to 0
2540
+ const topLimit = Math.max(elementRect.top, 0);
2541
+ const leftLimit = Math.max(elementRect.left, 0);
2542
+ // if the end of the scrollable container is beneath/after the current viewport, fall-back to its client height
2543
+ // add the distance from the start of the viewport to the beginning of the container to ensure scrolling bottom begins when the actual end of the container is reached
2544
+ const bottomLimit = topLimit + Math.min(elementRect.bottom, element.clientHeight);
2545
+ const rightLimit = leftLimit + Math.min(elementRect.right, element.clientWidth);
2516
2546
  return {
2517
- left: clientLeft - offsetContainerClientRect.left + offsetContainer.scrollLeft,
2518
- top: clientTop - offsetContainerClientRect.top + offsetContainer.scrollTop
2547
+ top: topLimit,
2548
+ bottom: bottomLimit,
2549
+ left: leftLimit,
2550
+ right: rightLimit
2519
2551
  };
2520
2552
  };
2553
+
2521
2554
  /**
2522
2555
  * @hidden
2523
2556
  *
2524
- * Retrieves the `left` and `top` values of the center of the provided element.
2525
- * The retrieved values are relative to the current viewport (client values).
2526
- * https://developer.mozilla.org/en-US/docs/Web/CSS/CSSOM_View/Coordinate_systems#standard_cssom_coordinate_systems
2557
+ * Notifies the timeline-scroll.directive to scroll into view to requested coordinates.
2558
+ * The scrolling is performed based on client (viewport) coordinates.
2527
2559
  */
2528
- const getElementClientCenterCoords = (element) => {
2529
- // client (viewport) coordinates of the targeted element
2530
- // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#value
2531
- const { left, top, width, height } = element.getBoundingClientRect();
2532
- return {
2533
- left: left + (width / 2),
2534
- top: top + (height / 2)
2535
- };
2536
- };
2560
+ class TimelineScrollService {
2561
+ constructor() {
2562
+ this.horizontalScroll = new Subject();
2563
+ this.verticalScroll = new Subject();
2564
+ this.scrollCancel = new Subject();
2565
+ }
2566
+ ngOnDestroy() {
2567
+ this.horizontalScroll.complete();
2568
+ this.verticalScroll.complete();
2569
+ this.scrollCancel.complete();
2570
+ }
2571
+ requestHorizontalScroll(clientTop) {
2572
+ this.horizontalScroll.next(clientTop);
2573
+ }
2574
+ requestVerticalScroll(clientLeft) {
2575
+ this.verticalScroll.next(clientLeft);
2576
+ }
2577
+ requestScrollCancel() {
2578
+ this.scrollCancel.next();
2579
+ }
2580
+ }
2581
+ TimelineScrollService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2582
+ TimelineScrollService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollService });
2583
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollService, decorators: [{
2584
+ type: Injectable
2585
+ }] });
2537
2586
 
2538
- /**
2539
- * Defines the size of the arrow that will be drawn at the end of each Gantt dependency.
2540
- */
2541
- const ARROW_SIZE = 4;
2542
- /**
2543
- * Defines the distance the polyline will cover from the task element before making a turn.
2544
- */
2545
- const MIN_DISTANCE_BEFORE_TURN = 10;
2546
2587
  /**
2547
2588
  * @hidden
2548
2589
  */
2549
- class GanttDependencyDirective {
2550
- constructor(polyline, zone, renderer, mapper, dependencyDomService) {
2551
- this.polyline = polyline;
2552
- this.zone = zone;
2553
- this.renderer = renderer;
2554
- this.mapper = mapper;
2555
- this.dependencyDomService = dependencyDomService;
2556
- this.subscriptions = new Subscription();
2557
- this.subscriptions.add(dependencyDomService.taskChanges
2558
- .pipe(switchMap(changes =>
2559
- // reacts only on the very last event emission,
2560
- // ensures that the tasks are drawn in the DOM
2561
- this.zone.onStable.pipe(take(1), map(() => changes))))
2562
- .subscribe(changes => this.updatePoints(changes)));
2563
- }
2564
- ngOnDestroy() {
2565
- this.subscriptions.unsubscribe();
2566
- }
2567
- ngOnChanges(changes) {
2568
- if (isPresent(changes['dependency'])) {
2569
- this.updatePoints(this.dependencyDomService.dependencyDomArgs);
2570
- }
2571
- }
2572
- updatePoints({ timelineRow, contentContainer, tasks }) {
2573
- if (!isPresent(timelineRow) || !isPresent(contentContainer) ||
2574
- !isPresent(tasks) || tasks.size === 0 ||
2575
- !tasks.has(this.mapper.extractFromDependency(this.dependency, 'fromId')) || !tasks.has(this.mapper.extractFromDependency(this.dependency, 'toId'))) {
2576
- this.clearPoints();
2577
- return;
2578
- }
2579
- const fromCoordinates = getElementRect(tasks.get(this.mapper.extractFromDependency(this.dependency, 'fromId')), contentContainer);
2580
- const toCoordinates = getElementRect(tasks.get(this.mapper.extractFromDependency(this.dependency, 'toId')), contentContainer);
2581
- const timelineRowHeight = isDocumentAvailable() ? timelineRow.getBoundingClientRect().height : 0;
2582
- const points = dependencyCoordinates(fromCoordinates, toCoordinates, timelineRowHeight, this.dependency.type, MIN_DISTANCE_BEFORE_TURN, ARROW_SIZE);
2583
- this.drawPoints(points);
2584
- }
2585
- clearPoints() {
2586
- this.renderer.setAttribute(this.polyline.nativeElement, 'points', '');
2587
- }
2588
- drawPoints(points) {
2589
- if (!isPresent(points) || points.length === 0) {
2590
- this.clearPoints();
2591
- return;
2592
- }
2593
- const parsedCoords = points.map(({ left, top }) => `${left},${top}`).join(' ');
2594
- this.renderer.setAttribute(this.polyline.nativeElement, 'points', parsedCoords);
2595
- }
2596
- }
2597
- GanttDependencyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttDependencyDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: MappingService }, { token: DependencyDomService }], target: i0.ɵɵFactoryTarget.Directive });
2598
- GanttDependencyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttDependencyDirective, selector: "[kendoGanttDependency]", inputs: { dependency: "dependency" }, usesOnChanges: true, ngImport: i0 });
2599
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttDependencyDirective, decorators: [{
2600
- type: Directive,
2601
- args: [{
2602
- selector: '[kendoGanttDependency]'
2603
- }]
2604
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: MappingService }, { type: DependencyDomService }]; }, propDecorators: { dependency: [{
2605
- type: Input
2606
- }] } });
2607
-
2608
- /**
2609
- * @hidden
2610
- */
2611
- var ScrollDirection;
2612
- (function (ScrollDirection) {
2613
- ScrollDirection[ScrollDirection["Backwards"] = -1] = "Backwards";
2614
- ScrollDirection[ScrollDirection["Forward"] = 1] = "Forward";
2615
- })(ScrollDirection || (ScrollDirection = {}));
2616
- /**
2617
- * @hidden
2618
- */
2619
- var ScrollAxis;
2620
- (function (ScrollAxis) {
2621
- ScrollAxis["Vertical"] = "scrollTop";
2622
- ScrollAxis["Horizontal"] = "scrollLeft";
2623
- })(ScrollAxis || (ScrollAxis = {}));
2624
-
2625
- /**
2626
- * @hidden
2627
- *
2628
- * Checks if the beginning of the scrollable element is reached (top/left).
2629
- * Floors the top value.
2630
- */
2631
- const isUpperLimitReached = (element, axis) => Math.floor(element[axis]) <= 0;
2632
- /**
2633
- * @hidden
2634
- *
2635
- * Checks if the end of the scrollable element is reached (bottom/right).
2636
- * Ceils the top value.
2637
- */
2638
- const isBottomLimitReached = (element, axis) => {
2639
- const elementSize = axis === ScrollAxis.Horizontal ?
2640
- element.scrollWidth - element.clientWidth :
2641
- element.scrollHeight - element.clientHeight;
2642
- return Math.ceil(element[axis]) >= elementSize;
2643
- };
2644
- /**
2645
- * @hidden
2646
- *
2647
- * Scrolls the element in the given direction by the provided step in the provided scroll axis.
2648
- *
2649
- * If the targeted scroll incrementation doesn't yield any result due to device pixel ratio issues (https://github.com/dimitar-pechev/RenderingIndependentScrollOffsets#readme),
2650
- * increments the step with 1px and again attempts to change the scrollTop of the element, until the content is actually scrolled.
2651
- *
2652
- * Cuts the operation short after 20 unsuccessful attempts to prevent infinite loops in possible corner-case scenarios.
2653
- */
2654
- const scrollElement = (element, step, direction, scrollAxis) => {
2655
- if (!(isPresent(element) && isDocumentAvailable())) {
2656
- return;
2657
- }
2658
- const initialScrollPosition = element[scrollAxis];
2659
- let currentStep = step;
2660
- let iterations = 0;
2661
- while (initialScrollPosition === element[scrollAxis] &&
2662
- !(direction === ScrollDirection.Backwards && isUpperLimitReached(element, scrollAxis)) &&
2663
- !(direction === ScrollDirection.Forward && isBottomLimitReached(element, scrollAxis)) &&
2664
- iterations < 20 // cut the operation short in 20 attempts - in case of a wild corner case
2665
- ) {
2666
- element[scrollAxis] += (currentStep * direction);
2667
- // try with a larger step if the current one doesn't update the scroll position successfully
2668
- currentStep += 1;
2669
- iterations += 1;
2670
- }
2671
- };
2672
- /**
2673
- * @hidden
2674
- *
2675
- * As client coordinates are not restricted to the range 0px - {viewportSize}px, but can have negative starting values or ending values greater than the viewport size,
2676
- * this function extracts the visible boundaries of the provided element - fall-backing to 0 when the top/left are below 0,
2677
- * and fall-backing to the actual visible size of the container for bottom/right.
2678
- */
2679
- const getViewportBoundaries = (element) => {
2680
- const elementRect = element.getBoundingClientRect();
2681
- // if the beginning of the scrollable container is above/before the current viewport, fall-back to 0
2682
- const topLimit = Math.max(elementRect.top, 0);
2683
- const leftLimit = Math.max(elementRect.left, 0);
2684
- // if the end of the scrollable container is beneath/after the current viewport, fall-back to its client height
2685
- // add the distance from the start of the viewport to the beginning of the container to ensure scrolling bottom begins when the actual end of the container is reached
2686
- const bottomLimit = topLimit + Math.min(elementRect.bottom, element.clientHeight);
2687
- const rightLimit = leftLimit + Math.min(elementRect.right, element.clientWidth);
2688
- return {
2689
- top: topLimit,
2690
- bottom: bottomLimit,
2691
- left: leftLimit,
2692
- right: rightLimit
2693
- };
2694
- };
2695
-
2696
- /**
2697
- * @hidden
2698
- *
2699
- * Notifies the timeline-scroll.directive to scroll into view to requested coordinates.
2700
- * The scrolling is performed based on client (viewport) coordinates.
2701
- */
2702
- class TimelineScrollService {
2703
- constructor() {
2704
- this.horizontalScroll = new Subject();
2705
- this.verticalScroll = new Subject();
2706
- this.scrollCancel = new Subject();
2707
- }
2708
- ngOnDestroy() {
2709
- this.horizontalScroll.complete();
2710
- this.verticalScroll.complete();
2711
- this.scrollCancel.complete();
2712
- }
2713
- requestHorizontalScroll(clientTop) {
2714
- this.horizontalScroll.next(clientTop);
2715
- }
2716
- requestVerticalScroll(clientLeft) {
2717
- this.verticalScroll.next(clientLeft);
2718
- }
2719
- requestScrollCancel() {
2720
- this.scrollCancel.next();
2721
- }
2722
- }
2723
- TimelineScrollService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2724
- TimelineScrollService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollService });
2725
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollService, decorators: [{
2726
- type: Injectable
2727
- }] });
2728
-
2729
- /**
2730
- * @hidden
2731
- */
2732
- class TimelineScrollableDirective {
2733
- constructor(timelineScrollableContainer, scrollService, zone) {
2734
- this.timelineScrollableContainer = timelineScrollableContainer;
2735
- this.scrollService = scrollService;
2590
+ class TimelineScrollableDirective {
2591
+ constructor(timelineScrollableContainer, scrollService, zone) {
2592
+ this.timelineScrollableContainer = timelineScrollableContainer;
2593
+ this.scrollService = scrollService;
2736
2594
  this.zone = zone;
2737
2595
  this.subscriptions = new Subscription();
2738
2596
  this.subscriptions.add(this.scrollService.horizontalScroll
@@ -2781,11 +2639,12 @@ class TimelineScrollableDirective {
2781
2639
  }
2782
2640
  }
2783
2641
  TimelineScrollableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollableDirective, deps: [{ token: i0.ElementRef }, { token: TimelineScrollService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
2784
- TimelineScrollableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: TimelineScrollableDirective, selector: "[kendoGanttTimelineScrollable]", inputs: { scrollSettings: "scrollSettings" }, ngImport: i0 });
2642
+ TimelineScrollableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: TimelineScrollableDirective, isStandalone: true, selector: "[kendoGanttTimelineScrollable]", inputs: { scrollSettings: "scrollSettings" }, ngImport: i0 });
2785
2643
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollableDirective, decorators: [{
2786
2644
  type: Directive,
2787
2645
  args: [{
2788
- selector: '[kendoGanttTimelineScrollable]'
2646
+ selector: '[kendoGanttTimelineScrollable]',
2647
+ standalone: true
2789
2648
  }]
2790
2649
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: TimelineScrollService }, { type: i0.NgZone }]; }, propDecorators: { scrollSettings: [{
2791
2650
  type: Input
@@ -2794,84 +2653,205 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2794
2653
  /**
2795
2654
  * @hidden
2796
2655
  */
2797
- class GanttTimelineComponent {
2798
- constructor(scrollSyncService, dependencyDomService, renderer, zone, currentTimeMarkerService) {
2799
- this.scrollSyncService = scrollSyncService;
2800
- this.dependencyDomService = dependencyDomService;
2801
- this.renderer = renderer;
2802
- this.zone = zone;
2803
- this.currentTimeMarkerService = currentTimeMarkerService;
2804
- this.dependencies = [];
2805
- // as all drag-and-drop operations are on the timeline container, use a single draggable instance
2806
- this.timelineContainerPress = new EventEmitter();
2807
- this.timelineContainerDrag = new EventEmitter();
2808
- this.timelineContainerRelease = new EventEmitter();
2809
- this.subscriptions = new Subscription();
2810
- this.subscriptions.add(
2811
- // task changes indicates change in row content, number, height, etc.
2812
- this.dependencyDomService.taskChanges
2813
- .pipe(filter(args => isPresent(args.timelineRow)), switchMap(args => this.zone.onStable.pipe(take(1), map(() => args))) // ensure the content is rendered
2814
- )
2815
- .subscribe(({ timelineRow }) => {
2816
- const timelineRowHeight = isDocumentAvailable() ? timelineRow.getBoundingClientRect().height : 0;
2817
- this.currentTimeMarkerService.rowHeight = timelineRowHeight;
2818
- this.currentTimeMarkerService.currentTimeMarker = this.currentTimeMarker;
2819
- this.currentTimeMarkerService.slots = this.slots;
2820
- this.currentTimeMarkerService.rows = this.rows;
2821
- this.currentTimeMarkerService.activeView = this.activeView;
2822
- this.createTimeMarker();
2823
- this.renderer.setStyle(this.timelineColumns.nativeElement, 'height', `${(this.rows || []).length * timelineRowHeight}px`);
2824
- }));
2825
- }
2826
- /**
2827
- * Specifies whether the draggable will attach or detach its pointer event listeners.
2828
- */
2829
- get draggableEnabled() {
2830
- return this.renderDependencyDragClues;
2831
- }
2832
- ngOnChanges(changes) {
2833
- if (changes['currentTimeMarker']) {
2834
- this.createTimeMarker();
2835
- }
2836
- }
2837
- ngAfterViewInit() {
2838
- this.currentTimeMarkerService.slots = this.slots;
2839
- this.currentTimeMarkerService.rows = this.rows;
2840
- this.currentTimeMarkerService.container = this.timelineContent;
2841
- const timelineHeader = this.timelineHeaderWrap.nativeElement;
2842
- const rightContainer = this.timelineContent.nativeElement;
2843
- this.scrollSyncService.registerElement(rightContainer, 'timeline');
2844
- this.scrollSyncService.registerElement(timelineHeader, 'header');
2845
- this.dependencyDomService.registerContentContainer(this.tasksContainer.nativeElement);
2846
- }
2847
- ngOnDestroy() {
2848
- this.subscriptions.unsubscribe();
2849
- }
2850
- isNonWorking(item) {
2851
- return item.hasOwnProperty('isWorking') && !item.isWorking;
2852
- }
2853
- createTimeMarker() {
2854
- this.zone.runOutsideAngular(() => {
2855
- var _a;
2856
- this.currentTimeMarkerService.removeTimeMarker();
2857
- if ((typeof this.currentTimeMarker === 'boolean' && this.currentTimeMarker) || ((_a = this.currentTimeMarker) === null || _a === void 0 ? void 0 : _a.enabled)) {
2858
- this.currentTimeMarkerService.createTimeMarker();
2859
- }
2860
- });
2656
+ class GanttHeaderTableBodyComponent {
2657
+ constructor() {
2658
+ this.tbodyClass = true;
2861
2659
  }
2862
2660
  }
2863
- GanttTimelineComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTimelineComponent, deps: [{ token: ScrollSyncService }, { token: DependencyDomService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: CurrentTimeMarkerService }], target: i0.ɵɵFactoryTarget.Component });
2864
- GanttTimelineComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttTimelineComponent, selector: "kendo-gantt-timeline", inputs: { rows: "rows", slots: "slots", groupSlots: "groupSlots", tableWidth: "tableWidth", activeView: "activeView", taskContentTemplate: "taskContentTemplate", taskTemplate: "taskTemplate", summaryTaskTemplate: "summaryTaskTemplate", taskClass: "taskClass", renderDependencyDragClues: "renderDependencyDragClues", dragScrollSettings: "dragScrollSettings", currentTimeMarker: "currentTimeMarker", selectable: "selectable", isTaskSelected: "isTaskSelected", isExpanded: "isExpanded", dependencies: "dependencies" }, outputs: { timelineContainerPress: "timelineContainerPress", timelineContainerDrag: "timelineContainerDrag", timelineContainerRelease: "timelineContainerRelease" }, viewQueries: [{ propertyName: "timelineContent", first: true, predicate: ["timelineContent"], descendants: true, static: true }, { propertyName: "timelineColumns", first: true, predicate: ["timelineColumns"], descendants: true, static: true }, { propertyName: "timelineHeaderWrap", first: true, predicate: ["timelineHeaderWrap"], descendants: true, static: true }, { propertyName: "tasksContainer", first: true, predicate: ["tasksContainer"], descendants: true, static: true }, { propertyName: "dragPopupContainer", first: true, predicate: ["dragPopupContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "dependencyDragCreatePolyline", first: true, predicate: ["dependencyDragCreatePolyline"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
2865
- <div class="k-gantt-timeline k-grid k-grid-md">
2866
- <div class="k-grid-header">
2867
- <div #timelineHeaderWrap class="k-grid-header-wrap">
2868
- <table
2869
- class="k-table k-table-md k-grid-header-table"
2870
- role="presentation"
2871
- [style.width.px]="tableWidth"
2872
- >
2873
- <tbody
2874
- kendoGanttHeaderTableBody
2661
+ GanttHeaderTableBodyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHeaderTableBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2662
+ GanttHeaderTableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttHeaderTableBodyComponent, isStandalone: true, selector: "[kendoGanttHeaderTableBody]", inputs: { groupSlots: "groupSlots", slots: "slots" }, host: { properties: { "class.k-table-tbody": "this.tbodyClass" } }, ngImport: i0, template: `
2663
+ <tr class="k-table-row">
2664
+ <td *ngFor="let item of groupSlots" [attr.colspan]="item.span" class="k-header k-table-td">{{ item.text }}</td>
2665
+ </tr>
2666
+
2667
+ <tr class="k-table-row">
2668
+ <td *ngFor="let item of slots" class="k-header k-table-td" [attr.colspan]="item.span === 7 ? item.span : 1" [attr.title]="item.text">{{ item.text }}</td>
2669
+ </tr>
2670
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2671
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHeaderTableBodyComponent, decorators: [{
2672
+ type: Component,
2673
+ args: [{
2674
+ // eslint-disable-next-line @angular-eslint/component-selector
2675
+ selector: '[kendoGanttHeaderTableBody]',
2676
+ template: `
2677
+ <tr class="k-table-row">
2678
+ <td *ngFor="let item of groupSlots" [attr.colspan]="item.span" class="k-header k-table-td">{{ item.text }}</td>
2679
+ </tr>
2680
+
2681
+ <tr class="k-table-row">
2682
+ <td *ngFor="let item of slots" class="k-header k-table-td" [attr.colspan]="item.span === 7 ? item.span : 1" [attr.title]="item.text">{{ item.text }}</td>
2683
+ </tr>
2684
+ `,
2685
+ standalone: true,
2686
+ imports: [NgFor]
2687
+ }]
2688
+ }], propDecorators: { tbodyClass: [{
2689
+ type: HostBinding,
2690
+ args: ['class.k-table-tbody']
2691
+ }], groupSlots: [{
2692
+ type: Input
2693
+ }], slots: [{
2694
+ type: Input
2695
+ }] } });
2696
+
2697
+ const MS_PER_SECOND = 1000;
2698
+ const MS_PER_MINUTE = 60 * MS_PER_SECOND;
2699
+ /**
2700
+ * @hidden
2701
+ */
2702
+ class CurrentTimeMarkerService {
2703
+ constructor(renderer, cdr) {
2704
+ this.renderer = renderer;
2705
+ this.cdr = cdr;
2706
+ this.slots = [];
2707
+ this.rows = [];
2708
+ this.now = new Date(Date.now());
2709
+ this.createTimeMarker = () => {
2710
+ if (!isDocumentAvailable()) {
2711
+ return;
2712
+ }
2713
+ this.removeTimeMarker();
2714
+ if (this.slotIndex >= 0) {
2715
+ this.now = new Date(Date.now());
2716
+ this.timeMarkerDiv = this.renderer.createElement('div');
2717
+ this.renderer.addClass(this.timeMarkerDiv, 'k-current-time');
2718
+ this.renderer.setStyle(this.timeMarkerDiv, 'width', '1px');
2719
+ this.renderer.setStyle(this.timeMarkerDiv, 'top', '0px');
2720
+ this.renderer.setStyle(this.timeMarkerDiv, `${this.rtl ? 'right' : 'left'}`, this.deltaOffset + 'px');
2721
+ this.renderer.appendChild(this.container.nativeElement, this.timeMarkerDiv);
2722
+ this.renderer.setStyle(this.timeMarkerDiv, 'height', this.height + 'px');
2723
+ this.currentTimeTimeout = setTimeout(this.createTimeMarker, this.interval || MS_PER_MINUTE);
2724
+ }
2725
+ };
2726
+ }
2727
+ get deltaOffset() {
2728
+ if (this.slotIndex >= 0) {
2729
+ const total = this.slots[this.slotIndex].end.getTime() - this.slots[this.slotIndex].start.getTime();
2730
+ if (total > 0) {
2731
+ const currentTimeValue = this.now.getTime() - this.slots[this.slotIndex].start.getTime();
2732
+ const fractionInsideCell = currentTimeValue / total;
2733
+ const deltaOffsetToSlot = this.slotIndex * this.slotWidth;
2734
+ const deltaOffsetInsideSlot = fractionInsideCell * this.slotWidth;
2735
+ return deltaOffsetToSlot + deltaOffsetInsideSlot;
2736
+ }
2737
+ return 0;
2738
+ }
2739
+ }
2740
+ get slotWidth() {
2741
+ var _a;
2742
+ return (_a = this.slots[0]) === null || _a === void 0 ? void 0 : _a.slotWidth;
2743
+ }
2744
+ get slotIndex() {
2745
+ return this.slots.indexOf(this.slots.find((slot) => slot.start <= this.now && slot.end > this.now));
2746
+ }
2747
+ get height() {
2748
+ return this.rows.length * this.rowHeight;
2749
+ }
2750
+ get interval() {
2751
+ var _a;
2752
+ if (typeof (this.currentTimeMarker) === 'boolean') {
2753
+ return MS_PER_MINUTE;
2754
+ }
2755
+ return ((_a = this.currentTimeMarker) === null || _a === void 0 ? void 0 : _a.updateInterval) || MS_PER_MINUTE;
2756
+ }
2757
+ ngOnDestroy() {
2758
+ clearTimeout(this.currentTimeTimeout);
2759
+ }
2760
+ removeTimeMarker() {
2761
+ if (this.timeMarkerDiv) {
2762
+ this.renderer.removeChild(this.container.nativeElement, this.timeMarkerDiv);
2763
+ clearTimeout(this.currentTimeTimeout);
2764
+ this.cdr.detectChanges();
2765
+ }
2766
+ }
2767
+ }
2768
+ CurrentTimeMarkerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrentTimeMarkerService, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Injectable });
2769
+ CurrentTimeMarkerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrentTimeMarkerService });
2770
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrentTimeMarkerService, decorators: [{
2771
+ type: Injectable
2772
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; } });
2773
+
2774
+ /**
2775
+ * @hidden
2776
+ */
2777
+ class GanttTimelineComponent {
2778
+ constructor(scrollSyncService, dependencyDomService, renderer, zone, currentTimeMarkerService) {
2779
+ this.scrollSyncService = scrollSyncService;
2780
+ this.dependencyDomService = dependencyDomService;
2781
+ this.renderer = renderer;
2782
+ this.zone = zone;
2783
+ this.currentTimeMarkerService = currentTimeMarkerService;
2784
+ this.dependencies = [];
2785
+ // as all drag-and-drop operations are on the timeline container, use a single draggable instance
2786
+ this.timelineContainerPress = new EventEmitter();
2787
+ this.timelineContainerDrag = new EventEmitter();
2788
+ this.timelineContainerRelease = new EventEmitter();
2789
+ this.subscriptions = new Subscription();
2790
+ this.subscriptions.add(
2791
+ // task changes indicates change in row content, number, height, etc.
2792
+ this.dependencyDomService.taskChanges
2793
+ .pipe(filter(args => isPresent(args.timelineRow)), switchMap(args => this.zone.onStable.pipe(take(1), map(() => args))) // ensure the content is rendered
2794
+ )
2795
+ .subscribe(({ timelineRow }) => {
2796
+ const timelineRowHeight = isDocumentAvailable() ? timelineRow.getBoundingClientRect().height : 0;
2797
+ this.currentTimeMarkerService.rowHeight = timelineRowHeight;
2798
+ this.currentTimeMarkerService.currentTimeMarker = this.currentTimeMarker;
2799
+ this.currentTimeMarkerService.slots = this.slots;
2800
+ this.currentTimeMarkerService.rows = this.rows;
2801
+ this.currentTimeMarkerService.activeView = this.activeView;
2802
+ this.createTimeMarker();
2803
+ this.renderer.setStyle(this.timelineColumns.nativeElement, 'height', `${(this.rows || []).length * timelineRowHeight}px`);
2804
+ }));
2805
+ }
2806
+ /**
2807
+ * Specifies whether the draggable will attach or detach its pointer event listeners.
2808
+ */
2809
+ get draggableEnabled() {
2810
+ return this.renderDependencyDragClues;
2811
+ }
2812
+ ngOnChanges(changes) {
2813
+ if (changes['currentTimeMarker']) {
2814
+ this.createTimeMarker();
2815
+ }
2816
+ }
2817
+ ngAfterViewInit() {
2818
+ this.currentTimeMarkerService.slots = this.slots;
2819
+ this.currentTimeMarkerService.rows = this.rows;
2820
+ this.currentTimeMarkerService.container = this.timelineContent;
2821
+ const timelineHeader = this.timelineHeaderWrap.nativeElement;
2822
+ const rightContainer = this.timelineContent.nativeElement;
2823
+ this.scrollSyncService.registerElement(rightContainer, 'timeline');
2824
+ this.scrollSyncService.registerElement(timelineHeader, 'header');
2825
+ this.dependencyDomService.registerContentContainer(this.tasksContainer.nativeElement);
2826
+ }
2827
+ ngOnDestroy() {
2828
+ this.subscriptions.unsubscribe();
2829
+ }
2830
+ isNonWorking(item) {
2831
+ return item.hasOwnProperty('isWorking') && !item.isWorking;
2832
+ }
2833
+ createTimeMarker() {
2834
+ this.zone.runOutsideAngular(() => {
2835
+ var _a;
2836
+ this.currentTimeMarkerService.removeTimeMarker();
2837
+ if ((typeof this.currentTimeMarker === 'boolean' && this.currentTimeMarker) || ((_a = this.currentTimeMarker) === null || _a === void 0 ? void 0 : _a.enabled)) {
2838
+ this.currentTimeMarkerService.createTimeMarker();
2839
+ }
2840
+ });
2841
+ }
2842
+ }
2843
+ GanttTimelineComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTimelineComponent, deps: [{ token: ScrollSyncService }, { token: DependencyDomService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: CurrentTimeMarkerService }], target: i0.ɵɵFactoryTarget.Component });
2844
+ GanttTimelineComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttTimelineComponent, isStandalone: true, selector: "kendo-gantt-timeline", inputs: { rows: "rows", slots: "slots", groupSlots: "groupSlots", tableWidth: "tableWidth", activeView: "activeView", taskContentTemplate: "taskContentTemplate", taskTemplate: "taskTemplate", summaryTaskTemplate: "summaryTaskTemplate", taskClass: "taskClass", renderDependencyDragClues: "renderDependencyDragClues", dragScrollSettings: "dragScrollSettings", currentTimeMarker: "currentTimeMarker", selectable: "selectable", isTaskSelected: "isTaskSelected", isExpanded: "isExpanded", dependencies: "dependencies" }, outputs: { timelineContainerPress: "timelineContainerPress", timelineContainerDrag: "timelineContainerDrag", timelineContainerRelease: "timelineContainerRelease" }, viewQueries: [{ propertyName: "timelineContent", first: true, predicate: ["timelineContent"], descendants: true, static: true }, { propertyName: "timelineColumns", first: true, predicate: ["timelineColumns"], descendants: true, static: true }, { propertyName: "timelineHeaderWrap", first: true, predicate: ["timelineHeaderWrap"], descendants: true, static: true }, { propertyName: "tasksContainer", first: true, predicate: ["tasksContainer"], descendants: true, static: true }, { propertyName: "dragPopupContainer", first: true, predicate: ["dragPopupContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "dependencyDragCreatePolyline", first: true, predicate: ["dependencyDragCreatePolyline"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
2845
+ <div class="k-gantt-timeline k-grid k-grid-md">
2846
+ <div class="k-grid-header">
2847
+ <div #timelineHeaderWrap class="k-grid-header-wrap">
2848
+ <table
2849
+ class="k-table k-table-md k-grid-header-table"
2850
+ role="presentation"
2851
+ [style.width.px]="tableWidth"
2852
+ >
2853
+ <tbody
2854
+ kendoGanttHeaderTableBody
2875
2855
  [groupSlots]="groupSlots"
2876
2856
  [slots]="slots">
2877
2857
  </tbody>
@@ -2964,7 +2944,7 @@ GanttTimelineComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
2964
2944
  <ng-container #dragPopupContainer></ng-container>
2965
2945
  </div>
2966
2946
  </div>
2967
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { kind: "component", type: GanttTasksTableBodyComponent, selector: "[kendoGanttTasksTableBody]", inputs: ["selectable", "rows", "activeView", "taskContentTemplate", "taskTemplate", "summaryTaskTemplate", "taskClass", "isExpanded", "isTaskSelected", "renderDependencyDragClues"] }, { kind: "component", type: GanttHeaderTableBodyComponent, selector: "[kendoGanttHeaderTableBody]", inputs: ["groupSlots", "slots"] }, { kind: "directive", type: GanttDependencyDirective, selector: "[kendoGanttDependency]", inputs: ["dependency"] }, { kind: "directive", type: TimelineScrollableDirective, selector: "[kendoGanttTimelineScrollable]", inputs: ["scrollSettings"] }] });
2947
+ `, isInline: true, dependencies: [{ kind: "directive", type: TableDirective, selector: "table", inputs: ["locked", "virtualColumns"] }, { kind: "component", type: GanttHeaderTableBodyComponent, selector: "[kendoGanttHeaderTableBody]", inputs: ["groupSlots", "slots"] }, { kind: "directive", type: TimelineScrollableDirective, selector: "[kendoGanttTimelineScrollable]", inputs: ["scrollSettings"] }, { kind: "directive", type: DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: GanttTasksTableBodyComponent, selector: "[kendoGanttTasksTableBody]", inputs: ["selectable", "rows", "activeView", "taskContentTemplate", "taskTemplate", "summaryTaskTemplate", "taskClass", "isExpanded", "isTaskSelected", "renderDependencyDragClues"] }, { kind: "directive", type: GanttDependencyDirective, selector: "[kendoGanttDependency]", inputs: ["dependency"] }] });
2968
2948
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTimelineComponent, decorators: [{
2969
2949
  type: Component,
2970
2950
  args: [{
@@ -3072,7 +3052,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3072
3052
  <ng-container #dragPopupContainer></ng-container>
3073
3053
  </div>
3074
3054
  </div>
3075
- `
3055
+ `,
3056
+ standalone: true,
3057
+ imports: [TableDirective, GanttHeaderTableBodyComponent, TimelineScrollableDirective, DraggableDirective, NgFor, GanttTasksTableBodyComponent, GanttDependencyDirective]
3076
3058
  }]
3077
3059
  }], ctorParameters: function () { return [{ type: ScrollSyncService }, { type: DependencyDomService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: CurrentTimeMarkerService }]; }, propDecorators: { timelineContent: [{
3078
3060
  type: ViewChild,
@@ -3203,11 +3185,12 @@ class CellTemplateDirective {
3203
3185
  }
3204
3186
  }
3205
3187
  CellTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CellTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3206
- CellTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: CellTemplateDirective, selector: "[kendoGanttCellTemplate]", ngImport: i0 });
3188
+ CellTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: CellTemplateDirective, isStandalone: true, selector: "[kendoGanttCellTemplate]", ngImport: i0 });
3207
3189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CellTemplateDirective, decorators: [{
3208
3190
  type: Directive,
3209
3191
  args: [{
3210
- selector: '[kendoGanttCellTemplate]'
3192
+ selector: '[kendoGanttCellTemplate]',
3193
+ standalone: true
3211
3194
  }]
3212
3195
  }], ctorParameters: function () {
3213
3196
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3231,11 +3214,12 @@ class ColumnMenuTemplateDirective {
3231
3214
  }
3232
3215
  }
3233
3216
  ColumnMenuTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ColumnMenuTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3234
- ColumnMenuTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ColumnMenuTemplateDirective, selector: "[kendoGanttColumnMenuTemplate]", ngImport: i0 });
3217
+ ColumnMenuTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ColumnMenuTemplateDirective, isStandalone: true, selector: "[kendoGanttColumnMenuTemplate]", ngImport: i0 });
3235
3218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ColumnMenuTemplateDirective, decorators: [{
3236
3219
  type: Directive,
3237
3220
  args: [{
3238
- selector: '[kendoGanttColumnMenuTemplate]'
3221
+ selector: '[kendoGanttColumnMenuTemplate]',
3222
+ standalone: true
3239
3223
  }]
3240
3224
  }], ctorParameters: function () {
3241
3225
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3258,11 +3242,12 @@ class FilterCellTemplateDirective {
3258
3242
  }
3259
3243
  }
3260
3244
  FilterCellTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterCellTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3261
- FilterCellTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: FilterCellTemplateDirective, selector: "[kendoGanttFilterCellTemplate]", ngImport: i0 });
3245
+ FilterCellTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: FilterCellTemplateDirective, isStandalone: true, selector: "[kendoGanttFilterCellTemplate]", ngImport: i0 });
3262
3246
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterCellTemplateDirective, decorators: [{
3263
3247
  type: Directive,
3264
3248
  args: [{
3265
- selector: '[kendoGanttFilterCellTemplate]'
3249
+ selector: '[kendoGanttFilterCellTemplate]',
3250
+ standalone: true
3266
3251
  }]
3267
3252
  }], ctorParameters: function () {
3268
3253
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3284,11 +3269,12 @@ class FilterMenuTemplateDirective {
3284
3269
  }
3285
3270
  }
3286
3271
  FilterMenuTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterMenuTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3287
- FilterMenuTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: FilterMenuTemplateDirective, selector: "[kendoGanttFilterMenuTemplate]", ngImport: i0 });
3272
+ FilterMenuTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: FilterMenuTemplateDirective, isStandalone: true, selector: "[kendoGanttFilterMenuTemplate]", ngImport: i0 });
3288
3273
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterMenuTemplateDirective, decorators: [{
3289
3274
  type: Directive,
3290
3275
  args: [{
3291
- selector: '[kendoGanttFilterMenuTemplate]'
3276
+ selector: '[kendoGanttFilterMenuTemplate]',
3277
+ standalone: true
3292
3278
  }]
3293
3279
  }], ctorParameters: function () {
3294
3280
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3314,11 +3300,12 @@ class FooterTemplateDirective {
3314
3300
  }
3315
3301
  }
3316
3302
  FooterTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FooterTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3317
- FooterTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: FooterTemplateDirective, selector: "[kendoGanttFooterTemplate]", ngImport: i0 });
3303
+ FooterTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: FooterTemplateDirective, isStandalone: true, selector: "[kendoGanttFooterTemplate]", ngImport: i0 });
3318
3304
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FooterTemplateDirective, decorators: [{
3319
3305
  type: Directive,
3320
3306
  args: [{
3321
- selector: '[kendoGanttFooterTemplate]'
3307
+ selector: '[kendoGanttFooterTemplate]',
3308
+ standalone: true
3322
3309
  }]
3323
3310
  }], ctorParameters: function () {
3324
3311
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3342,11 +3329,12 @@ class HeaderTemplateDirective {
3342
3329
  }
3343
3330
  }
3344
3331
  HeaderTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: HeaderTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3345
- HeaderTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: HeaderTemplateDirective, selector: "[kendoGanttHeaderTemplate]", ngImport: i0 });
3332
+ HeaderTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: HeaderTemplateDirective, isStandalone: true, selector: "[kendoGanttHeaderTemplate]", ngImport: i0 });
3346
3333
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: HeaderTemplateDirective, decorators: [{
3347
3334
  type: Directive,
3348
3335
  args: [{
3349
- selector: '[kendoGanttHeaderTemplate]'
3336
+ selector: '[kendoGanttHeaderTemplate]',
3337
+ standalone: true
3350
3338
  }]
3351
3339
  }], ctorParameters: function () {
3352
3340
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3374,11 +3362,12 @@ class EditTemplateDirective {
3374
3362
  }
3375
3363
  }
3376
3364
  EditTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3377
- EditTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: EditTemplateDirective, selector: "[kendoGanttEditTemplate]", ngImport: i0 });
3365
+ EditTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: EditTemplateDirective, isStandalone: true, selector: "[kendoGanttEditTemplate]", ngImport: i0 });
3378
3366
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditTemplateDirective, decorators: [{
3379
3367
  type: Directive,
3380
3368
  args: [{
3381
- selector: '[kendoGanttEditTemplate]'
3369
+ selector: '[kendoGanttEditTemplate]',
3370
+ standalone: true
3382
3371
  }]
3383
3372
  }], ctorParameters: function () {
3384
3373
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3430,7 +3419,7 @@ class GanttColumnComponent extends ColumnComponent {
3430
3419
  }
3431
3420
  }
3432
3421
  GanttColumnComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttColumnComponent, deps: [{ token: OptionChangesService }, { token: GanttColumnBase, host: true, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
3433
- GanttColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttColumnComponent, selector: "kendo-gantt-column", inputs: { format: "format", filter: "filter", filterable: "filterable", editor: "editor", editable: "editable", locked: "locked", lockable: "lockable", hidden: "hidden", media: "media", style: "style", headerStyle: "headerStyle", footerStyle: "footerStyle", cssClass: ["class", "cssClass"], headerClass: "headerClass", footerClass: "footerClass" }, providers: [
3422
+ GanttColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttColumnComponent, isStandalone: true, selector: "kendo-gantt-column", inputs: { format: "format", filter: "filter", filterable: "filterable", editor: "editor", editable: "editable", locked: "locked", lockable: "lockable", hidden: "hidden", media: "media", style: "style", headerStyle: "headerStyle", footerStyle: "footerStyle", cssClass: ["class", "cssClass"], headerClass: "headerClass", footerClass: "footerClass" }, providers: [
3434
3423
  {
3435
3424
  provide: GanttColumnBase,
3436
3425
  useExisting: forwardRef(() => GanttColumnComponent)
@@ -3446,7 +3435,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3446
3435
  provide: GanttColumnBase,
3447
3436
  useExisting: forwardRef(() => GanttColumnComponent)
3448
3437
  }
3449
- ]
3438
+ ],
3439
+ standalone: true
3450
3440
  }]
3451
3441
  }], ctorParameters: function () {
3452
3442
  return [{ type: OptionChangesService }, { type: GanttColumnBase, decorators: [{
@@ -3544,7 +3534,7 @@ class GanttColumnGroupComponent extends ColumnGroupComponent {
3544
3534
  }
3545
3535
  }
3546
3536
  GanttColumnGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttColumnGroupComponent, deps: [{ token: OptionChangesService }, { token: GanttColumnBase, host: true, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
3547
- GanttColumnGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttColumnGroupComponent, selector: "kendo-gantt-column-group", inputs: { locked: "locked", lockable: "lockable", hidden: "hidden", sortable: "sortable", media: "media", style: "style", headerStyle: "headerStyle", footerStyle: "footerStyle", cssClass: ["class", "cssClass"], headerClass: "headerClass", footerClass: "footerClass" }, providers: [
3537
+ GanttColumnGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttColumnGroupComponent, isStandalone: true, selector: "kendo-gantt-column-group", inputs: { locked: "locked", lockable: "lockable", hidden: "hidden", sortable: "sortable", media: "media", style: "style", headerStyle: "headerStyle", footerStyle: "footerStyle", cssClass: ["class", "cssClass"], headerClass: "headerClass", footerClass: "footerClass" }, providers: [
3548
3538
  {
3549
3539
  provide: GanttColumnBase,
3550
3540
  useExisting: forwardRef(() => GanttColumnGroupComponent)
@@ -3560,7 +3550,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3560
3550
  provide: GanttColumnBase,
3561
3551
  useExisting: forwardRef(() => GanttColumnGroupComponent)
3562
3552
  }
3563
- ]
3553
+ ],
3554
+ standalone: true
3564
3555
  }]
3565
3556
  }], ctorParameters: function () {
3566
3557
  return [{ type: OptionChangesService }, { type: GanttColumnBase, decorators: [{
@@ -3649,7 +3640,7 @@ class GanttSpanColumnComponent extends SpanColumnComponent {
3649
3640
  }
3650
3641
  }
3651
3642
  GanttSpanColumnComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSpanColumnComponent, deps: [{ token: OptionChangesService }, { token: GanttColumnBase, host: true, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
3652
- GanttSpanColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttSpanColumnComponent, selector: "kendo-gantt-span-column", inputs: { locked: "locked", lockable: "lockable", editable: "editable", hidden: "hidden", media: "media", style: "style", headerStyle: "headerStyle", footerStyle: "footerStyle", cssClass: ["class", "cssClass"], headerClass: "headerClass", footerClass: "footerClass" }, providers: [
3643
+ GanttSpanColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttSpanColumnComponent, isStandalone: true, selector: "kendo-gantt-span-column", inputs: { locked: "locked", lockable: "lockable", editable: "editable", hidden: "hidden", media: "media", style: "style", headerStyle: "headerStyle", footerStyle: "footerStyle", cssClass: ["class", "cssClass"], headerClass: "headerClass", footerClass: "footerClass" }, providers: [
3653
3644
  {
3654
3645
  provide: GanttColumnBase,
3655
3646
  useExisting: forwardRef(() => GanttSpanColumnComponent)
@@ -3665,7 +3656,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3665
3656
  provide: GanttColumnBase,
3666
3657
  useExisting: forwardRef(() => GanttSpanColumnComponent)
3667
3658
  }
3668
- ]
3659
+ ],
3660
+ standalone: true
3669
3661
  }]
3670
3662
  }], ctorParameters: function () {
3671
3663
  return [{ type: OptionChangesService }, { type: GanttColumnBase, decorators: [{
@@ -3809,11 +3801,12 @@ class GanttTaskTemplateDirective {
3809
3801
  }
3810
3802
  }
3811
3803
  GanttTaskTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3812
- GanttTaskTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttTaskTemplateDirective, selector: "[kendoGanttTaskTemplate]", ngImport: i0 });
3804
+ GanttTaskTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttTaskTemplateDirective, isStandalone: true, selector: "[kendoGanttTaskTemplate]", ngImport: i0 });
3813
3805
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskTemplateDirective, decorators: [{
3814
3806
  type: Directive,
3815
3807
  args: [{
3816
- selector: '[kendoGanttTaskTemplate]'
3808
+ selector: '[kendoGanttTaskTemplate]',
3809
+ standalone: true
3817
3810
  }]
3818
3811
  }], ctorParameters: function () {
3819
3812
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3856,11 +3849,12 @@ class GanttSummaryTaskTemplateDirective {
3856
3849
  }
3857
3850
  }
3858
3851
  GanttSummaryTaskTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSummaryTaskTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3859
- GanttSummaryTaskTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttSummaryTaskTemplateDirective, selector: "[kendoGanttSummaryTaskTemplate]", ngImport: i0 });
3852
+ GanttSummaryTaskTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttSummaryTaskTemplateDirective, isStandalone: true, selector: "[kendoGanttSummaryTaskTemplate]", ngImport: i0 });
3860
3853
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSummaryTaskTemplateDirective, decorators: [{
3861
3854
  type: Directive,
3862
3855
  args: [{
3863
- selector: '[kendoGanttSummaryTaskTemplate]'
3856
+ selector: '[kendoGanttSummaryTaskTemplate]',
3857
+ standalone: true
3864
3858
  }]
3865
3859
  }], ctorParameters: function () {
3866
3860
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3898,11 +3892,12 @@ class GanttTaskContentTemplateDirective {
3898
3892
  }
3899
3893
  }
3900
3894
  GanttTaskContentTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskContentTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
3901
- GanttTaskContentTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttTaskContentTemplateDirective, selector: "[kendoGanttTaskContentTemplate]", ngImport: i0 });
3895
+ GanttTaskContentTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttTaskContentTemplateDirective, isStandalone: true, selector: "[kendoGanttTaskContentTemplate]", ngImport: i0 });
3902
3896
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskContentTemplateDirective, decorators: [{
3903
3897
  type: Directive,
3904
3898
  args: [{
3905
- selector: '[kendoGanttTaskContentTemplate]'
3899
+ selector: '[kendoGanttTaskContentTemplate]',
3900
+ standalone: true
3906
3901
  }]
3907
3902
  }], ctorParameters: function () {
3908
3903
  return [{ type: i0.TemplateRef, decorators: [{
@@ -4019,11 +4014,12 @@ class ToolbarTemplateDirective {
4019
4014
  }
4020
4015
  }
4021
4016
  ToolbarTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
4022
- ToolbarTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ToolbarTemplateDirective, selector: "[kendoGanttToolbarTemplate]", inputs: { position: "position" }, ngImport: i0 });
4017
+ ToolbarTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ToolbarTemplateDirective, isStandalone: true, selector: "[kendoGanttToolbarTemplate]", inputs: { position: "position" }, ngImport: i0 });
4023
4018
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarTemplateDirective, decorators: [{
4024
4019
  type: Directive,
4025
4020
  args: [{
4026
- selector: '[kendoGanttToolbarTemplate]'
4021
+ selector: '[kendoGanttToolbarTemplate]',
4022
+ standalone: true
4027
4023
  }]
4028
4024
  }], ctorParameters: function () {
4029
4025
  return [{ type: i0.TemplateRef, decorators: [{
@@ -4093,851 +4089,863 @@ const mapPath = (item) => ({
4093
4089
  /**
4094
4090
  * @hidden
4095
4091
  */
4096
- class ToolbarNavigationService {
4097
- constructor(renderer) {
4098
- this.renderer = renderer;
4099
- this.focusIndex = 0;
4100
- }
4101
- updateFocus() {
4102
- this.focusableContent.forEach(el => {
4103
- this.renderer.setAttribute(el, 'tabindex', '-1');
4104
- });
4105
- this.renderer.setAttribute(this.focusableContent[this.focusIndex], 'tabindex', '0');
4106
- this.focusableContent[this.focusIndex].focus();
4107
- }
4108
- }
4109
- ToolbarNavigationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarNavigationService, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Injectable });
4110
- ToolbarNavigationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarNavigationService });
4111
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarNavigationService, decorators: [{
4112
- type: Injectable
4113
- }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; } });
4114
-
4115
- /**
4116
- * The Gantt ViewSelector component. Shows the currently active view type, and allows switching to another view type.
4117
- */
4118
- class ViewSelectorComponent {
4119
- constructor(localizationService) {
4092
+ class DependenciesTableComponent {
4093
+ constructor(mapper, editService, localizationService) {
4094
+ this.mapper = mapper;
4095
+ this.editService = editService;
4120
4096
  this.localizationService = localizationService;
4121
- this.hostClass = true;
4122
- /**
4123
- * The currently active view type.
4124
- * @default 'week'
4125
- */
4126
- this.activeView = 'week';
4127
- /**
4128
- * Fires each time the user selects a different view type. The event data contains the type of the newly selected view.
4129
- */
4130
- this.activeViewChange = new EventEmitter();
4131
- }
4132
- /**
4133
- * @hidden
4134
- */
4135
- onClick(viewType) {
4136
- if (viewType !== this.activeView) {
4137
- this.activeViewChange.emit(viewType);
4138
- }
4097
+ this.dependenciesChange = new EventEmitter();
4098
+ this.selectedKeys = [];
4099
+ this.formGroups = new FormArray([]);
4100
+ this.dependencyTypes = this.getDependencyTypes();
4101
+ this.plusIcon = plusIcon;
4102
+ this.minusIcon = minusIcon;
4139
4103
  }
4140
- /**
4141
- * @hidden
4142
- */
4143
- getViewTypeText(viewType) {
4144
- return this.localizationService.get(`${viewType}ViewText`);
4104
+ get taskId() {
4105
+ return this.editService.dataItem.id;
4145
4106
  }
4146
- /**
4147
- * @hidden
4148
- */
4149
- onActiveViewChange(event) {
4150
- this.activeViewChange.emit(event.target.value);
4107
+ // The target dependency id field
4108
+ // e.g. if Predecessors, we have the `fromId` which is the currently edited task,
4109
+ // while the `toId` is missing (needs to be selected by the user)
4110
+ get dependencyIdField() {
4111
+ return this.dependencyType === 'predecessor' ? 'fromId' : 'toId';
4112
+ }
4113
+ ngOnInit() {
4114
+ // generate the FormGroups per each Grid row
4115
+ if (this.formGroups.controls.length === 0) {
4116
+ const fields = this.mapper.dependencyFields;
4117
+ this.dependencies.forEach(item => {
4118
+ const formGroup = new FormGroup({
4119
+ [fields.id]: new FormControl(this.mapper.extractFromDependency(item, 'id')),
4120
+ [fields.fromId]: new FormControl(this.mapper.extractFromDependency(item, 'fromId'), Validators.required),
4121
+ [fields.toId]: new FormControl(this.mapper.extractFromDependency(item, 'toId'), Validators.required),
4122
+ [fields.type]: new FormControl(this.mapper.extractFromDependency(item, 'type'), Validators.required)
4123
+ });
4124
+ this.formGroups.push(formGroup);
4125
+ });
4126
+ }
4127
+ this.formGroups.valueChanges.subscribe(val => {
4128
+ this.formGroups.controls.forEach(control => {
4129
+ if (control.dirty) {
4130
+ this.editService.updateDependencies(control.value);
4131
+ }
4132
+ });
4133
+ this.dependenciesChange.emit(val);
4134
+ });
4135
+ }
4136
+ getFormControl(dataItemIndex, field) {
4137
+ // return the FormControl for the respective column editor
4138
+ return this.formGroups.controls
4139
+ .find((_control, index) => index === dataItemIndex)
4140
+ .get(this.mapper.dependencyFields[field]);
4141
+ }
4142
+ getText(token) {
4143
+ return this.localizationService.get(token);
4144
+ }
4145
+ getDependencyTypes() {
4146
+ const types = Object.keys(DependencyType)
4147
+ .filter(value => typeof DependencyType[value] === 'number')
4148
+ .map(type => {
4149
+ return {
4150
+ type,
4151
+ id: DependencyType[type]
4152
+ };
4153
+ });
4154
+ return types;
4155
+ }
4156
+ addHandler() {
4157
+ const fields = this.mapper.dependencyFields;
4158
+ const formGroup = new FormGroup({
4159
+ [fields.id]: new FormControl(),
4160
+ [fields.fromId]: new FormControl(this.dependencyIdField === 'toId' ? this.taskId : null, Validators.required),
4161
+ [fields.toId]: new FormControl(this.dependencyIdField === 'fromId' ? this.taskId : null, Validators.required),
4162
+ [fields.type]: new FormControl(null, Validators.required)
4163
+ });
4164
+ this.formGroups.push(formGroup);
4165
+ }
4166
+ removeHandler() {
4167
+ const [selectedIndex] = this.selectedKeys;
4168
+ const item = this.formGroups.at(selectedIndex).value;
4169
+ this.editService.deleteDependency(item);
4170
+ this.formGroups.removeAt(selectedIndex);
4151
4171
  }
4152
4172
  }
4153
- ViewSelectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ViewSelectorComponent, deps: [{ token: i1$1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
4154
- ViewSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ViewSelectorComponent, selector: "kendo-gantt-view-selector", inputs: { views: "views", activeView: "activeView" }, outputs: { activeViewChange: "activeViewChange" }, host: { properties: { "class.k-gantt-views-wrapper": "this.hostClass" } }, ngImport: i0, template: `
4155
- <select
4156
- class="k-dropdownlist k-picker k-rounded-md k-views-dropdown"
4157
- aria-label="View Selector"
4158
- [value]="activeView"
4159
- (change)="onActiveViewChange($event)">
4160
- <option *ngFor="let view of views" [value]="view">{{getViewTypeText(view)}}</option>
4161
- </select>
4162
- <kendo-buttongroup class="k-gantt-views" selection="single" [navigable]="false">
4163
- <button *ngFor="let view of views"
4164
- kendoButton
4165
- type="button"
4166
- [selected]="view === activeView"
4167
- (click)="onClick(view)">{{getViewTypeText(view)}}</button>
4168
- </kendo-buttongroup>
4169
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i4.ButtonGroupComponent, selector: "kendo-buttongroup", inputs: ["disabled", "selection", "width", "tabIndex", "navigable"], outputs: ["navigate"], exportAs: ["kendoButtonGroup"] }, { kind: "component", type: i4.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
4170
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ViewSelectorComponent, decorators: [{
4173
+ DependenciesTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DependenciesTableComponent, deps: [{ token: MappingService }, { token: EditService }, { token: GanttLocalizationService }], target: i0.ɵɵFactoryTarget.Component });
4174
+ DependenciesTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DependenciesTableComponent, isStandalone: true, selector: "kendo-gantt-dependencies-table", inputs: { tasks: "tasks", dependencies: "dependencies", dependencyType: "dependencyType" }, outputs: { dependenciesChange: "dependenciesChange" }, ngImport: i0, template: `
4175
+ <kendo-grid
4176
+ [data]="dependencies"
4177
+ [selectable]="{ mode: 'single' }"
4178
+ [(selectedKeys)]="selectedKeys"
4179
+ kendoGridSelectBy
4180
+ [height]="275"
4181
+ >
4182
+ <ng-template kendoGridToolbarTemplate>
4183
+ <button
4184
+ kendoButton
4185
+ icon="plus"
4186
+ [svgIcon]="plusIcon"
4187
+ (click)="addHandler()"
4188
+ >
4189
+ {{ getText('taskEditingDependenciesAddButtonText') }}
4190
+ </button>
4191
+ <button
4192
+ kendoButton
4193
+ icon="minus"
4194
+ [svgIcon]="minusIcon"
4195
+ [disabled]="selectedKeys.length === 0"
4196
+ (click)="removeHandler()"
4197
+ >
4198
+ {{ getText('taskEditingDependenciesRemoveButtonText') }}
4199
+ </button>
4200
+ </ng-template>
4201
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridNameColumnTitle')" [field]="dependencyIdField">
4202
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4203
+ <kendo-dropdownlist
4204
+ [data]="tasks"
4205
+ textField="title"
4206
+ valueField="id"
4207
+ [valuePrimitive]="true"
4208
+ [formControl]="getFormControl(rowIndex, column.field)"
4209
+ >
4210
+ </kendo-dropdownlist>
4211
+ </ng-template>
4212
+ </kendo-grid-column>
4213
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridTypeColumnTitle')" field="type">
4214
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4215
+ <kendo-dropdownlist
4216
+ [data]="dependencyTypes"
4217
+ textField="type"
4218
+ valueField="id"
4219
+ [valuePrimitive]="true"
4220
+ [formControl]="getFormControl(rowIndex, column.field)"
4221
+ >
4222
+ </kendo-dropdownlist>
4223
+ </ng-template>
4224
+ </kendo-grid-column>
4225
+ </kendo-grid>
4226
+ `, isInline: true, dependencies: [{ kind: "component", type: GridComponent, selector: "kendo-grid", inputs: ["data", "pageSize", "height", "rowHeight", "detailRowHeight", "skip", "scrollable", "selectable", "sort", "size", "trackBy", "filter", "group", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "rowReorderable", "navigable", "navigatable", "autoSize", "rowClass", "rowSticky", "rowSelected", "cellSelected", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "isDetailExpanded", "isGroupExpanded"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "dataStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "directive", type: ToolbarTemplateDirective$1, selector: "[kendoGridToolbarTemplate]", inputs: ["position"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: ColumnComponent$1, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterable", "editable"] }, { kind: "directive", type: CellTemplateDirective$1, selector: "[kendoGridCellTemplate]" }, { kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
4227
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DependenciesTableComponent, decorators: [{
4171
4228
  type: Component,
4172
4229
  args: [{
4173
- selector: 'kendo-gantt-view-selector',
4230
+ selector: 'kendo-gantt-dependencies-table',
4174
4231
  template: `
4175
- <select
4176
- class="k-dropdownlist k-picker k-rounded-md k-views-dropdown"
4177
- aria-label="View Selector"
4178
- [value]="activeView"
4179
- (change)="onActiveViewChange($event)">
4180
- <option *ngFor="let view of views" [value]="view">{{getViewTypeText(view)}}</option>
4181
- </select>
4182
- <kendo-buttongroup class="k-gantt-views" selection="single" [navigable]="false">
4183
- <button *ngFor="let view of views"
4184
- kendoButton
4185
- type="button"
4186
- [selected]="view === activeView"
4187
- (click)="onClick(view)">{{getViewTypeText(view)}}</button>
4188
- </kendo-buttongroup>
4189
- `
4232
+ <kendo-grid
4233
+ [data]="dependencies"
4234
+ [selectable]="{ mode: 'single' }"
4235
+ [(selectedKeys)]="selectedKeys"
4236
+ kendoGridSelectBy
4237
+ [height]="275"
4238
+ >
4239
+ <ng-template kendoGridToolbarTemplate>
4240
+ <button
4241
+ kendoButton
4242
+ icon="plus"
4243
+ [svgIcon]="plusIcon"
4244
+ (click)="addHandler()"
4245
+ >
4246
+ {{ getText('taskEditingDependenciesAddButtonText') }}
4247
+ </button>
4248
+ <button
4249
+ kendoButton
4250
+ icon="minus"
4251
+ [svgIcon]="minusIcon"
4252
+ [disabled]="selectedKeys.length === 0"
4253
+ (click)="removeHandler()"
4254
+ >
4255
+ {{ getText('taskEditingDependenciesRemoveButtonText') }}
4256
+ </button>
4257
+ </ng-template>
4258
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridNameColumnTitle')" [field]="dependencyIdField">
4259
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4260
+ <kendo-dropdownlist
4261
+ [data]="tasks"
4262
+ textField="title"
4263
+ valueField="id"
4264
+ [valuePrimitive]="true"
4265
+ [formControl]="getFormControl(rowIndex, column.field)"
4266
+ >
4267
+ </kendo-dropdownlist>
4268
+ </ng-template>
4269
+ </kendo-grid-column>
4270
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridTypeColumnTitle')" field="type">
4271
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4272
+ <kendo-dropdownlist
4273
+ [data]="dependencyTypes"
4274
+ textField="type"
4275
+ valueField="id"
4276
+ [valuePrimitive]="true"
4277
+ [formControl]="getFormControl(rowIndex, column.field)"
4278
+ >
4279
+ </kendo-dropdownlist>
4280
+ </ng-template>
4281
+ </kendo-grid-column>
4282
+ </kendo-grid>
4283
+ `,
4284
+ standalone: true,
4285
+ imports: [GridComponent, SelectionDirective, ToolbarTemplateDirective$1, ButtonComponent, ColumnComponent$1, CellTemplateDirective$1, DropDownListComponent, ReactiveFormsModule]
4190
4286
  }]
4191
- }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }]; }, propDecorators: { hostClass: [{
4192
- type: HostBinding,
4193
- args: ['class.k-gantt-views-wrapper']
4194
- }], views: [{
4287
+ }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: GanttLocalizationService }]; }, propDecorators: { tasks: [{
4195
4288
  type: Input
4196
- }], activeView: [{
4289
+ }], dependencies: [{
4197
4290
  type: Input
4198
- }], activeViewChange: [{
4291
+ }], dependencyType: [{
4292
+ type: Input
4293
+ }], dependenciesChange: [{
4199
4294
  type: Output
4200
4295
  }] } });
4201
4296
 
4202
4297
  /**
4203
- * The UI for adding new items to the Gantt.
4204
- * Use it within a toolbar template to provide a custom icon or list of options.
4298
+ * @hidden
4205
4299
  */
4206
- class GanttAddTaskComponent {
4207
- constructor(localizationService, editService, ngZone) {
4208
- this.localizationService = localizationService;
4300
+ class TaskFieldsComponent {
4301
+ constructor(mapper, editService, localizationService) {
4302
+ this.mapper = mapper;
4209
4303
  this.editService = editService;
4210
- this.ngZone = ngZone;
4211
- /**
4212
- * Sets the data of the DropDownButton.
4213
- * > The data has to be provided in an array-like list.
4214
- */
4215
- this.data = [{
4216
- text: this.getText('addChildText'),
4217
- type: 'addChild'
4218
- }, {
4219
- text: this.getText('addAboveText'),
4220
- type: 'addAbove'
4221
- }, {
4222
- text: this.getText('addBelowText'),
4223
- type: 'addBelow'
4224
- }];
4225
- /**
4226
- * Defines the name of an existing icon in a Kendo UI theme.
4227
- * @default 'plus'
4228
- */
4229
- this.icon = 'plus';
4230
- /**
4231
- * Defines an [`SVGIcon`](slug:api_icons_svgicon) icon to be rendered inside the `GanttAddTaskComponent` using
4232
- * a [`KendoSVGIcon`](slug:api_icons_svgiconcomponent) component.
4233
- */
4234
- this.svgIcon = plusIcon;
4304
+ this.localizationService = localizationService;
4235
4305
  }
4236
4306
  /**
4237
4307
  * @hidden
4238
4308
  */
4239
- getText(message) {
4240
- return this.localizationService.get(message);
4309
+ get formGroup() {
4310
+ return this.editService.taskFormGroup;
4241
4311
  }
4242
- /**
4243
- * @hidden
4244
- */
4245
- handleOpen(e) {
4246
- if (!this.editService.getSelectedItem()) {
4247
- e.preventDefault();
4248
- }
4249
- }
4250
- /**
4251
- * @hidden
4252
- */
4253
- handleMouseClick() {
4254
- if (!this.editService.getSelectedItem()) {
4255
- this.ngZone.run(() => {
4256
- this.editService.addEvent.next({
4257
- selectedItem: null,
4258
- actionType: 'addTask'
4259
- });
4260
- });
4261
- }
4262
- }
4263
- /**
4264
- * @hidden
4265
- */
4266
- handleItemClick(e) {
4267
- this.editService.addEvent.next({
4268
- actionType: e.type,
4269
- selectedItem: null
4270
- });
4312
+ getText(token) {
4313
+ return this.localizationService.get(token);
4271
4314
  }
4272
4315
  }
4273
- GanttAddTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttAddTaskComponent, deps: [{ token: i1$1.LocalizationService }, { token: EditService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
4274
- GanttAddTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttAddTaskComponent, selector: "kendo-gantt-add-task", inputs: { data: "data", icon: "icon", svgIcon: "svgIcon" }, ngImport: i0, template: `
4275
- <kendo-dropdownbutton
4276
- [data]="data"
4277
- [icon]="icon"
4278
- [svgIcon]="svgIcon"
4279
- [kendoEventsOutsideAngular]="{ click: handleMouseClick }"
4280
- [scope]="this"
4281
- (itemClick)="handleItemClick($event)"
4282
- (open)="handleOpen($event)">
4283
- {{ getText('addTaskText') }}
4284
- </kendo-dropdownbutton>
4285
- `, isInline: true, dependencies: [{ kind: "directive", type: i11.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { kind: "component", type: i4.DropDownButtonComponent, selector: "kendo-dropdownbutton", inputs: ["arrowIcon", "icon", "svgIcon", "iconClass", "imageUrl", "textField", "data", "size", "rounded", "fillMode", "themeColor", "buttonAttributes"], outputs: ["itemClick", "focus", "blur"], exportAs: ["kendoDropDownButton"] }] });
4286
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttAddTaskComponent, decorators: [{
4316
+ TaskFieldsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TaskFieldsComponent, deps: [{ token: MappingService }, { token: EditService }, { token: GanttLocalizationService }], target: i0.ɵɵFactoryTarget.Component });
4317
+ TaskFieldsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TaskFieldsComponent, isStandalone: true, selector: "kendo-gantt-task-fields", ngImport: i0, template: `
4318
+ <form class="k-form k-form-md" [formGroup]="formGroup">
4319
+ <kendo-formfield *ngIf="formGroup.get(mapper.taskFields.title)">
4320
+ <kendo-label [for]="title" [text]="getText('titleFieldInputLabel')"></kendo-label>
4321
+ <input #title kendoTextBox [formControlName]="mapper.taskFields.title" />
4322
+ </kendo-formfield>
4323
+ <div class="k-hstack">
4324
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.start)">
4325
+ <kendo-label [for]="start" [text]="getText('startFieldInputLabel')"></kendo-label>
4326
+ <kendo-datetimepicker #start [formControlName]="mapper.taskFields.start"></kendo-datetimepicker>
4327
+ </kendo-formfield>
4328
+ <kendo-treelist-spacer></kendo-treelist-spacer>
4329
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.end)">
4330
+ <kendo-label [for]="end" [text]="getText('endFieldInputLabel')"></kendo-label>
4331
+ <kendo-datetimepicker #end [formControlName]="mapper.taskFields.end"></kendo-datetimepicker>
4332
+ </kendo-formfield>
4333
+ </div>
4334
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.completionRatio)">
4335
+ <kendo-label [for]="completionRatio" [text]="getText('completionRatioFieldInputLabel')"></kendo-label>
4336
+ <kendo-numerictextbox
4337
+ #completionRatio
4338
+ [formControlName]="mapper.taskFields.completionRatio"
4339
+ [min]="0"
4340
+ [max]="1"
4341
+ [decimals]="2"
4342
+ format="p2"
4343
+ [step]="0.01"
4344
+ ></kendo-numerictextbox>
4345
+ </kendo-formfield>
4346
+ </form>
4347
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FormFieldComponent, selector: "kendo-formfield", inputs: ["showHints", "orientation", "showErrors"] }, { kind: "component", type: LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { kind: "directive", type: TextBoxDirective, selector: "input[kendoTextBox]", inputs: ["value"] }, { kind: "component", type: DateTimePickerComponent, selector: "kendo-datetimepicker", inputs: ["focusableId", "weekDaysFormat", "showOtherMonthDays", "value", "format", "twoDigitYearMax", "tabindex", "disabledDates", "popupSettings", "title", "subtitle", "disabled", "readonly", "readOnlyInput", "cancelButton", "formatPlaceholder", "placeholder", "steps", "focusedDate", "calendarType", "animateCalendarNavigation", "weekNumber", "min", "max", "rangeValidation", "disabledDatesValidation", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "clearButton", "autoFill", "adaptiveMode", "inputAttributes", "defaultTab", "size", "rounded", "fillMode", "headerTemplate", "footerTemplate", "footer"], outputs: ["valueChange", "open", "close", "focus", "blur", "escape"], exportAs: ["kendo-datetimepicker"] }, { kind: "component", type: TreeListSpacerComponent, selector: "kendo-treelist-spacer, kendo-treelist-pager-spacer", inputs: ["width"] }, { kind: "component", type: NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }] });
4348
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TaskFieldsComponent, decorators: [{
4287
4349
  type: Component,
4288
4350
  args: [{
4289
- selector: 'kendo-gantt-add-task',
4351
+ selector: 'kendo-gantt-task-fields',
4290
4352
  template: `
4291
- <kendo-dropdownbutton
4292
- [data]="data"
4293
- [icon]="icon"
4294
- [svgIcon]="svgIcon"
4295
- [kendoEventsOutsideAngular]="{ click: handleMouseClick }"
4296
- [scope]="this"
4297
- (itemClick)="handleItemClick($event)"
4298
- (open)="handleOpen($event)">
4299
- {{ getText('addTaskText') }}
4300
- </kendo-dropdownbutton>
4301
- `
4353
+ <form class="k-form k-form-md" [formGroup]="formGroup">
4354
+ <kendo-formfield *ngIf="formGroup.get(mapper.taskFields.title)">
4355
+ <kendo-label [for]="title" [text]="getText('titleFieldInputLabel')"></kendo-label>
4356
+ <input #title kendoTextBox [formControlName]="mapper.taskFields.title" />
4357
+ </kendo-formfield>
4358
+ <div class="k-hstack">
4359
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.start)">
4360
+ <kendo-label [for]="start" [text]="getText('startFieldInputLabel')"></kendo-label>
4361
+ <kendo-datetimepicker #start [formControlName]="mapper.taskFields.start"></kendo-datetimepicker>
4362
+ </kendo-formfield>
4363
+ <kendo-treelist-spacer></kendo-treelist-spacer>
4364
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.end)">
4365
+ <kendo-label [for]="end" [text]="getText('endFieldInputLabel')"></kendo-label>
4366
+ <kendo-datetimepicker #end [formControlName]="mapper.taskFields.end"></kendo-datetimepicker>
4367
+ </kendo-formfield>
4368
+ </div>
4369
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.completionRatio)">
4370
+ <kendo-label [for]="completionRatio" [text]="getText('completionRatioFieldInputLabel')"></kendo-label>
4371
+ <kendo-numerictextbox
4372
+ #completionRatio
4373
+ [formControlName]="mapper.taskFields.completionRatio"
4374
+ [min]="0"
4375
+ [max]="1"
4376
+ [decimals]="2"
4377
+ format="p2"
4378
+ [step]="0.01"
4379
+ ></kendo-numerictextbox>
4380
+ </kendo-formfield>
4381
+ </form>
4382
+ `,
4383
+ standalone: true,
4384
+ imports: [ReactiveFormsModule, NgIf, FormFieldComponent, LabelComponent, TextBoxDirective, DateTimePickerComponent, TreeListSpacerComponent, NumericTextBoxComponent]
4302
4385
  }]
4303
- }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }, { type: EditService }, { type: i0.NgZone }]; }, propDecorators: { data: [{
4304
- type: Input
4305
- }], icon: [{
4306
- type: Input
4307
- }], svgIcon: [{
4308
- type: Input
4309
- }] } });
4386
+ }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: GanttLocalizationService }]; } });
4310
4387
 
4311
4388
  /**
4312
4389
  * @hidden
4313
4390
  */
4314
- class ToolbarComponent {
4315
- constructor(hostEl, navigationService) {
4316
- this.hostEl = hostEl;
4317
- this.navigationService = navigationService;
4318
- this.context = {};
4319
- this.role = 'toolbar';
4320
- this.toolbarSizingClass = true;
4321
- this.activeViewChange = new EventEmitter();
4391
+ class EditDialogComponent {
4392
+ constructor(mapper, editService, cdr, localizationService) {
4393
+ this.mapper = mapper;
4394
+ this.editService = editService;
4395
+ this.cdr = cdr;
4396
+ this.localizationService = localizationService;
4397
+ this.saveIcon = saveIcon;
4398
+ this.cancelIcon = cancelOutlineIcon;
4399
+ this.deleteIcon = trashIcon;
4322
4400
  }
4323
- clickHandler(ev) {
4324
- if (this.navigable) {
4325
- const closestFocusable = closest(ev.target, isFocusable);
4326
- const targetIndex = this.navigationService.focusableContent.indexOf(closestFocusable);
4327
- if (targetIndex > -1) {
4328
- this.navigationService.focusIndex = targetIndex;
4329
- }
4330
- this.navigationService.updateFocus();
4331
- }
4401
+ ngOnInit() {
4402
+ this.editService.loadTasks(this.data).subscribe(value => {
4403
+ this.loadedTasks = value;
4404
+ });
4332
4405
  }
4333
- arrowLeftListener() {
4334
- if (this.navigable && isDocumentAvailable()) {
4335
- this.navigationService.focusIndex--;
4336
- if (this.navigationService.focusIndex < 0) {
4337
- this.navigationService.focusIndex = this.navigationService.focusableContent.length - 1;
4338
- }
4339
- this.navigationService.updateFocus();
4340
- }
4406
+ get predecessors() {
4407
+ return this.editService.predecessors;
4341
4408
  }
4342
- arrowRightListener() {
4343
- if (this.navigable && isDocumentAvailable()) {
4344
- this.navigationService.focusIndex++;
4345
- if (this.navigationService.focusIndex >= this.navigationService.focusableContent.length) {
4346
- this.navigationService.focusIndex = 0;
4347
- }
4348
- this.navigationService.updateFocus();
4349
- }
4409
+ set predecessors(items) {
4410
+ this.editService.predecessors = items;
4350
4411
  }
4351
- set position(value) {
4352
- this.context.position = this._position = value;
4412
+ get successors() {
4413
+ return this.editService.successors;
4353
4414
  }
4354
- get position() {
4355
- return this._position;
4415
+ set successors(items) {
4416
+ this.editService.successors = items;
4356
4417
  }
4357
- get toolbarTemplateRef() {
4358
- return this.toolbarTemplate ? this.toolbarTemplate.templateRef : undefined;
4418
+ getText(token) {
4419
+ return this.localizationService.get(token);
4359
4420
  }
4360
- get renderTemplate() {
4361
- const ganttToolbarTemplate = this.toolbarTemplate;
4362
- const templatePosition = ganttToolbarTemplate ? ganttToolbarTemplate.position : null;
4363
- return ganttToolbarTemplate && (templatePosition === 'both' || templatePosition === this.position);
4421
+ getDependencyType(typeId) {
4422
+ return DependencyType[typeId];
4364
4423
  }
4365
- handleViewChange(view) {
4366
- this.activeViewChange.emit(view);
4424
+ handleEditingResult(editResultType) {
4425
+ this.editService.triggerEditEvent(editResultType);
4367
4426
  }
4368
- ngAfterViewInit() {
4369
- if (isDocumentAvailable()) {
4370
- const focusableElements = Array.from(this.hostEl.nativeElement.querySelectorAll(focusableSelector) || [])
4371
- .filter(el => isVisible(el));
4372
- if (focusableElements.length) {
4373
- this.navigationService.focusableContent = focusableElements;
4374
- }
4375
- }
4427
+ handleTaskDelete() {
4428
+ this.editService.taskDelete.next(this.editService.dataItem);
4376
4429
  }
4377
4430
  }
4378
- ToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarComponent, deps: [{ token: i0.ElementRef }, { token: ToolbarNavigationService }], target: i0.ɵɵFactoryTarget.Component });
4379
- ToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ToolbarComponent, selector: "kendo-gantt-toolbar", inputs: { showAddTask: "showAddTask", showViewSelector: "showViewSelector", views: "views", activeView: "activeView", toolbarTemplate: "toolbarTemplate", navigable: "navigable", position: "position" }, outputs: { activeViewChange: "activeViewChange" }, host: { listeners: { "click": "clickHandler($event)", "keydown.arrowleft": "arrowLeftListener($event)", "keydown.arrowright": "arrowRightListener($event)" }, properties: { "attr.role": "this.role", "class.k-toolbar-md": "this.toolbarSizingClass" } }, providers: [ToolbarNavigationService], ngImport: i0, template: `
4380
- <ng-container *ngIf="!renderTemplate">
4381
- <kendo-gantt-add-task *ngIf="showAddTask"></kendo-gantt-add-task>
4382
- <span class="k-spacer k-toolbar-spacer"></span>
4383
- <kendo-gantt-view-selector
4384
- *ngIf="showViewSelector"
4385
- [views]="views"
4386
- [activeView]="activeView"
4387
- (activeViewChange)="handleViewChange($event)"></kendo-gantt-view-selector>
4388
- </ng-container>
4389
- <ng-template
4390
- *ngIf="renderTemplate"
4391
- [ngTemplateOutlet]="toolbarTemplateRef"
4392
- [ngTemplateOutletContext]="context"
4393
- >
4394
- </ng-template>
4395
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ViewSelectorComponent, selector: "kendo-gantt-view-selector", inputs: ["views", "activeView"], outputs: ["activeViewChange"] }, { kind: "component", type: GanttAddTaskComponent, selector: "kendo-gantt-add-task", inputs: ["data", "icon", "svgIcon"] }] });
4396
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarComponent, decorators: [{
4397
- type: Component,
4398
- args: [{
4399
- selector: 'kendo-gantt-toolbar',
4400
- providers: [ToolbarNavigationService],
4401
- template: `
4402
- <ng-container *ngIf="!renderTemplate">
4403
- <kendo-gantt-add-task *ngIf="showAddTask"></kendo-gantt-add-task>
4404
- <span class="k-spacer k-toolbar-spacer"></span>
4405
- <kendo-gantt-view-selector
4406
- *ngIf="showViewSelector"
4407
- [views]="views"
4408
- [activeView]="activeView"
4409
- (activeViewChange)="handleViewChange($event)"></kendo-gantt-view-selector>
4410
- </ng-container>
4411
- <ng-template
4412
- *ngIf="renderTemplate"
4413
- [ngTemplateOutlet]="toolbarTemplateRef"
4414
- [ngTemplateOutletContext]="context"
4415
- >
4416
- </ng-template>
4417
- `
4418
- }]
4419
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ToolbarNavigationService }]; }, propDecorators: { role: [{
4420
- type: HostBinding,
4421
- args: ['attr.role']
4422
- }], toolbarSizingClass: [{
4423
- type: HostBinding,
4424
- args: ['class.k-toolbar-md']
4425
- }], clickHandler: [{
4426
- type: HostListener,
4427
- args: ['click', ['$event']]
4428
- }], arrowLeftListener: [{
4429
- type: HostListener,
4430
- args: ['keydown.arrowleft', ['$event']]
4431
- }], arrowRightListener: [{
4432
- type: HostListener,
4433
- args: ['keydown.arrowright', ['$event']]
4434
- }], activeViewChange: [{
4435
- type: Output
4436
- }], showAddTask: [{
4437
- type: Input
4438
- }], showViewSelector: [{
4439
- type: Input
4440
- }], views: [{
4441
- type: Input
4442
- }], activeView: [{
4443
- type: Input
4444
- }], toolbarTemplate: [{
4445
- type: Input
4446
- }], navigable: [{
4447
- type: Input
4448
- }], position: [{
4449
- type: Input
4450
- }] } });
4431
+ EditDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditDialogComponent, deps: [{ token: MappingService }, { token: EditService }, { token: i0.ChangeDetectorRef }, { token: i1$1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
4432
+ EditDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EditDialogComponent, isStandalone: true, selector: "kendo-gantt-edit-dialog", inputs: { data: "data" }, ngImport: i0, template: `
4433
+ <kendo-dialog
4434
+ [title]="getText('taskEditingDialogTitle')"
4435
+ [width]="575"
4436
+ [height]="470"
4437
+ [autoFocusedElement]="'.k-actions .k-button-solid-primary'"
4438
+ (close)="handleEditingResult('cancel')">
4439
+ <kendo-dialog-messages
4440
+ [closeTitle]="getText('taskEditingDialogCloseTitle')"></kendo-dialog-messages>
4451
4441
 
4452
- /**
4453
- * @hidden
4454
- */
4455
- class DependenciesTableComponent {
4456
- constructor(mapper, editService, localizationService) {
4457
- this.mapper = mapper;
4458
- this.editService = editService;
4459
- this.localizationService = localizationService;
4460
- this.dependenciesChange = new EventEmitter();
4461
- this.selectedKeys = [];
4462
- this.formGroups = new FormArray([]);
4463
- this.dependencyTypes = this.getDependencyTypes();
4464
- this.plusIcon = plusIcon;
4465
- this.minusIcon = minusIcon;
4466
- }
4467
- get taskId() {
4468
- return this.editService.dataItem.id;
4469
- }
4470
- // The target dependency id field
4471
- // e.g. if Predecessors, we have the `fromId` which is the currently edited task,
4472
- // while the `toId` is missing (needs to be selected by the user)
4473
- get dependencyIdField() {
4474
- return this.dependencyType === 'predecessor' ? 'fromId' : 'toId';
4475
- }
4476
- ngOnInit() {
4477
- // generate the FormGroups per each Grid row
4478
- if (this.formGroups.controls.length === 0) {
4479
- const fields = this.mapper.dependencyFields;
4480
- this.dependencies.forEach(item => {
4481
- const formGroup = new FormGroup({
4482
- [fields.id]: new FormControl(this.mapper.extractFromDependency(item, 'id')),
4483
- [fields.fromId]: new FormControl(this.mapper.extractFromDependency(item, 'fromId'), Validators.required),
4484
- [fields.toId]: new FormControl(this.mapper.extractFromDependency(item, 'toId'), Validators.required),
4485
- [fields.type]: new FormControl(this.mapper.extractFromDependency(item, 'type'), Validators.required)
4486
- });
4487
- this.formGroups.push(formGroup);
4488
- });
4489
- }
4490
- this.formGroups.valueChanges.subscribe(val => {
4491
- this.formGroups.controls.forEach(control => {
4492
- if (control.dirty) {
4493
- this.editService.updateDependencies(control.value);
4494
- }
4495
- });
4496
- this.dependenciesChange.emit(val);
4497
- });
4498
- }
4499
- getFormControl(dataItemIndex, field) {
4500
- // return the FormControl for the respective column editor
4501
- return this.formGroups.controls
4502
- .find((_control, index) => index === dataItemIndex)
4503
- .get(this.mapper.dependencyFields[field]);
4504
- }
4505
- getText(token) {
4506
- return this.localizationService.get(token);
4507
- }
4508
- getDependencyTypes() {
4509
- const types = Object.keys(DependencyType)
4510
- .filter(value => typeof DependencyType[value] === 'number')
4511
- .map(type => {
4512
- return {
4513
- type,
4514
- id: DependencyType[type]
4515
- };
4516
- });
4517
- return types;
4518
- }
4519
- addHandler() {
4520
- const fields = this.mapper.dependencyFields;
4521
- const formGroup = new FormGroup({
4522
- [fields.id]: new FormControl(),
4523
- [fields.fromId]: new FormControl(this.dependencyIdField === 'toId' ? this.taskId : null, Validators.required),
4524
- [fields.toId]: new FormControl(this.dependencyIdField === 'fromId' ? this.taskId : null, Validators.required),
4525
- [fields.type]: new FormControl(null, Validators.required)
4526
- });
4527
- this.formGroups.push(formGroup);
4528
- }
4529
- removeHandler() {
4530
- const [selectedIndex] = this.selectedKeys;
4531
- const item = this.formGroups.at(selectedIndex).value;
4532
- this.editService.deleteDependency(item);
4533
- this.formGroups.removeAt(selectedIndex);
4534
- }
4535
- }
4536
- DependenciesTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DependenciesTableComponent, deps: [{ token: MappingService }, { token: EditService }, { token: GanttLocalizationService }], target: i0.ɵɵFactoryTarget.Component });
4537
- DependenciesTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DependenciesTableComponent, selector: "kendo-gantt-dependencies-table", inputs: { tasks: "tasks", dependencies: "dependencies", dependencyType: "dependencyType" }, outputs: { dependenciesChange: "dependenciesChange" }, ngImport: i0, template: `
4538
- <kendo-grid
4539
- [data]="dependencies"
4540
- [selectable]="{ mode: 'single' }"
4541
- [(selectedKeys)]="selectedKeys"
4542
- kendoGridSelectBy
4543
- [height]="275"
4544
- >
4545
- <ng-template kendoGridToolbarTemplate>
4442
+ <kendo-tabstrip [keepTabContent]="true" [style.height.px]="345">
4443
+ <kendo-tabstrip-tab [title]="getText('taskEditingGeneralTabTitle')" [selected]="true">
4444
+ <ng-template kendoTabContent>
4445
+ <kendo-gantt-task-fields></kendo-gantt-task-fields>
4446
+ </ng-template>
4447
+ </kendo-tabstrip-tab>
4448
+ <kendo-tabstrip-tab [title]="getText('taskEditingPredecessorsTabTitle')">
4449
+ <ng-template kendoTabContent>
4450
+ <kendo-gantt-dependencies-table
4451
+ [tasks]="loadedTasks"
4452
+ [(dependencies)]="predecessors"
4453
+ dependencyType="predecessor"
4454
+ >
4455
+ </kendo-gantt-dependencies-table>
4456
+ </ng-template>
4457
+ </kendo-tabstrip-tab>
4458
+ <kendo-tabstrip-tab [title]="getText('taskEditingSuccessorsTabTitle')">
4459
+ <ng-template kendoTabContent>
4460
+ <kendo-gantt-dependencies-table
4461
+ [tasks]="loadedTasks"
4462
+ [(dependencies)]="successors"
4463
+ dependencyType="successor">
4464
+ </kendo-gantt-dependencies-table>
4465
+ </ng-template>
4466
+ </kendo-tabstrip-tab>
4467
+ </kendo-tabstrip>
4468
+
4469
+ <kendo-dialog-actions layout="start">
4546
4470
  <button
4547
4471
  kendoButton
4548
- icon="plus"
4549
- [svgIcon]="plusIcon"
4550
- (click)="addHandler()"
4472
+ themeColor="primary"
4473
+ icon="save"
4474
+ [svgIcon]="saveIcon"
4475
+ (click)="handleEditingResult('save')"
4551
4476
  >
4552
- {{ getText('taskEditingDependenciesAddButtonText') }}
4477
+ {{ getText('saveButtonText') }}
4553
4478
  </button>
4554
4479
  <button
4555
4480
  kendoButton
4556
- icon="minus"
4557
- [svgIcon]="minusIcon"
4558
- [disabled]="selectedKeys.length === 0"
4559
- (click)="removeHandler()"
4481
+ icon="cancel-outline"
4482
+ [svgIcon]="cancelIcon"
4483
+ (click)="handleEditingResult('cancel')"
4560
4484
  >
4561
- {{ getText('taskEditingDependenciesRemoveButtonText') }}
4485
+ {{ getText('cancelButtonText') }}
4562
4486
  </button>
4563
- </ng-template>
4564
- <kendo-grid-column [title]="getText('taskEditingDependenciesGridNameColumnTitle')" [field]="dependencyIdField">
4565
- <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4566
- <kendo-dropdownlist
4567
- [data]="tasks"
4568
- textField="title"
4569
- valueField="id"
4570
- [valuePrimitive]="true"
4571
- [formControl]="getFormControl(rowIndex, column.field)"
4572
- >
4573
- </kendo-dropdownlist>
4574
- </ng-template>
4575
- </kendo-grid-column>
4576
- <kendo-grid-column [title]="getText('taskEditingDependenciesGridTypeColumnTitle')" field="type">
4577
- <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4578
- <kendo-dropdownlist
4579
- [data]="dependencyTypes"
4580
- textField="type"
4581
- valueField="id"
4582
- [valuePrimitive]="true"
4583
- [formControl]="getFormControl(rowIndex, column.field)"
4584
- >
4585
- </kendo-dropdownlist>
4586
- </ng-template>
4587
- </kendo-grid-column>
4588
- </kendo-grid>
4589
- `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: i6$1.GridComponent, selector: "kendo-grid", inputs: ["data", "pageSize", "height", "rowHeight", "detailRowHeight", "skip", "scrollable", "selectable", "sort", "size", "trackBy", "filter", "group", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "rowReorderable", "navigable", "navigatable", "autoSize", "rowClass", "rowSticky", "rowSelected", "cellSelected", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "isDetailExpanded", "isGroupExpanded"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "dataStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i6$1.ToolbarTemplateDirective, selector: "[kendoGridToolbarTemplate]", inputs: ["position"] }, { kind: "directive", type: i6$1.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i6$1.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterable", "editable"] }, { kind: "directive", type: i6$1.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "component", type: i7.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }] });
4590
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DependenciesTableComponent, decorators: [{
4487
+ <kendo-treelist-spacer></kendo-treelist-spacer>
4488
+ <button
4489
+ kendoButton
4490
+ themeColor="primary"
4491
+ fillMode="flat"
4492
+ icon="delete"
4493
+ [svgIcon]="deleteIcon"
4494
+ [kendoEventsOutsideAngular]="{
4495
+ click: handleTaskDelete
4496
+ }"
4497
+ [scope]="this"
4498
+ >
4499
+ {{ getText('deleteButtonText') }}
4500
+ </button>
4501
+ </kendo-dialog-actions>
4502
+ </kendo-dialog>
4503
+ `, isInline: true, dependencies: [{ kind: "component", type: DialogComponent, selector: "kendo-dialog", inputs: ["actions", "actionsLayout", "autoFocusedElement", "title", "width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight", "animation", "themeColor"], outputs: ["action", "close"], exportAs: ["kendoDialog"] }, { kind: "directive", type: CustomMessagesComponent$1, selector: "kendo-dialog-messages, kendo-window-messages" }, { kind: "component", type: TabStripComponent, selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "closeIcon", "closeIconClass", "closeSVGIcon", "showContentArea"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { kind: "component", type: TabStripTabComponent, selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: TabContentDirective, selector: "[kendoTabContent]" }, { kind: "component", type: TaskFieldsComponent, selector: "kendo-gantt-task-fields" }, { kind: "component", type: DependenciesTableComponent, selector: "kendo-gantt-dependencies-table", inputs: ["tasks", "dependencies", "dependencyType"], outputs: ["dependenciesChange"] }, { kind: "component", type: DialogActionsComponent, selector: "kendo-dialog-actions", inputs: ["actions", "layout"], outputs: ["action"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: TreeListSpacerComponent, selector: "kendo-treelist-spacer, kendo-treelist-pager-spacer", inputs: ["width"] }, { kind: "directive", type: EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }] });
4504
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditDialogComponent, decorators: [{
4591
4505
  type: Component,
4592
4506
  args: [{
4593
- selector: 'kendo-gantt-dependencies-table',
4507
+ selector: 'kendo-gantt-edit-dialog',
4594
4508
  template: `
4595
- <kendo-grid
4596
- [data]="dependencies"
4597
- [selectable]="{ mode: 'single' }"
4598
- [(selectedKeys)]="selectedKeys"
4599
- kendoGridSelectBy
4600
- [height]="275"
4601
- >
4602
- <ng-template kendoGridToolbarTemplate>
4509
+ <kendo-dialog
4510
+ [title]="getText('taskEditingDialogTitle')"
4511
+ [width]="575"
4512
+ [height]="470"
4513
+ [autoFocusedElement]="'.k-actions .k-button-solid-primary'"
4514
+ (close)="handleEditingResult('cancel')">
4515
+ <kendo-dialog-messages
4516
+ [closeTitle]="getText('taskEditingDialogCloseTitle')"></kendo-dialog-messages>
4517
+
4518
+ <kendo-tabstrip [keepTabContent]="true" [style.height.px]="345">
4519
+ <kendo-tabstrip-tab [title]="getText('taskEditingGeneralTabTitle')" [selected]="true">
4520
+ <ng-template kendoTabContent>
4521
+ <kendo-gantt-task-fields></kendo-gantt-task-fields>
4522
+ </ng-template>
4523
+ </kendo-tabstrip-tab>
4524
+ <kendo-tabstrip-tab [title]="getText('taskEditingPredecessorsTabTitle')">
4525
+ <ng-template kendoTabContent>
4526
+ <kendo-gantt-dependencies-table
4527
+ [tasks]="loadedTasks"
4528
+ [(dependencies)]="predecessors"
4529
+ dependencyType="predecessor"
4530
+ >
4531
+ </kendo-gantt-dependencies-table>
4532
+ </ng-template>
4533
+ </kendo-tabstrip-tab>
4534
+ <kendo-tabstrip-tab [title]="getText('taskEditingSuccessorsTabTitle')">
4535
+ <ng-template kendoTabContent>
4536
+ <kendo-gantt-dependencies-table
4537
+ [tasks]="loadedTasks"
4538
+ [(dependencies)]="successors"
4539
+ dependencyType="successor">
4540
+ </kendo-gantt-dependencies-table>
4541
+ </ng-template>
4542
+ </kendo-tabstrip-tab>
4543
+ </kendo-tabstrip>
4544
+
4545
+ <kendo-dialog-actions layout="start">
4603
4546
  <button
4604
4547
  kendoButton
4605
- icon="plus"
4606
- [svgIcon]="plusIcon"
4607
- (click)="addHandler()"
4548
+ themeColor="primary"
4549
+ icon="save"
4550
+ [svgIcon]="saveIcon"
4551
+ (click)="handleEditingResult('save')"
4608
4552
  >
4609
- {{ getText('taskEditingDependenciesAddButtonText') }}
4553
+ {{ getText('saveButtonText') }}
4610
4554
  </button>
4611
4555
  <button
4612
4556
  kendoButton
4613
- icon="minus"
4614
- [svgIcon]="minusIcon"
4615
- [disabled]="selectedKeys.length === 0"
4616
- (click)="removeHandler()"
4557
+ icon="cancel-outline"
4558
+ [svgIcon]="cancelIcon"
4559
+ (click)="handleEditingResult('cancel')"
4617
4560
  >
4618
- {{ getText('taskEditingDependenciesRemoveButtonText') }}
4561
+ {{ getText('cancelButtonText') }}
4619
4562
  </button>
4620
- </ng-template>
4621
- <kendo-grid-column [title]="getText('taskEditingDependenciesGridNameColumnTitle')" [field]="dependencyIdField">
4622
- <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4623
- <kendo-dropdownlist
4624
- [data]="tasks"
4625
- textField="title"
4626
- valueField="id"
4627
- [valuePrimitive]="true"
4628
- [formControl]="getFormControl(rowIndex, column.field)"
4629
- >
4630
- </kendo-dropdownlist>
4631
- </ng-template>
4632
- </kendo-grid-column>
4633
- <kendo-grid-column [title]="getText('taskEditingDependenciesGridTypeColumnTitle')" field="type">
4634
- <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4635
- <kendo-dropdownlist
4636
- [data]="dependencyTypes"
4637
- textField="type"
4638
- valueField="id"
4639
- [valuePrimitive]="true"
4640
- [formControl]="getFormControl(rowIndex, column.field)"
4641
- >
4642
- </kendo-dropdownlist>
4643
- </ng-template>
4644
- </kendo-grid-column>
4645
- </kendo-grid>
4646
- `
4563
+ <kendo-treelist-spacer></kendo-treelist-spacer>
4564
+ <button
4565
+ kendoButton
4566
+ themeColor="primary"
4567
+ fillMode="flat"
4568
+ icon="delete"
4569
+ [svgIcon]="deleteIcon"
4570
+ [kendoEventsOutsideAngular]="{
4571
+ click: handleTaskDelete
4572
+ }"
4573
+ [scope]="this"
4574
+ >
4575
+ {{ getText('deleteButtonText') }}
4576
+ </button>
4577
+ </kendo-dialog-actions>
4578
+ </kendo-dialog>
4579
+ `,
4580
+ standalone: true,
4581
+ imports: [DialogComponent, CustomMessagesComponent$1, TabStripComponent, TabStripTabComponent, TabContentDirective, TaskFieldsComponent, DependenciesTableComponent, DialogActionsComponent, ButtonComponent, TreeListSpacerComponent, EventsOutsideAngularDirective]
4582
+ }]
4583
+ }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: i0.ChangeDetectorRef }, { type: i1$1.LocalizationService }]; }, propDecorators: { data: [{
4584
+ type: Input
4585
+ }] } });
4586
+
4587
+ /**
4588
+ * @hidden
4589
+ */
4590
+ class ToolbarNavigationService {
4591
+ constructor(renderer) {
4592
+ this.renderer = renderer;
4593
+ this.focusIndex = 0;
4594
+ }
4595
+ updateFocus() {
4596
+ this.focusableContent.forEach(el => {
4597
+ this.renderer.setAttribute(el, 'tabindex', '-1');
4598
+ });
4599
+ this.renderer.setAttribute(this.focusableContent[this.focusIndex], 'tabindex', '0');
4600
+ this.focusableContent[this.focusIndex].focus();
4601
+ }
4602
+ }
4603
+ ToolbarNavigationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarNavigationService, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Injectable });
4604
+ ToolbarNavigationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarNavigationService });
4605
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarNavigationService, decorators: [{
4606
+ type: Injectable
4607
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; } });
4608
+
4609
+ /**
4610
+ * The Gantt ViewSelector component. Shows the currently active view type, and allows switching to another view type.
4611
+ */
4612
+ class ViewSelectorComponent {
4613
+ constructor(localizationService) {
4614
+ this.localizationService = localizationService;
4615
+ this.hostClass = true;
4616
+ /**
4617
+ * The currently active view type.
4618
+ * @default 'week'
4619
+ */
4620
+ this.activeView = 'week';
4621
+ /**
4622
+ * Fires each time the user selects a different view type. The event data contains the type of the newly selected view.
4623
+ */
4624
+ this.activeViewChange = new EventEmitter();
4625
+ }
4626
+ /**
4627
+ * @hidden
4628
+ */
4629
+ onClick(viewType) {
4630
+ if (viewType !== this.activeView) {
4631
+ this.activeViewChange.emit(viewType);
4632
+ }
4633
+ }
4634
+ /**
4635
+ * @hidden
4636
+ */
4637
+ getViewTypeText(viewType) {
4638
+ return this.localizationService.get(`${viewType}ViewText`);
4639
+ }
4640
+ /**
4641
+ * @hidden
4642
+ */
4643
+ onActiveViewChange(event) {
4644
+ this.activeViewChange.emit(event.target.value);
4645
+ }
4646
+ }
4647
+ ViewSelectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ViewSelectorComponent, deps: [{ token: i1$1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
4648
+ ViewSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ViewSelectorComponent, isStandalone: true, selector: "kendo-gantt-view-selector", inputs: { views: "views", activeView: "activeView" }, outputs: { activeViewChange: "activeViewChange" }, host: { properties: { "class.k-gantt-views-wrapper": "this.hostClass" } }, ngImport: i0, template: `
4649
+ <select
4650
+ class="k-dropdownlist k-picker k-rounded-md k-views-dropdown"
4651
+ aria-label="View Selector"
4652
+ [value]="activeView"
4653
+ (change)="onActiveViewChange($event)">
4654
+ <option *ngFor="let view of views" [value]="view">{{getViewTypeText(view)}}</option>
4655
+ </select>
4656
+ <kendo-buttongroup class="k-gantt-views" selection="single" [navigable]="false">
4657
+ <button *ngFor="let view of views"
4658
+ kendoButton
4659
+ type="button"
4660
+ [selected]="view === activeView"
4661
+ (click)="onClick(view)">{{getViewTypeText(view)}}</button>
4662
+ </kendo-buttongroup>
4663
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: ButtonGroupComponent, selector: "kendo-buttongroup", inputs: ["disabled", "selection", "width", "tabIndex", "navigable"], outputs: ["navigate"], exportAs: ["kendoButtonGroup"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
4664
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ViewSelectorComponent, decorators: [{
4665
+ type: Component,
4666
+ args: [{
4667
+ selector: 'kendo-gantt-view-selector',
4668
+ template: `
4669
+ <select
4670
+ class="k-dropdownlist k-picker k-rounded-md k-views-dropdown"
4671
+ aria-label="View Selector"
4672
+ [value]="activeView"
4673
+ (change)="onActiveViewChange($event)">
4674
+ <option *ngFor="let view of views" [value]="view">{{getViewTypeText(view)}}</option>
4675
+ </select>
4676
+ <kendo-buttongroup class="k-gantt-views" selection="single" [navigable]="false">
4677
+ <button *ngFor="let view of views"
4678
+ kendoButton
4679
+ type="button"
4680
+ [selected]="view === activeView"
4681
+ (click)="onClick(view)">{{getViewTypeText(view)}}</button>
4682
+ </kendo-buttongroup>
4683
+ `,
4684
+ standalone: true,
4685
+ imports: [NgFor, ReactiveFormsModule, ButtonGroupComponent, ButtonComponent]
4647
4686
  }]
4648
- }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: GanttLocalizationService }]; }, propDecorators: { tasks: [{
4649
- type: Input
4650
- }], dependencies: [{
4687
+ }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }]; }, propDecorators: { hostClass: [{
4688
+ type: HostBinding,
4689
+ args: ['class.k-gantt-views-wrapper']
4690
+ }], views: [{
4651
4691
  type: Input
4652
- }], dependencyType: [{
4692
+ }], activeView: [{
4653
4693
  type: Input
4654
- }], dependenciesChange: [{
4694
+ }], activeViewChange: [{
4655
4695
  type: Output
4656
4696
  }] } });
4657
4697
 
4658
4698
  /**
4659
- * @hidden
4699
+ * The UI for adding new items to the Gantt.
4700
+ * Use it within a toolbar template to provide a custom icon or list of options.
4660
4701
  */
4661
- class TaskFieldsComponent {
4662
- constructor(mapper, editService, localizationService) {
4663
- this.mapper = mapper;
4664
- this.editService = editService;
4702
+ class GanttAddTaskComponent {
4703
+ constructor(localizationService, editService, ngZone) {
4665
4704
  this.localizationService = localizationService;
4705
+ this.editService = editService;
4706
+ this.ngZone = ngZone;
4707
+ /**
4708
+ * Sets the data of the DropDownButton.
4709
+ * > The data has to be provided in an array-like list.
4710
+ */
4711
+ this.data = [{
4712
+ text: this.getText('addChildText'),
4713
+ type: 'addChild'
4714
+ }, {
4715
+ text: this.getText('addAboveText'),
4716
+ type: 'addAbove'
4717
+ }, {
4718
+ text: this.getText('addBelowText'),
4719
+ type: 'addBelow'
4720
+ }];
4721
+ /**
4722
+ * Defines the name of an existing icon in a Kendo UI theme.
4723
+ * @default 'plus'
4724
+ */
4725
+ this.icon = 'plus';
4726
+ /**
4727
+ * Defines an [`SVGIcon`](slug:api_icons_svgicon) icon to be rendered inside the `GanttAddTaskComponent` using
4728
+ * a [`KendoSVGIcon`](slug:api_icons_svgiconcomponent) component.
4729
+ */
4730
+ this.svgIcon = plusIcon;
4666
4731
  }
4667
4732
  /**
4668
4733
  * @hidden
4669
4734
  */
4670
- get formGroup() {
4671
- return this.editService.taskFormGroup;
4735
+ getText(message) {
4736
+ return this.localizationService.get(message);
4672
4737
  }
4673
- getText(token) {
4674
- return this.localizationService.get(token);
4738
+ /**
4739
+ * @hidden
4740
+ */
4741
+ handleOpen(e) {
4742
+ if (!this.editService.getSelectedItem()) {
4743
+ e.preventDefault();
4744
+ }
4745
+ }
4746
+ /**
4747
+ * @hidden
4748
+ */
4749
+ handleMouseClick() {
4750
+ if (!this.editService.getSelectedItem()) {
4751
+ this.ngZone.run(() => {
4752
+ this.editService.addEvent.next({
4753
+ selectedItem: null,
4754
+ actionType: 'addTask'
4755
+ });
4756
+ });
4757
+ }
4758
+ }
4759
+ /**
4760
+ * @hidden
4761
+ */
4762
+ handleItemClick(e) {
4763
+ this.editService.addEvent.next({
4764
+ actionType: e.type,
4765
+ selectedItem: null
4766
+ });
4675
4767
  }
4676
4768
  }
4677
- TaskFieldsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TaskFieldsComponent, deps: [{ token: MappingService }, { token: EditService }, { token: GanttLocalizationService }], target: i0.ɵɵFactoryTarget.Component });
4678
- TaskFieldsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TaskFieldsComponent, selector: "kendo-gantt-task-fields", ngImport: i0, template: `
4679
- <form class="k-form k-form-md" [formGroup]="formGroup">
4680
- <kendo-formfield *ngIf="formGroup.get(mapper.taskFields.title)">
4681
- <kendo-label [for]="title" [text]="getText('titleFieldInputLabel')"></kendo-label>
4682
- <input #title kendoTextBox [formControlName]="mapper.taskFields.title" />
4683
- </kendo-formfield>
4684
- <div class="k-hstack">
4685
- <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.start)">
4686
- <kendo-label [for]="start" [text]="getText('startFieldInputLabel')"></kendo-label>
4687
- <kendo-datetimepicker #start [formControlName]="mapper.taskFields.start"></kendo-datetimepicker>
4688
- </kendo-formfield>
4689
- <kendo-treelist-spacer></kendo-treelist-spacer>
4690
- <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.end)">
4691
- <kendo-label [for]="end" [text]="getText('endFieldInputLabel')"></kendo-label>
4692
- <kendo-datetimepicker #end [formControlName]="mapper.taskFields.end"></kendo-datetimepicker>
4693
- </kendo-formfield>
4694
- </div>
4695
- <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.completionRatio)">
4696
- <kendo-label [for]="completionRatio" [text]="getText('completionRatioFieldInputLabel')"></kendo-label>
4697
- <kendo-numerictextbox
4698
- #completionRatio
4699
- [formControlName]="mapper.taskFields.completionRatio"
4700
- [min]="0"
4701
- [max]="1"
4702
- [decimals]="2"
4703
- format="p2"
4704
- [step]="0.01"
4705
- ></kendo-numerictextbox>
4706
- </kendo-formfield>
4707
- </form>
4708
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6$2.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { kind: "directive", type: i7$1.TextBoxDirective, selector: "input[kendoTextBox]", inputs: ["value"] }, { kind: "component", type: i7$1.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "component", type: i7$1.FormFieldComponent, selector: "kendo-formfield", inputs: ["showHints", "orientation", "showErrors"] }, { kind: "component", type: i8.DateTimePickerComponent, selector: "kendo-datetimepicker", inputs: ["focusableId", "weekDaysFormat", "showOtherMonthDays", "value", "format", "twoDigitYearMax", "tabindex", "disabledDates", "popupSettings", "title", "subtitle", "disabled", "readonly", "readOnlyInput", "cancelButton", "formatPlaceholder", "placeholder", "steps", "focusedDate", "calendarType", "animateCalendarNavigation", "weekNumber", "min", "max", "rangeValidation", "disabledDatesValidation", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "clearButton", "autoFill", "adaptiveMode", "inputAttributes", "defaultTab", "size", "rounded", "fillMode", "headerTemplate", "footerTemplate", "footer"], outputs: ["valueChange", "open", "close", "focus", "blur", "escape"], exportAs: ["kendo-datetimepicker"] }, { kind: "component", type: i14.TreeListSpacerComponent, selector: "kendo-treelist-spacer, kendo-treelist-pager-spacer", inputs: ["width"] }] });
4709
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TaskFieldsComponent, decorators: [{
4769
+ GanttAddTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttAddTaskComponent, deps: [{ token: i1$1.LocalizationService }, { token: EditService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
4770
+ GanttAddTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttAddTaskComponent, isStandalone: true, selector: "kendo-gantt-add-task", inputs: { data: "data", icon: "icon", svgIcon: "svgIcon" }, ngImport: i0, template: `
4771
+ <kendo-dropdownbutton
4772
+ [data]="data"
4773
+ [icon]="icon"
4774
+ [svgIcon]="svgIcon"
4775
+ [kendoEventsOutsideAngular]="{ click: handleMouseClick }"
4776
+ [scope]="this"
4777
+ (itemClick)="handleItemClick($event)"
4778
+ (open)="handleOpen($event)">
4779
+ {{ getText('addTaskText') }}
4780
+ </kendo-dropdownbutton>
4781
+ `, isInline: true, dependencies: [{ kind: "component", type: DropDownButtonComponent, selector: "kendo-dropdownbutton", inputs: ["arrowIcon", "icon", "svgIcon", "iconClass", "imageUrl", "textField", "data", "size", "rounded", "fillMode", "themeColor", "buttonAttributes"], outputs: ["itemClick", "focus", "blur"], exportAs: ["kendoDropDownButton"] }, { kind: "directive", type: EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }] });
4782
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttAddTaskComponent, decorators: [{
4710
4783
  type: Component,
4711
4784
  args: [{
4712
- selector: 'kendo-gantt-task-fields',
4785
+ selector: 'kendo-gantt-add-task',
4713
4786
  template: `
4714
- <form class="k-form k-form-md" [formGroup]="formGroup">
4715
- <kendo-formfield *ngIf="formGroup.get(mapper.taskFields.title)">
4716
- <kendo-label [for]="title" [text]="getText('titleFieldInputLabel')"></kendo-label>
4717
- <input #title kendoTextBox [formControlName]="mapper.taskFields.title" />
4718
- </kendo-formfield>
4719
- <div class="k-hstack">
4720
- <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.start)">
4721
- <kendo-label [for]="start" [text]="getText('startFieldInputLabel')"></kendo-label>
4722
- <kendo-datetimepicker #start [formControlName]="mapper.taskFields.start"></kendo-datetimepicker>
4723
- </kendo-formfield>
4724
- <kendo-treelist-spacer></kendo-treelist-spacer>
4725
- <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.end)">
4726
- <kendo-label [for]="end" [text]="getText('endFieldInputLabel')"></kendo-label>
4727
- <kendo-datetimepicker #end [formControlName]="mapper.taskFields.end"></kendo-datetimepicker>
4728
- </kendo-formfield>
4729
- </div>
4730
- <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.completionRatio)">
4731
- <kendo-label [for]="completionRatio" [text]="getText('completionRatioFieldInputLabel')"></kendo-label>
4732
- <kendo-numerictextbox
4733
- #completionRatio
4734
- [formControlName]="mapper.taskFields.completionRatio"
4735
- [min]="0"
4736
- [max]="1"
4737
- [decimals]="2"
4738
- format="p2"
4739
- [step]="0.01"
4740
- ></kendo-numerictextbox>
4741
- </kendo-formfield>
4742
- </form>
4743
- `
4787
+ <kendo-dropdownbutton
4788
+ [data]="data"
4789
+ [icon]="icon"
4790
+ [svgIcon]="svgIcon"
4791
+ [kendoEventsOutsideAngular]="{ click: handleMouseClick }"
4792
+ [scope]="this"
4793
+ (itemClick)="handleItemClick($event)"
4794
+ (open)="handleOpen($event)">
4795
+ {{ getText('addTaskText') }}
4796
+ </kendo-dropdownbutton>
4797
+ `,
4798
+ standalone: true,
4799
+ imports: [DropDownButtonComponent, EventsOutsideAngularDirective]
4744
4800
  }]
4745
- }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: GanttLocalizationService }]; } });
4801
+ }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }, { type: EditService }, { type: i0.NgZone }]; }, propDecorators: { data: [{
4802
+ type: Input
4803
+ }], icon: [{
4804
+ type: Input
4805
+ }], svgIcon: [{
4806
+ type: Input
4807
+ }] } });
4746
4808
 
4747
4809
  /**
4748
4810
  * @hidden
4749
4811
  */
4750
- class EditDialogComponent {
4751
- constructor(mapper, editService, cdr, localizationService) {
4752
- this.mapper = mapper;
4753
- this.editService = editService;
4754
- this.cdr = cdr;
4755
- this.localizationService = localizationService;
4756
- this.saveIcon = saveIcon;
4757
- this.cancelIcon = cancelOutlineIcon;
4758
- this.deleteIcon = trashIcon;
4759
- }
4760
- ngOnInit() {
4761
- this.editService.loadTasks(this.data).subscribe(value => {
4762
- this.loadedTasks = value;
4763
- });
4812
+ class ToolbarComponent {
4813
+ constructor(hostEl, navigationService) {
4814
+ this.hostEl = hostEl;
4815
+ this.navigationService = navigationService;
4816
+ this.context = {};
4817
+ this.role = 'toolbar';
4818
+ this.toolbarSizingClass = true;
4819
+ this.activeViewChange = new EventEmitter();
4764
4820
  }
4765
- get predecessors() {
4766
- return this.editService.predecessors;
4821
+ clickHandler(ev) {
4822
+ if (this.navigable) {
4823
+ const closestFocusable = closest(ev.target, isFocusable);
4824
+ const targetIndex = this.navigationService.focusableContent.indexOf(closestFocusable);
4825
+ if (targetIndex > -1) {
4826
+ this.navigationService.focusIndex = targetIndex;
4827
+ }
4828
+ this.navigationService.updateFocus();
4829
+ }
4767
4830
  }
4768
- set predecessors(items) {
4769
- this.editService.predecessors = items;
4831
+ arrowLeftListener() {
4832
+ if (this.navigable && isDocumentAvailable()) {
4833
+ this.navigationService.focusIndex--;
4834
+ if (this.navigationService.focusIndex < 0) {
4835
+ this.navigationService.focusIndex = this.navigationService.focusableContent.length - 1;
4836
+ }
4837
+ this.navigationService.updateFocus();
4838
+ }
4770
4839
  }
4771
- get successors() {
4772
- return this.editService.successors;
4840
+ arrowRightListener() {
4841
+ if (this.navigable && isDocumentAvailable()) {
4842
+ this.navigationService.focusIndex++;
4843
+ if (this.navigationService.focusIndex >= this.navigationService.focusableContent.length) {
4844
+ this.navigationService.focusIndex = 0;
4845
+ }
4846
+ this.navigationService.updateFocus();
4847
+ }
4773
4848
  }
4774
- set successors(items) {
4775
- this.editService.successors = items;
4849
+ set position(value) {
4850
+ this.context.position = this._position = value;
4776
4851
  }
4777
- getText(token) {
4778
- return this.localizationService.get(token);
4852
+ get position() {
4853
+ return this._position;
4779
4854
  }
4780
- getDependencyType(typeId) {
4781
- return DependencyType[typeId];
4855
+ get toolbarTemplateRef() {
4856
+ return this.toolbarTemplate ? this.toolbarTemplate.templateRef : undefined;
4782
4857
  }
4783
- handleEditingResult(editResultType) {
4784
- this.editService.triggerEditEvent(editResultType);
4858
+ get renderTemplate() {
4859
+ const ganttToolbarTemplate = this.toolbarTemplate;
4860
+ const templatePosition = ganttToolbarTemplate ? ganttToolbarTemplate.position : null;
4861
+ return ganttToolbarTemplate && (templatePosition === 'both' || templatePosition === this.position);
4785
4862
  }
4786
- handleTaskDelete() {
4787
- this.editService.taskDelete.next(this.editService.dataItem);
4863
+ handleViewChange(view) {
4864
+ this.activeViewChange.emit(view);
4865
+ }
4866
+ ngAfterViewInit() {
4867
+ if (isDocumentAvailable()) {
4868
+ const focusableElements = Array.from(this.hostEl.nativeElement.querySelectorAll(focusableSelector) || [])
4869
+ .filter(el => isVisible(el));
4870
+ if (focusableElements.length) {
4871
+ this.navigationService.focusableContent = focusableElements;
4872
+ }
4873
+ }
4788
4874
  }
4789
4875
  }
4790
- EditDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditDialogComponent, deps: [{ token: MappingService }, { token: EditService }, { token: i0.ChangeDetectorRef }, { token: i1$1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
4791
- EditDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EditDialogComponent, selector: "kendo-gantt-edit-dialog", inputs: { data: "data" }, ngImport: i0, template: `
4792
- <kendo-dialog
4793
- [title]="getText('taskEditingDialogTitle')"
4794
- [width]="575"
4795
- [height]="470"
4796
- [autoFocusedElement]="'.k-actions .k-button-solid-primary'"
4797
- (close)="handleEditingResult('cancel')">
4798
- <kendo-dialog-messages
4799
- [closeTitle]="getText('taskEditingDialogCloseTitle')"></kendo-dialog-messages>
4800
-
4801
- <kendo-tabstrip [keepTabContent]="true" [style.height.px]="345">
4802
- <kendo-tabstrip-tab [title]="getText('taskEditingGeneralTabTitle')" [selected]="true">
4803
- <ng-template kendoTabContent>
4804
- <kendo-gantt-task-fields></kendo-gantt-task-fields>
4805
- </ng-template>
4806
- </kendo-tabstrip-tab>
4807
- <kendo-tabstrip-tab [title]="getText('taskEditingPredecessorsTabTitle')">
4808
- <ng-template kendoTabContent>
4809
- <kendo-gantt-dependencies-table
4810
- [tasks]="loadedTasks"
4811
- [(dependencies)]="predecessors"
4812
- dependencyType="predecessor"
4813
- >
4814
- </kendo-gantt-dependencies-table>
4815
- </ng-template>
4816
- </kendo-tabstrip-tab>
4817
- <kendo-tabstrip-tab [title]="getText('taskEditingSuccessorsTabTitle')">
4818
- <ng-template kendoTabContent>
4819
- <kendo-gantt-dependencies-table
4820
- [tasks]="loadedTasks"
4821
- [(dependencies)]="successors"
4822
- dependencyType="successor">
4823
- </kendo-gantt-dependencies-table>
4824
- </ng-template>
4825
- </kendo-tabstrip-tab>
4826
- </kendo-tabstrip>
4827
-
4828
- <kendo-dialog-actions layout="start">
4829
- <button
4830
- kendoButton
4831
- themeColor="primary"
4832
- icon="save"
4833
- [svgIcon]="saveIcon"
4834
- (click)="handleEditingResult('save')"
4835
- >
4836
- {{ getText('saveButtonText') }}
4837
- </button>
4838
- <button
4839
- kendoButton
4840
- icon="cancel-outline"
4841
- [svgIcon]="cancelIcon"
4842
- (click)="handleEditingResult('cancel')"
4843
- >
4844
- {{ getText('cancelButtonText') }}
4845
- </button>
4846
- <kendo-treelist-spacer></kendo-treelist-spacer>
4847
- <button
4848
- kendoButton
4849
- themeColor="primary"
4850
- fillMode="flat"
4851
- icon="delete"
4852
- [svgIcon]="deleteIcon"
4853
- [kendoEventsOutsideAngular]="{
4854
- click: handleTaskDelete
4855
- }"
4856
- [scope]="this"
4857
- >
4858
- {{ getText('deleteButtonText') }}
4859
- </button>
4860
- </kendo-dialog-actions>
4861
- </kendo-dialog>
4862
- `, isInline: true, dependencies: [{ kind: "directive", type: i11.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { kind: "component", type: i4.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: i14.TreeListSpacerComponent, selector: "kendo-treelist-spacer, kendo-treelist-pager-spacer", inputs: ["width"] }, { kind: "component", type: i7$2.DialogComponent, selector: "kendo-dialog", inputs: ["actions", "actionsLayout", "autoFocusedElement", "title", "width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight", "animation", "themeColor"], outputs: ["action", "close"], exportAs: ["kendoDialog"] }, { kind: "component", type: i7$2.DialogActionsComponent, selector: "kendo-dialog-actions", inputs: ["actions", "layout"], outputs: ["action"] }, { kind: "directive", type: i7$2.CustomMessagesComponent, selector: "kendo-dialog-messages, kendo-window-messages" }, { kind: "component", type: i8$1.TabStripComponent, selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "closeIcon", "closeIconClass", "closeSVGIcon", "showContentArea"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { kind: "component", type: i8$1.TabStripTabComponent, selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: i8$1.TabContentDirective, selector: "[kendoTabContent]" }, { kind: "component", type: DependenciesTableComponent, selector: "kendo-gantt-dependencies-table", inputs: ["tasks", "dependencies", "dependencyType"], outputs: ["dependenciesChange"] }, { kind: "component", type: TaskFieldsComponent, selector: "kendo-gantt-task-fields" }] });
4863
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditDialogComponent, decorators: [{
4876
+ ToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarComponent, deps: [{ token: i0.ElementRef }, { token: ToolbarNavigationService }], target: i0.ɵɵFactoryTarget.Component });
4877
+ ToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ToolbarComponent, isStandalone: true, selector: "kendo-gantt-toolbar", inputs: { showAddTask: "showAddTask", showViewSelector: "showViewSelector", views: "views", activeView: "activeView", toolbarTemplate: "toolbarTemplate", navigable: "navigable", position: "position" }, outputs: { activeViewChange: "activeViewChange" }, host: { listeners: { "click": "clickHandler($event)", "keydown.arrowleft": "arrowLeftListener($event)", "keydown.arrowright": "arrowRightListener($event)" }, properties: { "attr.role": "this.role", "class.k-toolbar-md": "this.toolbarSizingClass" } }, providers: [ToolbarNavigationService], ngImport: i0, template: `
4878
+ <ng-container *ngIf="!renderTemplate">
4879
+ <kendo-gantt-add-task *ngIf="showAddTask"></kendo-gantt-add-task>
4880
+ <span class="k-spacer k-toolbar-spacer"></span>
4881
+ <kendo-gantt-view-selector
4882
+ *ngIf="showViewSelector"
4883
+ [views]="views"
4884
+ [activeView]="activeView"
4885
+ (activeViewChange)="handleViewChange($event)"></kendo-gantt-view-selector>
4886
+ </ng-container>
4887
+ <ng-template
4888
+ *ngIf="renderTemplate"
4889
+ [ngTemplateOutlet]="toolbarTemplateRef"
4890
+ [ngTemplateOutletContext]="context"
4891
+ >
4892
+ </ng-template>
4893
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: GanttAddTaskComponent, selector: "kendo-gantt-add-task", inputs: ["data", "icon", "svgIcon"] }, { kind: "component", type: ViewSelectorComponent, selector: "kendo-gantt-view-selector", inputs: ["views", "activeView"], outputs: ["activeViewChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
4894
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarComponent, decorators: [{
4864
4895
  type: Component,
4865
4896
  args: [{
4866
- selector: 'kendo-gantt-edit-dialog',
4897
+ selector: 'kendo-gantt-toolbar',
4898
+ providers: [ToolbarNavigationService],
4867
4899
  template: `
4868
- <kendo-dialog
4869
- [title]="getText('taskEditingDialogTitle')"
4870
- [width]="575"
4871
- [height]="470"
4872
- [autoFocusedElement]="'.k-actions .k-button-solid-primary'"
4873
- (close)="handleEditingResult('cancel')">
4874
- <kendo-dialog-messages
4875
- [closeTitle]="getText('taskEditingDialogCloseTitle')"></kendo-dialog-messages>
4876
-
4877
- <kendo-tabstrip [keepTabContent]="true" [style.height.px]="345">
4878
- <kendo-tabstrip-tab [title]="getText('taskEditingGeneralTabTitle')" [selected]="true">
4879
- <ng-template kendoTabContent>
4880
- <kendo-gantt-task-fields></kendo-gantt-task-fields>
4881
- </ng-template>
4882
- </kendo-tabstrip-tab>
4883
- <kendo-tabstrip-tab [title]="getText('taskEditingPredecessorsTabTitle')">
4884
- <ng-template kendoTabContent>
4885
- <kendo-gantt-dependencies-table
4886
- [tasks]="loadedTasks"
4887
- [(dependencies)]="predecessors"
4888
- dependencyType="predecessor"
4889
- >
4890
- </kendo-gantt-dependencies-table>
4891
- </ng-template>
4892
- </kendo-tabstrip-tab>
4893
- <kendo-tabstrip-tab [title]="getText('taskEditingSuccessorsTabTitle')">
4894
- <ng-template kendoTabContent>
4895
- <kendo-gantt-dependencies-table
4896
- [tasks]="loadedTasks"
4897
- [(dependencies)]="successors"
4898
- dependencyType="successor">
4899
- </kendo-gantt-dependencies-table>
4900
- </ng-template>
4901
- </kendo-tabstrip-tab>
4902
- </kendo-tabstrip>
4903
-
4904
- <kendo-dialog-actions layout="start">
4905
- <button
4906
- kendoButton
4907
- themeColor="primary"
4908
- icon="save"
4909
- [svgIcon]="saveIcon"
4910
- (click)="handleEditingResult('save')"
4911
- >
4912
- {{ getText('saveButtonText') }}
4913
- </button>
4914
- <button
4915
- kendoButton
4916
- icon="cancel-outline"
4917
- [svgIcon]="cancelIcon"
4918
- (click)="handleEditingResult('cancel')"
4919
- >
4920
- {{ getText('cancelButtonText') }}
4921
- </button>
4922
- <kendo-treelist-spacer></kendo-treelist-spacer>
4923
- <button
4924
- kendoButton
4925
- themeColor="primary"
4926
- fillMode="flat"
4927
- icon="delete"
4928
- [svgIcon]="deleteIcon"
4929
- [kendoEventsOutsideAngular]="{
4930
- click: handleTaskDelete
4931
- }"
4932
- [scope]="this"
4933
- >
4934
- {{ getText('deleteButtonText') }}
4935
- </button>
4936
- </kendo-dialog-actions>
4937
- </kendo-dialog>
4938
- `
4900
+ <ng-container *ngIf="!renderTemplate">
4901
+ <kendo-gantt-add-task *ngIf="showAddTask"></kendo-gantt-add-task>
4902
+ <span class="k-spacer k-toolbar-spacer"></span>
4903
+ <kendo-gantt-view-selector
4904
+ *ngIf="showViewSelector"
4905
+ [views]="views"
4906
+ [activeView]="activeView"
4907
+ (activeViewChange)="handleViewChange($event)"></kendo-gantt-view-selector>
4908
+ </ng-container>
4909
+ <ng-template
4910
+ *ngIf="renderTemplate"
4911
+ [ngTemplateOutlet]="toolbarTemplateRef"
4912
+ [ngTemplateOutletContext]="context"
4913
+ >
4914
+ </ng-template>
4915
+ `,
4916
+ standalone: true,
4917
+ imports: [NgIf, GanttAddTaskComponent, ViewSelectorComponent, NgTemplateOutlet]
4939
4918
  }]
4940
- }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: i0.ChangeDetectorRef }, { type: i1$1.LocalizationService }]; }, propDecorators: { data: [{
4919
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ToolbarNavigationService }]; }, propDecorators: { role: [{
4920
+ type: HostBinding,
4921
+ args: ['attr.role']
4922
+ }], toolbarSizingClass: [{
4923
+ type: HostBinding,
4924
+ args: ['class.k-toolbar-md']
4925
+ }], clickHandler: [{
4926
+ type: HostListener,
4927
+ args: ['click', ['$event']]
4928
+ }], arrowLeftListener: [{
4929
+ type: HostListener,
4930
+ args: ['keydown.arrowleft', ['$event']]
4931
+ }], arrowRightListener: [{
4932
+ type: HostListener,
4933
+ args: ['keydown.arrowright', ['$event']]
4934
+ }], activeViewChange: [{
4935
+ type: Output
4936
+ }], showAddTask: [{
4937
+ type: Input
4938
+ }], showViewSelector: [{
4939
+ type: Input
4940
+ }], views: [{
4941
+ type: Input
4942
+ }], activeView: [{
4943
+ type: Input
4944
+ }], toolbarTemplate: [{
4945
+ type: Input
4946
+ }], navigable: [{
4947
+ type: Input
4948
+ }], position: [{
4941
4949
  type: Input
4942
4950
  }] } });
4943
4951
 
@@ -5102,7 +5110,7 @@ class LocalizedMessagesDirective extends Messages {
5102
5110
  }
5103
5111
  }
5104
5112
  LocalizedMessagesDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocalizedMessagesDirective, deps: [{ token: i1$1.LocalizationService }], target: i0.ɵɵFactoryTarget.Directive });
5105
- LocalizedMessagesDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: LocalizedMessagesDirective, selector: "[kendoGanttLocalizedMessages]", providers: [
5113
+ LocalizedMessagesDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: LocalizedMessagesDirective, isStandalone: true, selector: "[kendoGanttLocalizedMessages]", providers: [
5106
5114
  {
5107
5115
  provide: Messages,
5108
5116
  useExisting: forwardRef(() => LocalizedMessagesDirective)
@@ -5117,7 +5125,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
5117
5125
  useExisting: forwardRef(() => LocalizedMessagesDirective)
5118
5126
  }
5119
5127
  ],
5120
- selector: '[kendoGanttLocalizedMessages]'
5128
+ selector: '[kendoGanttLocalizedMessages]',
5129
+ standalone: true
5121
5130
  }]
5122
5131
  }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }]; } });
5123
5132
 
@@ -6385,9 +6394,13 @@ class GanttComponent {
6385
6394
  }
6386
6395
  }
6387
6396
  GanttComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttComponent, deps: [{ token: TimelineViewService }, { token: ScrollSyncService }, { token: i0.Renderer2 }, { token: MappingService }, { token: OptionChangesService }, { token: DependencyDomService }, { token: EditService }, { token: i1$1.LocalizationService }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: NavigationService }, { token: CurrentTimeMarkerService }], target: i0.ɵɵFactoryTarget.Component });
6388
- GanttComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttComponent, selector: "kendo-gantt", inputs: { roleDescription: ["aria-roledescription", "roleDescription"], role: "role", taskModelFields: "taskModelFields", dependencyModelFields: "dependencyModelFields", activeView: "activeView", data: "data", isSelected: "isSelected", validateNewDependency: "validateNewDependency", selectable: "selectable", toolbarSettings: "toolbarSettings", toolbarAriaLabel: "toolbarAriaLabel", fetchChildren: "fetchChildren", hasChildren: "hasChildren", dependencies: "dependencies", sortable: "sortable", sort: "sort", filterable: "filterable", filter: "filter", workDayStart: "workDayStart", workDayEnd: "workDayEnd", workWeekStart: "workWeekStart", workWeekEnd: "workWeekEnd", navigable: "navigable", timelinePaneOptions: "timelinePaneOptions", treeListPaneOptions: "treeListPaneOptions", taskClass: "taskClass", rowClass: "rowClass", isExpanded: "isExpanded", columnsAutoSize: "columnsAutoSize", currentTimeMarker: "currentTimeMarker", columnMenu: "columnMenu", columnsReorderable: "columnsReorderable", columnsResizable: "columnsResizable", dragScrollSettings: "dragScrollSettings" }, outputs: { selectionChange: "selectionChange", rowExpand: "rowExpand", taskDblClick: "taskDblClick", cellDblClick: "cellDblClick", cellClose: "cellClose", taskDelete: "taskDelete", rowCollapse: "rowCollapse", remove: "remove", cancel: "cancel", save: "save", taskAdd: "taskAdd", dependencyAdd: "dependencyAdd", sortChange: "sortChange", filterChange: "filterChange", dataStateChange: "dataStateChange", treeListPaneCollapsedChange: "treeListPaneCollapsedChange", timelinePaneCollapsedChange: "timelinePaneCollapsedChange", timelinePaneSizeChange: "timelinePaneSizeChange", activeViewChange: "activeViewChange", columnResize: "columnResize", columnReorder: "columnReorder", columnVisibilityChange: "columnVisibilityChange", columnLockedChange: "columnLockedChange", cellClick: "cellClick", taskClick: "taskClick" }, host: { properties: { "attr.aria-roledescription": "this.hostRoleDescriptionAttr", "attr.role": "this.hostRoleAttr", "class.k-gantt": "this.hostClasses", "attr.dir": "this.dir" } }, providers: [
6397
+ GanttComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttComponent, isStandalone: true, selector: "kendo-gantt", inputs: { roleDescription: ["aria-roledescription", "roleDescription"], role: "role", taskModelFields: "taskModelFields", dependencyModelFields: "dependencyModelFields", activeView: "activeView", data: "data", isSelected: "isSelected", validateNewDependency: "validateNewDependency", selectable: "selectable", toolbarSettings: "toolbarSettings", toolbarAriaLabel: "toolbarAriaLabel", fetchChildren: "fetchChildren", hasChildren: "hasChildren", dependencies: "dependencies", sortable: "sortable", sort: "sort", filterable: "filterable", filter: "filter", workDayStart: "workDayStart", workDayEnd: "workDayEnd", workWeekStart: "workWeekStart", workWeekEnd: "workWeekEnd", navigable: "navigable", timelinePaneOptions: "timelinePaneOptions", treeListPaneOptions: "treeListPaneOptions", taskClass: "taskClass", rowClass: "rowClass", isExpanded: "isExpanded", columnsAutoSize: "columnsAutoSize", currentTimeMarker: "currentTimeMarker", columnMenu: "columnMenu", columnsReorderable: "columnsReorderable", columnsResizable: "columnsResizable", dragScrollSettings: "dragScrollSettings" }, outputs: { selectionChange: "selectionChange", rowExpand: "rowExpand", taskDblClick: "taskDblClick", cellDblClick: "cellDblClick", cellClose: "cellClose", taskDelete: "taskDelete", rowCollapse: "rowCollapse", remove: "remove", cancel: "cancel", save: "save", taskAdd: "taskAdd", dependencyAdd: "dependencyAdd", sortChange: "sortChange", filterChange: "filterChange", dataStateChange: "dataStateChange", treeListPaneCollapsedChange: "treeListPaneCollapsedChange", timelinePaneCollapsedChange: "timelinePaneCollapsedChange", timelinePaneSizeChange: "timelinePaneSizeChange", activeViewChange: "activeViewChange", columnResize: "columnResize", columnReorder: "columnReorder", columnVisibilityChange: "columnVisibilityChange", columnLockedChange: "columnLockedChange", cellClick: "cellClick", taskClick: "taskClick" }, host: { properties: { "attr.aria-roledescription": "this.hostRoleDescriptionAttr", "attr.role": "this.hostRoleAttr", "class.k-gantt": "this.hostClasses", "attr.dir": "this.dir" } }, providers: [
6389
6398
  GanttLocalizationService,
6390
6399
  LocalizationService,
6400
+ {
6401
+ provide: L10N_PREFIX,
6402
+ useValue: 'kendo.gantt'
6403
+ },
6391
6404
  {
6392
6405
  provide: DataBoundTreeComponent,
6393
6406
  useExisting: forwardRef(() => GanttComponent)
@@ -6781,7 +6794,7 @@ GanttComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
6781
6794
  </kendo-dialog>
6782
6795
 
6783
6796
  <div kendoWatermarkOverlay *ngIf="showLicenseWatermark"></div>
6784
- `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { kind: "component", type: i4.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: i8$1.SplitterComponent, selector: "kendo-splitter", inputs: ["orientation", "splitbarWidth", "resizeStep"], outputs: ["layoutChange"], exportAs: ["kendoSplitter"] }, { kind: "component", type: i8$1.SplitterPaneComponent, selector: "kendo-splitter-pane", inputs: ["order", "size", "separatorLabel", "min", "max", "resizable", "collapsible", "scrollable", "collapsed", "orientation", "containsSplitter", "overlayContent"], outputs: ["sizeChange", "collapsedChange"], exportAs: ["kendoSplitterPane"] }, { kind: "component", type: i14.TreeListComponent, selector: "kendo-treelist", inputs: ["aria-label", "data", "pageSize", "height", "rowHeight", "skip", "scrollable", "sort", "trackBy", "filter", "virtualColumns", "filterable", "sortable", "pageable", "navigable", "navigatable", "autoSize", "rowClass", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "idField", "selectable", "isSelected", "rowReorderable", "columns", "fetchChildren", "hasChildren", "isExpanded"], outputs: ["selectionChange", "filterChange", "pageChange", "sortChange", "dataStateChange", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "scrollBottom", "contentScroll", "expand", "collapse", "expandStateChange", "rowReorder"], exportAs: ["kendoTreeList"] }, { kind: "component", type: i14.TreeListSpacerComponent, selector: "kendo-treelist-spacer, kendo-treelist-pager-spacer", inputs: ["width"] }, { kind: "component", type: i14.CustomMessagesComponent, selector: "kendo-treelist-messages" }, { kind: "component", type: i7$2.DialogComponent, selector: "kendo-dialog", inputs: ["actions", "actionsLayout", "autoFocusedElement", "title", "width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight", "animation", "themeColor"], outputs: ["action", "close"], exportAs: ["kendoDialog"] }, { kind: "component", type: i7$2.DialogActionsComponent, selector: "kendo-dialog-actions", inputs: ["actions", "layout"], outputs: ["action"] }, { kind: "component", type: i11.WatermarkOverlayComponent, selector: "div[kendoWatermarkOverlay]" }, { kind: "component", type: GanttTimelineComponent, selector: "kendo-gantt-timeline", inputs: ["rows", "slots", "groupSlots", "tableWidth", "activeView", "taskContentTemplate", "taskTemplate", "summaryTaskTemplate", "taskClass", "renderDependencyDragClues", "dragScrollSettings", "currentTimeMarker", "selectable", "isTaskSelected", "isExpanded", "dependencies"], outputs: ["timelineContainerPress", "timelineContainerDrag", "timelineContainerRelease"] }, { kind: "component", type: ToolbarComponent, selector: "kendo-gantt-toolbar", inputs: ["showAddTask", "showViewSelector", "views", "activeView", "toolbarTemplate", "navigable", "position"], outputs: ["activeViewChange"] }, { kind: "component", type: EditDialogComponent, selector: "kendo-gantt-edit-dialog", inputs: ["data"] }, { kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoGanttLocalizedMessages]" }] });
6797
+ `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoGanttLocalizedMessages]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ToolbarComponent, selector: "kendo-gantt-toolbar", inputs: ["showAddTask", "showViewSelector", "views", "activeView", "toolbarTemplate", "navigable", "position"], outputs: ["activeViewChange"] }, { kind: "component", type: SplitterComponent, selector: "kendo-splitter", inputs: ["orientation", "splitbarWidth", "resizeStep"], outputs: ["layoutChange"], exportAs: ["kendoSplitter"] }, { kind: "component", type: SplitterPaneComponent, selector: "kendo-splitter-pane", inputs: ["order", "size", "separatorLabel", "min", "max", "resizable", "collapsible", "scrollable", "collapsed", "orientation", "containsSplitter", "overlayContent"], outputs: ["sizeChange", "collapsedChange"], exportAs: ["kendoSplitterPane"] }, { kind: "component", type: TreeListComponent, selector: "kendo-treelist", inputs: ["aria-label", "data", "pageSize", "height", "rowHeight", "skip", "scrollable", "sort", "trackBy", "filter", "virtualColumns", "filterable", "sortable", "pageable", "navigable", "navigatable", "autoSize", "rowClass", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "idField", "selectable", "isSelected", "rowReorderable", "columns", "fetchChildren", "hasChildren", "isExpanded"], outputs: ["selectionChange", "filterChange", "pageChange", "sortChange", "dataStateChange", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "scrollBottom", "contentScroll", "expand", "collapse", "expandStateChange", "rowReorder"], exportAs: ["kendoTreeList"] }, { kind: "directive", type: EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { kind: "component", type: CustomMessagesComponent$2, selector: "kendo-treelist-messages" }, { kind: "component", type: GanttTimelineComponent, selector: "kendo-gantt-timeline", inputs: ["rows", "slots", "groupSlots", "tableWidth", "activeView", "taskContentTemplate", "taskTemplate", "summaryTaskTemplate", "taskClass", "renderDependencyDragClues", "dragScrollSettings", "currentTimeMarker", "selectable", "isTaskSelected", "isExpanded", "dependencies"], outputs: ["timelineContainerPress", "timelineContainerDrag", "timelineContainerRelease"] }, { kind: "component", type: EditDialogComponent, selector: "kendo-gantt-edit-dialog", inputs: ["data"] }, { kind: "component", type: DialogComponent, selector: "kendo-dialog", inputs: ["actions", "actionsLayout", "autoFocusedElement", "title", "width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight", "animation", "themeColor"], outputs: ["action", "close"], exportAs: ["kendoDialog"] }, { kind: "component", type: DialogActionsComponent, selector: "kendo-dialog-actions", inputs: ["actions", "layout"], outputs: ["action"] }, { kind: "component", type: TreeListSpacerComponent, selector: "kendo-treelist-spacer, kendo-treelist-pager-spacer", inputs: ["width"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: WatermarkOverlayComponent, selector: "div[kendoWatermarkOverlay]" }] });
6785
6798
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttComponent, decorators: [{
6786
6799
  type: Component,
6787
6800
  args: [{
@@ -6790,6 +6803,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
6790
6803
  providers: [
6791
6804
  GanttLocalizationService,
6792
6805
  LocalizationService,
6806
+ {
6807
+ provide: L10N_PREFIX,
6808
+ useValue: 'kendo.gantt'
6809
+ },
6793
6810
  {
6794
6811
  provide: DataBoundTreeComponent,
6795
6812
  useExisting: forwardRef(() => GanttComponent)
@@ -7184,7 +7201,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7184
7201
  </kendo-dialog>
7185
7202
 
7186
7203
  <div kendoWatermarkOverlay *ngIf="showLicenseWatermark"></div>
7187
- `
7204
+ `,
7205
+ standalone: true,
7206
+ imports: [LocalizedMessagesDirective, NgIf, ToolbarComponent, SplitterComponent, SplitterPaneComponent, TreeListComponent, EventsOutsideAngularDirective, CustomMessagesComponent$2, GanttTimelineComponent, EditDialogComponent, DialogComponent, DialogActionsComponent, TreeListSpacerComponent, ButtonComponent, WatermarkOverlayComponent]
7188
7207
  }]
7189
7208
  }], ctorParameters: function () { return [{ type: TimelineViewService }, { type: ScrollSyncService }, { type: i0.Renderer2 }, { type: MappingService }, { type: OptionChangesService }, { type: DependencyDomService }, { type: EditService }, { type: i1$1.LocalizationService }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: NavigationService }, { type: CurrentTimeMarkerService }]; }, propDecorators: { treeList: [{
7190
7209
  type: ViewChild,
@@ -7278,252 +7297,70 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7278
7297
  type: Input
7279
7298
  }], taskClass: [{
7280
7299
  type: Input
7281
- }], rowClass: [{
7282
- type: Input
7283
- }], isExpanded: [{
7284
- type: Input
7285
- }], columnsAutoSize: [{
7286
- type: Input
7287
- }], currentTimeMarker: [{
7288
- type: Input
7289
- }], columnMenu: [{
7290
- type: Input
7291
- }], columnsReorderable: [{
7292
- type: Input
7293
- }], columnsResizable: [{
7294
- type: Input
7295
- }], dragScrollSettings: [{
7296
- type: Input
7297
- }], rowExpand: [{
7298
- type: Output
7299
- }], taskDblClick: [{
7300
- type: Output
7301
- }], cellDblClick: [{
7302
- type: Output
7303
- }], cellClose: [{
7304
- type: Output
7305
- }], taskDelete: [{
7306
- type: Output
7307
- }], rowCollapse: [{
7308
- type: Output
7309
- }], remove: [{
7310
- type: Output
7311
- }], cancel: [{
7312
- type: Output
7313
- }], save: [{
7314
- type: Output
7315
- }], taskAdd: [{
7316
- type: Output
7317
- }], dependencyAdd: [{
7318
- type: Output
7319
- }], sortChange: [{
7320
- type: Output
7321
- }], filterChange: [{
7322
- type: Output
7323
- }], dataStateChange: [{
7324
- type: Output
7325
- }], treeListPaneCollapsedChange: [{
7326
- type: Output
7327
- }], timelinePaneCollapsedChange: [{
7328
- type: Output
7329
- }], timelinePaneSizeChange: [{
7330
- type: Output
7331
- }], activeViewChange: [{
7332
- type: Output
7333
- }], columnResize: [{
7334
- type: Output
7335
- }], columnReorder: [{
7336
- type: Output
7337
- }], columnVisibilityChange: [{
7338
- type: Output
7339
- }], columnLockedChange: [{
7340
- type: Output
7341
- }], cellClick: [{
7342
- type: Output
7343
- }], taskClick: [{
7344
- type: Output
7345
- }] } });
7346
-
7347
- /**
7348
- * A directive which binds the Gantt to an array of objects by using
7349
- * an ID and parent ID field to define the hierarchy.
7350
- *
7351
- * The directive encapsulates the in-memory handling of data operations such as sorting and filtering.
7352
- */
7353
- class GanttFlatBindingDirective extends FlatBindingDirective {
7354
- /**
7355
- * @hidden
7356
- */
7357
- set aggregate(value) {
7358
- super.aggregate = value;
7359
- }
7360
- }
7361
- GanttFlatBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttFlatBindingDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7362
- GanttFlatBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttFlatBindingDirective, selector: "[kendoGanttFlatBinding]", inputs: { data: ["kendoGanttFlatBinding", "data"] }, exportAs: ["kendoGanttFlatBinding"], usesInheritance: true, ngImport: i0 });
7363
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttFlatBindingDirective, decorators: [{
7364
- type: Directive,
7365
- args: [{
7366
- selector: '[kendoGanttFlatBinding]',
7367
- exportAs: 'kendoGanttFlatBinding'
7368
- }]
7369
- }], propDecorators: { data: [{
7370
- type: Input,
7371
- args: ['kendoGanttFlatBinding']
7372
- }] } });
7373
-
7374
- /**
7375
- * A directive which binds the Gantt to a tree of objects,
7376
- * which encapsulates the in-memory handling of data operations such as sorting and filtering.
7377
- */
7378
- class GanttHierarchyBindingDirective extends HierarchyBindingDirective {
7379
- /**
7380
- * @hidden
7381
- */
7382
- set aggregate(value) {
7383
- super.aggregate = value;
7384
- }
7385
- }
7386
- GanttHierarchyBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHierarchyBindingDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7387
- GanttHierarchyBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttHierarchyBindingDirective, selector: "[kendoGanttHierarchyBinding]", inputs: { data: ["kendoGanttHierarchyBinding", "data"] }, exportAs: ["kendoGanttHierarchyBinding"], usesInheritance: true, ngImport: i0 });
7388
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHierarchyBindingDirective, decorators: [{
7389
- type: Directive,
7390
- args: [{
7391
- selector: '[kendoGanttHierarchyBinding]',
7392
- exportAs: 'kendoGanttHierarchyBinding'
7393
- }]
7394
- }], propDecorators: { data: [{
7395
- type: Input,
7396
- args: ['kendoGanttHierarchyBinding']
7397
- }] } });
7398
-
7399
- /**
7400
- * A directive which controls the expanded state of the items.
7401
- */
7402
- class GanttExpandableDirective extends ExpandableDirective {
7403
- /**
7404
- * Defines the item key that will be stored in the expandedKeys collection.
7405
- * Defaults to the task data item ID field,
7406
- * which is specified in the [`taskModelFields`]({% slug api_gantt_ganttcomponent %}#toc-taskmodelfields) object.
7407
- *
7408
- */
7409
- set expandBy(value) {
7410
- super.expandBy = value;
7411
- }
7412
- }
7413
- GanttExpandableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttExpandableDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7414
- GanttExpandableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttExpandableDirective, selector: "[kendoGanttExpandable]", inputs: { expandBy: "expandBy" }, exportAs: ["kendoGanttExpandable"], usesInheritance: true, ngImport: i0 });
7415
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttExpandableDirective, decorators: [{
7416
- type: Directive,
7417
- args: [{
7418
- exportAs: 'kendoGanttExpandable',
7419
- selector: '[kendoGanttExpandable]'
7420
- }]
7421
- }], propDecorators: { expandBy: [{
7422
- type: Input
7423
- }] } });
7424
-
7425
- /**
7426
- * A directive which handles the [`selectionChange`]({% slug api_gantt_ganttcomponent %}#toc-selectionchange) event of the Gantt
7427
- * ([see example]({% slug selection_gantt %}#toc-built-in-directive))
7428
- */
7429
- class SelectableDirective {
7430
- constructor(gantt) {
7431
- this.gantt = gantt;
7432
- /**
7433
- * Fires when the selected keys are changed.
7434
- */
7435
- this.selectedKeysChange = new EventEmitter();
7436
- this.state = new Set();
7437
- this.isSelected = this.isSelected.bind(this);
7438
- this.selectionChange = this.selectionChange.bind(this);
7439
- this.selectable = true;
7440
- }
7441
- /**
7442
- * @hidden
7443
- */
7444
- set selectable(value) {
7445
- if (value) {
7446
- this.gantt.isSelected = this.isSelected;
7447
- this.subscribeSelection();
7448
- }
7449
- else {
7450
- this.gantt.isSelected = () => false;
7451
- this.unsubscribeSelection();
7452
- }
7453
- this.gantt.selectable = value;
7454
- this.gantt.updateView();
7455
- }
7456
- /**
7457
- * Sets the selected keys.
7458
- */
7459
- set selectedKeys(value) {
7460
- if (isPresent(value) && value === this.lastChange) {
7461
- return;
7462
- }
7463
- // prevent multiple items displayed as selected as multiple selection still not supported fully
7464
- const keys = (value || []).slice(0, 1);
7465
- this.state = new Set(keys);
7466
- this.gantt.updateView();
7467
- }
7468
- /**
7469
- * The field name or a function that specifies the data item unique key identifier.
7470
- * By default, the string field `id` is used.
7471
- */
7472
- set itemKey(value) {
7473
- if (isString(value)) {
7474
- this._keyGetter = getter(value);
7475
- }
7476
- else {
7477
- this._keyGetter = value;
7478
- }
7479
- }
7480
- get keyGetter() {
7481
- return this._keyGetter || this.gantt.idGetter;
7482
- }
7483
- ngOnDestroy() {
7484
- this.unsubscribeSelection();
7485
- }
7486
- isSelected(dataItem) {
7487
- return this.state.has(this.keyGetter(dataItem));
7488
- }
7489
- selectionChange({ action, items }) {
7490
- this.state.clear();
7491
- if (action === 'select') {
7492
- items.forEach(item => this.state.add(this.keyGetter(item)));
7493
- }
7494
- this.emitSelectedItemsChange();
7495
- }
7496
- emitSelectedItemsChange() {
7497
- this.lastChange = Array.from(this.state);
7498
- this.selectedKeysChange.emit(this.lastChange);
7499
- }
7500
- subscribeSelection() {
7501
- this.unsubscribeSelection();
7502
- this.selectionSubscription = this.gantt.selectionChange.subscribe(this.selectionChange);
7503
- }
7504
- unsubscribeSelection() {
7505
- if (this.selectionSubscription) {
7506
- this.selectionSubscription.unsubscribe();
7507
- this.selectionSubscription = null;
7508
- }
7509
- }
7510
- }
7511
- SelectableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SelectableDirective, deps: [{ token: GanttComponent }], target: i0.ɵɵFactoryTarget.Directive });
7512
- SelectableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: SelectableDirective, selector: "[kendoGanttSelectable]", inputs: { selectable: "selectable", selectedKeys: "selectedKeys", itemKey: "itemKey" }, outputs: { selectedKeysChange: "selectedKeysChange" }, exportAs: ["kendoGanttSelectable"], ngImport: i0 });
7513
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SelectableDirective, decorators: [{
7514
- type: Directive,
7515
- args: [{
7516
- exportAs: 'kendoGanttSelectable',
7517
- selector: '[kendoGanttSelectable]'
7518
- }]
7519
- }], ctorParameters: function () { return [{ type: GanttComponent }]; }, propDecorators: { selectable: [{
7520
- type: Input
7521
- }], selectedKeys: [{
7300
+ }], rowClass: [{
7522
7301
  type: Input
7523
- }], selectedKeysChange: [{
7524
- type: Output
7525
- }], itemKey: [{
7302
+ }], isExpanded: [{
7303
+ type: Input
7304
+ }], columnsAutoSize: [{
7305
+ type: Input
7306
+ }], currentTimeMarker: [{
7307
+ type: Input
7308
+ }], columnMenu: [{
7309
+ type: Input
7310
+ }], columnsReorderable: [{
7311
+ type: Input
7312
+ }], columnsResizable: [{
7526
7313
  type: Input
7314
+ }], dragScrollSettings: [{
7315
+ type: Input
7316
+ }], rowExpand: [{
7317
+ type: Output
7318
+ }], taskDblClick: [{
7319
+ type: Output
7320
+ }], cellDblClick: [{
7321
+ type: Output
7322
+ }], cellClose: [{
7323
+ type: Output
7324
+ }], taskDelete: [{
7325
+ type: Output
7326
+ }], rowCollapse: [{
7327
+ type: Output
7328
+ }], remove: [{
7329
+ type: Output
7330
+ }], cancel: [{
7331
+ type: Output
7332
+ }], save: [{
7333
+ type: Output
7334
+ }], taskAdd: [{
7335
+ type: Output
7336
+ }], dependencyAdd: [{
7337
+ type: Output
7338
+ }], sortChange: [{
7339
+ type: Output
7340
+ }], filterChange: [{
7341
+ type: Output
7342
+ }], dataStateChange: [{
7343
+ type: Output
7344
+ }], treeListPaneCollapsedChange: [{
7345
+ type: Output
7346
+ }], timelinePaneCollapsedChange: [{
7347
+ type: Output
7348
+ }], timelinePaneSizeChange: [{
7349
+ type: Output
7350
+ }], activeViewChange: [{
7351
+ type: Output
7352
+ }], columnResize: [{
7353
+ type: Output
7354
+ }], columnReorder: [{
7355
+ type: Output
7356
+ }], columnVisibilityChange: [{
7357
+ type: Output
7358
+ }], columnLockedChange: [{
7359
+ type: Output
7360
+ }], cellClick: [{
7361
+ type: Output
7362
+ }], taskClick: [{
7363
+ type: Output
7527
7364
  }] } });
7528
7365
 
7529
7366
  /**
@@ -7540,7 +7377,7 @@ class DragValidationTooltipComponent {
7540
7377
  }
7541
7378
  }
7542
7379
  DragValidationTooltipComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DragValidationTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7543
- DragValidationTooltipComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DragValidationTooltipComponent, selector: "ng-component", ngImport: i0, template: `
7380
+ DragValidationTooltipComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DragValidationTooltipComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
7544
7381
  <div
7545
7382
  class="k-tooltip k-gantt-tooltip-validation"
7546
7383
  [class.k-gantt-tooltip-valid]="showValidityStatus && isValid"
@@ -7574,10 +7411,92 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7574
7411
  <span class="k-gantt-tooltip-validation-value">{{ toTaskName }}</span>
7575
7412
  </div>
7576
7413
  </div>
7577
- `
7414
+ `,
7415
+ standalone: true
7578
7416
  }]
7579
7417
  }] });
7580
7418
 
7419
+ /**
7420
+ * A directive which binds the Gantt to an array of objects by using
7421
+ * an ID and parent ID field to define the hierarchy.
7422
+ *
7423
+ * The directive encapsulates the in-memory handling of data operations such as sorting and filtering.
7424
+ */
7425
+ class GanttFlatBindingDirective extends FlatBindingDirective {
7426
+ /**
7427
+ * @hidden
7428
+ */
7429
+ set aggregate(value) {
7430
+ super.aggregate = value;
7431
+ }
7432
+ }
7433
+ GanttFlatBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttFlatBindingDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7434
+ GanttFlatBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttFlatBindingDirective, isStandalone: true, selector: "[kendoGanttFlatBinding]", inputs: { data: ["kendoGanttFlatBinding", "data"] }, exportAs: ["kendoGanttFlatBinding"], usesInheritance: true, ngImport: i0 });
7435
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttFlatBindingDirective, decorators: [{
7436
+ type: Directive,
7437
+ args: [{
7438
+ selector: '[kendoGanttFlatBinding]',
7439
+ exportAs: 'kendoGanttFlatBinding',
7440
+ standalone: true
7441
+ }]
7442
+ }], propDecorators: { data: [{
7443
+ type: Input,
7444
+ args: ['kendoGanttFlatBinding']
7445
+ }] } });
7446
+
7447
+ /**
7448
+ * A directive which binds the Gantt to a tree of objects,
7449
+ * which encapsulates the in-memory handling of data operations such as sorting and filtering.
7450
+ */
7451
+ class GanttHierarchyBindingDirective extends HierarchyBindingDirective {
7452
+ /**
7453
+ * @hidden
7454
+ */
7455
+ set aggregate(value) {
7456
+ super.aggregate = value;
7457
+ }
7458
+ }
7459
+ GanttHierarchyBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHierarchyBindingDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7460
+ GanttHierarchyBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttHierarchyBindingDirective, isStandalone: true, selector: "[kendoGanttHierarchyBinding]", inputs: { data: ["kendoGanttHierarchyBinding", "data"] }, exportAs: ["kendoGanttHierarchyBinding"], usesInheritance: true, ngImport: i0 });
7461
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHierarchyBindingDirective, decorators: [{
7462
+ type: Directive,
7463
+ args: [{
7464
+ selector: '[kendoGanttHierarchyBinding]',
7465
+ exportAs: 'kendoGanttHierarchyBinding',
7466
+ standalone: true
7467
+ }]
7468
+ }], propDecorators: { data: [{
7469
+ type: Input,
7470
+ args: ['kendoGanttHierarchyBinding']
7471
+ }] } });
7472
+
7473
+ /**
7474
+ * A directive which controls the expanded state of the items.
7475
+ */
7476
+ class GanttExpandableDirective extends ExpandableDirective {
7477
+ /**
7478
+ * Defines the item key that will be stored in the expandedKeys collection.
7479
+ * Defaults to the task data item ID field,
7480
+ * which is specified in the [`taskModelFields`]({% slug api_gantt_ganttcomponent %}#toc-taskmodelfields) object.
7481
+ *
7482
+ */
7483
+ set expandBy(value) {
7484
+ super.expandBy = value;
7485
+ }
7486
+ }
7487
+ GanttExpandableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttExpandableDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7488
+ GanttExpandableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttExpandableDirective, isStandalone: true, selector: "[kendoGanttExpandable]", inputs: { expandBy: "expandBy" }, exportAs: ["kendoGanttExpandable"], usesInheritance: true, ngImport: i0 });
7489
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttExpandableDirective, decorators: [{
7490
+ type: Directive,
7491
+ args: [{
7492
+ exportAs: 'kendoGanttExpandable',
7493
+ selector: '[kendoGanttExpandable]',
7494
+ standalone: true
7495
+ }]
7496
+ }], propDecorators: { expandBy: [{
7497
+ type: Input
7498
+ }] } });
7499
+
7581
7500
  /**
7582
7501
  * When added to the .k-task-dot, the element will be kept with hover styles.
7583
7502
  * Used for the drag clue from which the dragging has started.
@@ -7872,11 +7791,12 @@ class DependencyDragCreateDirective {
7872
7791
  }
7873
7792
  }
7874
7793
  DependencyDragCreateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DependencyDragCreateDirective, deps: [{ token: GanttComponent }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: MappingService }, { token: i3.PopupService }, { token: TimelineScrollService }], target: i0.ɵɵFactoryTarget.Directive });
7875
- DependencyDragCreateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: DependencyDragCreateDirective, selector: "[kendoGanttDependencyDragCreate]", inputs: { displayValidationTooltip: "displayValidationTooltip" }, ngImport: i0 });
7794
+ DependencyDragCreateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: DependencyDragCreateDirective, isStandalone: true, selector: "[kendoGanttDependencyDragCreate]", inputs: { displayValidationTooltip: "displayValidationTooltip" }, ngImport: i0 });
7876
7795
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DependencyDragCreateDirective, decorators: [{
7877
7796
  type: Directive,
7878
7797
  args: [{
7879
- selector: '[kendoGanttDependencyDragCreate]'
7798
+ selector: '[kendoGanttDependencyDragCreate]',
7799
+ standalone: true
7880
7800
  }]
7881
7801
  }], ctorParameters: function () { return [{ type: GanttComponent }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: MappingService }, { type: i3.PopupService }, { type: TimelineScrollService }]; }, propDecorators: { displayValidationTooltip: [{
7882
7802
  type: Input
@@ -7895,7 +7815,7 @@ class TimelineDayViewComponent extends ViewBase {
7895
7815
  }
7896
7816
  }
7897
7817
  TimelineDayViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineDayViewComponent, deps: [{ token: OptionChangesService }, { token: DependencyDomService }], target: i0.ɵɵFactoryTarget.Component });
7898
- TimelineDayViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineDayViewComponent, selector: "kendo-gantt-timeline-day-view", providers: [
7818
+ TimelineDayViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineDayViewComponent, isStandalone: true, selector: "kendo-gantt-timeline-day-view", providers: [
7899
7819
  {
7900
7820
  provide: ViewBase,
7901
7821
  useExisting: forwardRef(() => TimelineDayViewComponent)
@@ -7911,7 +7831,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7911
7831
  provide: ViewBase,
7912
7832
  useExisting: forwardRef(() => TimelineDayViewComponent)
7913
7833
  }
7914
- ]
7834
+ ],
7835
+ standalone: true
7915
7836
  }]
7916
7837
  }], ctorParameters: function () { return [{ type: OptionChangesService }, { type: DependencyDomService }]; } });
7917
7838
 
@@ -7928,7 +7849,7 @@ class TimelineWeekViewComponent extends ViewBase {
7928
7849
  }
7929
7850
  }
7930
7851
  TimelineWeekViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineWeekViewComponent, deps: [{ token: OptionChangesService }, { token: DependencyDomService }], target: i0.ɵɵFactoryTarget.Component });
7931
- TimelineWeekViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineWeekViewComponent, selector: "kendo-gantt-timeline-week-view", providers: [
7852
+ TimelineWeekViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineWeekViewComponent, isStandalone: true, selector: "kendo-gantt-timeline-week-view", providers: [
7932
7853
  {
7933
7854
  provide: ViewBase,
7934
7855
  useExisting: forwardRef(() => TimelineWeekViewComponent)
@@ -7944,7 +7865,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7944
7865
  provide: ViewBase,
7945
7866
  useExisting: forwardRef(() => TimelineWeekViewComponent)
7946
7867
  }
7947
- ]
7868
+ ],
7869
+ standalone: true
7948
7870
  }]
7949
7871
  }], ctorParameters: function () { return [{ type: OptionChangesService }, { type: DependencyDomService }]; } });
7950
7872
 
@@ -7961,7 +7883,7 @@ class TimelineMonthViewComponent extends ViewBase {
7961
7883
  }
7962
7884
  }
7963
7885
  TimelineMonthViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineMonthViewComponent, deps: [{ token: OptionChangesService }, { token: DependencyDomService }], target: i0.ɵɵFactoryTarget.Component });
7964
- TimelineMonthViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineMonthViewComponent, selector: "kendo-gantt-timeline-month-view", providers: [
7886
+ TimelineMonthViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineMonthViewComponent, isStandalone: true, selector: "kendo-gantt-timeline-month-view", providers: [
7965
7887
  {
7966
7888
  provide: ViewBase,
7967
7889
  useExisting: forwardRef(() => TimelineMonthViewComponent)
@@ -7977,7 +7899,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7977
7899
  provide: ViewBase,
7978
7900
  useExisting: forwardRef(() => TimelineMonthViewComponent)
7979
7901
  }
7980
- ]
7902
+ ],
7903
+ standalone: true
7981
7904
  }]
7982
7905
  }], ctorParameters: function () { return [{ type: OptionChangesService }, { type: DependencyDomService }]; } });
7983
7906
 
@@ -7994,7 +7917,7 @@ class TimelineYearViewComponent extends ViewBase {
7994
7917
  }
7995
7918
  }
7996
7919
  TimelineYearViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineYearViewComponent, deps: [{ token: OptionChangesService }, { token: DependencyDomService }], target: i0.ɵɵFactoryTarget.Component });
7997
- TimelineYearViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineYearViewComponent, selector: "kendo-gantt-timeline-year-view", providers: [
7920
+ TimelineYearViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineYearViewComponent, isStandalone: true, selector: "kendo-gantt-timeline-year-view", providers: [
7998
7921
  {
7999
7922
  provide: ViewBase,
8000
7923
  useExisting: forwardRef(() => TimelineYearViewComponent)
@@ -8010,10 +7933,116 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
8010
7933
  provide: ViewBase,
8011
7934
  useExisting: forwardRef(() => TimelineYearViewComponent)
8012
7935
  }
8013
- ]
7936
+ ],
7937
+ standalone: true
8014
7938
  }]
8015
7939
  }], ctorParameters: function () { return [{ type: OptionChangesService }, { type: DependencyDomService }]; } });
8016
7940
 
7941
+ /**
7942
+ * A directive which handles the [`selectionChange`]({% slug api_gantt_ganttcomponent %}#toc-selectionchange) event of the Gantt
7943
+ * ([see example]({% slug selection_gantt %}#toc-built-in-directive))
7944
+ */
7945
+ class SelectableDirective {
7946
+ constructor(gantt) {
7947
+ this.gantt = gantt;
7948
+ /**
7949
+ * Fires when the selected keys are changed.
7950
+ */
7951
+ this.selectedKeysChange = new EventEmitter();
7952
+ this.state = new Set();
7953
+ this.isSelected = this.isSelected.bind(this);
7954
+ this.selectionChange = this.selectionChange.bind(this);
7955
+ this.selectable = true;
7956
+ }
7957
+ /**
7958
+ * @hidden
7959
+ */
7960
+ set selectable(value) {
7961
+ if (value) {
7962
+ this.gantt.isSelected = this.isSelected;
7963
+ this.subscribeSelection();
7964
+ }
7965
+ else {
7966
+ this.gantt.isSelected = () => false;
7967
+ this.unsubscribeSelection();
7968
+ }
7969
+ this.gantt.selectable = value;
7970
+ this.gantt.updateView();
7971
+ }
7972
+ /**
7973
+ * Sets the selected keys.
7974
+ */
7975
+ set selectedKeys(value) {
7976
+ if (isPresent(value) && value === this.lastChange) {
7977
+ return;
7978
+ }
7979
+ // prevent multiple items displayed as selected as multiple selection still not supported fully
7980
+ const keys = (value || []).slice(0, 1);
7981
+ this.state = new Set(keys);
7982
+ this.gantt.updateView();
7983
+ }
7984
+ /**
7985
+ * The field name or a function that specifies the data item unique key identifier.
7986
+ * By default, the string field `id` is used.
7987
+ */
7988
+ set itemKey(value) {
7989
+ if (isString(value)) {
7990
+ this._keyGetter = getter(value);
7991
+ }
7992
+ else {
7993
+ this._keyGetter = value;
7994
+ }
7995
+ }
7996
+ get keyGetter() {
7997
+ return this._keyGetter || this.gantt.idGetter;
7998
+ }
7999
+ ngOnDestroy() {
8000
+ this.unsubscribeSelection();
8001
+ }
8002
+ isSelected(dataItem) {
8003
+ return this.state.has(this.keyGetter(dataItem));
8004
+ }
8005
+ selectionChange({ action, items }) {
8006
+ this.state.clear();
8007
+ if (action === 'select') {
8008
+ items.forEach(item => this.state.add(this.keyGetter(item)));
8009
+ }
8010
+ this.emitSelectedItemsChange();
8011
+ }
8012
+ emitSelectedItemsChange() {
8013
+ this.lastChange = Array.from(this.state);
8014
+ this.selectedKeysChange.emit(this.lastChange);
8015
+ }
8016
+ subscribeSelection() {
8017
+ this.unsubscribeSelection();
8018
+ this.selectionSubscription = this.gantt.selectionChange.subscribe(this.selectionChange);
8019
+ }
8020
+ unsubscribeSelection() {
8021
+ if (this.selectionSubscription) {
8022
+ this.selectionSubscription.unsubscribe();
8023
+ this.selectionSubscription = null;
8024
+ }
8025
+ }
8026
+ }
8027
+ SelectableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SelectableDirective, deps: [{ token: GanttComponent }], target: i0.ɵɵFactoryTarget.Directive });
8028
+ SelectableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: SelectableDirective, isStandalone: true, selector: "[kendoGanttSelectable]", inputs: { selectable: "selectable", selectedKeys: "selectedKeys", itemKey: "itemKey" }, outputs: { selectedKeysChange: "selectedKeysChange" }, exportAs: ["kendoGanttSelectable"], ngImport: i0 });
8029
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SelectableDirective, decorators: [{
8030
+ type: Directive,
8031
+ args: [{
8032
+ exportAs: 'kendoGanttSelectable',
8033
+ selector: '[kendoGanttSelectable]',
8034
+ standalone: true
8035
+ }]
8036
+ }], ctorParameters: function () { return [{ type: GanttComponent }]; }, propDecorators: { selectable: [{
8037
+ type: Input
8038
+ }], selectedKeys: [{
8039
+ type: Input
8040
+ }], selectedKeysChange: [{
8041
+ type: Output
8042
+ }], itemKey: [{
8043
+ type: Input
8044
+ }] } });
8045
+
8017
8046
  /**
8018
8047
  * Custom component messages override default component messages
8019
8048
  * ([see example](slug:globalization_treelist#toc-custom-messages)).
@@ -8028,7 +8057,7 @@ class CustomMessagesComponent extends Messages {
8028
8057
  }
8029
8058
  }
8030
8059
  CustomMessagesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CustomMessagesComponent, deps: [{ token: i1$1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
8031
- CustomMessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CustomMessagesComponent, selector: "kendo-gantt-messages", providers: [
8060
+ CustomMessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CustomMessagesComponent, isStandalone: true, selector: "kendo-gantt-messages", providers: [
8032
8061
  {
8033
8062
  provide: Messages,
8034
8063
  useExisting: forwardRef(() => CustomMessagesComponent)
@@ -8044,74 +8073,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
8044
8073
  }
8045
8074
  ],
8046
8075
  selector: 'kendo-gantt-messages',
8047
- template: ``
8076
+ template: ``,
8077
+ standalone: true
8048
8078
  }]
8049
8079
  }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }]; } });
8050
8080
 
8051
- const IMPORTED_MODULES = [
8052
- CommonModule,
8053
- ReactiveFormsModule,
8054
- LabelModule,
8055
- InputsModule,
8056
- DateInputsModule,
8057
- ButtonsModule,
8058
- SplitterModule,
8059
- TreeListModule,
8060
- ButtonsModule,
8061
- DialogModule,
8062
- EventsModule,
8063
- PopupModule,
8064
- DraggableModule,
8065
- TabStripModule,
8066
- GridModule,
8067
- DropDownsModule,
8068
- IconsModule,
8069
- IntlModule,
8070
- WatermarkModule
8071
- ];
8072
- const DECLARATIONS = [
8081
+ /**
8082
+ * Utility array that contains all `@progress/kendo-angular-gantt` related components and directives
8083
+ */
8084
+ const KENDO_GANTT = [
8073
8085
  GanttComponent,
8074
8086
  GanttFlatBindingDirective,
8075
8087
  GanttHierarchyBindingDirective,
8076
- GanttTaskComponent,
8077
- GanttSummaryTaskComponent,
8078
- GanttMilestoneTaskComponent,
8079
- GanttTimelineComponent,
8080
- GanttTasksTableBodyComponent,
8081
- GanttHeaderTableBodyComponent,
8082
8088
  GanttTaskContentTemplateDirective,
8083
8089
  GanttTaskTemplateDirective,
8084
8090
  GanttSummaryTaskTemplateDirective,
8085
8091
  ToolbarTemplateDirective,
8086
- ToolbarComponent,
8087
8092
  ViewSelectorComponent,
8088
8093
  GanttColumnComponent,
8089
8094
  GanttColumnGroupComponent,
8090
8095
  GanttSpanColumnComponent,
8091
- FilterMenuTemplateDirective,
8092
8096
  FilterCellTemplateDirective,
8097
+ FilterMenuTemplateDirective,
8093
8098
  CellTemplateDirective,
8094
8099
  EditTemplateDirective,
8095
8100
  ColumnMenuTemplateDirective,
8096
8101
  HeaderTemplateDirective,
8097
8102
  FooterTemplateDirective,
8098
8103
  GanttExpandableDirective,
8099
- GanttDependencyDirective,
8100
8104
  DependencyDragCreateDirective,
8101
8105
  TimelineDayViewComponent,
8102
8106
  TimelineWeekViewComponent,
8103
8107
  TimelineMonthViewComponent,
8104
8108
  TimelineYearViewComponent,
8105
8109
  SelectableDirective,
8106
- EditDialogComponent,
8107
8110
  CustomMessagesComponent,
8108
- LocalizedMessagesDirective,
8109
- GanttAddTaskComponent,
8110
- DragValidationTooltipComponent,
8111
- TimelineScrollableDirective,
8112
- DependenciesTableComponent,
8113
- TaskFieldsComponent
8111
+ GanttAddTaskComponent
8114
8112
  ];
8113
+
8114
+ // IMPORTANT: NgModule export kept for backwards compatibility
8115
8115
  /**
8116
8116
  * Represents the [NgModule](link:site.data.urls.angular['ngmoduleapi'])
8117
8117
  * definition for the Gantt component.
@@ -8146,126 +8146,71 @@ const DECLARATIONS = [
8146
8146
  class GanttModule {
8147
8147
  }
8148
8148
  GanttModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8149
- GanttModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: GanttModule, declarations: [GanttComponent,
8150
- GanttFlatBindingDirective,
8151
- GanttHierarchyBindingDirective,
8152
- GanttTaskComponent,
8153
- GanttSummaryTaskComponent,
8154
- GanttMilestoneTaskComponent,
8155
- GanttTimelineComponent,
8156
- GanttTasksTableBodyComponent,
8157
- GanttHeaderTableBodyComponent,
8158
- GanttTaskContentTemplateDirective,
8159
- GanttTaskTemplateDirective,
8160
- GanttSummaryTaskTemplateDirective,
8161
- ToolbarTemplateDirective,
8162
- ToolbarComponent,
8163
- ViewSelectorComponent,
8164
- GanttColumnComponent,
8165
- GanttColumnGroupComponent,
8166
- GanttSpanColumnComponent,
8167
- FilterMenuTemplateDirective,
8168
- FilterCellTemplateDirective,
8169
- CellTemplateDirective,
8170
- EditTemplateDirective,
8171
- ColumnMenuTemplateDirective,
8172
- HeaderTemplateDirective,
8173
- FooterTemplateDirective,
8174
- GanttExpandableDirective,
8175
- GanttDependencyDirective,
8176
- DependencyDragCreateDirective,
8177
- TimelineDayViewComponent,
8178
- TimelineWeekViewComponent,
8179
- TimelineMonthViewComponent,
8180
- TimelineYearViewComponent,
8181
- SelectableDirective,
8182
- EditDialogComponent,
8183
- CustomMessagesComponent,
8184
- LocalizedMessagesDirective,
8185
- GanttAddTaskComponent,
8186
- DragValidationTooltipComponent,
8187
- TimelineScrollableDirective,
8188
- DependenciesTableComponent,
8189
- TaskFieldsComponent], imports: [CommonModule,
8190
- ReactiveFormsModule,
8191
- LabelModule,
8192
- InputsModule,
8193
- DateInputsModule,
8194
- ButtonsModule,
8195
- SplitterModule,
8196
- TreeListModule,
8197
- ButtonsModule,
8198
- DialogModule,
8199
- EventsModule,
8200
- PopupModule,
8201
- DraggableModule,
8202
- TabStripModule,
8203
- GridModule,
8204
- DropDownsModule,
8205
- IconsModule,
8206
- IntlModule,
8207
- WatermarkModule], exports: [GanttComponent,
8208
- GanttFlatBindingDirective,
8209
- GanttHierarchyBindingDirective,
8210
- GanttTaskComponent,
8211
- GanttSummaryTaskComponent,
8212
- GanttMilestoneTaskComponent,
8213
- GanttTimelineComponent,
8214
- GanttTasksTableBodyComponent,
8215
- GanttHeaderTableBodyComponent,
8216
- GanttTaskContentTemplateDirective,
8217
- GanttTaskTemplateDirective,
8218
- GanttSummaryTaskTemplateDirective,
8219
- ToolbarTemplateDirective,
8220
- ToolbarComponent,
8221
- ViewSelectorComponent,
8222
- GanttColumnComponent,
8223
- GanttColumnGroupComponent,
8224
- GanttSpanColumnComponent,
8225
- FilterMenuTemplateDirective,
8226
- FilterCellTemplateDirective,
8227
- CellTemplateDirective,
8228
- EditTemplateDirective,
8229
- ColumnMenuTemplateDirective,
8230
- HeaderTemplateDirective,
8231
- FooterTemplateDirective,
8232
- GanttExpandableDirective,
8233
- GanttDependencyDirective,
8234
- DependencyDragCreateDirective,
8235
- TimelineDayViewComponent,
8236
- TimelineWeekViewComponent,
8237
- TimelineMonthViewComponent,
8238
- TimelineYearViewComponent,
8239
- SelectableDirective,
8240
- EditDialogComponent,
8241
- CustomMessagesComponent,
8242
- LocalizedMessagesDirective,
8243
- GanttAddTaskComponent,
8244
- DragValidationTooltipComponent,
8245
- TimelineScrollableDirective,
8246
- DependenciesTableComponent,
8247
- TaskFieldsComponent] });
8149
+ GanttModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: GanttModule, imports: [GanttComponent, GanttFlatBindingDirective, GanttHierarchyBindingDirective, GanttTaskContentTemplateDirective, GanttTaskTemplateDirective, GanttSummaryTaskTemplateDirective, ToolbarTemplateDirective, ViewSelectorComponent, GanttColumnComponent, GanttColumnGroupComponent, GanttSpanColumnComponent, FilterCellTemplateDirective, FilterMenuTemplateDirective, CellTemplateDirective, EditTemplateDirective, ColumnMenuTemplateDirective, HeaderTemplateDirective, FooterTemplateDirective, GanttExpandableDirective, DependencyDragCreateDirective, TimelineDayViewComponent, TimelineWeekViewComponent, TimelineMonthViewComponent, TimelineYearViewComponent, SelectableDirective, CustomMessagesComponent, GanttAddTaskComponent], exports: [GanttComponent, GanttFlatBindingDirective, GanttHierarchyBindingDirective, GanttTaskContentTemplateDirective, GanttTaskTemplateDirective, GanttSummaryTaskTemplateDirective, ToolbarTemplateDirective, ViewSelectorComponent, GanttColumnComponent, GanttColumnGroupComponent, GanttSpanColumnComponent, FilterCellTemplateDirective, FilterMenuTemplateDirective, CellTemplateDirective, EditTemplateDirective, ColumnMenuTemplateDirective, HeaderTemplateDirective, FooterTemplateDirective, GanttExpandableDirective, DependencyDragCreateDirective, TimelineDayViewComponent, TimelineWeekViewComponent, TimelineMonthViewComponent, TimelineYearViewComponent, SelectableDirective, CustomMessagesComponent, GanttAddTaskComponent] });
8248
8150
  GanttModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttModule, providers: [{
8249
8151
  provide: L10N_PREFIX,
8250
8152
  useValue: 'kendo.gantt'
8251
- }, {
8252
- provide: TOUCH_ENABLED,
8253
- useValue: touchEnabled
8254
- }], imports: [IMPORTED_MODULES] });
8153
+ },
8154
+ // InputsModule providers
8155
+ IconsService,
8156
+ PopupService,
8157
+ ResizeBatchService,
8158
+ DialogContainerService,
8159
+ DialogService,
8160
+ WindowService,
8161
+ WindowContainerService,
8162
+ // DateInputsModule providers
8163
+ CalendarDOMService,
8164
+ CenturyViewService,
8165
+ DecadeViewService,
8166
+ MonthViewService,
8167
+ YearViewService,
8168
+ WeekNamesService,
8169
+ NavigationService$1,
8170
+ TimePickerDOMService,
8171
+ HoursService,
8172
+ MinutesService,
8173
+ SecondsService,
8174
+ MillisecondsService,
8175
+ DayPeriodService,
8176
+ // TreeListModule providers
8177
+ ColumnResizingService
8178
+ ], imports: [GanttComponent, ViewSelectorComponent, GanttColumnComponent, GanttColumnGroupComponent, GanttSpanColumnComponent, TimelineDayViewComponent, TimelineWeekViewComponent, TimelineMonthViewComponent, TimelineYearViewComponent, CustomMessagesComponent, GanttAddTaskComponent] });
8255
8179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttModule, decorators: [{
8256
8180
  type: NgModule,
8257
8181
  args: [{
8258
- imports: [...IMPORTED_MODULES],
8259
- declarations: [...DECLARATIONS],
8260
- exports: [...DECLARATIONS],
8182
+ imports: [...KENDO_GANTT],
8183
+ exports: [...KENDO_GANTT],
8261
8184
  entryComponents: [DragValidationTooltipComponent],
8262
8185
  providers: [{
8263
8186
  provide: L10N_PREFIX,
8264
8187
  useValue: 'kendo.gantt'
8265
- }, {
8266
- provide: TOUCH_ENABLED,
8267
- useValue: touchEnabled
8268
- }]
8188
+ },
8189
+ // InputsModule providers
8190
+ IconsService,
8191
+ PopupService,
8192
+ ResizeBatchService,
8193
+ DialogContainerService,
8194
+ DialogService,
8195
+ WindowService,
8196
+ WindowContainerService,
8197
+ // DateInputsModule providers
8198
+ CalendarDOMService,
8199
+ CenturyViewService,
8200
+ DecadeViewService,
8201
+ MonthViewService,
8202
+ YearViewService,
8203
+ WeekNamesService,
8204
+ NavigationService$1,
8205
+ TimePickerDOMService,
8206
+ HoursService,
8207
+ MinutesService,
8208
+ SecondsService,
8209
+ MillisecondsService,
8210
+ DayPeriodService,
8211
+ // TreeListModule providers
8212
+ ColumnResizingService
8213
+ ]
8269
8214
  }]
8270
8215
  }] });
8271
8216
 
@@ -8273,5 +8218,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
8273
8218
  * Generated bundle index. Do not edit.
8274
8219
  */
8275
8220
 
8276
- export { CellCloseEvent, CellTemplateDirective, ColumnMenuTemplateDirective, CustomMessagesComponent, DependenciesTableComponent, DependencyDragCreateDirective, DependencyType, DragValidationTooltipComponent, EditDialogComponent, EditTemplateDirective, FilterCellTemplateDirective, FilterMenuTemplateDirective, FooterTemplateDirective, GanttAddTaskComponent, GanttColumnBase, GanttColumnComponent, GanttColumnGroupComponent, GanttComponent, GanttDependencyDirective, GanttExpandableDirective, GanttFlatBindingDirective, GanttHeaderTableBodyComponent, GanttHierarchyBindingDirective, GanttMilestoneTaskComponent, GanttModule, GanttSpanColumnComponent, GanttSummaryTaskComponent, GanttSummaryTaskTemplateDirective, GanttTaskComponent, GanttTaskContentTemplateDirective, GanttTaskTemplateDirective, GanttTasksTableBodyComponent, GanttTimelineComponent, HeaderTemplateDirective, LocalizedMessagesDirective, SelectableDirective, TaskFieldsComponent, TimelineDayViewComponent, TimelineMonthViewComponent, TimelineScrollableDirective, TimelineWeekViewComponent, TimelineYearViewComponent, ToolbarComponent, ToolbarTemplateDirective, ViewSelectorComponent };
8221
+ export { CellCloseEvent, CellTemplateDirective, ColumnMenuTemplateDirective, CustomMessagesComponent, DependenciesTableComponent, DependencyDragCreateDirective, DependencyType, DragValidationTooltipComponent, EditDialogComponent, EditTemplateDirective, FilterCellTemplateDirective, FilterMenuTemplateDirective, FooterTemplateDirective, GanttAddTaskComponent, GanttColumnBase, GanttColumnComponent, GanttColumnGroupComponent, GanttComponent, GanttDependencyDirective, GanttExpandableDirective, GanttFlatBindingDirective, GanttHeaderTableBodyComponent, GanttHierarchyBindingDirective, GanttMilestoneTaskComponent, GanttModule, GanttSpanColumnComponent, GanttSummaryTaskComponent, GanttSummaryTaskTemplateDirective, GanttTaskComponent, GanttTaskContentTemplateDirective, GanttTaskTemplateDirective, GanttTasksTableBodyComponent, GanttTimelineComponent, HeaderTemplateDirective, KENDO_GANTT, LocalizedMessagesDirective, SelectableDirective, TaskFieldsComponent, TimelineDayViewComponent, TimelineMonthViewComponent, TimelineScrollableDirective, TimelineWeekViewComponent, TimelineYearViewComponent, ToolbarComponent, ToolbarTemplateDirective, ViewSelectorComponent };
8277
8222