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

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 (93) hide show
  1. package/binding-directives/flat-binding.directive.d.ts +1 -1
  2. package/binding-directives/hierarchy-binding.directive.d.ts +1 -1
  3. package/columns/cell-template.directive.d.ts +1 -1
  4. package/columns/column-group.component.d.ts +1 -1
  5. package/columns/column-menu-template.directive.d.ts +1 -1
  6. package/columns/column.component.d.ts +1 -1
  7. package/columns/edit-template.directive.d.ts +1 -1
  8. package/columns/filter-cell-template.directive.d.ts +1 -1
  9. package/columns/filter-menu-template.directive.d.ts +1 -1
  10. package/columns/footer-template.directive.d.ts +1 -1
  11. package/columns/header-template.directive.d.ts +1 -1
  12. package/columns/span-column.component.d.ts +1 -1
  13. package/dependencies/gantt-dependency.directive.d.ts +1 -1
  14. package/directives.d.ts +29 -0
  15. package/dragging/dependency-drag-create.directive.d.ts +1 -1
  16. package/dragging/drag-validation-tooltip.component.d.ts +1 -1
  17. package/editing/add-task.component.d.ts +1 -1
  18. package/editing/dependencies-table.component.d.ts +1 -1
  19. package/editing/edit-dialog.component.d.ts +1 -1
  20. package/editing/task-fields.component.d.ts +1 -1
  21. package/esm2020/binding-directives/flat-binding.directive.mjs +3 -2
  22. package/esm2020/binding-directives/hierarchy-binding.directive.mjs +3 -2
  23. package/esm2020/columns/cell-template.directive.mjs +3 -2
  24. package/esm2020/columns/column-group.component.mjs +3 -2
  25. package/esm2020/columns/column-menu-template.directive.mjs +3 -2
  26. package/esm2020/columns/column.component.mjs +3 -2
  27. package/esm2020/columns/edit-template.directive.mjs +3 -2
  28. package/esm2020/columns/filter-cell-template.directive.mjs +3 -2
  29. package/esm2020/columns/filter-menu-template.directive.mjs +3 -2
  30. package/esm2020/columns/footer-template.directive.mjs +3 -2
  31. package/esm2020/columns/header-template.directive.mjs +3 -2
  32. package/esm2020/columns/span-column.component.mjs +3 -2
  33. package/esm2020/dependencies/gantt-dependency.directive.mjs +3 -2
  34. package/esm2020/directives.mjs +57 -0
  35. package/esm2020/dragging/dependency-drag-create.directive.mjs +3 -2
  36. package/esm2020/dragging/drag-validation-tooltip.component.mjs +3 -2
  37. package/esm2020/editing/add-task.component.mjs +7 -5
  38. package/esm2020/editing/dependencies-table.component.mjs +9 -7
  39. package/esm2020/editing/edit-dialog.component.mjs +12 -10
  40. package/esm2020/editing/task-fields.component.mjs +12 -9
  41. package/esm2020/expanded-state/expandable.directive.mjs +3 -2
  42. package/esm2020/gantt.component.mjs +14 -15
  43. package/esm2020/gantt.module.mjs +90 -214
  44. package/esm2020/index.mjs +1 -0
  45. package/esm2020/localization/custom-messages.component.mjs +3 -2
  46. package/esm2020/localization/localized-messages.directive.mjs +3 -2
  47. package/esm2020/package-metadata.mjs +2 -2
  48. package/esm2020/rendering/gantt-header-table-body.component.mjs +6 -4
  49. package/esm2020/rendering/gantt-milestone-task.component.mjs +6 -4
  50. package/esm2020/rendering/gantt-summary-task.component.mjs +6 -4
  51. package/esm2020/rendering/gantt-task.component.mjs +8 -6
  52. package/esm2020/rendering/gantt-tasks-table-body.component.mjs +9 -7
  53. package/esm2020/scrolling/timeline-scroll.directive.mjs +3 -2
  54. package/esm2020/selection/selectable.directive.mjs +3 -2
  55. package/esm2020/template-directives/summary-task-template.directive.mjs +3 -2
  56. package/esm2020/template-directives/task-content-template.directive.mjs +3 -2
  57. package/esm2020/template-directives/task-template.directive.mjs +3 -2
  58. package/esm2020/timeline/gantt-timeline.component.mjs +12 -10
  59. package/esm2020/timeline/timeline-day-view.component.mjs +3 -2
  60. package/esm2020/timeline/timeline-month-view.component.mjs +3 -2
  61. package/esm2020/timeline/timeline-week-view.component.mjs +3 -2
  62. package/esm2020/timeline/timeline-year-view.component.mjs +3 -2
  63. package/esm2020/toolbar/toolbar-template.directive.mjs +3 -2
  64. package/esm2020/toolbar/toolbar.component.mjs +8 -6
  65. package/esm2020/toolbar/view-selector.component.mjs +9 -6
  66. package/expanded-state/expandable.directive.d.ts +1 -1
  67. package/fesm2015/progress-kendo-angular-gantt.mjs +1803 -1840
  68. package/fesm2020/progress-kendo-angular-gantt.mjs +1950 -1987
  69. package/gantt.component.d.ts +1 -1
  70. package/gantt.module.d.ts +25 -54
  71. package/index.d.ts +1 -0
  72. package/localization/custom-messages.component.d.ts +1 -1
  73. package/localization/localized-messages.directive.d.ts +1 -1
  74. package/package.json +15 -15
  75. package/rendering/gantt-header-table-body.component.d.ts +1 -1
  76. package/rendering/gantt-milestone-task.component.d.ts +1 -1
  77. package/rendering/gantt-summary-task.component.d.ts +1 -1
  78. package/rendering/gantt-task.component.d.ts +1 -1
  79. package/rendering/gantt-tasks-table-body.component.d.ts +1 -1
  80. package/schematics/ngAdd/index.js +7 -7
  81. package/scrolling/timeline-scroll.directive.d.ts +1 -1
  82. package/selection/selectable.directive.d.ts +1 -1
  83. package/template-directives/summary-task-template.directive.d.ts +1 -1
  84. package/template-directives/task-content-template.directive.d.ts +1 -1
  85. package/template-directives/task-template.directive.d.ts +1 -1
  86. package/timeline/gantt-timeline.component.d.ts +1 -1
  87. package/timeline/timeline-day-view.component.d.ts +1 -1
  88. package/timeline/timeline-month-view.component.d.ts +1 -1
  89. package/timeline/timeline-week-view.component.d.ts +1 -1
  90. package/timeline/timeline-year-view.component.d.ts +1 -1
  91. package/toolbar/toolbar-template.directive.d.ts +1 -1
  92. package/toolbar/toolbar.component.d.ts +1 -1
  93. package/toolbar/view-selector.component.d.ts +1 -1
@@ -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, InjectionToken, 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: 1721847330,
44
+ version: '16.6.0-develop.2',
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,82 +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 }]; } });
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
+ }] } });
736
836
 
737
837
  /**
738
838
  * @hidden
@@ -1227,6 +1327,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1227
1327
  type: Injectable
1228
1328
  }] });
1229
1329
 
1330
+ /**
1331
+ * @hidden
1332
+ */
1333
+ class ScrollSyncService {
1334
+ constructor(ngZone) {
1335
+ this.ngZone = ngZone;
1336
+ this.changes = new Subject();
1337
+ this.elements = [];
1338
+ this.subscriptions = new Subscription();
1339
+ this.subscriptions.add(this.changes.subscribe(args => {
1340
+ this.scroll(args);
1341
+ }));
1342
+ }
1343
+ registerElement(el, sourceType) {
1344
+ this.elements.push({ element: el, sourceType });
1345
+ if (sourceType === "timeline" || sourceType === "treelist") {
1346
+ this.ngZone.runOutsideAngular(() => {
1347
+ const obs = fromEvent(el, 'scroll').pipe(map(({ target: { scrollTop, scrollLeft } }) => ({
1348
+ scrollTop,
1349
+ scrollLeft,
1350
+ sourceType
1351
+ })));
1352
+ const comparisonFn = sourceType === 'timeline' ?
1353
+ (x, y) => (x.scrollTop === y.scrollTop) && (x.scrollLeft === y.scrollLeft) :
1354
+ (x, y) => (x.scrollTop === y.scrollTop);
1355
+ this.subscriptions.add(obs.pipe(distinctUntilChanged(comparisonFn))
1356
+ .subscribe((event) => this.changes.next(event)));
1357
+ });
1358
+ }
1359
+ }
1360
+ ngOnDestroy() {
1361
+ this.subscriptions.unsubscribe();
1362
+ this.elements = null;
1363
+ }
1364
+ syncScrollTop(sourceType, targetType) {
1365
+ const source = this.elements.find(element => element.sourceType === sourceType);
1366
+ const target = this.elements.find(element => element.sourceType === targetType);
1367
+ // Need to wait for the splitter pane's content to be rendered
1368
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => target.element.scrollTop = source.element.scrollTop);
1369
+ }
1370
+ resetTimelineScrollLeft() {
1371
+ const source = this.elements.find(element => element.sourceType === 'timeline');
1372
+ source.element.scrollLeft = 0;
1373
+ }
1374
+ scroll({ scrollTop, scrollLeft, sourceType }) {
1375
+ this.ngZone.runOutsideAngular(() => {
1376
+ if (sourceType === 'timeline') {
1377
+ const header = this.elements.find(element => element.sourceType === 'header').element;
1378
+ header.scrollLeft = scrollLeft;
1379
+ if (!this.syncingTimeline) {
1380
+ this.syncingTreeList = true;
1381
+ const treelist = this.elements.find(element => element.sourceType === 'treelist').element;
1382
+ treelist.scrollTop = scrollTop;
1383
+ }
1384
+ this.syncingTimeline = false;
1385
+ }
1386
+ if (sourceType === 'treelist') {
1387
+ if (!this.syncingTreeList) {
1388
+ this.syncingTimeline = true;
1389
+ const timeline = this.elements.find(element => element.sourceType === 'timeline').element;
1390
+ timeline.scrollTop = scrollTop;
1391
+ }
1392
+ this.syncingTreeList = false;
1393
+ }
1394
+ });
1395
+ }
1396
+ }
1397
+ ScrollSyncService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ScrollSyncService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
1398
+ ScrollSyncService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ScrollSyncService });
1399
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ScrollSyncService, decorators: [{
1400
+ type: Injectable
1401
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
1402
+
1230
1403
  /**
1231
1404
  * @hidden
1232
1405
  */
@@ -1760,7 +1933,7 @@ class GanttTaskComponent extends GanttTaskBase {
1760
1933
  }
1761
1934
  }
1762
1935
  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: [
1936
+ 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
1937
  {
1765
1938
  provide: GanttTaskBase,
1766
1939
  useExisting: forwardRef(() => GanttTaskComponent)
@@ -1836,7 +2009,7 @@ GanttTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ver
1836
2009
  >
1837
2010
  </div>
1838
2011
  </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"] }] });
2012
+ `, 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
2013
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskComponent, decorators: [{
1841
2014
  type: Component,
1842
2015
  args: [{
@@ -1918,7 +2091,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1918
2091
  >
1919
2092
  </div>
1920
2093
  </ng-container>
1921
- `
2094
+ `,
2095
+ standalone: true,
2096
+ imports: [NgClass, NgIf, NgTemplateOutlet, EventsOutsideAngularDirective, IconWrapperComponent]
1922
2097
  }]
1923
2098
  }], ctorParameters: function () {
1924
2099
  return [{ type: EditService }, { type: undefined, decorators: [{
@@ -1948,7 +2123,7 @@ class GanttSummaryTaskComponent extends GanttTaskBase {
1948
2123
  }
1949
2124
  }
1950
2125
  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: [
2126
+ 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
2127
  {
1953
2128
  provide: GanttTaskBase,
1954
2129
  useExisting: forwardRef(() => GanttSummaryTaskComponent)
@@ -1997,7 +2172,7 @@ GanttSummaryTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.
1997
2172
  >
1998
2173
  </div>
1999
2174
  </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"] }] });
2175
+ `, 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
2176
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSummaryTaskComponent, decorators: [{
2002
2177
  type: Component,
2003
2178
  args: [{
@@ -2052,7 +2227,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2052
2227
  >
2053
2228
  </div>
2054
2229
  </ng-container>
2055
- `
2230
+ `,
2231
+ standalone: true,
2232
+ imports: [NgClass, NgIf, NgTemplateOutlet]
2056
2233
  }]
2057
2234
  }], ctorParameters: function () {
2058
2235
  return [{ type: undefined, decorators: [{
@@ -2079,7 +2256,7 @@ class GanttMilestoneTaskComponent extends GanttTaskBase {
2079
2256
  }
2080
2257
  }
2081
2258
  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: [
2259
+ 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
2260
  {
2084
2261
  provide: GanttTaskBase,
2085
2262
  useExisting: forwardRef(() => GanttMilestoneTaskComponent)
@@ -2108,7 +2285,7 @@ GanttMilestoneTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.
2108
2285
  >
2109
2286
  </div>
2110
2287
  </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"] }] });
2288
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
2112
2289
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttMilestoneTaskComponent, decorators: [{
2113
2290
  type: Component,
2114
2291
  args: [{
@@ -2143,7 +2320,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2143
2320
  >
2144
2321
  </div>
2145
2322
  </ng-container>
2146
- `
2323
+ `,
2324
+ standalone: true,
2325
+ imports: [NgClass, NgIf]
2147
2326
  }]
2148
2327
  }], ctorParameters: function () {
2149
2328
  return [{ type: undefined, decorators: [{
@@ -2175,7 +2354,7 @@ class GanttTasksTableBodyComponent {
2175
2354
  }
2176
2355
  }
2177
2356
  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: `
2357
+ 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
2358
  <tr class="k-table-row" #timelineRow *ngFor="let item of rows; let index = index">
2180
2359
  <td class="k-table-td">
2181
2360
  <kendo-gantt-milestone-task
@@ -2222,7 +2401,7 @@ GanttTasksTableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14
2222
2401
  </ng-template>
2223
2402
  </td>
2224
2403
  </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" }] });
2404
+ `, 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
2405
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTasksTableBodyComponent, decorators: [{
2227
2406
  type: Component,
2228
2407
  args: [{
@@ -2275,7 +2454,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2275
2454
  </ng-template>
2276
2455
  </td>
2277
2456
  </tr>
2278
- `
2457
+ `,
2458
+ standalone: true,
2459
+ imports: [NgFor, NgIf, GanttMilestoneTaskComponent, GanttSummaryTaskComponent, GanttTaskComponent]
2279
2460
  }]
2280
2461
  }], ctorParameters: function () { return [{ type: DependencyDomService }, { type: MappingService }]; }, propDecorators: { timelineRow: [{
2281
2462
  type: ViewChild,
@@ -2305,442 +2486,139 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2305
2486
  /**
2306
2487
  * @hidden
2307
2488
  */
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
- }] } });
2489
+ var ScrollDirection;
2490
+ (function (ScrollDirection) {
2491
+ ScrollDirection[ScrollDirection["Backwards"] = -1] = "Backwards";
2492
+ ScrollDirection[ScrollDirection["Forward"] = 1] = "Forward";
2493
+ })(ScrollDirection || (ScrollDirection = {}));
2494
+ /**
2495
+ * @hidden
2496
+ */
2497
+ var ScrollAxis;
2498
+ (function (ScrollAxis) {
2499
+ ScrollAxis["Vertical"] = "scrollTop";
2500
+ ScrollAxis["Horizontal"] = "scrollLeft";
2501
+ })(ScrollAxis || (ScrollAxis = {}));
2346
2502
 
2347
2503
  /**
2348
2504
  * @hidden
2349
2505
  *
2350
- * Gets the offset (top and left values) relative to a target element.
2506
+ * Checks if the beginning of the scrollable element is reached (top/left).
2507
+ * Floors the top value.
2351
2508
  */
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
- };
2509
+ const isUpperLimitReached = (element, axis) => Math.floor(element[axis]) <= 0;
2368
2510
  /**
2369
2511
  * @hidden
2370
- */
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
- };
2512
+ *
2513
+ * Checks if the end of the scrollable element is reached (bottom/right).
2514
+ * Ceils the top value.
2515
+ */
2516
+ const isBottomLimitReached = (element, axis) => {
2517
+ const elementSize = axis === ScrollAxis.Horizontal ?
2518
+ element.scrollWidth - element.clientWidth :
2519
+ element.scrollHeight - element.clientHeight;
2520
+ return Math.ceil(element[axis]) >= elementSize;
2378
2521
  };
2379
2522
  /**
2380
2523
  * @hidden
2524
+ *
2525
+ * Scrolls the element in the given direction by the provided step in the provided scroll axis.
2526
+ *
2527
+ * If the targeted scroll incrementation doesn't yield any result due to device pixel ratio issues (https://github.com/dimitar-pechev/RenderingIndependentScrollOffsets#readme),
2528
+ * increments the step with 1px and again attempts to change the scrollTop of the element, until the content is actually scrolled.
2529
+ *
2530
+ * Cuts the operation short after 20 unsuccessful attempts to prevent infinite loops in possible corner-case scenarios.
2381
2531
  */
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));
2532
+ const scrollElement = (element, step, direction, scrollAxis) => {
2533
+ if (!(isPresent(element) && isDocumentAvailable())) {
2534
+ return;
2411
2535
  }
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));
2536
+ const initialScrollPosition = element[scrollAxis];
2537
+ let currentStep = step;
2538
+ let iterations = 0;
2539
+ while (initialScrollPosition === element[scrollAxis] &&
2540
+ !(direction === ScrollDirection.Backwards && isUpperLimitReached(element, scrollAxis)) &&
2541
+ !(direction === ScrollDirection.Forward && isBottomLimitReached(element, scrollAxis)) &&
2542
+ iterations < 20 // cut the operation short in 20 attempts - in case of a wild corner case
2543
+ ) {
2544
+ element[scrollAxis] += (currentStep * direction);
2545
+ // try with a larger step if the current one doesn't update the scroll position successfully
2546
+ currentStep += 1;
2547
+ iterations += 1;
2457
2548
  }
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
2549
  };
2506
2550
  /**
2507
2551
  * @hidden
2508
2552
  *
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
2553
+ * 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,
2554
+ * this function extracts the visible boundaries of the provided element - fall-backing to 0 when the top/left are below 0,
2555
+ * and fall-backing to the actual visible size of the container for bottom/right.
2511
2556
  */
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();
2557
+ const getViewportBoundaries = (element) => {
2558
+ const elementRect = element.getBoundingClientRect();
2559
+ // if the beginning of the scrollable container is above/before the current viewport, fall-back to 0
2560
+ const topLimit = Math.max(elementRect.top, 0);
2561
+ const leftLimit = Math.max(elementRect.left, 0);
2562
+ // if the end of the scrollable container is beneath/after the current viewport, fall-back to its client height
2563
+ // 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
2564
+ const bottomLimit = topLimit + Math.min(elementRect.bottom, element.clientHeight);
2565
+ const rightLimit = leftLimit + Math.min(elementRect.right, element.clientWidth);
2516
2566
  return {
2517
- left: clientLeft - offsetContainerClientRect.left + offsetContainer.scrollLeft,
2518
- top: clientTop - offsetContainerClientRect.top + offsetContainer.scrollTop
2567
+ top: topLimit,
2568
+ bottom: bottomLimit,
2569
+ left: leftLimit,
2570
+ right: rightLimit
2519
2571
  };
2520
2572
  };
2573
+
2521
2574
  /**
2522
2575
  * @hidden
2523
2576
  *
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
2577
+ * Notifies the timeline-scroll.directive to scroll into view to requested coordinates.
2578
+ * The scrolling is performed based on client (viewport) coordinates.
2527
2579
  */
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
- };
2580
+ class TimelineScrollService {
2581
+ constructor() {
2582
+ this.horizontalScroll = new Subject();
2583
+ this.verticalScroll = new Subject();
2584
+ this.scrollCancel = new Subject();
2585
+ }
2586
+ ngOnDestroy() {
2587
+ this.horizontalScroll.complete();
2588
+ this.verticalScroll.complete();
2589
+ this.scrollCancel.complete();
2590
+ }
2591
+ requestHorizontalScroll(clientTop) {
2592
+ this.horizontalScroll.next(clientTop);
2593
+ }
2594
+ requestVerticalScroll(clientLeft) {
2595
+ this.verticalScroll.next(clientLeft);
2596
+ }
2597
+ requestScrollCancel() {
2598
+ this.scrollCancel.next();
2599
+ }
2600
+ }
2601
+ TimelineScrollService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2602
+ TimelineScrollService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollService });
2603
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollService, decorators: [{
2604
+ type: Injectable
2605
+ }] });
2537
2606
 
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
2607
  /**
2547
2608
  * @hidden
2548
2609
  */
2549
- class GanttDependencyDirective {
2550
- constructor(polyline, zone, renderer, mapper, dependencyDomService) {
2551
- this.polyline = polyline;
2610
+ class TimelineScrollableDirective {
2611
+ constructor(timelineScrollableContainer, scrollService, zone) {
2612
+ this.timelineScrollableContainer = timelineScrollableContainer;
2613
+ this.scrollService = scrollService;
2552
2614
  this.zone = zone;
2553
- this.renderer = renderer;
2554
- this.mapper = mapper;
2555
- this.dependencyDomService = dependencyDomService;
2556
2615
  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;
2736
- this.zone = zone;
2737
- this.subscriptions = new Subscription();
2738
- this.subscriptions.add(this.scrollService.horizontalScroll
2739
- .subscribe(this.scrollHorizontallyTo.bind(this)));
2740
- this.subscriptions.add(this.scrollService.verticalScroll
2741
- .subscribe(this.scrollVerticallyTo.bind(this)));
2742
- this.subscriptions.add(this.scrollService.scrollCancel
2743
- .subscribe(this.cancelScroll.bind(this)));
2616
+ this.subscriptions.add(this.scrollService.horizontalScroll
2617
+ .subscribe(this.scrollHorizontallyTo.bind(this)));
2618
+ this.subscriptions.add(this.scrollService.verticalScroll
2619
+ .subscribe(this.scrollVerticallyTo.bind(this)));
2620
+ this.subscriptions.add(this.scrollService.scrollCancel
2621
+ .subscribe(this.cancelScroll.bind(this)));
2744
2622
  }
2745
2623
  ngOnDestroy() {
2746
2624
  this.subscriptions.unsubscribe();
@@ -2781,11 +2659,12 @@ class TimelineScrollableDirective {
2781
2659
  }
2782
2660
  }
2783
2661
  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 });
2662
+ TimelineScrollableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: TimelineScrollableDirective, isStandalone: true, selector: "[kendoGanttTimelineScrollable]", inputs: { scrollSettings: "scrollSettings" }, ngImport: i0 });
2785
2663
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TimelineScrollableDirective, decorators: [{
2786
2664
  type: Directive,
2787
2665
  args: [{
2788
- selector: '[kendoGanttTimelineScrollable]'
2666
+ selector: '[kendoGanttTimelineScrollable]',
2667
+ standalone: true
2789
2668
  }]
2790
2669
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: TimelineScrollService }, { type: i0.NgZone }]; }, propDecorators: { scrollSettings: [{
2791
2670
  type: Input
@@ -2794,86 +2673,207 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2794
2673
  /**
2795
2674
  * @hidden
2796
2675
  */
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
- });
2676
+ class GanttHeaderTableBodyComponent {
2677
+ constructor() {
2678
+ this.tbodyClass = true;
2861
2679
  }
2862
2680
  }
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
2875
- [groupSlots]="groupSlots"
2876
- [slots]="slots">
2681
+ GanttHeaderTableBodyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHeaderTableBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2682
+ 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: `
2683
+ <tr class="k-table-row">
2684
+ <td *ngFor="let item of groupSlots" [attr.colspan]="item.span" class="k-header k-table-td">{{ item.text }}</td>
2685
+ </tr>
2686
+
2687
+ <tr class="k-table-row">
2688
+ <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>
2689
+ </tr>
2690
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2691
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHeaderTableBodyComponent, decorators: [{
2692
+ type: Component,
2693
+ args: [{
2694
+ // eslint-disable-next-line @angular-eslint/component-selector
2695
+ selector: '[kendoGanttHeaderTableBody]',
2696
+ template: `
2697
+ <tr class="k-table-row">
2698
+ <td *ngFor="let item of groupSlots" [attr.colspan]="item.span" class="k-header k-table-td">{{ item.text }}</td>
2699
+ </tr>
2700
+
2701
+ <tr class="k-table-row">
2702
+ <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>
2703
+ </tr>
2704
+ `,
2705
+ standalone: true,
2706
+ imports: [NgFor]
2707
+ }]
2708
+ }], propDecorators: { tbodyClass: [{
2709
+ type: HostBinding,
2710
+ args: ['class.k-table-tbody']
2711
+ }], groupSlots: [{
2712
+ type: Input
2713
+ }], slots: [{
2714
+ type: Input
2715
+ }] } });
2716
+
2717
+ const MS_PER_SECOND = 1000;
2718
+ const MS_PER_MINUTE = 60 * MS_PER_SECOND;
2719
+ /**
2720
+ * @hidden
2721
+ */
2722
+ class CurrentTimeMarkerService {
2723
+ constructor(renderer, cdr) {
2724
+ this.renderer = renderer;
2725
+ this.cdr = cdr;
2726
+ this.slots = [];
2727
+ this.rows = [];
2728
+ this.now = new Date(Date.now());
2729
+ this.createTimeMarker = () => {
2730
+ if (!isDocumentAvailable()) {
2731
+ return;
2732
+ }
2733
+ this.removeTimeMarker();
2734
+ if (this.slotIndex >= 0) {
2735
+ this.now = new Date(Date.now());
2736
+ this.timeMarkerDiv = this.renderer.createElement('div');
2737
+ this.renderer.addClass(this.timeMarkerDiv, 'k-current-time');
2738
+ this.renderer.setStyle(this.timeMarkerDiv, 'width', '1px');
2739
+ this.renderer.setStyle(this.timeMarkerDiv, 'top', '0px');
2740
+ this.renderer.setStyle(this.timeMarkerDiv, `${this.rtl ? 'right' : 'left'}`, this.deltaOffset + 'px');
2741
+ this.renderer.appendChild(this.container.nativeElement, this.timeMarkerDiv);
2742
+ this.renderer.setStyle(this.timeMarkerDiv, 'height', this.height + 'px');
2743
+ this.currentTimeTimeout = setTimeout(this.createTimeMarker, this.interval || MS_PER_MINUTE);
2744
+ }
2745
+ };
2746
+ }
2747
+ get deltaOffset() {
2748
+ if (this.slotIndex >= 0) {
2749
+ const total = this.slots[this.slotIndex].end.getTime() - this.slots[this.slotIndex].start.getTime();
2750
+ if (total > 0) {
2751
+ const currentTimeValue = this.now.getTime() - this.slots[this.slotIndex].start.getTime();
2752
+ const fractionInsideCell = currentTimeValue / total;
2753
+ const deltaOffsetToSlot = this.slotIndex * this.slotWidth;
2754
+ const deltaOffsetInsideSlot = fractionInsideCell * this.slotWidth;
2755
+ return deltaOffsetToSlot + deltaOffsetInsideSlot;
2756
+ }
2757
+ return 0;
2758
+ }
2759
+ }
2760
+ get slotWidth() {
2761
+ var _a;
2762
+ return (_a = this.slots[0]) === null || _a === void 0 ? void 0 : _a.slotWidth;
2763
+ }
2764
+ get slotIndex() {
2765
+ return this.slots.indexOf(this.slots.find((slot) => slot.start <= this.now && slot.end > this.now));
2766
+ }
2767
+ get height() {
2768
+ return this.rows.length * this.rowHeight;
2769
+ }
2770
+ get interval() {
2771
+ var _a;
2772
+ if (typeof (this.currentTimeMarker) === 'boolean') {
2773
+ return MS_PER_MINUTE;
2774
+ }
2775
+ return ((_a = this.currentTimeMarker) === null || _a === void 0 ? void 0 : _a.updateInterval) || MS_PER_MINUTE;
2776
+ }
2777
+ ngOnDestroy() {
2778
+ clearTimeout(this.currentTimeTimeout);
2779
+ }
2780
+ removeTimeMarker() {
2781
+ if (this.timeMarkerDiv) {
2782
+ this.renderer.removeChild(this.container.nativeElement, this.timeMarkerDiv);
2783
+ clearTimeout(this.currentTimeTimeout);
2784
+ this.cdr.detectChanges();
2785
+ }
2786
+ }
2787
+ }
2788
+ 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 });
2789
+ CurrentTimeMarkerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrentTimeMarkerService });
2790
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrentTimeMarkerService, decorators: [{
2791
+ type: Injectable
2792
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; } });
2793
+
2794
+ /**
2795
+ * @hidden
2796
+ */
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
+ });
2861
+ }
2862
+ }
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, 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: `
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
2875
+ [groupSlots]="groupSlots"
2876
+ [slots]="slots">
2877
2877
  </tbody>
2878
2878
  </table>
2879
2879
  </div>
@@ -2964,7 +2964,7 @@ GanttTimelineComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
2964
2964
  <ng-container #dragPopupContainer></ng-container>
2965
2965
  </div>
2966
2966
  </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"] }] });
2967
+ `, 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
2968
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTimelineComponent, decorators: [{
2969
2969
  type: Component,
2970
2970
  args: [{
@@ -3072,7 +3072,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3072
3072
  <ng-container #dragPopupContainer></ng-container>
3073
3073
  </div>
3074
3074
  </div>
3075
- `
3075
+ `,
3076
+ standalone: true,
3077
+ imports: [TableDirective, GanttHeaderTableBodyComponent, TimelineScrollableDirective, DraggableDirective, NgFor, GanttTasksTableBodyComponent, GanttDependencyDirective]
3076
3078
  }]
3077
3079
  }], ctorParameters: function () { return [{ type: ScrollSyncService }, { type: DependencyDomService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: CurrentTimeMarkerService }]; }, propDecorators: { timelineContent: [{
3078
3080
  type: ViewChild,
@@ -3203,11 +3205,12 @@ class CellTemplateDirective {
3203
3205
  }
3204
3206
  }
3205
3207
  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 });
3208
+ CellTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: CellTemplateDirective, isStandalone: true, selector: "[kendoGanttCellTemplate]", ngImport: i0 });
3207
3209
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CellTemplateDirective, decorators: [{
3208
3210
  type: Directive,
3209
3211
  args: [{
3210
- selector: '[kendoGanttCellTemplate]'
3212
+ selector: '[kendoGanttCellTemplate]',
3213
+ standalone: true
3211
3214
  }]
3212
3215
  }], ctorParameters: function () {
3213
3216
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3231,11 +3234,12 @@ class ColumnMenuTemplateDirective {
3231
3234
  }
3232
3235
  }
3233
3236
  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 });
3237
+ ColumnMenuTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ColumnMenuTemplateDirective, isStandalone: true, selector: "[kendoGanttColumnMenuTemplate]", ngImport: i0 });
3235
3238
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ColumnMenuTemplateDirective, decorators: [{
3236
3239
  type: Directive,
3237
3240
  args: [{
3238
- selector: '[kendoGanttColumnMenuTemplate]'
3241
+ selector: '[kendoGanttColumnMenuTemplate]',
3242
+ standalone: true
3239
3243
  }]
3240
3244
  }], ctorParameters: function () {
3241
3245
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3258,11 +3262,12 @@ class FilterCellTemplateDirective {
3258
3262
  }
3259
3263
  }
3260
3264
  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 });
3265
+ FilterCellTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: FilterCellTemplateDirective, isStandalone: true, selector: "[kendoGanttFilterCellTemplate]", ngImport: i0 });
3262
3266
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterCellTemplateDirective, decorators: [{
3263
3267
  type: Directive,
3264
3268
  args: [{
3265
- selector: '[kendoGanttFilterCellTemplate]'
3269
+ selector: '[kendoGanttFilterCellTemplate]',
3270
+ standalone: true
3266
3271
  }]
3267
3272
  }], ctorParameters: function () {
3268
3273
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3284,11 +3289,12 @@ class FilterMenuTemplateDirective {
3284
3289
  }
3285
3290
  }
3286
3291
  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 });
3292
+ FilterMenuTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: FilterMenuTemplateDirective, isStandalone: true, selector: "[kendoGanttFilterMenuTemplate]", ngImport: i0 });
3288
3293
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterMenuTemplateDirective, decorators: [{
3289
3294
  type: Directive,
3290
3295
  args: [{
3291
- selector: '[kendoGanttFilterMenuTemplate]'
3296
+ selector: '[kendoGanttFilterMenuTemplate]',
3297
+ standalone: true
3292
3298
  }]
3293
3299
  }], ctorParameters: function () {
3294
3300
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3314,11 +3320,12 @@ class FooterTemplateDirective {
3314
3320
  }
3315
3321
  }
3316
3322
  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 });
3323
+ FooterTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: FooterTemplateDirective, isStandalone: true, selector: "[kendoGanttFooterTemplate]", ngImport: i0 });
3318
3324
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FooterTemplateDirective, decorators: [{
3319
3325
  type: Directive,
3320
3326
  args: [{
3321
- selector: '[kendoGanttFooterTemplate]'
3327
+ selector: '[kendoGanttFooterTemplate]',
3328
+ standalone: true
3322
3329
  }]
3323
3330
  }], ctorParameters: function () {
3324
3331
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3342,11 +3349,12 @@ class HeaderTemplateDirective {
3342
3349
  }
3343
3350
  }
3344
3351
  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 });
3352
+ HeaderTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: HeaderTemplateDirective, isStandalone: true, selector: "[kendoGanttHeaderTemplate]", ngImport: i0 });
3346
3353
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: HeaderTemplateDirective, decorators: [{
3347
3354
  type: Directive,
3348
3355
  args: [{
3349
- selector: '[kendoGanttHeaderTemplate]'
3356
+ selector: '[kendoGanttHeaderTemplate]',
3357
+ standalone: true
3350
3358
  }]
3351
3359
  }], ctorParameters: function () {
3352
3360
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3374,11 +3382,12 @@ class EditTemplateDirective {
3374
3382
  }
3375
3383
  }
3376
3384
  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 });
3385
+ EditTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: EditTemplateDirective, isStandalone: true, selector: "[kendoGanttEditTemplate]", ngImport: i0 });
3378
3386
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditTemplateDirective, decorators: [{
3379
3387
  type: Directive,
3380
3388
  args: [{
3381
- selector: '[kendoGanttEditTemplate]'
3389
+ selector: '[kendoGanttEditTemplate]',
3390
+ standalone: true
3382
3391
  }]
3383
3392
  }], ctorParameters: function () {
3384
3393
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3430,7 +3439,7 @@ class GanttColumnComponent extends ColumnComponent {
3430
3439
  }
3431
3440
  }
3432
3441
  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: [
3442
+ 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
3443
  {
3435
3444
  provide: GanttColumnBase,
3436
3445
  useExisting: forwardRef(() => GanttColumnComponent)
@@ -3446,7 +3455,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3446
3455
  provide: GanttColumnBase,
3447
3456
  useExisting: forwardRef(() => GanttColumnComponent)
3448
3457
  }
3449
- ]
3458
+ ],
3459
+ standalone: true
3450
3460
  }]
3451
3461
  }], ctorParameters: function () {
3452
3462
  return [{ type: OptionChangesService }, { type: GanttColumnBase, decorators: [{
@@ -3544,7 +3554,7 @@ class GanttColumnGroupComponent extends ColumnGroupComponent {
3544
3554
  }
3545
3555
  }
3546
3556
  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: [
3557
+ 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
3558
  {
3549
3559
  provide: GanttColumnBase,
3550
3560
  useExisting: forwardRef(() => GanttColumnGroupComponent)
@@ -3560,7 +3570,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3560
3570
  provide: GanttColumnBase,
3561
3571
  useExisting: forwardRef(() => GanttColumnGroupComponent)
3562
3572
  }
3563
- ]
3573
+ ],
3574
+ standalone: true
3564
3575
  }]
3565
3576
  }], ctorParameters: function () {
3566
3577
  return [{ type: OptionChangesService }, { type: GanttColumnBase, decorators: [{
@@ -3649,7 +3660,7 @@ class GanttSpanColumnComponent extends SpanColumnComponent {
3649
3660
  }
3650
3661
  }
3651
3662
  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: [
3663
+ 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
3664
  {
3654
3665
  provide: GanttColumnBase,
3655
3666
  useExisting: forwardRef(() => GanttSpanColumnComponent)
@@ -3665,7 +3676,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3665
3676
  provide: GanttColumnBase,
3666
3677
  useExisting: forwardRef(() => GanttSpanColumnComponent)
3667
3678
  }
3668
- ]
3679
+ ],
3680
+ standalone: true
3669
3681
  }]
3670
3682
  }], ctorParameters: function () {
3671
3683
  return [{ type: OptionChangesService }, { type: GanttColumnBase, decorators: [{
@@ -3809,11 +3821,12 @@ class GanttTaskTemplateDirective {
3809
3821
  }
3810
3822
  }
3811
3823
  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 });
3824
+ GanttTaskTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttTaskTemplateDirective, isStandalone: true, selector: "[kendoGanttTaskTemplate]", ngImport: i0 });
3813
3825
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskTemplateDirective, decorators: [{
3814
3826
  type: Directive,
3815
3827
  args: [{
3816
- selector: '[kendoGanttTaskTemplate]'
3828
+ selector: '[kendoGanttTaskTemplate]',
3829
+ standalone: true
3817
3830
  }]
3818
3831
  }], ctorParameters: function () {
3819
3832
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3856,11 +3869,12 @@ class GanttSummaryTaskTemplateDirective {
3856
3869
  }
3857
3870
  }
3858
3871
  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 });
3872
+ GanttSummaryTaskTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttSummaryTaskTemplateDirective, isStandalone: true, selector: "[kendoGanttSummaryTaskTemplate]", ngImport: i0 });
3860
3873
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSummaryTaskTemplateDirective, decorators: [{
3861
3874
  type: Directive,
3862
3875
  args: [{
3863
- selector: '[kendoGanttSummaryTaskTemplate]'
3876
+ selector: '[kendoGanttSummaryTaskTemplate]',
3877
+ standalone: true
3864
3878
  }]
3865
3879
  }], ctorParameters: function () {
3866
3880
  return [{ type: i0.TemplateRef, decorators: [{
@@ -3898,11 +3912,12 @@ class GanttTaskContentTemplateDirective {
3898
3912
  }
3899
3913
  }
3900
3914
  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 });
3915
+ GanttTaskContentTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttTaskContentTemplateDirective, isStandalone: true, selector: "[kendoGanttTaskContentTemplate]", ngImport: i0 });
3902
3916
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttTaskContentTemplateDirective, decorators: [{
3903
3917
  type: Directive,
3904
3918
  args: [{
3905
- selector: '[kendoGanttTaskContentTemplate]'
3919
+ selector: '[kendoGanttTaskContentTemplate]',
3920
+ standalone: true
3906
3921
  }]
3907
3922
  }], ctorParameters: function () {
3908
3923
  return [{ type: i0.TemplateRef, decorators: [{
@@ -4019,11 +4034,12 @@ class ToolbarTemplateDirective {
4019
4034
  }
4020
4035
  }
4021
4036
  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 });
4037
+ ToolbarTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ToolbarTemplateDirective, isStandalone: true, selector: "[kendoGanttToolbarTemplate]", inputs: { position: "position" }, ngImport: i0 });
4023
4038
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarTemplateDirective, decorators: [{
4024
4039
  type: Directive,
4025
4040
  args: [{
4026
- selector: '[kendoGanttToolbarTemplate]'
4041
+ selector: '[kendoGanttToolbarTemplate]',
4042
+ standalone: true
4027
4043
  }]
4028
4044
  }], ctorParameters: function () {
4029
4045
  return [{ type: i0.TemplateRef, decorators: [{
@@ -4093,851 +4109,863 @@ const mapPath = (item) => ({
4093
4109
  /**
4094
4110
  * @hidden
4095
4111
  */
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) {
4112
+ class DependenciesTableComponent {
4113
+ constructor(mapper, editService, localizationService) {
4114
+ this.mapper = mapper;
4115
+ this.editService = editService;
4120
4116
  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
- }
4117
+ this.dependenciesChange = new EventEmitter();
4118
+ this.selectedKeys = [];
4119
+ this.formGroups = new FormArray([]);
4120
+ this.dependencyTypes = this.getDependencyTypes();
4121
+ this.plusIcon = plusIcon;
4122
+ this.minusIcon = minusIcon;
4139
4123
  }
4140
- /**
4141
- * @hidden
4142
- */
4143
- getViewTypeText(viewType) {
4144
- return this.localizationService.get(`${viewType}ViewText`);
4124
+ get taskId() {
4125
+ return this.editService.dataItem.id;
4145
4126
  }
4146
- /**
4147
- * @hidden
4148
- */
4149
- onActiveViewChange(event) {
4150
- this.activeViewChange.emit(event.target.value);
4127
+ // The target dependency id field
4128
+ // e.g. if Predecessors, we have the `fromId` which is the currently edited task,
4129
+ // while the `toId` is missing (needs to be selected by the user)
4130
+ get dependencyIdField() {
4131
+ return this.dependencyType === 'predecessor' ? 'fromId' : 'toId';
4132
+ }
4133
+ ngOnInit() {
4134
+ // generate the FormGroups per each Grid row
4135
+ if (this.formGroups.controls.length === 0) {
4136
+ const fields = this.mapper.dependencyFields;
4137
+ this.dependencies.forEach(item => {
4138
+ const formGroup = new FormGroup({
4139
+ [fields.id]: new FormControl(this.mapper.extractFromDependency(item, 'id')),
4140
+ [fields.fromId]: new FormControl(this.mapper.extractFromDependency(item, 'fromId'), Validators.required),
4141
+ [fields.toId]: new FormControl(this.mapper.extractFromDependency(item, 'toId'), Validators.required),
4142
+ [fields.type]: new FormControl(this.mapper.extractFromDependency(item, 'type'), Validators.required)
4143
+ });
4144
+ this.formGroups.push(formGroup);
4145
+ });
4146
+ }
4147
+ this.formGroups.valueChanges.subscribe(val => {
4148
+ this.formGroups.controls.forEach(control => {
4149
+ if (control.dirty) {
4150
+ this.editService.updateDependencies(control.value);
4151
+ }
4152
+ });
4153
+ this.dependenciesChange.emit(val);
4154
+ });
4155
+ }
4156
+ getFormControl(dataItemIndex, field) {
4157
+ // return the FormControl for the respective column editor
4158
+ return this.formGroups.controls
4159
+ .find((_control, index) => index === dataItemIndex)
4160
+ .get(this.mapper.dependencyFields[field]);
4161
+ }
4162
+ getText(token) {
4163
+ return this.localizationService.get(token);
4164
+ }
4165
+ getDependencyTypes() {
4166
+ const types = Object.keys(DependencyType)
4167
+ .filter(value => typeof DependencyType[value] === 'number')
4168
+ .map(type => {
4169
+ return {
4170
+ type,
4171
+ id: DependencyType[type]
4172
+ };
4173
+ });
4174
+ return types;
4175
+ }
4176
+ addHandler() {
4177
+ const fields = this.mapper.dependencyFields;
4178
+ const formGroup = new FormGroup({
4179
+ [fields.id]: new FormControl(),
4180
+ [fields.fromId]: new FormControl(this.dependencyIdField === 'toId' ? this.taskId : null, Validators.required),
4181
+ [fields.toId]: new FormControl(this.dependencyIdField === 'fromId' ? this.taskId : null, Validators.required),
4182
+ [fields.type]: new FormControl(null, Validators.required)
4183
+ });
4184
+ this.formGroups.push(formGroup);
4185
+ }
4186
+ removeHandler() {
4187
+ const [selectedIndex] = this.selectedKeys;
4188
+ const item = this.formGroups.at(selectedIndex).value;
4189
+ this.editService.deleteDependency(item);
4190
+ this.formGroups.removeAt(selectedIndex);
4151
4191
  }
4152
4192
  }
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: [{
4193
+ 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 });
4194
+ 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: `
4195
+ <kendo-grid
4196
+ [data]="dependencies"
4197
+ [selectable]="{ mode: 'single' }"
4198
+ [(selectedKeys)]="selectedKeys"
4199
+ kendoGridSelectBy
4200
+ [height]="275"
4201
+ >
4202
+ <ng-template kendoGridToolbarTemplate>
4203
+ <button
4204
+ kendoButton
4205
+ icon="plus"
4206
+ [svgIcon]="plusIcon"
4207
+ (click)="addHandler()"
4208
+ >
4209
+ {{ getText('taskEditingDependenciesAddButtonText') }}
4210
+ </button>
4211
+ <button
4212
+ kendoButton
4213
+ icon="minus"
4214
+ [svgIcon]="minusIcon"
4215
+ [disabled]="selectedKeys.length === 0"
4216
+ (click)="removeHandler()"
4217
+ >
4218
+ {{ getText('taskEditingDependenciesRemoveButtonText') }}
4219
+ </button>
4220
+ </ng-template>
4221
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridNameColumnTitle')" [field]="dependencyIdField">
4222
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4223
+ <kendo-dropdownlist
4224
+ [data]="tasks"
4225
+ textField="title"
4226
+ valueField="id"
4227
+ [valuePrimitive]="true"
4228
+ [formControl]="getFormControl(rowIndex, column.field)"
4229
+ >
4230
+ </kendo-dropdownlist>
4231
+ </ng-template>
4232
+ </kendo-grid-column>
4233
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridTypeColumnTitle')" field="type">
4234
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4235
+ <kendo-dropdownlist
4236
+ [data]="dependencyTypes"
4237
+ textField="type"
4238
+ valueField="id"
4239
+ [valuePrimitive]="true"
4240
+ [formControl]="getFormControl(rowIndex, column.field)"
4241
+ >
4242
+ </kendo-dropdownlist>
4243
+ </ng-template>
4244
+ </kendo-grid-column>
4245
+ </kendo-grid>
4246
+ `, 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"] }] });
4247
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DependenciesTableComponent, decorators: [{
4171
4248
  type: Component,
4172
4249
  args: [{
4173
- selector: 'kendo-gantt-view-selector',
4250
+ selector: 'kendo-gantt-dependencies-table',
4174
4251
  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
- `
4252
+ <kendo-grid
4253
+ [data]="dependencies"
4254
+ [selectable]="{ mode: 'single' }"
4255
+ [(selectedKeys)]="selectedKeys"
4256
+ kendoGridSelectBy
4257
+ [height]="275"
4258
+ >
4259
+ <ng-template kendoGridToolbarTemplate>
4260
+ <button
4261
+ kendoButton
4262
+ icon="plus"
4263
+ [svgIcon]="plusIcon"
4264
+ (click)="addHandler()"
4265
+ >
4266
+ {{ getText('taskEditingDependenciesAddButtonText') }}
4267
+ </button>
4268
+ <button
4269
+ kendoButton
4270
+ icon="minus"
4271
+ [svgIcon]="minusIcon"
4272
+ [disabled]="selectedKeys.length === 0"
4273
+ (click)="removeHandler()"
4274
+ >
4275
+ {{ getText('taskEditingDependenciesRemoveButtonText') }}
4276
+ </button>
4277
+ </ng-template>
4278
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridNameColumnTitle')" [field]="dependencyIdField">
4279
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4280
+ <kendo-dropdownlist
4281
+ [data]="tasks"
4282
+ textField="title"
4283
+ valueField="id"
4284
+ [valuePrimitive]="true"
4285
+ [formControl]="getFormControl(rowIndex, column.field)"
4286
+ >
4287
+ </kendo-dropdownlist>
4288
+ </ng-template>
4289
+ </kendo-grid-column>
4290
+ <kendo-grid-column [title]="getText('taskEditingDependenciesGridTypeColumnTitle')" field="type">
4291
+ <ng-template kendoGridCellTemplate let-dataItem="dataItem" let-column="column" let-rowIndex="rowIndex">
4292
+ <kendo-dropdownlist
4293
+ [data]="dependencyTypes"
4294
+ textField="type"
4295
+ valueField="id"
4296
+ [valuePrimitive]="true"
4297
+ [formControl]="getFormControl(rowIndex, column.field)"
4298
+ >
4299
+ </kendo-dropdownlist>
4300
+ </ng-template>
4301
+ </kendo-grid-column>
4302
+ </kendo-grid>
4303
+ `,
4304
+ standalone: true,
4305
+ imports: [GridComponent, SelectionDirective, ToolbarTemplateDirective$1, ButtonComponent, ColumnComponent$1, CellTemplateDirective$1, DropDownListComponent, ReactiveFormsModule]
4190
4306
  }]
4191
- }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }]; }, propDecorators: { hostClass: [{
4192
- type: HostBinding,
4193
- args: ['class.k-gantt-views-wrapper']
4194
- }], views: [{
4307
+ }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: GanttLocalizationService }]; }, propDecorators: { tasks: [{
4195
4308
  type: Input
4196
- }], activeView: [{
4309
+ }], dependencies: [{
4197
4310
  type: Input
4198
- }], activeViewChange: [{
4311
+ }], dependencyType: [{
4312
+ type: Input
4313
+ }], dependenciesChange: [{
4199
4314
  type: Output
4200
4315
  }] } });
4201
4316
 
4202
4317
  /**
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.
4318
+ * @hidden
4205
4319
  */
4206
- class GanttAddTaskComponent {
4207
- constructor(localizationService, editService, ngZone) {
4208
- this.localizationService = localizationService;
4320
+ class TaskFieldsComponent {
4321
+ constructor(mapper, editService, localizationService) {
4322
+ this.mapper = mapper;
4209
4323
  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;
4324
+ this.localizationService = localizationService;
4235
4325
  }
4236
4326
  /**
4237
4327
  * @hidden
4238
4328
  */
4239
- getText(message) {
4240
- return this.localizationService.get(message);
4329
+ get formGroup() {
4330
+ return this.editService.taskFormGroup;
4241
4331
  }
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
- });
4332
+ getText(token) {
4333
+ return this.localizationService.get(token);
4271
4334
  }
4272
4335
  }
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: [{
4336
+ 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 });
4337
+ TaskFieldsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TaskFieldsComponent, isStandalone: true, selector: "kendo-gantt-task-fields", ngImport: i0, template: `
4338
+ <form class="k-form k-form-md" [formGroup]="formGroup">
4339
+ <kendo-formfield *ngIf="formGroup.get(mapper.taskFields.title)">
4340
+ <kendo-label [for]="title" [text]="getText('titleFieldInputLabel')"></kendo-label>
4341
+ <input #title kendoTextBox [formControlName]="mapper.taskFields.title" />
4342
+ </kendo-formfield>
4343
+ <div class="k-hstack">
4344
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.start)">
4345
+ <kendo-label [for]="start" [text]="getText('startFieldInputLabel')"></kendo-label>
4346
+ <kendo-datetimepicker #start [formControlName]="mapper.taskFields.start"></kendo-datetimepicker>
4347
+ </kendo-formfield>
4348
+ <kendo-treelist-spacer></kendo-treelist-spacer>
4349
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.end)">
4350
+ <kendo-label [for]="end" [text]="getText('endFieldInputLabel')"></kendo-label>
4351
+ <kendo-datetimepicker #end [formControlName]="mapper.taskFields.end"></kendo-datetimepicker>
4352
+ </kendo-formfield>
4353
+ </div>
4354
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.completionRatio)">
4355
+ <kendo-label [for]="completionRatio" [text]="getText('completionRatioFieldInputLabel')"></kendo-label>
4356
+ <kendo-numerictextbox
4357
+ #completionRatio
4358
+ [formControlName]="mapper.taskFields.completionRatio"
4359
+ [min]="0"
4360
+ [max]="1"
4361
+ [decimals]="2"
4362
+ format="p2"
4363
+ [step]="0.01"
4364
+ ></kendo-numerictextbox>
4365
+ </kendo-formfield>
4366
+ </form>
4367
+ `, 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"] }] });
4368
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TaskFieldsComponent, decorators: [{
4287
4369
  type: Component,
4288
4370
  args: [{
4289
- selector: 'kendo-gantt-add-task',
4371
+ selector: 'kendo-gantt-task-fields',
4290
4372
  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
- `
4373
+ <form class="k-form k-form-md" [formGroup]="formGroup">
4374
+ <kendo-formfield *ngIf="formGroup.get(mapper.taskFields.title)">
4375
+ <kendo-label [for]="title" [text]="getText('titleFieldInputLabel')"></kendo-label>
4376
+ <input #title kendoTextBox [formControlName]="mapper.taskFields.title" />
4377
+ </kendo-formfield>
4378
+ <div class="k-hstack">
4379
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.start)">
4380
+ <kendo-label [for]="start" [text]="getText('startFieldInputLabel')"></kendo-label>
4381
+ <kendo-datetimepicker #start [formControlName]="mapper.taskFields.start"></kendo-datetimepicker>
4382
+ </kendo-formfield>
4383
+ <kendo-treelist-spacer></kendo-treelist-spacer>
4384
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.end)">
4385
+ <kendo-label [for]="end" [text]="getText('endFieldInputLabel')"></kendo-label>
4386
+ <kendo-datetimepicker #end [formControlName]="mapper.taskFields.end"></kendo-datetimepicker>
4387
+ </kendo-formfield>
4388
+ </div>
4389
+ <kendo-formfield [style.width.%]="49" *ngIf="formGroup.get(mapper.taskFields.completionRatio)">
4390
+ <kendo-label [for]="completionRatio" [text]="getText('completionRatioFieldInputLabel')"></kendo-label>
4391
+ <kendo-numerictextbox
4392
+ #completionRatio
4393
+ [formControlName]="mapper.taskFields.completionRatio"
4394
+ [min]="0"
4395
+ [max]="1"
4396
+ [decimals]="2"
4397
+ format="p2"
4398
+ [step]="0.01"
4399
+ ></kendo-numerictextbox>
4400
+ </kendo-formfield>
4401
+ </form>
4402
+ `,
4403
+ standalone: true,
4404
+ imports: [ReactiveFormsModule, NgIf, FormFieldComponent, LabelComponent, TextBoxDirective, DateTimePickerComponent, TreeListSpacerComponent, NumericTextBoxComponent]
4302
4405
  }]
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
- }] } });
4406
+ }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: GanttLocalizationService }]; } });
4310
4407
 
4311
4408
  /**
4312
4409
  * @hidden
4313
4410
  */
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();
4411
+ class EditDialogComponent {
4412
+ constructor(mapper, editService, cdr, localizationService) {
4413
+ this.mapper = mapper;
4414
+ this.editService = editService;
4415
+ this.cdr = cdr;
4416
+ this.localizationService = localizationService;
4417
+ this.saveIcon = saveIcon;
4418
+ this.cancelIcon = cancelOutlineIcon;
4419
+ this.deleteIcon = trashIcon;
4322
4420
  }
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
- }
4421
+ ngOnInit() {
4422
+ this.editService.loadTasks(this.data).subscribe(value => {
4423
+ this.loadedTasks = value;
4424
+ });
4332
4425
  }
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
- }
4426
+ get predecessors() {
4427
+ return this.editService.predecessors;
4341
4428
  }
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
- }
4429
+ set predecessors(items) {
4430
+ this.editService.predecessors = items;
4350
4431
  }
4351
- set position(value) {
4352
- this.context.position = this._position = value;
4432
+ get successors() {
4433
+ return this.editService.successors;
4353
4434
  }
4354
- get position() {
4355
- return this._position;
4435
+ set successors(items) {
4436
+ this.editService.successors = items;
4356
4437
  }
4357
- get toolbarTemplateRef() {
4358
- return this.toolbarTemplate ? this.toolbarTemplate.templateRef : undefined;
4438
+ getText(token) {
4439
+ return this.localizationService.get(token);
4359
4440
  }
4360
- get renderTemplate() {
4361
- const ganttToolbarTemplate = this.toolbarTemplate;
4362
- const templatePosition = ganttToolbarTemplate ? ganttToolbarTemplate.position : null;
4363
- return ganttToolbarTemplate && (templatePosition === 'both' || templatePosition === this.position);
4441
+ getDependencyType(typeId) {
4442
+ return DependencyType[typeId];
4364
4443
  }
4365
- handleViewChange(view) {
4366
- this.activeViewChange.emit(view);
4444
+ handleEditingResult(editResultType) {
4445
+ this.editService.triggerEditEvent(editResultType);
4367
4446
  }
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
- }
4447
+ handleTaskDelete() {
4448
+ this.editService.taskDelete.next(this.editService.dataItem);
4376
4449
  }
4377
4450
  }
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: [{
4451
+ 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 });
4452
+ 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: `
4453
+ <kendo-dialog
4454
+ [title]="getText('taskEditingDialogTitle')"
4455
+ [width]="575"
4456
+ [height]="470"
4457
+ [autoFocusedElement]="'.k-actions .k-button-solid-primary'"
4458
+ (close)="handleEditingResult('cancel')">
4459
+ <kendo-dialog-messages
4460
+ [closeTitle]="getText('taskEditingDialogCloseTitle')"></kendo-dialog-messages>
4461
+
4462
+ <kendo-tabstrip [keepTabContent]="true" [style.height.px]="345">
4463
+ <kendo-tabstrip-tab [title]="getText('taskEditingGeneralTabTitle')" [selected]="true">
4464
+ <ng-template kendoTabContent>
4465
+ <kendo-gantt-task-fields></kendo-gantt-task-fields>
4466
+ </ng-template>
4467
+ </kendo-tabstrip-tab>
4468
+ <kendo-tabstrip-tab [title]="getText('taskEditingPredecessorsTabTitle')">
4469
+ <ng-template kendoTabContent>
4470
+ <kendo-gantt-dependencies-table
4471
+ [tasks]="loadedTasks"
4472
+ [(dependencies)]="predecessors"
4473
+ dependencyType="predecessor"
4474
+ >
4475
+ </kendo-gantt-dependencies-table>
4476
+ </ng-template>
4477
+ </kendo-tabstrip-tab>
4478
+ <kendo-tabstrip-tab [title]="getText('taskEditingSuccessorsTabTitle')">
4479
+ <ng-template kendoTabContent>
4480
+ <kendo-gantt-dependencies-table
4481
+ [tasks]="loadedTasks"
4482
+ [(dependencies)]="successors"
4483
+ dependencyType="successor">
4484
+ </kendo-gantt-dependencies-table>
4485
+ </ng-template>
4486
+ </kendo-tabstrip-tab>
4487
+ </kendo-tabstrip>
4488
+
4489
+ <kendo-dialog-actions layout="start">
4490
+ <button
4491
+ kendoButton
4492
+ themeColor="primary"
4493
+ icon="save"
4494
+ [svgIcon]="saveIcon"
4495
+ (click)="handleEditingResult('save')"
4496
+ >
4497
+ {{ getText('saveButtonText') }}
4498
+ </button>
4499
+ <button
4500
+ kendoButton
4501
+ icon="cancel-outline"
4502
+ [svgIcon]="cancelIcon"
4503
+ (click)="handleEditingResult('cancel')"
4504
+ >
4505
+ {{ getText('cancelButtonText') }}
4506
+ </button>
4507
+ <kendo-treelist-spacer></kendo-treelist-spacer>
4508
+ <button
4509
+ kendoButton
4510
+ themeColor="primary"
4511
+ fillMode="flat"
4512
+ icon="delete"
4513
+ [svgIcon]="deleteIcon"
4514
+ [kendoEventsOutsideAngular]="{
4515
+ click: handleTaskDelete
4516
+ }"
4517
+ [scope]="this"
4518
+ >
4519
+ {{ getText('deleteButtonText') }}
4520
+ </button>
4521
+ </kendo-dialog-actions>
4522
+ </kendo-dialog>
4523
+ `, 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"] }] });
4524
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditDialogComponent, decorators: [{
4525
+ type: Component,
4526
+ args: [{
4527
+ selector: 'kendo-gantt-edit-dialog',
4528
+ template: `
4529
+ <kendo-dialog
4530
+ [title]="getText('taskEditingDialogTitle')"
4531
+ [width]="575"
4532
+ [height]="470"
4533
+ [autoFocusedElement]="'.k-actions .k-button-solid-primary'"
4534
+ (close)="handleEditingResult('cancel')">
4535
+ <kendo-dialog-messages
4536
+ [closeTitle]="getText('taskEditingDialogCloseTitle')"></kendo-dialog-messages>
4537
+
4538
+ <kendo-tabstrip [keepTabContent]="true" [style.height.px]="345">
4539
+ <kendo-tabstrip-tab [title]="getText('taskEditingGeneralTabTitle')" [selected]="true">
4540
+ <ng-template kendoTabContent>
4541
+ <kendo-gantt-task-fields></kendo-gantt-task-fields>
4542
+ </ng-template>
4543
+ </kendo-tabstrip-tab>
4544
+ <kendo-tabstrip-tab [title]="getText('taskEditingPredecessorsTabTitle')">
4545
+ <ng-template kendoTabContent>
4546
+ <kendo-gantt-dependencies-table
4547
+ [tasks]="loadedTasks"
4548
+ [(dependencies)]="predecessors"
4549
+ dependencyType="predecessor"
4550
+ >
4551
+ </kendo-gantt-dependencies-table>
4552
+ </ng-template>
4553
+ </kendo-tabstrip-tab>
4554
+ <kendo-tabstrip-tab [title]="getText('taskEditingSuccessorsTabTitle')">
4555
+ <ng-template kendoTabContent>
4556
+ <kendo-gantt-dependencies-table
4557
+ [tasks]="loadedTasks"
4558
+ [(dependencies)]="successors"
4559
+ dependencyType="successor">
4560
+ </kendo-gantt-dependencies-table>
4561
+ </ng-template>
4562
+ </kendo-tabstrip-tab>
4563
+ </kendo-tabstrip>
4564
+
4565
+ <kendo-dialog-actions layout="start">
4566
+ <button
4567
+ kendoButton
4568
+ themeColor="primary"
4569
+ icon="save"
4570
+ [svgIcon]="saveIcon"
4571
+ (click)="handleEditingResult('save')"
4572
+ >
4573
+ {{ getText('saveButtonText') }}
4574
+ </button>
4575
+ <button
4576
+ kendoButton
4577
+ icon="cancel-outline"
4578
+ [svgIcon]="cancelIcon"
4579
+ (click)="handleEditingResult('cancel')"
4580
+ >
4581
+ {{ getText('cancelButtonText') }}
4582
+ </button>
4583
+ <kendo-treelist-spacer></kendo-treelist-spacer>
4584
+ <button
4585
+ kendoButton
4586
+ themeColor="primary"
4587
+ fillMode="flat"
4588
+ icon="delete"
4589
+ [svgIcon]="deleteIcon"
4590
+ [kendoEventsOutsideAngular]="{
4591
+ click: handleTaskDelete
4592
+ }"
4593
+ [scope]="this"
4594
+ >
4595
+ {{ getText('deleteButtonText') }}
4596
+ </button>
4597
+ </kendo-dialog-actions>
4598
+ </kendo-dialog>
4599
+ `,
4600
+ standalone: true,
4601
+ imports: [DialogComponent, CustomMessagesComponent$1, TabStripComponent, TabStripTabComponent, TabContentDirective, TaskFieldsComponent, DependenciesTableComponent, DialogActionsComponent, ButtonComponent, TreeListSpacerComponent, EventsOutsideAngularDirective]
4602
+ }]
4603
+ }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: i0.ChangeDetectorRef }, { type: i1$1.LocalizationService }]; }, propDecorators: { data: [{
4449
4604
  type: Input
4450
4605
  }] } });
4451
4606
 
4452
4607
  /**
4453
4608
  * @hidden
4454
4609
  */
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';
4610
+ class ToolbarNavigationService {
4611
+ constructor(renderer) {
4612
+ this.renderer = renderer;
4613
+ this.focusIndex = 0;
4475
4614
  }
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);
4615
+ updateFocus() {
4616
+ this.focusableContent.forEach(el => {
4617
+ this.renderer.setAttribute(el, 'tabindex', '-1');
4497
4618
  });
4619
+ this.renderer.setAttribute(this.focusableContent[this.focusIndex], 'tabindex', '0');
4620
+ this.focusableContent[this.focusIndex].focus();
4498
4621
  }
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);
4622
+ }
4623
+ ToolbarNavigationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarNavigationService, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Injectable });
4624
+ ToolbarNavigationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarNavigationService });
4625
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarNavigationService, decorators: [{
4626
+ type: Injectable
4627
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; } });
4628
+
4629
+ /**
4630
+ * The Gantt ViewSelector component. Shows the currently active view type, and allows switching to another view type.
4631
+ */
4632
+ class ViewSelectorComponent {
4633
+ constructor(localizationService) {
4634
+ this.localizationService = localizationService;
4635
+ this.hostClass = true;
4636
+ /**
4637
+ * The currently active view type.
4638
+ * @default 'week'
4639
+ */
4640
+ this.activeView = 'week';
4641
+ /**
4642
+ * Fires each time the user selects a different view type. The event data contains the type of the newly selected view.
4643
+ */
4644
+ this.activeViewChange = new EventEmitter();
4507
4645
  }
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;
4646
+ /**
4647
+ * @hidden
4648
+ */
4649
+ onClick(viewType) {
4650
+ if (viewType !== this.activeView) {
4651
+ this.activeViewChange.emit(viewType);
4652
+ }
4518
4653
  }
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);
4654
+ /**
4655
+ * @hidden
4656
+ */
4657
+ getViewTypeText(viewType) {
4658
+ return this.localizationService.get(`${viewType}ViewText`);
4528
4659
  }
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);
4660
+ /**
4661
+ * @hidden
4662
+ */
4663
+ onActiveViewChange(event) {
4664
+ this.activeViewChange.emit(event.target.value);
4534
4665
  }
4535
4666
  }
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>
4546
- <button
4547
- kendoButton
4548
- icon="plus"
4549
- [svgIcon]="plusIcon"
4550
- (click)="addHandler()"
4551
- >
4552
- {{ getText('taskEditingDependenciesAddButtonText') }}
4553
- </button>
4554
- <button
4555
- kendoButton
4556
- icon="minus"
4557
- [svgIcon]="minusIcon"
4558
- [disabled]="selectedKeys.length === 0"
4559
- (click)="removeHandler()"
4560
- >
4561
- {{ getText('taskEditingDependenciesRemoveButtonText') }}
4562
- </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: [{
4667
+ 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 });
4668
+ 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: `
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
+ `, 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"] }] });
4684
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ViewSelectorComponent, decorators: [{
4591
4685
  type: Component,
4592
4686
  args: [{
4593
- selector: 'kendo-gantt-dependencies-table',
4687
+ selector: 'kendo-gantt-view-selector',
4594
4688
  template: `
4595
- <kendo-grid
4596
- [data]="dependencies"
4597
- [selectable]="{ mode: 'single' }"
4598
- [(selectedKeys)]="selectedKeys"
4599
- kendoGridSelectBy
4600
- [height]="275"
4601
- >
4602
- <ng-template kendoGridToolbarTemplate>
4603
- <button
4604
- kendoButton
4605
- icon="plus"
4606
- [svgIcon]="plusIcon"
4607
- (click)="addHandler()"
4608
- >
4609
- {{ getText('taskEditingDependenciesAddButtonText') }}
4610
- </button>
4611
- <button
4612
- kendoButton
4613
- icon="minus"
4614
- [svgIcon]="minusIcon"
4615
- [disabled]="selectedKeys.length === 0"
4616
- (click)="removeHandler()"
4617
- >
4618
- {{ getText('taskEditingDependenciesRemoveButtonText') }}
4619
- </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
- `
4689
+ <select
4690
+ class="k-dropdownlist k-picker k-rounded-md k-views-dropdown"
4691
+ aria-label="View Selector"
4692
+ [value]="activeView"
4693
+ (change)="onActiveViewChange($event)">
4694
+ <option *ngFor="let view of views" [value]="view">{{getViewTypeText(view)}}</option>
4695
+ </select>
4696
+ <kendo-buttongroup class="k-gantt-views" selection="single" [navigable]="false">
4697
+ <button *ngFor="let view of views"
4698
+ kendoButton
4699
+ type="button"
4700
+ [selected]="view === activeView"
4701
+ (click)="onClick(view)">{{getViewTypeText(view)}}</button>
4702
+ </kendo-buttongroup>
4703
+ `,
4704
+ standalone: true,
4705
+ imports: [NgFor, ReactiveFormsModule, ButtonGroupComponent, ButtonComponent]
4647
4706
  }]
4648
- }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: GanttLocalizationService }]; }, propDecorators: { tasks: [{
4649
- type: Input
4650
- }], dependencies: [{
4707
+ }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }]; }, propDecorators: { hostClass: [{
4708
+ type: HostBinding,
4709
+ args: ['class.k-gantt-views-wrapper']
4710
+ }], views: [{
4651
4711
  type: Input
4652
- }], dependencyType: [{
4712
+ }], activeView: [{
4653
4713
  type: Input
4654
- }], dependenciesChange: [{
4714
+ }], activeViewChange: [{
4655
4715
  type: Output
4656
4716
  }] } });
4657
4717
 
4658
4718
  /**
4659
- * @hidden
4719
+ * The UI for adding new items to the Gantt.
4720
+ * Use it within a toolbar template to provide a custom icon or list of options.
4660
4721
  */
4661
- class TaskFieldsComponent {
4662
- constructor(mapper, editService, localizationService) {
4663
- this.mapper = mapper;
4664
- this.editService = editService;
4722
+ class GanttAddTaskComponent {
4723
+ constructor(localizationService, editService, ngZone) {
4665
4724
  this.localizationService = localizationService;
4725
+ this.editService = editService;
4726
+ this.ngZone = ngZone;
4727
+ /**
4728
+ * Sets the data of the DropDownButton.
4729
+ * > The data has to be provided in an array-like list.
4730
+ */
4731
+ this.data = [{
4732
+ text: this.getText('addChildText'),
4733
+ type: 'addChild'
4734
+ }, {
4735
+ text: this.getText('addAboveText'),
4736
+ type: 'addAbove'
4737
+ }, {
4738
+ text: this.getText('addBelowText'),
4739
+ type: 'addBelow'
4740
+ }];
4741
+ /**
4742
+ * Defines the name of an existing icon in a Kendo UI theme.
4743
+ * @default 'plus'
4744
+ */
4745
+ this.icon = 'plus';
4746
+ /**
4747
+ * Defines an [`SVGIcon`](slug:api_icons_svgicon) icon to be rendered inside the `GanttAddTaskComponent` using
4748
+ * a [`KendoSVGIcon`](slug:api_icons_svgiconcomponent) component.
4749
+ */
4750
+ this.svgIcon = plusIcon;
4666
4751
  }
4667
4752
  /**
4668
4753
  * @hidden
4669
4754
  */
4670
- get formGroup() {
4671
- return this.editService.taskFormGroup;
4755
+ getText(message) {
4756
+ return this.localizationService.get(message);
4672
4757
  }
4673
- getText(token) {
4674
- return this.localizationService.get(token);
4758
+ /**
4759
+ * @hidden
4760
+ */
4761
+ handleOpen(e) {
4762
+ if (!this.editService.getSelectedItem()) {
4763
+ e.preventDefault();
4764
+ }
4765
+ }
4766
+ /**
4767
+ * @hidden
4768
+ */
4769
+ handleMouseClick() {
4770
+ if (!this.editService.getSelectedItem()) {
4771
+ this.ngZone.run(() => {
4772
+ this.editService.addEvent.next({
4773
+ selectedItem: null,
4774
+ actionType: 'addTask'
4775
+ });
4776
+ });
4777
+ }
4778
+ }
4779
+ /**
4780
+ * @hidden
4781
+ */
4782
+ handleItemClick(e) {
4783
+ this.editService.addEvent.next({
4784
+ actionType: e.type,
4785
+ selectedItem: null
4786
+ });
4675
4787
  }
4676
4788
  }
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: [{
4789
+ 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 });
4790
+ 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: `
4791
+ <kendo-dropdownbutton
4792
+ [data]="data"
4793
+ [icon]="icon"
4794
+ [svgIcon]="svgIcon"
4795
+ [kendoEventsOutsideAngular]="{ click: handleMouseClick }"
4796
+ [scope]="this"
4797
+ (itemClick)="handleItemClick($event)"
4798
+ (open)="handleOpen($event)">
4799
+ {{ getText('addTaskText') }}
4800
+ </kendo-dropdownbutton>
4801
+ `, 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"] }] });
4802
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttAddTaskComponent, decorators: [{
4710
4803
  type: Component,
4711
4804
  args: [{
4712
- selector: 'kendo-gantt-task-fields',
4805
+ selector: 'kendo-gantt-add-task',
4713
4806
  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
- `
4807
+ <kendo-dropdownbutton
4808
+ [data]="data"
4809
+ [icon]="icon"
4810
+ [svgIcon]="svgIcon"
4811
+ [kendoEventsOutsideAngular]="{ click: handleMouseClick }"
4812
+ [scope]="this"
4813
+ (itemClick)="handleItemClick($event)"
4814
+ (open)="handleOpen($event)">
4815
+ {{ getText('addTaskText') }}
4816
+ </kendo-dropdownbutton>
4817
+ `,
4818
+ standalone: true,
4819
+ imports: [DropDownButtonComponent, EventsOutsideAngularDirective]
4744
4820
  }]
4745
- }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: GanttLocalizationService }]; } });
4821
+ }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }, { type: EditService }, { type: i0.NgZone }]; }, propDecorators: { data: [{
4822
+ type: Input
4823
+ }], icon: [{
4824
+ type: Input
4825
+ }], svgIcon: [{
4826
+ type: Input
4827
+ }] } });
4746
4828
 
4747
4829
  /**
4748
4830
  * @hidden
4749
4831
  */
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;
4832
+ class ToolbarComponent {
4833
+ constructor(hostEl, navigationService) {
4834
+ this.hostEl = hostEl;
4835
+ this.navigationService = navigationService;
4836
+ this.context = {};
4837
+ this.role = 'toolbar';
4838
+ this.toolbarSizingClass = true;
4839
+ this.activeViewChange = new EventEmitter();
4759
4840
  }
4760
- ngOnInit() {
4761
- this.editService.loadTasks(this.data).subscribe(value => {
4762
- this.loadedTasks = value;
4763
- });
4841
+ clickHandler(ev) {
4842
+ if (this.navigable) {
4843
+ const closestFocusable = closest(ev.target, isFocusable);
4844
+ const targetIndex = this.navigationService.focusableContent.indexOf(closestFocusable);
4845
+ if (targetIndex > -1) {
4846
+ this.navigationService.focusIndex = targetIndex;
4847
+ }
4848
+ this.navigationService.updateFocus();
4849
+ }
4764
4850
  }
4765
- get predecessors() {
4766
- return this.editService.predecessors;
4851
+ arrowLeftListener() {
4852
+ if (this.navigable && isDocumentAvailable()) {
4853
+ this.navigationService.focusIndex--;
4854
+ if (this.navigationService.focusIndex < 0) {
4855
+ this.navigationService.focusIndex = this.navigationService.focusableContent.length - 1;
4856
+ }
4857
+ this.navigationService.updateFocus();
4858
+ }
4767
4859
  }
4768
- set predecessors(items) {
4769
- this.editService.predecessors = items;
4860
+ arrowRightListener() {
4861
+ if (this.navigable && isDocumentAvailable()) {
4862
+ this.navigationService.focusIndex++;
4863
+ if (this.navigationService.focusIndex >= this.navigationService.focusableContent.length) {
4864
+ this.navigationService.focusIndex = 0;
4865
+ }
4866
+ this.navigationService.updateFocus();
4867
+ }
4770
4868
  }
4771
- get successors() {
4772
- return this.editService.successors;
4869
+ set position(value) {
4870
+ this.context.position = this._position = value;
4773
4871
  }
4774
- set successors(items) {
4775
- this.editService.successors = items;
4872
+ get position() {
4873
+ return this._position;
4776
4874
  }
4777
- getText(token) {
4778
- return this.localizationService.get(token);
4875
+ get toolbarTemplateRef() {
4876
+ return this.toolbarTemplate ? this.toolbarTemplate.templateRef : undefined;
4779
4877
  }
4780
- getDependencyType(typeId) {
4781
- return DependencyType[typeId];
4878
+ get renderTemplate() {
4879
+ const ganttToolbarTemplate = this.toolbarTemplate;
4880
+ const templatePosition = ganttToolbarTemplate ? ganttToolbarTemplate.position : null;
4881
+ return ganttToolbarTemplate && (templatePosition === 'both' || templatePosition === this.position);
4782
4882
  }
4783
- handleEditingResult(editResultType) {
4784
- this.editService.triggerEditEvent(editResultType);
4883
+ handleViewChange(view) {
4884
+ this.activeViewChange.emit(view);
4785
4885
  }
4786
- handleTaskDelete() {
4787
- this.editService.taskDelete.next(this.editService.dataItem);
4886
+ ngAfterViewInit() {
4887
+ if (isDocumentAvailable()) {
4888
+ const focusableElements = Array.from(this.hostEl.nativeElement.querySelectorAll(focusableSelector) || [])
4889
+ .filter(el => isVisible(el));
4890
+ if (focusableElements.length) {
4891
+ this.navigationService.focusableContent = focusableElements;
4892
+ }
4893
+ }
4788
4894
  }
4789
4895
  }
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: [{
4896
+ 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 });
4897
+ 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: `
4898
+ <ng-container *ngIf="!renderTemplate">
4899
+ <kendo-gantt-add-task *ngIf="showAddTask"></kendo-gantt-add-task>
4900
+ <span class="k-spacer k-toolbar-spacer"></span>
4901
+ <kendo-gantt-view-selector
4902
+ *ngIf="showViewSelector"
4903
+ [views]="views"
4904
+ [activeView]="activeView"
4905
+ (activeViewChange)="handleViewChange($event)"></kendo-gantt-view-selector>
4906
+ </ng-container>
4907
+ <ng-template
4908
+ *ngIf="renderTemplate"
4909
+ [ngTemplateOutlet]="toolbarTemplateRef"
4910
+ [ngTemplateOutletContext]="context"
4911
+ >
4912
+ </ng-template>
4913
+ `, 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"] }] });
4914
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarComponent, decorators: [{
4864
4915
  type: Component,
4865
4916
  args: [{
4866
- selector: 'kendo-gantt-edit-dialog',
4917
+ selector: 'kendo-gantt-toolbar',
4918
+ providers: [ToolbarNavigationService],
4867
4919
  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
- `
4920
+ <ng-container *ngIf="!renderTemplate">
4921
+ <kendo-gantt-add-task *ngIf="showAddTask"></kendo-gantt-add-task>
4922
+ <span class="k-spacer k-toolbar-spacer"></span>
4923
+ <kendo-gantt-view-selector
4924
+ *ngIf="showViewSelector"
4925
+ [views]="views"
4926
+ [activeView]="activeView"
4927
+ (activeViewChange)="handleViewChange($event)"></kendo-gantt-view-selector>
4928
+ </ng-container>
4929
+ <ng-template
4930
+ *ngIf="renderTemplate"
4931
+ [ngTemplateOutlet]="toolbarTemplateRef"
4932
+ [ngTemplateOutletContext]="context"
4933
+ >
4934
+ </ng-template>
4935
+ `,
4936
+ standalone: true,
4937
+ imports: [NgIf, GanttAddTaskComponent, ViewSelectorComponent, NgTemplateOutlet]
4939
4938
  }]
4940
- }], ctorParameters: function () { return [{ type: MappingService }, { type: EditService }, { type: i0.ChangeDetectorRef }, { type: i1$1.LocalizationService }]; }, propDecorators: { data: [{
4939
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ToolbarNavigationService }]; }, propDecorators: { role: [{
4940
+ type: HostBinding,
4941
+ args: ['attr.role']
4942
+ }], toolbarSizingClass: [{
4943
+ type: HostBinding,
4944
+ args: ['class.k-toolbar-md']
4945
+ }], clickHandler: [{
4946
+ type: HostListener,
4947
+ args: ['click', ['$event']]
4948
+ }], arrowLeftListener: [{
4949
+ type: HostListener,
4950
+ args: ['keydown.arrowleft', ['$event']]
4951
+ }], arrowRightListener: [{
4952
+ type: HostListener,
4953
+ args: ['keydown.arrowright', ['$event']]
4954
+ }], activeViewChange: [{
4955
+ type: Output
4956
+ }], showAddTask: [{
4957
+ type: Input
4958
+ }], showViewSelector: [{
4959
+ type: Input
4960
+ }], views: [{
4961
+ type: Input
4962
+ }], activeView: [{
4963
+ type: Input
4964
+ }], toolbarTemplate: [{
4965
+ type: Input
4966
+ }], navigable: [{
4967
+ type: Input
4968
+ }], position: [{
4941
4969
  type: Input
4942
4970
  }] } });
4943
4971
 
@@ -5102,7 +5130,7 @@ class LocalizedMessagesDirective extends Messages {
5102
5130
  }
5103
5131
  }
5104
5132
  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: [
5133
+ LocalizedMessagesDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: LocalizedMessagesDirective, isStandalone: true, selector: "[kendoGanttLocalizedMessages]", providers: [
5106
5134
  {
5107
5135
  provide: Messages,
5108
5136
  useExisting: forwardRef(() => LocalizedMessagesDirective)
@@ -5117,7 +5145,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
5117
5145
  useExisting: forwardRef(() => LocalizedMessagesDirective)
5118
5146
  }
5119
5147
  ],
5120
- selector: '[kendoGanttLocalizedMessages]'
5148
+ selector: '[kendoGanttLocalizedMessages]',
5149
+ standalone: true
5121
5150
  }]
5122
5151
  }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }]; } });
5123
5152
 
@@ -6385,7 +6414,7 @@ class GanttComponent {
6385
6414
  }
6386
6415
  }
6387
6416
  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: [
6417
+ 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
6418
  GanttLocalizationService,
6390
6419
  LocalizationService,
6391
6420
  {
@@ -6781,7 +6810,7 @@ GanttComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
6781
6810
  </kendo-dialog>
6782
6811
 
6783
6812
  <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]" }] });
6813
+ `, 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
6814
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttComponent, decorators: [{
6786
6815
  type: Component,
6787
6816
  args: [{
@@ -7184,7 +7213,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7184
7213
  </kendo-dialog>
7185
7214
 
7186
7215
  <div kendoWatermarkOverlay *ngIf="showLicenseWatermark"></div>
7187
- `
7216
+ `,
7217
+ standalone: true,
7218
+ imports: [LocalizedMessagesDirective, NgIf, ToolbarComponent, SplitterComponent, SplitterPaneComponent, TreeListComponent, EventsOutsideAngularDirective, CustomMessagesComponent$2, GanttTimelineComponent, EditDialogComponent, DialogComponent, DialogActionsComponent, TreeListSpacerComponent, ButtonComponent, WatermarkOverlayComponent]
7188
7219
  }]
7189
7220
  }], 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
7221
  type: ViewChild,
@@ -7278,252 +7309,70 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7278
7309
  type: Input
7279
7310
  }], taskClass: [{
7280
7311
  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: [{
7312
+ }], rowClass: [{
7522
7313
  type: Input
7523
- }], selectedKeysChange: [{
7524
- type: Output
7525
- }], itemKey: [{
7314
+ }], isExpanded: [{
7315
+ type: Input
7316
+ }], columnsAutoSize: [{
7317
+ type: Input
7318
+ }], currentTimeMarker: [{
7319
+ type: Input
7320
+ }], columnMenu: [{
7321
+ type: Input
7322
+ }], columnsReorderable: [{
7323
+ type: Input
7324
+ }], columnsResizable: [{
7526
7325
  type: Input
7326
+ }], dragScrollSettings: [{
7327
+ type: Input
7328
+ }], rowExpand: [{
7329
+ type: Output
7330
+ }], taskDblClick: [{
7331
+ type: Output
7332
+ }], cellDblClick: [{
7333
+ type: Output
7334
+ }], cellClose: [{
7335
+ type: Output
7336
+ }], taskDelete: [{
7337
+ type: Output
7338
+ }], rowCollapse: [{
7339
+ type: Output
7340
+ }], remove: [{
7341
+ type: Output
7342
+ }], cancel: [{
7343
+ type: Output
7344
+ }], save: [{
7345
+ type: Output
7346
+ }], taskAdd: [{
7347
+ type: Output
7348
+ }], dependencyAdd: [{
7349
+ type: Output
7350
+ }], sortChange: [{
7351
+ type: Output
7352
+ }], filterChange: [{
7353
+ type: Output
7354
+ }], dataStateChange: [{
7355
+ type: Output
7356
+ }], treeListPaneCollapsedChange: [{
7357
+ type: Output
7358
+ }], timelinePaneCollapsedChange: [{
7359
+ type: Output
7360
+ }], timelinePaneSizeChange: [{
7361
+ type: Output
7362
+ }], activeViewChange: [{
7363
+ type: Output
7364
+ }], columnResize: [{
7365
+ type: Output
7366
+ }], columnReorder: [{
7367
+ type: Output
7368
+ }], columnVisibilityChange: [{
7369
+ type: Output
7370
+ }], columnLockedChange: [{
7371
+ type: Output
7372
+ }], cellClick: [{
7373
+ type: Output
7374
+ }], taskClick: [{
7375
+ type: Output
7527
7376
  }] } });
7528
7377
 
7529
7378
  /**
@@ -7540,7 +7389,7 @@ class DragValidationTooltipComponent {
7540
7389
  }
7541
7390
  }
7542
7391
  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: `
7392
+ DragValidationTooltipComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DragValidationTooltipComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
7544
7393
  <div
7545
7394
  class="k-tooltip k-gantt-tooltip-validation"
7546
7395
  [class.k-gantt-tooltip-valid]="showValidityStatus && isValid"
@@ -7574,10 +7423,92 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7574
7423
  <span class="k-gantt-tooltip-validation-value">{{ toTaskName }}</span>
7575
7424
  </div>
7576
7425
  </div>
7577
- `
7426
+ `,
7427
+ standalone: true
7578
7428
  }]
7579
7429
  }] });
7580
7430
 
7431
+ /**
7432
+ * A directive which binds the Gantt to an array of objects by using
7433
+ * an ID and parent ID field to define the hierarchy.
7434
+ *
7435
+ * The directive encapsulates the in-memory handling of data operations such as sorting and filtering.
7436
+ */
7437
+ class GanttFlatBindingDirective extends FlatBindingDirective {
7438
+ /**
7439
+ * @hidden
7440
+ */
7441
+ set aggregate(value) {
7442
+ super.aggregate = value;
7443
+ }
7444
+ }
7445
+ GanttFlatBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttFlatBindingDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7446
+ 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 });
7447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttFlatBindingDirective, decorators: [{
7448
+ type: Directive,
7449
+ args: [{
7450
+ selector: '[kendoGanttFlatBinding]',
7451
+ exportAs: 'kendoGanttFlatBinding',
7452
+ standalone: true
7453
+ }]
7454
+ }], propDecorators: { data: [{
7455
+ type: Input,
7456
+ args: ['kendoGanttFlatBinding']
7457
+ }] } });
7458
+
7459
+ /**
7460
+ * A directive which binds the Gantt to a tree of objects,
7461
+ * which encapsulates the in-memory handling of data operations such as sorting and filtering.
7462
+ */
7463
+ class GanttHierarchyBindingDirective extends HierarchyBindingDirective {
7464
+ /**
7465
+ * @hidden
7466
+ */
7467
+ set aggregate(value) {
7468
+ super.aggregate = value;
7469
+ }
7470
+ }
7471
+ GanttHierarchyBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHierarchyBindingDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7472
+ 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 });
7473
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttHierarchyBindingDirective, decorators: [{
7474
+ type: Directive,
7475
+ args: [{
7476
+ selector: '[kendoGanttHierarchyBinding]',
7477
+ exportAs: 'kendoGanttHierarchyBinding',
7478
+ standalone: true
7479
+ }]
7480
+ }], propDecorators: { data: [{
7481
+ type: Input,
7482
+ args: ['kendoGanttHierarchyBinding']
7483
+ }] } });
7484
+
7485
+ /**
7486
+ * A directive which controls the expanded state of the items.
7487
+ */
7488
+ class GanttExpandableDirective extends ExpandableDirective {
7489
+ /**
7490
+ * Defines the item key that will be stored in the expandedKeys collection.
7491
+ * Defaults to the task data item ID field,
7492
+ * which is specified in the [`taskModelFields`]({% slug api_gantt_ganttcomponent %}#toc-taskmodelfields) object.
7493
+ *
7494
+ */
7495
+ set expandBy(value) {
7496
+ super.expandBy = value;
7497
+ }
7498
+ }
7499
+ GanttExpandableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttExpandableDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7500
+ 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 });
7501
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttExpandableDirective, decorators: [{
7502
+ type: Directive,
7503
+ args: [{
7504
+ exportAs: 'kendoGanttExpandable',
7505
+ selector: '[kendoGanttExpandable]',
7506
+ standalone: true
7507
+ }]
7508
+ }], propDecorators: { expandBy: [{
7509
+ type: Input
7510
+ }] } });
7511
+
7581
7512
  /**
7582
7513
  * When added to the .k-task-dot, the element will be kept with hover styles.
7583
7514
  * Used for the drag clue from which the dragging has started.
@@ -7872,11 +7803,12 @@ class DependencyDragCreateDirective {
7872
7803
  }
7873
7804
  }
7874
7805
  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 });
7806
+ DependencyDragCreateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: DependencyDragCreateDirective, isStandalone: true, selector: "[kendoGanttDependencyDragCreate]", inputs: { displayValidationTooltip: "displayValidationTooltip" }, ngImport: i0 });
7876
7807
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DependencyDragCreateDirective, decorators: [{
7877
7808
  type: Directive,
7878
7809
  args: [{
7879
- selector: '[kendoGanttDependencyDragCreate]'
7810
+ selector: '[kendoGanttDependencyDragCreate]',
7811
+ standalone: true
7880
7812
  }]
7881
7813
  }], ctorParameters: function () { return [{ type: GanttComponent }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: MappingService }, { type: i3.PopupService }, { type: TimelineScrollService }]; }, propDecorators: { displayValidationTooltip: [{
7882
7814
  type: Input
@@ -7895,7 +7827,7 @@ class TimelineDayViewComponent extends ViewBase {
7895
7827
  }
7896
7828
  }
7897
7829
  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: [
7830
+ TimelineDayViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineDayViewComponent, isStandalone: true, selector: "kendo-gantt-timeline-day-view", providers: [
7899
7831
  {
7900
7832
  provide: ViewBase,
7901
7833
  useExisting: forwardRef(() => TimelineDayViewComponent)
@@ -7911,7 +7843,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7911
7843
  provide: ViewBase,
7912
7844
  useExisting: forwardRef(() => TimelineDayViewComponent)
7913
7845
  }
7914
- ]
7846
+ ],
7847
+ standalone: true
7915
7848
  }]
7916
7849
  }], ctorParameters: function () { return [{ type: OptionChangesService }, { type: DependencyDomService }]; } });
7917
7850
 
@@ -7928,7 +7861,7 @@ class TimelineWeekViewComponent extends ViewBase {
7928
7861
  }
7929
7862
  }
7930
7863
  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: [
7864
+ TimelineWeekViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineWeekViewComponent, isStandalone: true, selector: "kendo-gantt-timeline-week-view", providers: [
7932
7865
  {
7933
7866
  provide: ViewBase,
7934
7867
  useExisting: forwardRef(() => TimelineWeekViewComponent)
@@ -7944,7 +7877,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7944
7877
  provide: ViewBase,
7945
7878
  useExisting: forwardRef(() => TimelineWeekViewComponent)
7946
7879
  }
7947
- ]
7880
+ ],
7881
+ standalone: true
7948
7882
  }]
7949
7883
  }], ctorParameters: function () { return [{ type: OptionChangesService }, { type: DependencyDomService }]; } });
7950
7884
 
@@ -7961,7 +7895,7 @@ class TimelineMonthViewComponent extends ViewBase {
7961
7895
  }
7962
7896
  }
7963
7897
  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: [
7898
+ TimelineMonthViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineMonthViewComponent, isStandalone: true, selector: "kendo-gantt-timeline-month-view", providers: [
7965
7899
  {
7966
7900
  provide: ViewBase,
7967
7901
  useExisting: forwardRef(() => TimelineMonthViewComponent)
@@ -7977,7 +7911,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
7977
7911
  provide: ViewBase,
7978
7912
  useExisting: forwardRef(() => TimelineMonthViewComponent)
7979
7913
  }
7980
- ]
7914
+ ],
7915
+ standalone: true
7981
7916
  }]
7982
7917
  }], ctorParameters: function () { return [{ type: OptionChangesService }, { type: DependencyDomService }]; } });
7983
7918
 
@@ -7994,7 +7929,7 @@ class TimelineYearViewComponent extends ViewBase {
7994
7929
  }
7995
7930
  }
7996
7931
  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: [
7932
+ TimelineYearViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TimelineYearViewComponent, isStandalone: true, selector: "kendo-gantt-timeline-year-view", providers: [
7998
7933
  {
7999
7934
  provide: ViewBase,
8000
7935
  useExisting: forwardRef(() => TimelineYearViewComponent)
@@ -8010,10 +7945,116 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
8010
7945
  provide: ViewBase,
8011
7946
  useExisting: forwardRef(() => TimelineYearViewComponent)
8012
7947
  }
8013
- ]
7948
+ ],
7949
+ standalone: true
8014
7950
  }]
8015
7951
  }], ctorParameters: function () { return [{ type: OptionChangesService }, { type: DependencyDomService }]; } });
8016
7952
 
7953
+ /**
7954
+ * A directive which handles the [`selectionChange`]({% slug api_gantt_ganttcomponent %}#toc-selectionchange) event of the Gantt
7955
+ * ([see example]({% slug selection_gantt %}#toc-built-in-directive))
7956
+ */
7957
+ class SelectableDirective {
7958
+ constructor(gantt) {
7959
+ this.gantt = gantt;
7960
+ /**
7961
+ * Fires when the selected keys are changed.
7962
+ */
7963
+ this.selectedKeysChange = new EventEmitter();
7964
+ this.state = new Set();
7965
+ this.isSelected = this.isSelected.bind(this);
7966
+ this.selectionChange = this.selectionChange.bind(this);
7967
+ this.selectable = true;
7968
+ }
7969
+ /**
7970
+ * @hidden
7971
+ */
7972
+ set selectable(value) {
7973
+ if (value) {
7974
+ this.gantt.isSelected = this.isSelected;
7975
+ this.subscribeSelection();
7976
+ }
7977
+ else {
7978
+ this.gantt.isSelected = () => false;
7979
+ this.unsubscribeSelection();
7980
+ }
7981
+ this.gantt.selectable = value;
7982
+ this.gantt.updateView();
7983
+ }
7984
+ /**
7985
+ * Sets the selected keys.
7986
+ */
7987
+ set selectedKeys(value) {
7988
+ if (isPresent(value) && value === this.lastChange) {
7989
+ return;
7990
+ }
7991
+ // prevent multiple items displayed as selected as multiple selection still not supported fully
7992
+ const keys = (value || []).slice(0, 1);
7993
+ this.state = new Set(keys);
7994
+ this.gantt.updateView();
7995
+ }
7996
+ /**
7997
+ * The field name or a function that specifies the data item unique key identifier.
7998
+ * By default, the string field `id` is used.
7999
+ */
8000
+ set itemKey(value) {
8001
+ if (isString(value)) {
8002
+ this._keyGetter = getter(value);
8003
+ }
8004
+ else {
8005
+ this._keyGetter = value;
8006
+ }
8007
+ }
8008
+ get keyGetter() {
8009
+ return this._keyGetter || this.gantt.idGetter;
8010
+ }
8011
+ ngOnDestroy() {
8012
+ this.unsubscribeSelection();
8013
+ }
8014
+ isSelected(dataItem) {
8015
+ return this.state.has(this.keyGetter(dataItem));
8016
+ }
8017
+ selectionChange({ action, items }) {
8018
+ this.state.clear();
8019
+ if (action === 'select') {
8020
+ items.forEach(item => this.state.add(this.keyGetter(item)));
8021
+ }
8022
+ this.emitSelectedItemsChange();
8023
+ }
8024
+ emitSelectedItemsChange() {
8025
+ this.lastChange = Array.from(this.state);
8026
+ this.selectedKeysChange.emit(this.lastChange);
8027
+ }
8028
+ subscribeSelection() {
8029
+ this.unsubscribeSelection();
8030
+ this.selectionSubscription = this.gantt.selectionChange.subscribe(this.selectionChange);
8031
+ }
8032
+ unsubscribeSelection() {
8033
+ if (this.selectionSubscription) {
8034
+ this.selectionSubscription.unsubscribe();
8035
+ this.selectionSubscription = null;
8036
+ }
8037
+ }
8038
+ }
8039
+ SelectableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SelectableDirective, deps: [{ token: GanttComponent }], target: i0.ɵɵFactoryTarget.Directive });
8040
+ 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 });
8041
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SelectableDirective, decorators: [{
8042
+ type: Directive,
8043
+ args: [{
8044
+ exportAs: 'kendoGanttSelectable',
8045
+ selector: '[kendoGanttSelectable]',
8046
+ standalone: true
8047
+ }]
8048
+ }], ctorParameters: function () { return [{ type: GanttComponent }]; }, propDecorators: { selectable: [{
8049
+ type: Input
8050
+ }], selectedKeys: [{
8051
+ type: Input
8052
+ }], selectedKeysChange: [{
8053
+ type: Output
8054
+ }], itemKey: [{
8055
+ type: Input
8056
+ }] } });
8057
+
8017
8058
  /**
8018
8059
  * Custom component messages override default component messages
8019
8060
  * ([see example](slug:globalization_treelist#toc-custom-messages)).
@@ -8028,7 +8069,7 @@ class CustomMessagesComponent extends Messages {
8028
8069
  }
8029
8070
  }
8030
8071
  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: [
8072
+ CustomMessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CustomMessagesComponent, isStandalone: true, selector: "kendo-gantt-messages", providers: [
8032
8073
  {
8033
8074
  provide: Messages,
8034
8075
  useExisting: forwardRef(() => CustomMessagesComponent)
@@ -8044,74 +8085,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
8044
8085
  }
8045
8086
  ],
8046
8087
  selector: 'kendo-gantt-messages',
8047
- template: ``
8088
+ template: ``,
8089
+ standalone: true
8048
8090
  }]
8049
8091
  }], ctorParameters: function () { return [{ type: i1$1.LocalizationService }]; } });
8050
8092
 
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 = [
8093
+ /**
8094
+ * Utility array that contains all `@progress/kendo-angular-gantt` related components and directives
8095
+ */
8096
+ const KENDO_GANTT = [
8073
8097
  GanttComponent,
8074
8098
  GanttFlatBindingDirective,
8075
8099
  GanttHierarchyBindingDirective,
8076
- GanttTaskComponent,
8077
- GanttSummaryTaskComponent,
8078
- GanttMilestoneTaskComponent,
8079
- GanttTimelineComponent,
8080
- GanttTasksTableBodyComponent,
8081
- GanttHeaderTableBodyComponent,
8082
8100
  GanttTaskContentTemplateDirective,
8083
8101
  GanttTaskTemplateDirective,
8084
8102
  GanttSummaryTaskTemplateDirective,
8085
8103
  ToolbarTemplateDirective,
8086
- ToolbarComponent,
8087
8104
  ViewSelectorComponent,
8088
8105
  GanttColumnComponent,
8089
8106
  GanttColumnGroupComponent,
8090
8107
  GanttSpanColumnComponent,
8091
- FilterMenuTemplateDirective,
8092
8108
  FilterCellTemplateDirective,
8109
+ FilterMenuTemplateDirective,
8093
8110
  CellTemplateDirective,
8094
8111
  EditTemplateDirective,
8095
8112
  ColumnMenuTemplateDirective,
8096
8113
  HeaderTemplateDirective,
8097
8114
  FooterTemplateDirective,
8098
8115
  GanttExpandableDirective,
8099
- GanttDependencyDirective,
8100
8116
  DependencyDragCreateDirective,
8101
8117
  TimelineDayViewComponent,
8102
8118
  TimelineWeekViewComponent,
8103
8119
  TimelineMonthViewComponent,
8104
8120
  TimelineYearViewComponent,
8105
8121
  SelectableDirective,
8106
- EditDialogComponent,
8107
8122
  CustomMessagesComponent,
8108
- LocalizedMessagesDirective,
8109
- GanttAddTaskComponent,
8110
- DragValidationTooltipComponent,
8111
- TimelineScrollableDirective,
8112
- DependenciesTableComponent,
8113
- TaskFieldsComponent
8123
+ GanttAddTaskComponent
8114
8124
  ];
8125
+
8126
+ // IMPORTANT: NgModule export kept for backwards compatibility
8115
8127
  /**
8116
8128
  * Represents the [NgModule](link:site.data.urls.angular['ngmoduleapi'])
8117
8129
  * definition for the Gantt component.
@@ -8146,118 +8158,44 @@ const DECLARATIONS = [
8146
8158
  class GanttModule {
8147
8159
  }
8148
8160
  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] });
8161
+ 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
8162
  GanttModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttModule, providers: [{
8249
8163
  provide: L10N_PREFIX,
8250
8164
  useValue: 'kendo.gantt'
8251
8165
  }, {
8252
8166
  provide: TOUCH_ENABLED,
8253
8167
  useValue: touchEnabled
8254
- }], imports: [IMPORTED_MODULES] });
8168
+ },
8169
+ // InputsModule providers
8170
+ IconsService,
8171
+ PopupService,
8172
+ ResizeBatchService,
8173
+ DialogContainerService,
8174
+ DialogService,
8175
+ WindowService,
8176
+ WindowContainerService,
8177
+ // DateInputsModule providers
8178
+ CalendarDOMService,
8179
+ CenturyViewService,
8180
+ DecadeViewService,
8181
+ MonthViewService,
8182
+ YearViewService,
8183
+ WeekNamesService,
8184
+ NavigationService$1,
8185
+ TimePickerDOMService,
8186
+ HoursService,
8187
+ MinutesService,
8188
+ SecondsService,
8189
+ MillisecondsService,
8190
+ DayPeriodService,
8191
+ // TreeListModule providers
8192
+ ColumnResizingService
8193
+ ], imports: [GanttComponent, ViewSelectorComponent, GanttColumnComponent, GanttColumnGroupComponent, GanttSpanColumnComponent, TimelineDayViewComponent, TimelineWeekViewComponent, TimelineMonthViewComponent, TimelineYearViewComponent, CustomMessagesComponent, GanttAddTaskComponent] });
8255
8194
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttModule, decorators: [{
8256
8195
  type: NgModule,
8257
8196
  args: [{
8258
- imports: [...IMPORTED_MODULES],
8259
- declarations: [...DECLARATIONS],
8260
- exports: [...DECLARATIONS],
8197
+ imports: [...KENDO_GANTT],
8198
+ exports: [...KENDO_GANTT],
8261
8199
  entryComponents: [DragValidationTooltipComponent],
8262
8200
  providers: [{
8263
8201
  provide: L10N_PREFIX,
@@ -8265,7 +8203,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
8265
8203
  }, {
8266
8204
  provide: TOUCH_ENABLED,
8267
8205
  useValue: touchEnabled
8268
- }]
8206
+ },
8207
+ // InputsModule providers
8208
+ IconsService,
8209
+ PopupService,
8210
+ ResizeBatchService,
8211
+ DialogContainerService,
8212
+ DialogService,
8213
+ WindowService,
8214
+ WindowContainerService,
8215
+ // DateInputsModule providers
8216
+ CalendarDOMService,
8217
+ CenturyViewService,
8218
+ DecadeViewService,
8219
+ MonthViewService,
8220
+ YearViewService,
8221
+ WeekNamesService,
8222
+ NavigationService$1,
8223
+ TimePickerDOMService,
8224
+ HoursService,
8225
+ MinutesService,
8226
+ SecondsService,
8227
+ MillisecondsService,
8228
+ DayPeriodService,
8229
+ // TreeListModule providers
8230
+ ColumnResizingService
8231
+ ]
8269
8232
  }]
8270
8233
  }] });
8271
8234
 
@@ -8273,5 +8236,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
8273
8236
  * Generated bundle index. Do not edit.
8274
8237
  */
8275
8238
 
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 };
8239
+ 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
8240