@worktile/gantt 15.1.0 → 15.1.1

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.
@@ -1,19 +1,18 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, EventEmitter, Directive, Inject, Input, Output, ContentChild, HostBinding, Component, Injectable, ViewChild, Pipe, ViewChildren, PLATFORM_ID, ElementRef, Optional, forwardRef, ChangeDetectionStrategy, ContentChildren, NgModule } from '@angular/core';
2
+ import { InjectionToken, EventEmitter, Directive, Inject, Input, Output, ContentChild, HostBinding, Component, ViewChild, Pipe, ViewChildren, Injectable, PLATFORM_ID, ElementRef, Optional, HostListener, forwardRef, ChangeDetectionStrategy, ContentChildren, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { DOCUMENT, isPlatformServer, CommonModule } from '@angular/common';
5
- import { __awaiter, __decorate, __param } from 'tslib';
6
5
  import { take, takeUntil, skip, switchMap, debounceTime, map, pairwise, auditTime as auditTime$1, startWith as startWith$1, finalize } from 'rxjs/operators';
7
6
  import { BehaviorSubject, Subject, from, takeUntil as takeUntil$1, startWith, auditTime, filter, merge, EMPTY, fromEvent, Observable, interval, animationFrameScheduler } from 'rxjs';
8
7
  import { fromUnixTime, getWeek, getDaysInMonth, differenceInCalendarDays, setDate, addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addQuarters, addYears, startOfDay, startOfWeek, startOfMonth, startOfQuarter, startOfYear, endOfDay, endOfWeek, endOfMonth, endOfQuarter, endOfYear, getUnixTime, format, isWeekend, isToday, differenceInDays, differenceInCalendarQuarters, eachMonthOfInterval, eachYearOfInterval, eachWeekOfInterval, eachDayOfInterval, differenceInCalendarYears } from 'date-fns';
9
8
  export { addDays, addHours, addMinutes, addMonths, addQuarters, addSeconds, addWeeks, addYears, differenceInCalendarDays, differenceInCalendarQuarters, differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, endOfDay, endOfMonth, endOfQuarter, endOfWeek, endOfYear, format, fromUnixTime, getDaysInMonth, getUnixTime, getWeek, isToday, isWeekend, setDate, startOfDay, startOfMonth, startOfQuarter, startOfWeek, startOfYear } from 'date-fns';
10
9
  import { SelectionModel } from '@angular/cdk/collections';
11
10
  import { coerceBooleanProperty, coerceCssPixelValue } from '@angular/cdk/coercion';
12
- import * as i3 from '@angular/cdk/scrolling';
11
+ import * as i1$1 from '@angular/cdk/scrolling';
13
12
  import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';
14
- import { InputBoolean } from 'ngx-tethys/core';
15
13
  import * as i2 from '@angular/cdk/drag-drop';
16
14
  import { CdkDrag, DragDropModule } from '@angular/cdk/drag-drop';
15
+ import { __decorate, __param, __awaiter } from 'tslib';
17
16
 
18
17
  class GanttDatePoint {
19
18
  constructor(start, text, x, y, additions, style) {
@@ -1325,100 +1324,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImpor
1325
1324
 
1326
1325
  const GANTT_ABSTRACT_TOKEN = new InjectionToken('gantt-abstract-token');
1327
1326
 
1328
- class GanttPrintService {
1329
- constructor() { }
1330
- setInlineStyles(targetElem) {
1331
- const svgElements = Array.from(targetElem.getElementsByTagName('svg'));
1332
- for (const svgElement of svgElements) {
1333
- this.recursElementChildren(svgElement);
1334
- }
1335
- }
1336
- recursElementChildren(node) {
1337
- const transformProperties = [
1338
- 'fill',
1339
- 'color',
1340
- 'font-size',
1341
- 'stroke',
1342
- 'font',
1343
- 'text-anchor',
1344
- 'stroke-dasharray',
1345
- 'shape-rendering',
1346
- 'stroke-width'
1347
- ];
1348
- if (!node.style) {
1349
- return;
1350
- }
1351
- const styles = getComputedStyle(node);
1352
- for (const transformProperty of transformProperties) {
1353
- node.style[transformProperty] = styles[transformProperty];
1354
- }
1355
- for (const child of Array.from(node.childNodes)) {
1356
- this.recursElementChildren(child);
1357
- }
1358
- }
1359
- register(root) {
1360
- this.root = root.nativeElement;
1361
- this.mainContainer = this.root.getElementsByClassName('gantt-main-container')[0];
1362
- }
1363
- print(name = 'download', ignoreElementClass) {
1364
- return __awaiter(this, void 0, void 0, function* () {
1365
- const root = this.root;
1366
- const mainContainer = this.mainContainer;
1367
- // set print width
1368
- const printWidth = root.offsetWidth;
1369
- // set print height
1370
- const printHeight = root.offsetHeight - mainContainer.offsetHeight + mainContainer.scrollHeight;
1371
- const html2canvas = (yield import(/* webpackChunkName: 'html2canvas' */ 'html2canvas')).default;
1372
- html2canvas(root, {
1373
- logging: false,
1374
- allowTaint: true,
1375
- useCORS: true,
1376
- width: printWidth,
1377
- height: printHeight,
1378
- ignoreElements: (element) => {
1379
- if (ignoreElementClass && element.classList.contains(ignoreElementClass)) {
1380
- return true;
1381
- }
1382
- if (element.classList.contains('gantt-calendar-today-overlay')) {
1383
- return true;
1384
- }
1385
- },
1386
- onclone: (cloneDocument) => {
1387
- const ganttClass = root.className;
1388
- const cloneGanttDom = cloneDocument.querySelector(`.${ganttClass.replace(/\s+/g, '.')}`);
1389
- const cloneGanttContainerDom = cloneDocument.querySelector('.gantt-container');
1390
- const cloneCalendarOverlay = cloneDocument.querySelector('.gantt-calendar-grid-main');
1391
- const cloneLinksOverlay = cloneDocument.querySelector('.gantt-links-overlay-main');
1392
- // change targetDom width
1393
- cloneGanttDom.style.width = `${printWidth}px`;
1394
- cloneGanttDom.style.height = `${printHeight}px`;
1395
- cloneGanttDom.style.overflow = `unset`;
1396
- cloneGanttContainerDom.style.backgroundColor = '#fff';
1397
- cloneCalendarOverlay.setAttribute('height', `${printHeight}`);
1398
- cloneCalendarOverlay.setAttribute('style', `background: transparent`);
1399
- if (cloneLinksOverlay) {
1400
- cloneLinksOverlay.setAttribute('height', `${printHeight}`);
1401
- cloneLinksOverlay.setAttribute('style', `height: ${printHeight}px`);
1402
- }
1403
- // setInlineStyles for svg
1404
- this.setInlineStyles(cloneGanttDom);
1405
- }
1406
- }).then((canvas) => {
1407
- const link = document.createElement('a');
1408
- const dataUrl = canvas.toDataURL('image/png');
1409
- link.download = `${name}.png`;
1410
- link.href = dataUrl;
1411
- link.click();
1412
- });
1413
- });
1414
- }
1415
- }
1416
- GanttPrintService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttPrintService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1417
- GanttPrintService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttPrintService });
1418
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttPrintService, decorators: [{
1419
- type: Injectable
1420
- }], ctorParameters: function () { return []; } });
1421
-
1422
1327
  const supports = (typeof window !== 'undefined' && !!window.CSS && CSS.supports) || (() => false);
1423
1328
  /**
1424
1329
  * Note: we don't need to add vendor prefixes within `.scss` files since they're added automatically.
@@ -2621,6 +2526,7 @@ class GanttDomService {
2621
2526
  this.container = this.root.getElementsByClassName('gantt-container')[0];
2622
2527
  this.sideContainer = this.root.getElementsByClassName('gantt-side-container')[0];
2623
2528
  this.mainContainer = this.root.getElementsByClassName('gantt-main-container')[0];
2529
+ this.verticalScrollContainer = this.root.getElementsByClassName('gantt-scroll-container')[0];
2624
2530
  const mainItems = this.mainContainer.getElementsByClassName('gantt-main-items')[0];
2625
2531
  const mainGroups = this.mainContainer.getElementsByClassName('gantt-main-groups')[0];
2626
2532
  this.mainItems = mainItems || mainGroups;
@@ -3622,6 +3528,100 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImpor
3622
3528
  }, template: "<div class=\"gantt-drag-mask\">\n <div class=\"date-range\">\n <span class=\"start\"></span>\n <span class=\"end\"></span>\n </div>\n</div>\n" }]
3623
3529
  }] });
3624
3530
 
3531
+ class GanttPrintService {
3532
+ constructor() { }
3533
+ setInlineStyles(targetElem) {
3534
+ const svgElements = Array.from(targetElem.getElementsByTagName('svg'));
3535
+ for (const svgElement of svgElements) {
3536
+ this.recursElementChildren(svgElement);
3537
+ }
3538
+ }
3539
+ recursElementChildren(node) {
3540
+ const transformProperties = [
3541
+ 'fill',
3542
+ 'color',
3543
+ 'font-size',
3544
+ 'stroke',
3545
+ 'font',
3546
+ 'text-anchor',
3547
+ 'stroke-dasharray',
3548
+ 'shape-rendering',
3549
+ 'stroke-width'
3550
+ ];
3551
+ if (!node.style) {
3552
+ return;
3553
+ }
3554
+ const styles = getComputedStyle(node);
3555
+ for (const transformProperty of transformProperties) {
3556
+ node.style[transformProperty] = styles[transformProperty];
3557
+ }
3558
+ for (const child of Array.from(node.childNodes)) {
3559
+ this.recursElementChildren(child);
3560
+ }
3561
+ }
3562
+ register(root) {
3563
+ this.root = root.nativeElement;
3564
+ this.mainContainer = this.root.getElementsByClassName('gantt-main-container')[0];
3565
+ }
3566
+ print(name = 'download', ignoreElementClass) {
3567
+ return __awaiter(this, void 0, void 0, function* () {
3568
+ const root = this.root;
3569
+ const mainContainer = this.mainContainer;
3570
+ // set print width
3571
+ const printWidth = root.offsetWidth;
3572
+ // set print height
3573
+ const printHeight = root.offsetHeight - mainContainer.offsetHeight + mainContainer.scrollHeight;
3574
+ const html2canvas = (yield import(/* webpackChunkName: 'html2canvas' */ 'html2canvas')).default;
3575
+ html2canvas(root, {
3576
+ logging: false,
3577
+ allowTaint: true,
3578
+ useCORS: true,
3579
+ width: printWidth,
3580
+ height: printHeight,
3581
+ ignoreElements: (element) => {
3582
+ if (ignoreElementClass && element.classList.contains(ignoreElementClass)) {
3583
+ return true;
3584
+ }
3585
+ if (element.classList.contains('gantt-calendar-today-overlay')) {
3586
+ return true;
3587
+ }
3588
+ },
3589
+ onclone: (cloneDocument) => {
3590
+ const ganttClass = root.className;
3591
+ const cloneGanttDom = cloneDocument.querySelector(`.${ganttClass.replace(/\s+/g, '.')}`);
3592
+ const cloneGanttContainerDom = cloneDocument.querySelector('.gantt-container');
3593
+ const cloneCalendarOverlay = cloneDocument.querySelector('.gantt-calendar-grid-main');
3594
+ const cloneLinksOverlay = cloneDocument.querySelector('.gantt-links-overlay-main');
3595
+ // change targetDom width
3596
+ cloneGanttDom.style.width = `${printWidth}px`;
3597
+ cloneGanttDom.style.height = `${printHeight}px`;
3598
+ cloneGanttDom.style.overflow = `unset`;
3599
+ cloneGanttContainerDom.style.backgroundColor = '#fff';
3600
+ cloneCalendarOverlay.setAttribute('height', `${printHeight}`);
3601
+ cloneCalendarOverlay.setAttribute('style', `background: transparent`);
3602
+ if (cloneLinksOverlay) {
3603
+ cloneLinksOverlay.setAttribute('height', `${printHeight}`);
3604
+ cloneLinksOverlay.setAttribute('style', `height: ${printHeight}px`);
3605
+ }
3606
+ // setInlineStyles for svg
3607
+ this.setInlineStyles(cloneGanttDom);
3608
+ }
3609
+ }).then((canvas) => {
3610
+ const link = document.createElement('a');
3611
+ const dataUrl = canvas.toDataURL('image/png');
3612
+ link.download = `${name}.png`;
3613
+ link.href = dataUrl;
3614
+ link.click();
3615
+ });
3616
+ });
3617
+ }
3618
+ }
3619
+ GanttPrintService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttPrintService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3620
+ GanttPrintService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttPrintService });
3621
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttPrintService, decorators: [{
3622
+ type: Injectable
3623
+ }], ctorParameters: function () { return []; } });
3624
+
3625
3625
  class NgxGanttToolbarComponent {
3626
3626
  constructor(ganttUpper) {
3627
3627
  this.ganttUpper = ganttUpper;
@@ -3653,6 +3653,9 @@ class NgxGanttRootComponent {
3653
3653
  get view() {
3654
3654
  return this.ganttUpper.view;
3655
3655
  }
3656
+ onWindowResize() {
3657
+ this.computeScrollBarOffset();
3658
+ }
3656
3659
  constructor(elementRef, ngZone, dom, dragContainer, ganttUpper, printService) {
3657
3660
  this.elementRef = elementRef;
3658
3661
  this.ngZone = ngZone;
@@ -3660,6 +3663,8 @@ class NgxGanttRootComponent {
3660
3663
  this.dragContainer = dragContainer;
3661
3664
  this.ganttUpper = ganttUpper;
3662
3665
  this.printService = printService;
3666
+ this.verticalScrollbarWidth = 0;
3667
+ this.horizontalScrollbarHeight = 0;
3663
3668
  this.unsubscribe$ = new Subject();
3664
3669
  this.ganttUpper.dragContainer = dragContainer;
3665
3670
  }
@@ -3683,9 +3688,24 @@ class NgxGanttRootComponent {
3683
3688
  this.ganttUpper.viewChange.pipe(startWith$1(null), takeUntil(this.unsubscribe$)).subscribe(() => {
3684
3689
  this.scrollToToday();
3685
3690
  });
3691
+ this.computeScrollBarOffset();
3686
3692
  });
3687
3693
  });
3688
3694
  }
3695
+ computeScrollBarOffset() {
3696
+ const ganttMainContainer = this.dom.mainContainer;
3697
+ const ganttVerticalScrollContainer = this.dom.verticalScrollContainer;
3698
+ let verticalScrollbarWidth = 0;
3699
+ if (ganttVerticalScrollContainer) {
3700
+ verticalScrollbarWidth = ganttVerticalScrollContainer.offsetWidth - ganttVerticalScrollContainer.clientWidth;
3701
+ }
3702
+ else {
3703
+ verticalScrollbarWidth = (ganttMainContainer === null || ganttMainContainer === void 0 ? void 0 : ganttMainContainer.offsetWidth) - (ganttMainContainer === null || ganttMainContainer === void 0 ? void 0 : ganttMainContainer.clientWidth);
3704
+ }
3705
+ const horizontalScrollbarHeight = (ganttMainContainer === null || ganttMainContainer === void 0 ? void 0 : ganttMainContainer.offsetHeight) - (ganttMainContainer === null || ganttMainContainer === void 0 ? void 0 : ganttMainContainer.clientHeight);
3706
+ this.verticalScrollbarWidth = verticalScrollbarWidth;
3707
+ this.horizontalScrollbarHeight = horizontalScrollbarHeight;
3708
+ }
3689
3709
  ngOnDestroy() {
3690
3710
  this.unsubscribe$.next();
3691
3711
  }
@@ -3749,12 +3769,12 @@ class NgxGanttRootComponent {
3749
3769
  }
3750
3770
  }
3751
3771
  NgxGanttRootComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: NgxGanttRootComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: GanttDomService }, { token: GanttDragContainer }, { token: GANTT_UPPER_TOKEN }, { token: GanttPrintService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
3752
- NgxGanttRootComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: NgxGanttRootComponent, selector: "ngx-gantt-root", inputs: { sideWidth: "sideWidth" }, host: { classAttribute: "gantt" }, providers: [GanttDomService, GanttDragContainer], queries: [{ propertyName: "sideTemplate", first: true, predicate: ["sideTemplate"], descendants: true, static: true }, { propertyName: "mainTemplate", first: true, predicate: ["mainTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "backdrop", first: true, predicate: GanttDragBackdropComponent, descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<div class=\"gantt-side\" *ngIf=\"sideTemplate\" [style.width.px]=\"sideWidth\">\n <div class=\"gantt-side-container\" cdkScrollable>\n <ng-template [ngTemplateOutlet]=\"sideTemplate\"></ng-template>\n </div>\n</div>\n<div class=\"gantt-container\" *ngIf=\"mainTemplate\">\n <gantt-calendar-header></gantt-calendar-header>\n <gantt-calendar-grid></gantt-calendar-grid>\n <gantt-drag-backdrop></gantt-drag-backdrop>\n <div class=\"gantt-main\">\n <ng-template [ngTemplateOutlet]=\"mainTemplate\"></ng-template>\n </div>\n</div>\n<ng-content></ng-content>\n<gantt-toolbar *ngIf=\"ganttUpper.showToolbar || ganttUpper.toolbarTemplate\" [template]=\"ganttUpper.toolbarTemplate\"> </gantt-toolbar>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "component", type: GanttCalendarHeaderComponent, selector: "gantt-calendar-header" }, { kind: "component", type: GanttCalendarGridComponent, selector: "gantt-calendar-grid" }, { kind: "component", type: GanttDragBackdropComponent, selector: "gantt-drag-backdrop" }, { kind: "component", type: NgxGanttToolbarComponent, selector: "ngx-gantt-toolbar,gantt-toolbar", inputs: ["template"] }] });
3772
+ NgxGanttRootComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: NgxGanttRootComponent, selector: "ngx-gantt-root", inputs: { sideWidth: "sideWidth" }, host: { listeners: { "window:resize": "onWindowResize()" }, classAttribute: "gantt" }, providers: [GanttDomService, GanttDragContainer], queries: [{ propertyName: "sideTemplate", first: true, predicate: ["sideTemplate"], descendants: true, static: true }, { propertyName: "mainTemplate", first: true, predicate: ["mainTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "backdrop", first: true, predicate: GanttDragBackdropComponent, descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<div class=\"gantt-side\" *ngIf=\"sideTemplate\" [style.width.px]=\"sideWidth\" [style.padding-bottom.px]=\"horizontalScrollbarHeight\">\n <div class=\"gantt-side-container\" cdkScrollable>\n <ng-template [ngTemplateOutlet]=\"sideTemplate\"></ng-template>\n </div>\n</div>\n<div class=\"gantt-container\" *ngIf=\"mainTemplate\">\n <gantt-calendar-header [style.padding-right.px]=\"verticalScrollbarWidth\"></gantt-calendar-header>\n <gantt-calendar-grid\n [style.padding-right.px]=\"verticalScrollbarWidth\"\n [style.padding-bottom.px]=\"horizontalScrollbarHeight\"\n ></gantt-calendar-grid>\n <gantt-drag-backdrop></gantt-drag-backdrop>\n <div class=\"gantt-main\">\n <ng-template [ngTemplateOutlet]=\"mainTemplate\"></ng-template>\n </div>\n</div>\n<ng-content></ng-content>\n<gantt-toolbar *ngIf=\"ganttUpper.showToolbar || ganttUpper.toolbarTemplate\" [template]=\"ganttUpper.toolbarTemplate\"> </gantt-toolbar>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "component", type: GanttCalendarHeaderComponent, selector: "gantt-calendar-header" }, { kind: "component", type: GanttCalendarGridComponent, selector: "gantt-calendar-grid" }, { kind: "component", type: GanttDragBackdropComponent, selector: "gantt-drag-backdrop" }, { kind: "component", type: NgxGanttToolbarComponent, selector: "ngx-gantt-toolbar,gantt-toolbar", inputs: ["template"] }] });
3753
3773
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: NgxGanttRootComponent, decorators: [{
3754
3774
  type: Component,
3755
3775
  args: [{ selector: 'ngx-gantt-root', providers: [GanttDomService, GanttDragContainer], host: {
3756
3776
  class: 'gantt'
3757
- }, template: "<div class=\"gantt-side\" *ngIf=\"sideTemplate\" [style.width.px]=\"sideWidth\">\n <div class=\"gantt-side-container\" cdkScrollable>\n <ng-template [ngTemplateOutlet]=\"sideTemplate\"></ng-template>\n </div>\n</div>\n<div class=\"gantt-container\" *ngIf=\"mainTemplate\">\n <gantt-calendar-header></gantt-calendar-header>\n <gantt-calendar-grid></gantt-calendar-grid>\n <gantt-drag-backdrop></gantt-drag-backdrop>\n <div class=\"gantt-main\">\n <ng-template [ngTemplateOutlet]=\"mainTemplate\"></ng-template>\n </div>\n</div>\n<ng-content></ng-content>\n<gantt-toolbar *ngIf=\"ganttUpper.showToolbar || ganttUpper.toolbarTemplate\" [template]=\"ganttUpper.toolbarTemplate\"> </gantt-toolbar>\n" }]
3777
+ }, template: "<div class=\"gantt-side\" *ngIf=\"sideTemplate\" [style.width.px]=\"sideWidth\" [style.padding-bottom.px]=\"horizontalScrollbarHeight\">\n <div class=\"gantt-side-container\" cdkScrollable>\n <ng-template [ngTemplateOutlet]=\"sideTemplate\"></ng-template>\n </div>\n</div>\n<div class=\"gantt-container\" *ngIf=\"mainTemplate\">\n <gantt-calendar-header [style.padding-right.px]=\"verticalScrollbarWidth\"></gantt-calendar-header>\n <gantt-calendar-grid\n [style.padding-right.px]=\"verticalScrollbarWidth\"\n [style.padding-bottom.px]=\"horizontalScrollbarHeight\"\n ></gantt-calendar-grid>\n <gantt-drag-backdrop></gantt-drag-backdrop>\n <div class=\"gantt-main\">\n <ng-template [ngTemplateOutlet]=\"mainTemplate\"></ng-template>\n </div>\n</div>\n<ng-content></ng-content>\n<gantt-toolbar *ngIf=\"ganttUpper.showToolbar || ganttUpper.toolbarTemplate\" [template]=\"ganttUpper.toolbarTemplate\"> </gantt-toolbar>\n" }]
3758
3778
  }], ctorParameters: function () {
3759
3779
  return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: GanttDomService }, { type: GanttDragContainer }, { type: GanttUpper, decorators: [{
3760
3780
  type: Inject,
@@ -3773,6 +3793,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImpor
3773
3793
  }], backdrop: [{
3774
3794
  type: ViewChild,
3775
3795
  args: [GanttDragBackdropComponent, { static: true, read: ElementRef }]
3796
+ }], onWindowResize: [{
3797
+ type: HostListener,
3798
+ args: ['window:resize']
3776
3799
  }] } });
3777
3800
 
3778
3801
  class NgxGanttComponent extends GanttUpper {
@@ -3796,9 +3819,9 @@ class NgxGanttComponent extends GanttUpper {
3796
3819
  get loading() {
3797
3820
  return this._loading;
3798
3821
  }
3799
- constructor(elementRef, cdr, ngZone, printService, config) {
3822
+ constructor(elementRef, cdr, ngZone, viewportRuler, config) {
3800
3823
  super(elementRef, cdr, ngZone, config);
3801
- this.printService = printService;
3824
+ this.viewportRuler = viewportRuler;
3802
3825
  this.maxLevel = 2;
3803
3826
  this.virtualScrollEnabled = true;
3804
3827
  this.loadingDelay = 0;
@@ -3866,6 +3889,19 @@ class NgxGanttComponent extends GanttUpper {
3866
3889
  });
3867
3890
  }
3868
3891
  }
3892
+ ngAfterViewChecked() {
3893
+ if (this.virtualScrollEnabled && this.viewportRuler && this.virtualScroll.getRenderedRange().end > 0) {
3894
+ const onStable$ = this.ngZone.isStable ? from(Promise.resolve()) : this.ngZone.onStable.pipe(take(1));
3895
+ this.ngZone.runOutsideAngular(() => {
3896
+ onStable$.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
3897
+ if (!this.ganttRoot.verticalScrollbarWidth) {
3898
+ this.ganttRoot.computeScrollBarOffset();
3899
+ this.cdr.markForCheck();
3900
+ }
3901
+ });
3902
+ });
3903
+ }
3904
+ }
3869
3905
  buildFlatItems() {
3870
3906
  const virtualData = [];
3871
3907
  if (this.groups.length) {
@@ -3977,7 +4013,7 @@ class NgxGanttComponent extends GanttUpper {
3977
4013
  this.cdr.detectChanges();
3978
4014
  }
3979
4015
  }
3980
- NgxGanttComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: NgxGanttComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: GanttPrintService, optional: true }, { token: GANTT_GLOBAL_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
4016
+ NgxGanttComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: NgxGanttComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1$1.ViewportRuler }, { token: GANTT_GLOBAL_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
3981
4017
  NgxGanttComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: NgxGanttComponent, selector: "ngx-gantt", inputs: { maxLevel: "maxLevel", async: "async", childrenResolve: "childrenResolve", linkable: "linkable", loading: "loading", virtualScrollEnabled: "virtualScrollEnabled", loadingDelay: "loadingDelay" }, outputs: { linkDragStarted: "linkDragStarted", linkDragEnded: "linkDragEnded", lineClick: "lineClick", selectedChange: "selectedChange" }, providers: [
3982
4018
  {
3983
4019
  provide: GANTT_UPPER_TOKEN,
@@ -3987,10 +4023,7 @@ NgxGanttComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
3987
4023
  provide: GANTT_ABSTRACT_TOKEN,
3988
4024
  useExisting: forwardRef(() => NgxGanttComponent)
3989
4025
  }
3990
- ], queries: [{ propertyName: "table", first: true, predicate: NgxGanttTableComponent, descendants: true }, { propertyName: "tableEmptyTemplate", first: true, predicate: ["tableEmpty"], descendants: true, static: true }, { propertyName: "columns", predicate: NgxGanttTableColumnComponent, descendants: true }], viewQueries: [{ propertyName: "ganttRoot", first: true, predicate: ["ganttRoot"], descendants: true }, { propertyName: "virtualScroll", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ngx-gantt-root #ganttRoot>\n <div class=\"gantt-header\">\n <gantt-table-header #tableHeader [columns]=\"columns\"></gantt-table-header>\n <div class=\"gantt-container-header\">\n <gantt-calendar-header></gantt-calendar-header>\n </div>\n </div>\n <gantt-loader *ngIf=\"loading\"></gantt-loader>\n\n <cdk-virtual-scroll-viewport\n class=\"gantt-virtual-scroll-viewport\"\n [ngClass]=\"{ 'gantt-normal-viewport': !virtualScrollEnabled }\"\n [itemSize]=\"styles.lineHeight\"\n [minBufferPx]=\"styles.lineHeight * 10\"\n [maxBufferPx]=\"styles.lineHeight * 20\"\n >\n <ng-container *cdkVirtualFor=\"let item of flatItems; trackBy: trackBy\"></ng-container>\n <div class=\"gantt-side\" [style.width.px]=\"tableHeader.tableWidth + 1\">\n <div class=\"gantt-side-container\">\n <div class=\"gantt-table\">\n <gantt-table-body\n [flatItems]=\"flatItems\"\n [viewportItems]=\"viewportItems\"\n [columns]=\"columns\"\n [groupTemplate]=\"groupTemplate\"\n [emptyTemplate]=\"tableEmptyTemplate\"\n [rowBeforeTemplate]=\"table?.rowBeforeTemplate\"\n [rowAfterTemplate]=\"table?.rowAfterTemplate\"\n [draggable]=\"table.draggable\"\n [dropEnterPredicate]=\"table.dropEnterPredicate\"\n (dragDropped)=\"table.dragDropped.emit($event)\"\n (dragStarted)=\"table.dragStarted.emit($event)\"\n (dragEnded)=\"table.dragEnded.emit($event)\"\n (itemClick)=\"selectItem($event)\"\n >\n </gantt-table-body>\n </div>\n </div>\n </div>\n <div class=\"gantt-container\">\n <gantt-calendar-grid></gantt-calendar-grid>\n <div class=\"gantt-main\">\n <gantt-main\n [flatItems]=\"flatItems\"\n [viewportItems]=\"viewportItems\"\n [groupHeaderTemplate]=\"groupHeaderTemplate\"\n [itemTemplate]=\"itemTemplate\"\n [barTemplate]=\"barTemplate\"\n [rangeTemplate]=\"rangeTemplate\"\n (barClick)=\"barClick.emit($event)\"\n (lineClick)=\"lineClick.emit($event)\"\n >\n </gantt-main>\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n\n <gantt-drag-backdrop [style.left.px]=\"tableHeader.tableWidth + 1\"></gantt-drag-backdrop>\n</ngx-gantt-root>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: GanttTableHeaderComponent, selector: "gantt-table-header", inputs: ["columns"] }, { kind: "component", type: GanttTableBodyComponent, selector: "gantt-table-body", inputs: ["viewportItems", "flatItems", "columns", "groupTemplate", "emptyTemplate", "rowBeforeTemplate", "rowAfterTemplate", "draggable", "dropEnterPredicate"], outputs: ["dragDropped", "dragStarted", "dragEnded", "itemClick"] }, { kind: "component", type: GanttMainComponent, selector: "gantt-main", inputs: ["viewportItems", "flatItems", "groupHeaderTemplate", "itemTemplate", "barTemplate", "rangeTemplate"], outputs: ["barClick", "lineClick"] }, { kind: "component", type: GanttCalendarHeaderComponent, selector: "gantt-calendar-header" }, { kind: "component", type: GanttCalendarGridComponent, selector: "gantt-calendar-grid" }, { kind: "component", type: GanttLoaderComponent, selector: "gantt-loader" }, { kind: "component", type: GanttDragBackdropComponent, selector: "gantt-drag-backdrop" }, { kind: "component", type: NgxGanttRootComponent, selector: "ngx-gantt-root", inputs: ["sideWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3991
- __decorate([
3992
- InputBoolean()
3993
- ], NgxGanttComponent.prototype, "virtualScrollEnabled", void 0);
4026
+ ], queries: [{ propertyName: "table", first: true, predicate: NgxGanttTableComponent, descendants: true }, { propertyName: "tableEmptyTemplate", first: true, predicate: ["tableEmpty"], descendants: true, static: true }, { propertyName: "columns", predicate: NgxGanttTableColumnComponent, descendants: true }], viewQueries: [{ propertyName: "ganttRoot", first: true, predicate: ["ganttRoot"], descendants: true }, { propertyName: "virtualScroll", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ngx-gantt-root #ganttRoot>\n <div class=\"gantt-header\">\n <gantt-table-header #tableHeader [columns]=\"columns\"></gantt-table-header>\n <div class=\"gantt-container-header\">\n <gantt-calendar-header [style.padding-right.px]=\"ganttRoot.verticalScrollbarWidth\"></gantt-calendar-header>\n </div>\n </div>\n <gantt-loader *ngIf=\"loading\"></gantt-loader>\n\n <cdk-virtual-scroll-viewport\n class=\"gantt-virtual-scroll-viewport\"\n [ngClass]=\"{ 'gantt-normal-viewport': !virtualScrollEnabled, 'gantt-scroll-container': virtualScrollEnabled }\"\n [itemSize]=\"styles.lineHeight\"\n [minBufferPx]=\"styles.lineHeight * 10\"\n [maxBufferPx]=\"styles.lineHeight * 20\"\n >\n <ng-container *cdkVirtualFor=\"let item of flatItems; trackBy: trackBy\"></ng-container>\n <div class=\"gantt-side\" [style.width.px]=\"tableHeader.tableWidth + 1\" [style.padding-bottom.px]=\"ganttRoot.horizontalScrollbarHeight\">\n <div class=\"gantt-side-container\">\n <div class=\"gantt-table\">\n <gantt-table-body\n [flatItems]=\"flatItems\"\n [viewportItems]=\"viewportItems\"\n [columns]=\"columns\"\n [groupTemplate]=\"groupTemplate\"\n [emptyTemplate]=\"tableEmptyTemplate\"\n [rowBeforeTemplate]=\"table?.rowBeforeTemplate\"\n [rowAfterTemplate]=\"table?.rowAfterTemplate\"\n [draggable]=\"table.draggable\"\n [dropEnterPredicate]=\"table.dropEnterPredicate\"\n (dragDropped)=\"table.dragDropped.emit($event)\"\n (dragStarted)=\"table.dragStarted.emit($event)\"\n (dragEnded)=\"table.dragEnded.emit($event)\"\n (itemClick)=\"selectItem($event)\"\n >\n </gantt-table-body>\n </div>\n </div>\n </div>\n <div class=\"gantt-container\">\n <gantt-calendar-grid\n [style.padding-right.px]=\"ganttRoot.verticalScrollbarWidth\"\n [style.padding-bottom.px]=\"ganttRoot.horizontalScrollbarHeight\"\n ></gantt-calendar-grid>\n <div class=\"gantt-main\">\n <gantt-main\n [flatItems]=\"flatItems\"\n [viewportItems]=\"viewportItems\"\n [groupHeaderTemplate]=\"groupHeaderTemplate\"\n [itemTemplate]=\"itemTemplate\"\n [barTemplate]=\"barTemplate\"\n [rangeTemplate]=\"rangeTemplate\"\n (barClick)=\"barClick.emit($event)\"\n (lineClick)=\"lineClick.emit($event)\"\n >\n </gantt-main>\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n\n <gantt-drag-backdrop [style.left.px]=\"tableHeader.tableWidth + 1\"></gantt-drag-backdrop>\n</ngx-gantt-root>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1$1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1$1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: GanttTableHeaderComponent, selector: "gantt-table-header", inputs: ["columns"] }, { kind: "component", type: GanttTableBodyComponent, selector: "gantt-table-body", inputs: ["viewportItems", "flatItems", "columns", "groupTemplate", "emptyTemplate", "rowBeforeTemplate", "rowAfterTemplate", "draggable", "dropEnterPredicate"], outputs: ["dragDropped", "dragStarted", "dragEnded", "itemClick"] }, { kind: "component", type: GanttMainComponent, selector: "gantt-main", inputs: ["viewportItems", "flatItems", "groupHeaderTemplate", "itemTemplate", "barTemplate", "rangeTemplate"], outputs: ["barClick", "lineClick"] }, { kind: "component", type: GanttCalendarHeaderComponent, selector: "gantt-calendar-header" }, { kind: "component", type: GanttCalendarGridComponent, selector: "gantt-calendar-grid" }, { kind: "component", type: GanttLoaderComponent, selector: "gantt-loader" }, { kind: "component", type: GanttDragBackdropComponent, selector: "gantt-drag-backdrop" }, { kind: "component", type: NgxGanttRootComponent, selector: "ngx-gantt-root", inputs: ["sideWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3994
4027
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: NgxGanttComponent, decorators: [{
3995
4028
  type: Component,
3996
4029
  args: [{ selector: 'ngx-gantt', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
@@ -4002,11 +4035,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImpor
4002
4035
  provide: GANTT_ABSTRACT_TOKEN,
4003
4036
  useExisting: forwardRef(() => NgxGanttComponent)
4004
4037
  }
4005
- ], template: "<ngx-gantt-root #ganttRoot>\n <div class=\"gantt-header\">\n <gantt-table-header #tableHeader [columns]=\"columns\"></gantt-table-header>\n <div class=\"gantt-container-header\">\n <gantt-calendar-header></gantt-calendar-header>\n </div>\n </div>\n <gantt-loader *ngIf=\"loading\"></gantt-loader>\n\n <cdk-virtual-scroll-viewport\n class=\"gantt-virtual-scroll-viewport\"\n [ngClass]=\"{ 'gantt-normal-viewport': !virtualScrollEnabled }\"\n [itemSize]=\"styles.lineHeight\"\n [minBufferPx]=\"styles.lineHeight * 10\"\n [maxBufferPx]=\"styles.lineHeight * 20\"\n >\n <ng-container *cdkVirtualFor=\"let item of flatItems; trackBy: trackBy\"></ng-container>\n <div class=\"gantt-side\" [style.width.px]=\"tableHeader.tableWidth + 1\">\n <div class=\"gantt-side-container\">\n <div class=\"gantt-table\">\n <gantt-table-body\n [flatItems]=\"flatItems\"\n [viewportItems]=\"viewportItems\"\n [columns]=\"columns\"\n [groupTemplate]=\"groupTemplate\"\n [emptyTemplate]=\"tableEmptyTemplate\"\n [rowBeforeTemplate]=\"table?.rowBeforeTemplate\"\n [rowAfterTemplate]=\"table?.rowAfterTemplate\"\n [draggable]=\"table.draggable\"\n [dropEnterPredicate]=\"table.dropEnterPredicate\"\n (dragDropped)=\"table.dragDropped.emit($event)\"\n (dragStarted)=\"table.dragStarted.emit($event)\"\n (dragEnded)=\"table.dragEnded.emit($event)\"\n (itemClick)=\"selectItem($event)\"\n >\n </gantt-table-body>\n </div>\n </div>\n </div>\n <div class=\"gantt-container\">\n <gantt-calendar-grid></gantt-calendar-grid>\n <div class=\"gantt-main\">\n <gantt-main\n [flatItems]=\"flatItems\"\n [viewportItems]=\"viewportItems\"\n [groupHeaderTemplate]=\"groupHeaderTemplate\"\n [itemTemplate]=\"itemTemplate\"\n [barTemplate]=\"barTemplate\"\n [rangeTemplate]=\"rangeTemplate\"\n (barClick)=\"barClick.emit($event)\"\n (lineClick)=\"lineClick.emit($event)\"\n >\n </gantt-main>\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n\n <gantt-drag-backdrop [style.left.px]=\"tableHeader.tableWidth + 1\"></gantt-drag-backdrop>\n</ngx-gantt-root>\n" }]
4038
+ ], template: "<ngx-gantt-root #ganttRoot>\n <div class=\"gantt-header\">\n <gantt-table-header #tableHeader [columns]=\"columns\"></gantt-table-header>\n <div class=\"gantt-container-header\">\n <gantt-calendar-header [style.padding-right.px]=\"ganttRoot.verticalScrollbarWidth\"></gantt-calendar-header>\n </div>\n </div>\n <gantt-loader *ngIf=\"loading\"></gantt-loader>\n\n <cdk-virtual-scroll-viewport\n class=\"gantt-virtual-scroll-viewport\"\n [ngClass]=\"{ 'gantt-normal-viewport': !virtualScrollEnabled, 'gantt-scroll-container': virtualScrollEnabled }\"\n [itemSize]=\"styles.lineHeight\"\n [minBufferPx]=\"styles.lineHeight * 10\"\n [maxBufferPx]=\"styles.lineHeight * 20\"\n >\n <ng-container *cdkVirtualFor=\"let item of flatItems; trackBy: trackBy\"></ng-container>\n <div class=\"gantt-side\" [style.width.px]=\"tableHeader.tableWidth + 1\" [style.padding-bottom.px]=\"ganttRoot.horizontalScrollbarHeight\">\n <div class=\"gantt-side-container\">\n <div class=\"gantt-table\">\n <gantt-table-body\n [flatItems]=\"flatItems\"\n [viewportItems]=\"viewportItems\"\n [columns]=\"columns\"\n [groupTemplate]=\"groupTemplate\"\n [emptyTemplate]=\"tableEmptyTemplate\"\n [rowBeforeTemplate]=\"table?.rowBeforeTemplate\"\n [rowAfterTemplate]=\"table?.rowAfterTemplate\"\n [draggable]=\"table.draggable\"\n [dropEnterPredicate]=\"table.dropEnterPredicate\"\n (dragDropped)=\"table.dragDropped.emit($event)\"\n (dragStarted)=\"table.dragStarted.emit($event)\"\n (dragEnded)=\"table.dragEnded.emit($event)\"\n (itemClick)=\"selectItem($event)\"\n >\n </gantt-table-body>\n </div>\n </div>\n </div>\n <div class=\"gantt-container\">\n <gantt-calendar-grid\n [style.padding-right.px]=\"ganttRoot.verticalScrollbarWidth\"\n [style.padding-bottom.px]=\"ganttRoot.horizontalScrollbarHeight\"\n ></gantt-calendar-grid>\n <div class=\"gantt-main\">\n <gantt-main\n [flatItems]=\"flatItems\"\n [viewportItems]=\"viewportItems\"\n [groupHeaderTemplate]=\"groupHeaderTemplate\"\n [itemTemplate]=\"itemTemplate\"\n [barTemplate]=\"barTemplate\"\n [rangeTemplate]=\"rangeTemplate\"\n (barClick)=\"barClick.emit($event)\"\n (lineClick)=\"lineClick.emit($event)\"\n >\n </gantt-main>\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n\n <gantt-drag-backdrop [style.left.px]=\"tableHeader.tableWidth + 1\"></gantt-drag-backdrop>\n</ngx-gantt-root>\n" }]
4006
4039
  }], ctorParameters: function () {
4007
- return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: GanttPrintService, decorators: [{
4008
- type: Optional
4009
- }] }, { type: undefined, decorators: [{
4040
+ return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1$1.ViewportRuler }, { type: undefined, decorators: [{
4010
4041
  type: Inject,
4011
4042
  args: [GANTT_GLOBAL_CONFIG]
4012
4043
  }] }];