@worktile/gantt 12.1.2 → 12.2.0-next.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.
@@ -2,14 +2,16 @@ import * as i0 from '@angular/core';
2
2
  import { InjectionToken, EventEmitter, Directive, Inject, Input, Output, ContentChild, HostBinding, Component, Pipe, ViewChild, Injectable, Optional, forwardRef, ChangeDetectionStrategy, ContentChildren, NgModule } from '@angular/core';
3
3
  import * as i2 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
- import { take, skip, takeUntil, startWith, map, pairwise, auditTime, finalize } from 'rxjs/operators';
5
+ import { take, skip, takeUntil, startWith, map, pairwise, auditTime, debounceTime, finalize } from 'rxjs/operators';
6
6
  import { BehaviorSubject, Subject, merge, fromEvent } from 'rxjs';
7
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';
8
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';
9
- import { coerceCssPixelValue } from '@angular/cdk/coercion';
9
+ import { SelectionModel } from '@angular/cdk/collections';
10
+ import { coerceBooleanProperty, coerceCssPixelValue } from '@angular/cdk/coercion';
10
11
  import * as i1 from '@angular/cdk/drag-drop';
11
12
  import { DragDropModule } from '@angular/cdk/drag-drop';
12
13
  import html2canvas from 'html2canvas';
14
+ import { __decorate, __param } from 'tslib';
13
15
 
14
16
  class GanttDatePoint {
15
17
  constructor(start, text, x, y, additions) {
@@ -33,6 +35,8 @@ class GanttLineClickEvent {
33
35
  }
34
36
  class GanttBarClickEvent {
35
37
  }
38
+ class GanttSelectedEvent {
39
+ }
36
40
 
37
41
  class GanttDate {
38
42
  constructor(date) {
@@ -201,6 +205,25 @@ var GanttViewType;
201
205
  GanttViewType["week"] = "week";
202
206
  })(GanttViewType || (GanttViewType = {}));
203
207
 
208
+ var GanttLinkType;
209
+ (function (GanttLinkType) {
210
+ GanttLinkType[GanttLinkType["fs"] = 1] = "fs";
211
+ GanttLinkType[GanttLinkType["ff"] = 2] = "ff";
212
+ GanttLinkType[GanttLinkType["ss"] = 3] = "ss";
213
+ GanttLinkType[GanttLinkType["sf"] = 4] = "sf";
214
+ })(GanttLinkType || (GanttLinkType = {}));
215
+ var GanttLinkPathType;
216
+ (function (GanttLinkPathType) {
217
+ GanttLinkPathType["curve"] = "curve";
218
+ GanttLinkPathType["line"] = "line";
219
+ })(GanttLinkPathType || (GanttLinkPathType = {}));
220
+ var LinkColors;
221
+ (function (LinkColors) {
222
+ LinkColors["default"] = "#cacaca";
223
+ LinkColors["blocked"] = "#FF7575";
224
+ LinkColors["active"] = "#348FE4";
225
+ })(LinkColors || (LinkColors = {}));
226
+
204
227
  var GanttItemType;
205
228
  (function (GanttItemType) {
206
229
  GanttItemType["bar"] = "bar";
@@ -212,7 +235,17 @@ class GanttItemInternal {
212
235
  this.refs$ = new BehaviorSubject(null);
213
236
  this.origin = item;
214
237
  this.id = this.origin.id;
215
- this.links = this.origin.links || [];
238
+ this.links = (this.origin.links || []).map((link) => {
239
+ if (typeof link === 'string') {
240
+ return {
241
+ type: GanttLinkType.fs,
242
+ link
243
+ };
244
+ }
245
+ else {
246
+ return link;
247
+ }
248
+ });
216
249
  this.color = this.origin.color;
217
250
  this.barStyle = this.origin.barStyle;
218
251
  this.linkable = this.origin.linkable === undefined ? true : this.origin.linkable;
@@ -271,7 +304,7 @@ class GanttItemInternal {
271
304
  this.origin.expanded = expanded;
272
305
  }
273
306
  addLink(linkId) {
274
- this.links = [...this.links, linkId];
307
+ this.links = [...this.links, { type: GanttLinkType.fs, link: linkId }];
275
308
  this.origin.links = this.links;
276
309
  }
277
310
  }
@@ -300,7 +333,12 @@ const defaultConfig = {
300
333
  quarter: 'QQQ',
301
334
  year: 'yyyy年',
302
335
  yearMonth: 'yyyy年MM月',
303
- yearQuarter: 'yyyy年QQQ',
336
+ yearQuarter: 'yyyy年QQQ'
337
+ },
338
+ linkOptions: {
339
+ dependencyTypes: [GanttLinkType.fs],
340
+ showArrow: false,
341
+ linkPathType: GanttLinkPathType.curve
304
342
  }
305
343
  };
306
344
  const GANTT_GLOBAL_CONFIG = new InjectionToken('GANTT_GLOBAL_CONFIG');
@@ -770,8 +808,32 @@ class GanttUpper {
770
808
  this.expandChange = new EventEmitter();
771
809
  this.firstChange = true;
772
810
  this.unsubscribe$ = new Subject();
811
+ this._selectable = false;
812
+ this._multiple = false;
773
813
  this.ganttClass = true;
774
814
  }
815
+ set selectable(value) {
816
+ var _a;
817
+ this._selectable = coerceBooleanProperty(value);
818
+ if (this._selectable) {
819
+ this.selectionModel = this.initSelectionModel();
820
+ }
821
+ else {
822
+ (_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.clear();
823
+ }
824
+ }
825
+ get selectable() {
826
+ return this._selectable;
827
+ }
828
+ set multiple(value) {
829
+ this._multiple = coerceBooleanProperty(value);
830
+ if (this.selectable) {
831
+ this.selectionModel = this.initSelectionModel();
832
+ }
833
+ }
834
+ get multiple() {
835
+ return this._multiple;
836
+ }
775
837
  get element() {
776
838
  return this.elementRef.nativeElement;
777
839
  }
@@ -869,6 +931,9 @@ class GanttUpper {
869
931
  this.expandChange.next();
870
932
  this.cdr.detectChanges();
871
933
  }
934
+ initSelectionModel() {
935
+ return new SelectionModel(this.multiple, []);
936
+ }
872
937
  onInit() {
873
938
  this.styles = Object.assign({}, defaultStyles, this.styles);
874
939
  this.viewOptions.dateFormat = Object.assign({}, defaultConfig.dateFormat, this.config.dateFormat, this.viewOptions.dateFormat);
@@ -876,6 +941,7 @@ class GanttUpper {
876
941
  this.setupGroups();
877
942
  this.setupItems();
878
943
  this.computeRefs();
944
+ this.initSelectionModel();
879
945
  this.firstChange = false;
880
946
  this.ngZone.onStable.pipe(take(1)).subscribe(() => {
881
947
  this.element.style.opacity = '1';
@@ -956,9 +1022,18 @@ class GanttUpper {
956
1022
  }
957
1023
  return items.filter((item) => ids.includes(item.id));
958
1024
  }
1025
+ isSelected(id) {
1026
+ if (!this.selectable) {
1027
+ return false;
1028
+ }
1029
+ if (!this.selectionModel.hasValue()) {
1030
+ return false;
1031
+ }
1032
+ return this.selectionModel.isSelected(id);
1033
+ }
959
1034
  }
960
1035
  GanttUpper.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttUpper, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: GANTT_GLOBAL_CONFIG }], target: i0.ɵɵFactoryTarget.Directive });
961
- GanttUpper.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.2", type: GanttUpper, inputs: { originItems: ["items", "originItems"], originGroups: ["groups", "originGroups"], viewType: "viewType", start: "start", end: "end", showTodayLine: "showTodayLine", draggable: "draggable", styles: "styles", viewOptions: "viewOptions", disabledLoadOnScroll: "disabledLoadOnScroll" }, outputs: { loadOnScroll: "loadOnScroll", dragStarted: "dragStarted", dragMoved: "dragMoved", dragEnded: "dragEnded", barClick: "barClick" }, host: { properties: { "class.gantt": "this.ganttClass" } }, queries: [{ propertyName: "barTemplate", first: true, predicate: ["bar"], descendants: true, static: true }, { propertyName: "rangeTemplate", first: true, predicate: ["range"], descendants: true, static: true }, { propertyName: "itemTemplate", first: true, predicate: ["item"], descendants: true, static: true }, { propertyName: "groupTemplate", first: true, predicate: ["group"], descendants: true, static: true }, { propertyName: "groupHeaderTemplate", first: true, predicate: ["groupHeader"], descendants: true, static: true }], ngImport: i0 });
1036
+ GanttUpper.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.2", type: GanttUpper, inputs: { originItems: ["items", "originItems"], originGroups: ["groups", "originGroups"], viewType: "viewType", start: "start", end: "end", showTodayLine: "showTodayLine", draggable: "draggable", styles: "styles", viewOptions: "viewOptions", disabledLoadOnScroll: "disabledLoadOnScroll", selectable: "selectable", multiple: "multiple" }, outputs: { loadOnScroll: "loadOnScroll", dragStarted: "dragStarted", dragMoved: "dragMoved", dragEnded: "dragEnded", barClick: "barClick" }, host: { properties: { "class.gantt": "this.ganttClass" } }, queries: [{ propertyName: "barTemplate", first: true, predicate: ["bar"], descendants: true, static: true }, { propertyName: "rangeTemplate", first: true, predicate: ["range"], descendants: true, static: true }, { propertyName: "itemTemplate", first: true, predicate: ["item"], descendants: true, static: true }, { propertyName: "groupTemplate", first: true, predicate: ["group"], descendants: true, static: true }, { propertyName: "groupHeaderTemplate", first: true, predicate: ["groupHeader"], descendants: true, static: true }], ngImport: i0 });
962
1037
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttUpper, decorators: [{
963
1038
  type: Directive
964
1039
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
@@ -986,6 +1061,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImpor
986
1061
  type: Input
987
1062
  }], disabledLoadOnScroll: [{
988
1063
  type: Input
1064
+ }], selectable: [{
1065
+ type: Input
1066
+ }], multiple: [{
1067
+ type: Input
989
1068
  }], loadOnScroll: [{
990
1069
  type: Output
991
1070
  }], dragStarted: [{
@@ -1240,9 +1319,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImpor
1240
1319
  const defaultColumnWidth = 100;
1241
1320
  const minColumnWidth = 80;
1242
1321
  class GanttTableComponent {
1243
- constructor(gantt, elementRef) {
1322
+ constructor(gantt, ganttUpper, elementRef) {
1244
1323
  this.gantt = gantt;
1324
+ this.ganttUpper = ganttUpper;
1245
1325
  this.elementRef = elementRef;
1326
+ this.itemClick = new EventEmitter();
1246
1327
  this.ganttTableClass = true;
1247
1328
  this.ganttTableEmptyClass = false;
1248
1329
  }
@@ -1272,7 +1353,8 @@ class GanttTableComponent {
1272
1353
  expandGroup(group) {
1273
1354
  this.gantt.expandGroup(group);
1274
1355
  }
1275
- expandChildren(item) {
1356
+ expandChildren(event, item) {
1357
+ event.stopPropagation();
1276
1358
  this.gantt.expandChildren(item);
1277
1359
  }
1278
1360
  dragStarted(event) {
@@ -1346,8 +1428,8 @@ class GanttTableComponent {
1346
1428
  return item.id || index;
1347
1429
  }
1348
1430
  }
1349
- GanttTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttTableComponent, deps: [{ token: GANTT_ABSTRACT_TOKEN }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1350
- GanttTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.2", type: GanttTableComponent, selector: "gantt-table", inputs: { groups: "groups", items: "items", columns: "columns", groupTemplate: "groupTemplate", emptyTemplate: "emptyTemplate", rowBeforeTemplate: "rowBeforeTemplate", rowAfterTemplate: "rowAfterTemplate" }, host: { properties: { "class.gantt-table": "this.ganttTableClass", "class.gantt-table-empty": "this.ganttTableEmptyClass" } }, viewQueries: [{ propertyName: "draglineElementRef", first: true, predicate: ["dragLine"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"gantt-table-header gantt-table-row\">\n <div class=\"gantt-table-column\" *ngFor=\"let column of columnList; let i = index\" [style.width]=\"column.columnWidth\">\n <ng-container *ngIf=\"column.headerTemplateRef; else default\" [ngTemplateOutlet]=\"column.headerTemplateRef\"></ng-container>\n <ng-template #default>\n {{ column.name }}\n </ng-template>\n <div\n class=\"gantt-table-drag-trigger\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"dragMoved($event, column)\"\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"columnDragEnded($event, column)\"\n ></div>\n </div>\n</div>\n<div class=\"gantt-table-body\">\n <ng-container *ngIf=\"!groups.length && !items.length\">\n <ng-container *ngIf=\"!emptyTemplate\">\n <gantt-icon class=\"empty-icon\" iconName=\"empty\"></gantt-icon>\n <div class=\"empty-text\">\u6CA1\u6709\u6570\u636E</div>\n </ng-container>\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"groups && groups.length > 0; else itemsTemplate\">\n <ng-container *ngFor=\"let group of groups; trackBy: trackBy\">\n <div class=\"gantt-table-group\" [ngClass]=\"group.class\">\n <div class=\"gantt-table-group-title\" [class.expanded]=\"group.expanded\" (click)=\"expandGroup(group)\">\n <gantt-icon class=\"expand-icon\" [iconName]=\"group.expanded ? 'angle-down' : 'angle-right'\"></gantt-icon>\n <ng-container *ngIf=\"groupTemplate; else default\">\n <ng-template\n [ngTemplateOutlet]=\"groupTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: group.origin, group: group.origin }\"\n ></ng-template>\n </ng-container>\n <ng-template #default>\n <span class=\"group-title\">{{ group.title }}</span>\n </ng-template>\n </div>\n </div>\n\n <ng-container *ngIf=\"group.expanded\">\n <ng-template\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ group: group, items: group.items, level: 0 }\"\n ></ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<div\n class=\"gantt-table-drag-trigger\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"dragMoved($event)\"\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"tableDragEnded($event)\"\n></div>\n\n<div #dragLine class=\"gantt-table-drag-auxiliary-line\"></div>\n\n<ng-template #itemsTemplate>\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: items, level: 0 }\"></ng-template>\n</ng-template>\n\n<ng-template #ganttItems let-group=\"group\" let-items=\"items\" let-level=\"level\">\n <ng-container *ngFor=\"let item of items; trackBy: trackBy\">\n <div\n class=\"gantt-table-item gantt-table-row\"\n [class.gantt-table-item-first-level-group]=\"level === 0 && (item.type | isGanttRangeItem)\"\n [class.gantt-table-item-with-group]=\"group\"\n [style.height.px]=\"gantt.styles.lineHeight\"\n [style.lineHeight.px]=\"gantt.styles.lineHeight\"\n >\n <ng-template\n [ngTemplateOutlet]=\"rowBeforeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n <div class=\"gantt-table-column\" *ngFor=\"let column of columnList; let first = first\" [style.width]=\"column.columnWidth\">\n <div *ngIf=\"first\" class=\"gantt-expand-icon\" [style.marginLeft.px]=\"level * 20\">\n <ng-container *ngIf=\"level < gantt.maxLevel - 1 && item.expandable\">\n <gantt-icon\n *ngIf=\"!item.loading\"\n class=\"expand-icon\"\n [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"\n (click)=\"expandChildren(item)\"\n ></gantt-icon>\n <gantt-icon *ngIf=\"item.loading\" [iconName]=\"'loading'\"></gantt-icon>\n </ng-container>\n </div>\n <div class=\"gantt-table-column-content\">\n <ng-template\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"rowAfterTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n <ng-template\n *ngIf=\"item.children && item.expanded\"\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ items: item.children, level: level + 1, group: group }\"\n ></ng-template>\n </ng-container>\n</ng-template>\n", components: [{ type: GanttIconComponent, selector: "gantt-icon", inputs: ["iconName"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "isGanttRangeItem": IsGanttRangeItemPipe } });
1431
+ GanttTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttTableComponent, deps: [{ token: GANTT_ABSTRACT_TOKEN }, { token: GANTT_UPPER_TOKEN }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1432
+ GanttTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.2", type: GanttTableComponent, selector: "gantt-table", inputs: { groups: "groups", items: "items", columns: "columns", groupTemplate: "groupTemplate", emptyTemplate: "emptyTemplate", rowBeforeTemplate: "rowBeforeTemplate", rowAfterTemplate: "rowAfterTemplate" }, outputs: { itemClick: "itemClick" }, host: { properties: { "class.gantt-table": "this.ganttTableClass", "class.gantt-table-empty": "this.ganttTableEmptyClass" } }, viewQueries: [{ propertyName: "draglineElementRef", first: true, predicate: ["dragLine"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"gantt-table-header gantt-table-row\">\n <div class=\"gantt-table-column\" *ngFor=\"let column of columnList; let i = index\" [style.width]=\"column.columnWidth\">\n <ng-container *ngIf=\"column.headerTemplateRef; else default\" [ngTemplateOutlet]=\"column.headerTemplateRef\"></ng-container>\n <ng-template #default>\n {{ column.name }}\n </ng-template>\n <div\n class=\"gantt-table-drag-trigger\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"dragMoved($event, column)\"\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"columnDragEnded($event, column)\"\n ></div>\n </div>\n</div>\n<div class=\"gantt-table-body\">\n <ng-container *ngIf=\"!groups.length && !items.length\">\n <ng-container *ngIf=\"!emptyTemplate\">\n <gantt-icon class=\"empty-icon\" iconName=\"empty\"></gantt-icon>\n <div class=\"empty-text\">\u6CA1\u6709\u6570\u636E</div>\n </ng-container>\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"groups && groups.length > 0; else itemsTemplate\">\n <ng-container *ngFor=\"let group of groups; trackBy: trackBy\">\n <div class=\"gantt-table-group\" [ngClass]=\"group.class\">\n <div class=\"gantt-table-group-title\" [class.expanded]=\"group.expanded\" (click)=\"expandGroup(group)\">\n <gantt-icon class=\"expand-icon\" [iconName]=\"group.expanded ? 'angle-down' : 'angle-right'\"></gantt-icon>\n <ng-container *ngIf=\"groupTemplate; else default\">\n <ng-template\n [ngTemplateOutlet]=\"groupTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: group.origin, group: group.origin }\"\n ></ng-template>\n </ng-container>\n <ng-template #default>\n <span class=\"group-title\">{{ group.title }}</span>\n </ng-template>\n </div>\n </div>\n\n <ng-container *ngIf=\"group.expanded\">\n <ng-template\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ group: group, items: group.items, level: 0 }\"\n ></ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<div\n class=\"gantt-table-drag-trigger\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n cdkDragBoundary=\".gantt\"\n (cdkDragMoved)=\"dragMoved($event)\"\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"tableDragEnded($event)\"\n></div>\n\n<div #dragLine class=\"gantt-table-drag-auxiliary-line\"></div>\n\n<ng-template #itemsTemplate>\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: items, level: 0 }\"></ng-template>\n</ng-template>\n\n<ng-template #ganttItems let-group=\"group\" let-items=\"items\" let-level=\"level\">\n <ng-container *ngFor=\"let item of items; trackBy: trackBy\">\n <div\n (click)=\"itemClick.emit({ event: $event, selectedValue: this.item.origin })\"\n class=\"gantt-table-item gantt-table-row\"\n [class.gantt-table-item-first-level-group]=\"level === 0 && (item.type | isGanttRangeItem)\"\n [class.gantt-table-item-with-group]=\"group\"\n [class.gantt-table-item-active]=\"ganttUpper.isSelected(item.id)\"\n [style.height.px]=\"gantt.styles.lineHeight\"\n [style.lineHeight.px]=\"gantt.styles.lineHeight\"\n >\n <ng-template\n [ngTemplateOutlet]=\"rowBeforeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n <div class=\"gantt-table-column\" *ngFor=\"let column of columnList; let first = first\" [style.width]=\"column.columnWidth\">\n <div *ngIf=\"first\" class=\"gantt-expand-icon\" [style.marginLeft.px]=\"level * 20\">\n <ng-container *ngIf=\"level < gantt.maxLevel - 1 && item.expandable\">\n <gantt-icon\n *ngIf=\"!item.loading\"\n class=\"expand-icon\"\n [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"\n (click)=\"expandChildren($event, item)\"\n ></gantt-icon>\n <gantt-icon *ngIf=\"item.loading\" [iconName]=\"'loading'\"></gantt-icon>\n </ng-container>\n </div>\n <div class=\"gantt-table-column-content\">\n <ng-template\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"rowAfterTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n <ng-template\n *ngIf=\"item.children && item.expanded\"\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ items: item.children, level: level + 1, group: group }\"\n ></ng-template>\n </ng-container>\n</ng-template>\n", components: [{ type: GanttIconComponent, selector: "gantt-icon", inputs: ["iconName"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "isGanttRangeItem": IsGanttRangeItemPipe } });
1351
1433
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttTableComponent, decorators: [{
1352
1434
  type: Component,
1353
1435
  args: [{
@@ -1357,6 +1439,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImpor
1357
1439
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1358
1440
  type: Inject,
1359
1441
  args: [GANTT_ABSTRACT_TOKEN]
1442
+ }] }, { type: GanttUpper, decorators: [{
1443
+ type: Inject,
1444
+ args: [GANTT_UPPER_TOKEN]
1360
1445
  }] }, { type: i0.ElementRef }]; }, propDecorators: { groups: [{
1361
1446
  type: Input
1362
1447
  }], items: [{
@@ -1371,6 +1456,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImpor
1371
1456
  type: Input
1372
1457
  }], rowAfterTemplate: [{
1373
1458
  type: Input
1459
+ }], itemClick: [{
1460
+ type: Output
1374
1461
  }], draglineElementRef: [{
1375
1462
  type: ViewChild,
1376
1463
  args: ['dragLine', { static: true }]
@@ -1832,12 +1919,214 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImpor
1832
1919
  args: ['mainTemplate', { static: true }]
1833
1920
  }] } });
1834
1921
 
1835
- var LinkColors;
1836
- (function (LinkColors) {
1837
- LinkColors["default"] = "#cacaca";
1838
- LinkColors["blocked"] = "#FF7575";
1839
- LinkColors["active"] = "#348FE4";
1840
- })(LinkColors || (LinkColors = {}));
1922
+ class GanttLinkPath {
1923
+ constructor() { }
1924
+ generatePath(source, target, type) {
1925
+ if (source.before && source.after && target.before && target.after) {
1926
+ let path = '';
1927
+ switch (type) {
1928
+ case GanttLinkType.ss:
1929
+ path = this.generateSSPath(source, target);
1930
+ break;
1931
+ case GanttLinkType.ff:
1932
+ path = this.generateFFPath(source, target);
1933
+ break;
1934
+ case GanttLinkType.sf:
1935
+ path = this.generateFSAndSFPath(source, target, type);
1936
+ break;
1937
+ default:
1938
+ path = this.generateFSAndSFPath(source, target);
1939
+ }
1940
+ return path;
1941
+ }
1942
+ }
1943
+ }
1944
+ GanttLinkPath.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttLinkPath, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1945
+ GanttLinkPath.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttLinkPath });
1946
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttLinkPath, decorators: [{
1947
+ type: Injectable
1948
+ }], ctorParameters: function () { return []; } });
1949
+
1950
+ let GanttLinkPathCurve = class GanttLinkPathCurve extends GanttLinkPath {
1951
+ constructor(ganttUpper) {
1952
+ super();
1953
+ this.ganttUpper = ganttUpper;
1954
+ this.bezierWeight = -0.5;
1955
+ }
1956
+ generateSSPath(source, target) {
1957
+ const x1 = source.before.x;
1958
+ const y1 = source.before.y;
1959
+ const x4 = target.before.x;
1960
+ const y4 = target.before.y;
1961
+ const isMirror = y4 > y1 ? 0 : 1;
1962
+ const radius = Math.abs(y4 - y1) / 2;
1963
+ if (x4 > x1) {
1964
+ return `M ${x1} ${y1}
1965
+ A ${radius} ${radius} 0 1 ${isMirror} ${x1} ${y4}
1966
+ L ${x4} ${y4}`;
1967
+ }
1968
+ else {
1969
+ return `M ${x1} ${y1}
1970
+ L ${x4} ${y1}
1971
+ A ${radius} ${radius} 0 1 ${isMirror} ${x4} ${y4}`;
1972
+ }
1973
+ }
1974
+ generateFFPath(source, target) {
1975
+ const x1 = source.after.x;
1976
+ const y1 = source.after.y;
1977
+ const x4 = target.after.x;
1978
+ const y4 = target.after.y;
1979
+ const isMirror = y4 > y1 ? 1 : 0;
1980
+ const radius = Math.abs(y4 - y1) / 2;
1981
+ if (x4 > x1) {
1982
+ return `M ${x1} ${y1}
1983
+ L ${x4} ${y1}
1984
+ A ${radius} ${radius} 0 1 ${isMirror} ${x4} ${y4}`;
1985
+ }
1986
+ else {
1987
+ return `M ${x1} ${y1}
1988
+ A ${radius} ${radius} 0 1 ${isMirror} ${x1} ${y4}
1989
+ L ${x4} ${y4}`;
1990
+ }
1991
+ }
1992
+ generateFSAndSFPath(source, target, type) {
1993
+ let x1 = source.after.x;
1994
+ let y1 = source.after.y;
1995
+ let x4 = target.before.x;
1996
+ let y4 = target.before.y;
1997
+ if (type === GanttLinkType.sf) {
1998
+ x1 = target.after.x;
1999
+ y1 = target.after.y;
2000
+ x4 = source.before.x;
2001
+ y4 = source.before.y;
2002
+ }
2003
+ const dx = Math.abs(x4 - x1) * this.bezierWeight;
2004
+ const x2 = x1 - dx;
2005
+ const x3 = x4 + dx;
2006
+ const centerX = (x1 + x4) / 2;
2007
+ const centerY = (y1 + y4) / 2;
2008
+ let controlX = this.ganttUpper.styles.lineHeight / 2;
2009
+ const controlY = this.ganttUpper.styles.lineHeight / 2;
2010
+ if (x1 >= x4) {
2011
+ if (y4 > y1) {
2012
+ if (Math.abs(y4 - y1) <= this.ganttUpper.styles.lineHeight) {
2013
+ return `M ${x1} ${y1}
2014
+ C ${x1 + controlX} ${y1} ${x1 + controlX} ${y1 + controlX} ${x1} ${y1 + controlY}
2015
+ L ${x4} ${y4 - controlY}
2016
+ C ${x4 - controlY} ${y4 - controlY} ${x4 - controlX} ${y4} ${x4} ${y4}`;
2017
+ }
2018
+ else {
2019
+ controlX = this.ganttUpper.styles.lineHeight;
2020
+ return `M ${x1} ${y1}
2021
+ C ${x1 + controlX} ${y1} ${x1 + controlX} ${y1 + controlX} ${centerX} ${centerY}
2022
+ C ${x4 - controlX} ${y4 - controlX} ${x4 - controlX} ${y4} ${x4} ${y4}
2023
+ `;
2024
+ }
2025
+ }
2026
+ else {
2027
+ if (Math.abs(y4 - y1) <= this.ganttUpper.styles.lineHeight) {
2028
+ return `M ${x1} ${y1}
2029
+ C ${x1 + controlX} ${y1} ${x1 + controlX} ${y1 - controlX} ${x1} ${y1 - controlY}
2030
+ L ${x4} ${y4 + controlY}
2031
+ C ${x4 - controlY} ${y4 + controlY} ${x4 - controlX} ${y4} ${x4} ${y4}
2032
+ `;
2033
+ }
2034
+ else {
2035
+ controlX = this.ganttUpper.styles.lineHeight;
2036
+ return `M ${x1} ${y1}
2037
+ C ${x1 + controlX} ${y1} ${x1 + controlX} ${y1 - controlX} ${centerX} ${centerY}
2038
+ C ${x4 - controlX} ${y4 + controlX} ${x4 - controlX} ${y4} ${x4} ${y4}
2039
+ `;
2040
+ }
2041
+ }
2042
+ }
2043
+ else if (x4 - x1 < 100) {
2044
+ const radius = Math.abs(y4 - y1) / 4;
2045
+ let lindWidth = x4 - x1 - radius;
2046
+ lindWidth = Math.max(lindWidth, radius);
2047
+ return `M ${x1} ${y1}
2048
+ L ${x1 + lindWidth} ${y1}
2049
+ A ${radius} ${radius} 0 1 ${y4 > y1 ? 1 : 0} ${x1 + lindWidth} ${y4 > y1 ? y1 + 2 * radius : y1 - 2 * radius}
2050
+ L ${x4 - lindWidth} ${y4 > y1 ? y1 + 2 * radius : y1 - 2 * radius}
2051
+ A ${radius} ${radius} 0 1 ${y4 > y1 ? 0 : 1} ${x4 - lindWidth} ${y4}
2052
+ L ${x4} ${y4}
2053
+ `;
2054
+ }
2055
+ return `M ${x1} ${y1} C ${x2} ${y1} ${x3} ${y4} ${x4} ${y4}`;
2056
+ }
2057
+ };
2058
+ GanttLinkPathCurve = __decorate([
2059
+ __param(0, Inject(GANTT_UPPER_TOKEN))
2060
+ ], GanttLinkPathCurve);
2061
+
2062
+ class GanttLinkPathLine extends GanttLinkPath {
2063
+ constructor() {
2064
+ super();
2065
+ this.pathControl = 20;
2066
+ }
2067
+ generateSSPath(source, target) {
2068
+ const x1 = source.before.x;
2069
+ const y1 = source.before.y;
2070
+ const x4 = target.before.x;
2071
+ const y4 = target.before.y;
2072
+ const control = this.pathControl;
2073
+ const centerY = (y1 + y4) / 2;
2074
+ return `M ${x1} ${y1}
2075
+ L ${x4 > x1 ? x1 - control : x4 - control} ${y1}
2076
+ L ${x4 > x1 ? x1 - control : x4 - control} ${y4}
2077
+ L ${x4} ${y4}`;
2078
+ }
2079
+ generateFFPath(source, target) {
2080
+ const x1 = source.after.x;
2081
+ const y1 = source.after.y;
2082
+ const x4 = target.after.x;
2083
+ const y4 = target.after.y;
2084
+ const control = this.pathControl;
2085
+ return `M ${x1} ${y1}
2086
+ L ${x4 > x1 ? x4 + control : x1 + control} ${y1}
2087
+ L ${x4 > x1 ? x4 + control : x1 + control} ${y4}
2088
+ L ${x4} ${y4}`;
2089
+ }
2090
+ generateFSAndSFPath(source, target, type) {
2091
+ let x1 = source.after.x;
2092
+ let y1 = source.after.y;
2093
+ let x4 = target.before.x;
2094
+ let y4 = target.before.y;
2095
+ const control = this.pathControl;
2096
+ if (type === GanttLinkType.sf) {
2097
+ x1 = target.after.x;
2098
+ y1 = target.after.y;
2099
+ x4 = source.before.x;
2100
+ y4 = source.before.y;
2101
+ }
2102
+ if (x4 - x1 >= 40) {
2103
+ return `M ${x1} ${y1}
2104
+ L ${x1 + control} ${y1}
2105
+ L ${x1 + control} ${y4}
2106
+ L ${x4} ${y4}`;
2107
+ }
2108
+ else {
2109
+ return `M ${x1} ${y1}
2110
+ L ${x1 + control} ${y1}
2111
+ L ${x1 + control} ${y4 > y1 ? y1 + control : y1 - control}
2112
+ L ${x4 - control} ${y4 > y1 ? y1 + control : y1 - control}
2113
+ L ${x4 - control} ${y4}
2114
+ L ${x4} ${y4}`;
2115
+ }
2116
+ }
2117
+ }
2118
+
2119
+ function generatePathFactory(type, ganttUpper) {
2120
+ switch (type) {
2121
+ case GanttLinkPathType.curve:
2122
+ return new GanttLinkPathCurve(ganttUpper);
2123
+ case GanttLinkPathType.line:
2124
+ return new GanttLinkPathLine();
2125
+ default:
2126
+ throw new Error('gantt link path type invalid');
2127
+ }
2128
+ }
2129
+
1841
2130
  class GanttLinksComponent {
1842
2131
  constructor(ganttUpper, cdr, elementRef, ganttDragContainer) {
1843
2132
  this.ganttUpper = ganttUpper;
@@ -1848,20 +2137,23 @@ class GanttLinksComponent {
1848
2137
  this.items = [];
1849
2138
  this.lineClick = new EventEmitter();
1850
2139
  this.links = [];
2140
+ this.ganttLinkTypes = GanttLinkType;
2141
+ this.showArrow = false;
1851
2142
  this.linkItems = [];
1852
- this.bezierWeight = -0.5;
1853
2143
  this.firstChange = true;
1854
2144
  this.unsubscribe$ = new Subject();
1855
2145
  this.ganttLinksOverlay = true;
1856
2146
  }
1857
2147
  ngOnInit() {
2148
+ this.linkPath = generatePathFactory(this.ganttUpper.linkOptions.linkPathType, this.ganttUpper);
2149
+ this.showArrow = this.ganttUpper.linkOptions.showArrow;
1858
2150
  this.buildLinks();
1859
2151
  this.firstChange = false;
1860
2152
  this.ganttDragContainer.dragStarted.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
1861
2153
  this.elementRef.nativeElement.style.visibility = 'hidden';
1862
2154
  });
1863
2155
  merge(this.ganttUpper.viewChange, this.ganttUpper.expandChange, this.ganttUpper.view.start$, this.ganttUpper.dragEnded, this.ganttUpper.linkDragEnded)
1864
- .pipe(takeUntil(this.unsubscribe$), skip(1))
2156
+ .pipe(takeUntil(this.unsubscribe$), skip(1), debounceTime(0))
1865
2157
  .subscribe(() => {
1866
2158
  this.elementRef.nativeElement.style.visibility = 'visible';
1867
2159
  this.buildLinks();
@@ -1912,77 +2204,24 @@ class GanttLinksComponent {
1912
2204
  });
1913
2205
  }
1914
2206
  }
1915
- generatePath(source, target) {
1916
- if (source.before && source.after && target.before && target.after) {
1917
- const x1 = source.after.x;
1918
- const y1 = source.after.y;
1919
- const x4 = target.before.x;
1920
- const y4 = target.before.y;
1921
- const dx = Math.abs(x4 - x1) * this.bezierWeight;
1922
- const x2 = x1 - dx;
1923
- const x3 = x4 + dx;
1924
- const centerX = (x1 + x4) / 2;
1925
- const centerY = (y1 + y4) / 2;
1926
- let controlX = this.ganttUpper.styles.lineHeight / 2;
1927
- const controlY = this.ganttUpper.styles.lineHeight / 2;
1928
- if (x1 >= x4) {
1929
- if (y4 > y1) {
1930
- if (Math.abs(y4 - y1) <= this.ganttUpper.styles.lineHeight) {
1931
- return `M ${x1} ${y1}
1932
- C ${x1 + controlX} ${y1} ${x1 + controlX} ${y1 + controlX} ${x1} ${y1 + controlY}
1933
- L ${x1} ${y1 + controlY} ${centerX} ${centerY}
1934
-
1935
- M ${x4} ${y4}
1936
- C ${x4 - controlX} ${y4} ${x4 - controlX} ${y4 - controlX} ${x4} ${y4 - controlY}
1937
- L ${x4} ${y4 - controlY} ${centerX} ${centerY}`;
1938
- }
1939
- else {
1940
- controlX = this.ganttUpper.styles.lineHeight;
1941
- return `M ${x1} ${y1}
1942
- C ${x1 + controlX} ${y1} ${x1 + controlX} ${y1 + controlX} ${centerX} ${centerY}
1943
-
1944
-
1945
- M ${x4} ${y4}
1946
- C ${x4 - controlX} ${y4} ${x4 - controlX} ${y4 - controlX} ${centerX} ${centerY}`;
1947
- }
1948
- }
1949
- else {
1950
- if (Math.abs(y4 - y1) <= this.ganttUpper.styles.lineHeight) {
1951
- return `M ${x1} ${y1}
1952
- C ${x1 + controlX} ${y1} ${x1 + controlX} ${y1 - controlX} ${x1} ${y1 - controlY}
1953
- L ${x1} ${y1 - controlY} ${centerX} ${centerY}
1954
-
1955
- M ${x4} ${y4}
1956
- C ${x4 - controlX} ${y4} ${x4 - controlX} ${y4 + controlX} ${x4} ${y4 + controlY}
1957
- L ${x4} ${y4 + controlY} ${centerX} ${centerY}
1958
- `;
1959
- }
1960
- else {
1961
- controlX = this.ganttUpper.styles.lineHeight;
1962
- return `M ${x1} ${y1}
1963
- C ${x1 + controlX} ${y1} ${x1 + controlX} ${y1 - controlX} ${centerX} ${centerY}
1964
-
1965
- M ${x4} ${y4}
1966
- C ${x4 - controlX} ${y4} ${x4 - controlX} ${y4 + controlX} ${centerX} ${centerY}`;
1967
- }
1968
- }
1969
- }
1970
- return `M ${x1} ${y1} C ${x2} ${y1} ${x3} ${y4} ${x4} ${y4}`;
1971
- }
1972
- }
1973
2207
  buildLinks() {
1974
2208
  this.computeItemPosition();
1975
2209
  this.links = [];
1976
2210
  this.linkItems.forEach((source) => {
1977
2211
  if (source.origin.start || source.origin.end) {
1978
- source.links.forEach((linkId) => {
1979
- const target = this.linkItems.find((item) => item.id === linkId);
2212
+ source.links.forEach((link) => {
2213
+ const target = this.linkItems.find((item) => item.id === link.link);
1980
2214
  if (target && (target.origin.start || target.origin.end)) {
2215
+ let color = LinkColors.default;
2216
+ if (link.type === GanttLinkType.fs && source.end.getTime() > target.start.getTime()) {
2217
+ color = LinkColors.blocked;
2218
+ }
1981
2219
  this.links.push({
1982
- path: this.generatePath(source, target),
2220
+ path: this.linkPath.generatePath(source, target, link.type),
1983
2221
  source: source.origin,
1984
2222
  target: target.origin,
1985
- color: source.end.getTime() > target.start.getTime() ? LinkColors.blocked : LinkColors.default
2223
+ type: link.type,
2224
+ color: link.color || color
1986
2225
  });
1987
2226
  }
1988
2227
  });
@@ -2015,7 +2254,7 @@ class GanttLinksComponent {
2015
2254
  }
2016
2255
  }
2017
2256
  GanttLinksComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttLinksComponent, deps: [{ token: GANTT_UPPER_TOKEN }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: GanttDragContainer }], target: i0.ɵɵFactoryTarget.Component });
2018
- GanttLinksComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.2", type: GanttLinksComponent, selector: "gantt-links-overlay", inputs: { groups: "groups", items: "items" }, outputs: { lineClick: "lineClick" }, host: { properties: { "class.gantt-links-overlay": "this.ganttLinksOverlay" } }, usesOnChanges: true, ngImport: i0, template: "<svg [attr.width]=\"ganttUpper.view.width\" class=\"gantt-links-overlay-main\">\n <ng-container *ngFor=\"let link of links; let i = index; trackBy: trackBy\">\n <path [attr.d]=\"link.path\" fill=\"transparent\" stroke-width=\"2\" [attr.stroke]=\"link.color\" pointer-events=\"none\"></path>\n <g>\n <path\n class=\"link-line\"\n (click)=\"onLineClick($event, link)\"\n (mouseenter)=\"mouseEnterPath(link)\"\n (mouseleave)=\"mouseLeavePath(link)\"\n [attr.d]=\"link.path\"\n stroke=\"transparent\"\n stroke-width=\"9\"\n fill=\"none\"\n cursor=\"pointer\"\n ></path>\n </g>\n </ng-container>\n <line class=\"link-dragging-line\"></line>\n</svg>\n", directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2257
+ GanttLinksComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.2", type: GanttLinksComponent, selector: "gantt-links-overlay", inputs: { groups: "groups", items: "items" }, outputs: { lineClick: "lineClick" }, host: { properties: { "class.gantt-links-overlay": "this.ganttLinksOverlay" } }, usesOnChanges: true, ngImport: i0, template: "<svg [attr.width]=\"ganttUpper.view.width\" class=\"gantt-links-overlay-main\">\n <ng-container *ngFor=\"let link of links; let i = index; trackBy: trackBy\">\n <path\n [attr.d]=\"link.path\"\n fill=\"transparent\"\n stroke-width=\"2\"\n [attr.stroke]=\"link.color\"\n pointer-events=\"none\"\n [attr.style]=\"link.type === ganttLinkTypes.sf ? 'marker-start: url(#triangle' + i + ')' : 'marker-end: url(#triangle' + i + ')'\"\n ></path>\n <g>\n <path\n class=\"link-line\"\n (click)=\"onLineClick($event, link)\"\n (mouseenter)=\"mouseEnterPath(link)\"\n (mouseleave)=\"mouseLeavePath(link)\"\n [attr.d]=\"link.path\"\n stroke=\"transparent\"\n stroke-width=\"9\"\n fill=\"none\"\n cursor=\"pointer\"\n ></path>\n </g>\n <defs *ngIf=\"showArrow\">\n <marker\n *ngIf=\"link.type === ganttLinkTypes.sf; else markerEnd\"\n [id]=\"'triangle' + i\"\n markerUnits=\"strokeWidth\"\n markerWidth=\"5\"\n markerHeight=\"4\"\n refX=\"5\"\n refY=\"2\"\n orient=\"180\"\n >\n <path [attr.fill]=\"link.color\" [attr.stroke]=\"link.color\" d=\"M 0 0 L 5 2 L 0 4 z\" />\n </marker>\n\n <ng-template #markerEnd>\n <marker [id]=\"'triangle' + i\" markerUnits=\"strokeWidth\" markerWidth=\"5\" markerHeight=\"4\" refX=\"5\" refY=\"2\" orient=\"auto\">\n <path [attr.fill]=\"link.color\" [attr.stroke]=\"link.color\" d=\"M 0 0 L 5 2 L 0 4 z\" />\n </marker>\n </ng-template>\n </defs>\n </ng-container>\n <line class=\"link-dragging-line\"></line>\n</svg>\n", directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
2019
2258
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttLinksComponent, decorators: [{
2020
2259
  type: Component,
2021
2260
  args: [{
@@ -2173,19 +2412,22 @@ class GanttBarDrag {
2173
2412
  this.dragContainer.dragStarted.emit({ item: this.item.origin });
2174
2413
  });
2175
2414
  dragRef.moved.subscribe((event) => {
2176
- const x = this.item.refs.x + event.distance.x;
2177
- const days = differenceInCalendarDays(this.item.end.value, this.item.start.value);
2178
- const start = this.ganttUpper.view.getDateByXPoint(x);
2179
- const end = start.addDays(days);
2180
- this.openDragBackdrop(this.barElement, this.ganttUpper.view.getDateByXPoint(x), end);
2415
+ const currentX = this.item.refs.x + event.distance.x;
2416
+ const currentDate = this.ganttUpper.view.getDateByXPoint(currentX);
2417
+ const currentStartX = this.ganttUpper.view.getXPointByDate(currentDate);
2418
+ const dayWidth = this.ganttUpper.view.getDayOccupancyWidth(currentDate);
2419
+ const diffDays = differenceInCalendarDays(this.item.end.value, this.item.start.value);
2420
+ let start = currentDate;
2421
+ let end = currentDate.addDays(diffDays);
2422
+ if (currentX > currentStartX + dayWidth / 2) {
2423
+ start = start.addDays(1);
2424
+ end = end.addDays(1);
2425
+ }
2426
+ this.openDragBackdrop(this.barElement, start, end);
2181
2427
  this.item.updateDate(start, end);
2182
2428
  this.dragContainer.dragMoved.emit({ item: this.item.origin });
2183
2429
  });
2184
2430
  dragRef.ended.subscribe((event) => {
2185
- const days = differenceInCalendarDays(this.item.end.value, this.item.start.value);
2186
- const start = this.ganttUpper.view.getDateByXPoint(this.item.refs.x + event.distance.x);
2187
- const end = start.addDays(days);
2188
- this.item.updateDate(start, end);
2189
2431
  this.clearDraggingStyles();
2190
2432
  this.closeDragBackdrop();
2191
2433
  event.source.reset();
@@ -2477,7 +2719,7 @@ class GanttMainComponent {
2477
2719
  }
2478
2720
  }
2479
2721
  GanttMainComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttMainComponent, deps: [{ token: GANTT_UPPER_TOKEN }], target: i0.ɵɵFactoryTarget.Component });
2480
- GanttMainComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.2", type: GanttMainComponent, selector: "gantt-main", inputs: { groups: "groups", items: "items", groupHeaderTemplate: "groupHeaderTemplate", itemTemplate: "itemTemplate", barTemplate: "barTemplate", rangeTemplate: "rangeTemplate" }, outputs: { barClick: "barClick", lineClick: "lineClick" }, host: { properties: { "class.gantt-main-container": "this.ganttMainClass" } }, ngImport: i0, template: "<gantt-links-overlay [groups]=\"groups\" [items]=\"items\" (lineClick)=\"lineClick.emit($event)\"></gantt-links-overlay>\n<!-- groups -->\n<div class=\"gantt-main-groups\" *ngIf=\"groups && groups.length > 0; else itemsTemplate\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-container *ngFor=\"let group of groups; trackBy: trackBy\">\n <div class=\"gantt-group\" [ngClass]=\"group.class\">\n <ng-template [ngTemplateOutlet]=\"groupHeaderTemplate\" [ngTemplateOutletContext]=\"{ group: group }\"></ng-template>\n </div>\n <div *ngIf=\"group.expanded\" class=\"gantt-items\">\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: group.items }\"></ng-template>\n </div>\n </ng-container>\n</div>\n<!-- items -->\n<ng-template #itemsTemplate>\n <div class=\"gantt-main-items\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: items }\"></ng-template>\n </div>\n</ng-template>\n\n<ng-template #ganttItems let-items=\"items\">\n <ng-container *ngFor=\"let item of items; trackBy: trackBy\">\n <div class=\"gantt-item\" [style.height.px]=\"ganttUpper.styles.lineHeight\">\n <ng-container *ngIf=\"item.type | isGanttCustomItem\">\n <ng-template [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{ item: item.origin, refs: item.refs }\"></ng-template>\n </ng-container>\n <gantt-range *ngIf=\"item.type | isGanttRangeItem\" [template]=\"rangeTemplate\" [item]=\"item\"></gantt-range>\n <gantt-bar *ngIf=\"item.type | isGanttBarItem\" [item]=\"item\" [template]=\"barTemplate\" (barClick)=\"barClick.emit($event)\"></gantt-bar>\n </div>\n <ng-template\n *ngIf=\"item.children && item.expanded\"\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ items: item.children }\"\n ></ng-template>\n </ng-container>\n</ng-template>\n", components: [{ type: GanttLinksComponent, selector: "gantt-links-overlay", inputs: ["groups", "items"], outputs: ["lineClick"] }, { type: NgxGanttRangeComponent, selector: "ngx-gantt-range,gantt-range" }, { type: NgxGanttBarComponent, selector: "ngx-gantt-bar,gantt-bar", outputs: ["barClick"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "isGanttCustomItem": IsGanttCustomItemPipe, "isGanttRangeItem": IsGanttRangeItemPipe, "isGanttBarItem": IsGanttBarItemPipe } });
2722
+ GanttMainComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.2", type: GanttMainComponent, selector: "gantt-main", inputs: { groups: "groups", items: "items", groupHeaderTemplate: "groupHeaderTemplate", itemTemplate: "itemTemplate", barTemplate: "barTemplate", rangeTemplate: "rangeTemplate" }, outputs: { barClick: "barClick", lineClick: "lineClick" }, host: { properties: { "class.gantt-main-container": "this.ganttMainClass" } }, ngImport: i0, template: "<gantt-links-overlay [groups]=\"groups\" [items]=\"items\" (lineClick)=\"lineClick.emit($event)\"></gantt-links-overlay>\n<!-- groups -->\n<div class=\"gantt-main-groups\" *ngIf=\"groups && groups.length > 0; else itemsTemplate\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-container *ngFor=\"let group of groups; trackBy: trackBy\">\n <div class=\"gantt-group\" [ngClass]=\"group.class\">\n <ng-template [ngTemplateOutlet]=\"groupHeaderTemplate\" [ngTemplateOutletContext]=\"{ group: group }\"></ng-template>\n </div>\n <div *ngIf=\"group.expanded\" class=\"gantt-items\">\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: group.items }\"></ng-template>\n </div>\n </ng-container>\n</div>\n<!-- items -->\n<ng-template #itemsTemplate>\n <div class=\"gantt-main-items\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: items }\"></ng-template>\n </div>\n</ng-template>\n\n<ng-template #ganttItems let-items=\"items\">\n <ng-container *ngFor=\"let item of items;\">\n <div\n class=\"gantt-item\"\n [style.height.px]=\"ganttUpper.styles.lineHeight\"\n [class.gantt-main-item-active]=\"ganttUpper.isSelected(item.id)\"\n >\n <ng-container *ngIf=\"item.type | isGanttCustomItem\">\n <ng-template [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{ item: item.origin, refs: item.refs }\"></ng-template>\n </ng-container>\n <gantt-range *ngIf=\"item.type | isGanttRangeItem\" [template]=\"rangeTemplate\" [item]=\"item\"></gantt-range>\n <gantt-bar *ngIf=\"item.type | isGanttBarItem\" [item]=\"item\" [template]=\"barTemplate\" (barClick)=\"barClick.emit($event)\"></gantt-bar>\n </div>\n <ng-template\n *ngIf=\"item.children && item.expanded\"\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ items: item.children }\"\n ></ng-template>\n </ng-container>\n</ng-template>\n", components: [{ type: GanttLinksComponent, selector: "gantt-links-overlay", inputs: ["groups", "items"], outputs: ["lineClick"] }, { type: NgxGanttRangeComponent, selector: "ngx-gantt-range,gantt-range" }, { type: NgxGanttBarComponent, selector: "ngx-gantt-bar,gantt-bar", outputs: ["barClick"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "isGanttCustomItem": IsGanttCustomItemPipe, "isGanttRangeItem": IsGanttRangeItemPipe, "isGanttBarItem": IsGanttBarItemPipe } });
2481
2723
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: GanttMainComponent, decorators: [{
2482
2724
  type: Component,
2483
2725
  args: [{
@@ -2515,11 +2757,14 @@ class NgxGanttComponent extends GanttUpper {
2515
2757
  this.linkDragStarted = new EventEmitter();
2516
2758
  this.linkDragEnded = new EventEmitter();
2517
2759
  this.lineClick = new EventEmitter();
2760
+ this.selectedChange = new EventEmitter();
2518
2761
  this.ngUnsubscribe$ = new Subject();
2519
2762
  this.sideTableWidth = sideWidth;
2520
2763
  }
2521
2764
  ngOnInit() {
2765
+ var _a;
2522
2766
  super.onInit();
2767
+ this.linkOptions = Object.assign({}, defaultConfig.linkOptions, (_a = this.config) === null || _a === void 0 ? void 0 : _a.linkOptions, this.linkOptions);
2523
2768
  this.ngZone.onStable.pipe(take(1)).subscribe(() => {
2524
2769
  this.dragContainer.linkDragStarted.pipe(takeUntil(this.ngUnsubscribe$)).subscribe((event) => {
2525
2770
  this.linkDragStarted.emit(event);
@@ -2568,12 +2813,29 @@ class NgxGanttComponent extends GanttUpper {
2568
2813
  this.expandChange.emit();
2569
2814
  }
2570
2815
  }
2816
+ selectItem(selectEvent) {
2817
+ var _a;
2818
+ if (!this.selectable) {
2819
+ return;
2820
+ }
2821
+ const { event, selectedValue } = selectEvent;
2822
+ this.selectionModel.toggle(selectedValue.id);
2823
+ const selectedIds = this.selectionModel.selected;
2824
+ if (this.multiple) {
2825
+ const selectedValue = this.getGanttItems(selectedIds).map((item) => item.origin);
2826
+ this.selectedChange.emit({ event, selectedValue });
2827
+ }
2828
+ else {
2829
+ const selectedValue = (_a = this.getGanttItem(selectedIds[0])) === null || _a === void 0 ? void 0 : _a.origin;
2830
+ this.selectedChange.emit({ event, selectedValue });
2831
+ }
2832
+ }
2571
2833
  ngOnDestroy() {
2572
2834
  super.onDestroy();
2573
2835
  }
2574
2836
  }
2575
2837
  NgxGanttComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: NgxGanttComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: GANTT_GLOBAL_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
2576
- NgxGanttComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.2", type: NgxGanttComponent, selector: "ngx-gantt", inputs: { maxLevel: "maxLevel", async: "async", childrenResolve: "childrenResolve", linkable: "linkable" }, outputs: { linkDragStarted: "linkDragStarted", linkDragEnded: "linkDragEnded", lineClick: "lineClick" }, providers: [
2838
+ NgxGanttComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.2", type: NgxGanttComponent, selector: "ngx-gantt", inputs: { maxLevel: "maxLevel", async: "async", childrenResolve: "childrenResolve", linkable: "linkable", linkOptions: "linkOptions" }, outputs: { linkDragStarted: "linkDragStarted", linkDragEnded: "linkDragEnded", lineClick: "lineClick", selectedChange: "selectedChange" }, providers: [
2577
2839
  {
2578
2840
  provide: GANTT_UPPER_TOKEN,
2579
2841
  useExisting: NgxGanttComponent
@@ -2582,7 +2844,7 @@ NgxGanttComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
2582
2844
  provide: GANTT_ABSTRACT_TOKEN,
2583
2845
  useExisting: forwardRef(() => NgxGanttComponent)
2584
2846
  }
2585
- ], 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 }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ngx-gantt-root>\n <ng-template #sideTemplate>\n <gantt-table\n [groups]=\"groups\"\n [items]=\"items\"\n [columns]=\"columns\"\n [groupTemplate]=\"groupTemplate\"\n [emptyTemplate]=\"tableEmptyTemplate\"\n [rowBeforeTemplate]=\"table?.rowBeforeTemplate\"\n [rowAfterTemplate]=\"table?.rowAfterTemplate\"\n ></gantt-table>\n </ng-template>\n <ng-template #mainTemplate>\n <gantt-main\n [groups]=\"groups\"\n [items]=\"items\"\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 </ng-template>\n</ngx-gantt-root>\n", components: [{ type: NgxGanttRootComponent, selector: "ngx-gantt-root", inputs: ["sideWidth"] }, { type: GanttTableComponent, selector: "gantt-table", inputs: ["groups", "items", "columns", "groupTemplate", "emptyTemplate", "rowBeforeTemplate", "rowAfterTemplate"] }, { type: GanttMainComponent, selector: "gantt-main", inputs: ["groups", "items", "groupHeaderTemplate", "itemTemplate", "barTemplate", "rangeTemplate"], outputs: ["barClick", "lineClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2847
+ ], 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 }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ngx-gantt-root>\n <ng-template #sideTemplate>\n <gantt-table\n [groups]=\"groups\"\n [items]=\"items\"\n [columns]=\"columns\"\n [groupTemplate]=\"groupTemplate\"\n [emptyTemplate]=\"tableEmptyTemplate\"\n [rowBeforeTemplate]=\"table?.rowBeforeTemplate\"\n [rowAfterTemplate]=\"table?.rowAfterTemplate\"\n (itemClick)=\"selectItem($event)\"\n ></gantt-table>\n </ng-template>\n <ng-template #mainTemplate>\n <gantt-main\n [groups]=\"groups\"\n [items]=\"items\"\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 </ng-template>\n</ngx-gantt-root>\n", components: [{ type: NgxGanttRootComponent, selector: "ngx-gantt-root", inputs: ["sideWidth"] }, { type: GanttTableComponent, selector: "gantt-table", inputs: ["groups", "items", "columns", "groupTemplate", "emptyTemplate", "rowBeforeTemplate", "rowAfterTemplate"], outputs: ["itemClick"] }, { type: GanttMainComponent, selector: "gantt-main", inputs: ["groups", "items", "groupHeaderTemplate", "itemTemplate", "barTemplate", "rangeTemplate"], outputs: ["barClick", "lineClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2586
2848
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: NgxGanttComponent, decorators: [{
2587
2849
  type: Component,
2588
2850
  args: [{
@@ -2611,12 +2873,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImpor
2611
2873
  type: Input
2612
2874
  }], linkable: [{
2613
2875
  type: Input
2876
+ }], linkOptions: [{
2877
+ type: Input
2614
2878
  }], linkDragStarted: [{
2615
2879
  type: Output
2616
2880
  }], linkDragEnded: [{
2617
2881
  type: Output
2618
2882
  }], lineClick: [{
2619
2883
  type: Output
2884
+ }], selectedChange: [{
2885
+ type: Output
2620
2886
  }], table: [{
2621
2887
  type: ContentChild,
2622
2888
  args: [NgxGanttTableComponent]
@@ -2703,5 +2969,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImpor
2703
2969
  * Generated bundle index. Do not edit.
2704
2970
  */
2705
2971
 
2706
- export { GANTT_GLOBAL_CONFIG, GANTT_UPPER_TOKEN, GanttBarClickEvent, GanttDate, GanttDatePoint, GanttDragEvent, GanttGroupInternal, GanttItemInternal, GanttItemType, GanttItemUpper, GanttLineClickEvent, GanttLinkDragEvent, GanttLoadOnScrollEvent, GanttPrintService, GanttTableEvent, GanttUpper, GanttView, GanttViewType, IsGanttBarItemPipe, IsGanttCustomItemPipe, IsGanttRangeItemPipe, NgxGanttBarComponent, NgxGanttComponent, NgxGanttModule, NgxGanttRangeComponent, NgxGanttRootComponent, NgxGanttTableColumnComponent, NgxGanttTableComponent, defaultConfig, primaryDatePointTop, secondaryDatePointTop };
2972
+ export { GANTT_GLOBAL_CONFIG, GANTT_UPPER_TOKEN, GanttBarClickEvent, GanttDate, GanttDatePoint, GanttDragEvent, GanttGroupInternal, GanttItemInternal, GanttItemType, GanttItemUpper, GanttLineClickEvent, GanttLinkDragEvent, GanttLoadOnScrollEvent, GanttPrintService, GanttSelectedEvent, GanttTableEvent, GanttUpper, GanttView, GanttViewType, IsGanttBarItemPipe, IsGanttCustomItemPipe, IsGanttRangeItemPipe, NgxGanttBarComponent, NgxGanttComponent, NgxGanttModule, NgxGanttRangeComponent, NgxGanttRootComponent, NgxGanttTableColumnComponent, NgxGanttTableComponent, defaultConfig, primaryDatePointTop, secondaryDatePointTop };
2707
2973
  //# sourceMappingURL=worktile-gantt.js.map