@fatcore/gantt-lite 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +9 -12
  2. package/fatcore-gantt-lite-1.0.0.tgz +0 -0
  3. package/fatcore-gantt-lite-1.0.2.tgz +0 -0
  4. package/{dist19/gantt-lite/fesm2022/gantt-lite.mjs → fesm2022/fatcore-gantt-lite.mjs} +13 -13
  5. package/fesm2022/fatcore-gantt-lite.mjs.map +1 -0
  6. package/{dist20/gantt-lite/fesm2022 → fesm2022}/gantt-lite.mjs +1 -1
  7. package/fesm2022/gantt-lite.mjs.map +1 -0
  8. package/gantt-lite-1.0.2.tgz +0 -0
  9. package/{dist20/gantt-lite/index.d.ts → index.d.ts} +22 -1
  10. package/package.json +16 -40
  11. package/.editorconfig +0 -16
  12. package/.vscode/extensions.json +0 -4
  13. package/.vscode/launch.json +0 -20
  14. package/.vscode/tasks.json +0 -42
  15. package/angular.json +0 -165
  16. package/dist17/gantt-lite/README.md +0 -24
  17. package/dist17/gantt-lite/esm2022/gantt-lite.mjs +0 -5
  18. package/dist17/gantt-lite/esm2022/gantt-lite.module.mjs +0 -18
  19. package/dist17/gantt-lite/esm2022/lib/gantt-lite-base.mjs +0 -290
  20. package/dist17/gantt-lite/esm2022/lib/gantt-lite.component.mjs +0 -359
  21. package/dist17/gantt-lite/esm2022/lib/gantt-lite.helper.mjs +0 -107
  22. package/dist17/gantt-lite/esm2022/lib/gantt-lite.model.mjs +0 -2
  23. package/dist17/gantt-lite/esm2022/public-api.mjs +0 -3
  24. package/dist17/gantt-lite/fesm2022/gantt-lite.mjs +0 -774
  25. package/dist17/gantt-lite/fesm2022/gantt-lite.mjs.map +0 -1
  26. package/dist17/gantt-lite/gantt-lite.module.d.ts +0 -8
  27. package/dist17/gantt-lite/index.d.ts +0 -5
  28. package/dist17/gantt-lite/lib/gantt-lite-base.d.ts +0 -50
  29. package/dist17/gantt-lite/lib/gantt-lite.component.d.ts +0 -55
  30. package/dist17/gantt-lite/lib/gantt-lite.helper.d.ts +0 -20
  31. package/dist17/gantt-lite/lib/gantt-lite.model.d.ts +0 -47
  32. package/dist17/gantt-lite/public-api.d.ts +0 -2
  33. package/dist18/gantt-lite/README.md +0 -24
  34. package/dist18/gantt-lite/esm2022/gantt-lite.mjs +0 -5
  35. package/dist18/gantt-lite/esm2022/gantt-lite.module.mjs +0 -18
  36. package/dist18/gantt-lite/esm2022/lib/gantt-lite-base.mjs +0 -290
  37. package/dist18/gantt-lite/esm2022/lib/gantt-lite.component.mjs +0 -359
  38. package/dist18/gantt-lite/esm2022/lib/gantt-lite.helper.mjs +0 -107
  39. package/dist18/gantt-lite/esm2022/lib/gantt-lite.model.mjs +0 -2
  40. package/dist18/gantt-lite/esm2022/public-api.mjs +0 -3
  41. package/dist18/gantt-lite/fesm2022/gantt-lite.mjs +0 -774
  42. package/dist18/gantt-lite/fesm2022/gantt-lite.mjs.map +0 -1
  43. package/dist18/gantt-lite/gantt-lite.module.d.ts +0 -8
  44. package/dist18/gantt-lite/index.d.ts +0 -5
  45. package/dist18/gantt-lite/lib/gantt-lite-base.d.ts +0 -50
  46. package/dist18/gantt-lite/lib/gantt-lite.component.d.ts +0 -55
  47. package/dist18/gantt-lite/lib/gantt-lite.helper.d.ts +0 -20
  48. package/dist18/gantt-lite/lib/gantt-lite.model.d.ts +0 -47
  49. package/dist18/gantt-lite/public-api.d.ts +0 -2
  50. package/dist19/gantt-lite/README.md +0 -24
  51. package/dist19/gantt-lite/fesm2022/gantt-lite.mjs.map +0 -1
  52. package/dist19/gantt-lite/gantt-lite.module.d.ts +0 -8
  53. package/dist19/gantt-lite/index.d.ts +0 -5
  54. package/dist19/gantt-lite/lib/gantt-lite-base.d.ts +0 -50
  55. package/dist19/gantt-lite/lib/gantt-lite.component.d.ts +0 -55
  56. package/dist19/gantt-lite/lib/gantt-lite.helper.d.ts +0 -20
  57. package/dist19/gantt-lite/lib/gantt-lite.model.d.ts +0 -47
  58. package/dist19/gantt-lite/public-api.d.ts +0 -2
  59. package/dist20/gantt-lite/README.md +0 -24
  60. package/dist20/gantt-lite/fesm2022/gantt-lite.mjs.map +0 -1
  61. package/my-workspace-0.0.0.tgz +0 -0
  62. package/projects/gantt-lite/README.md +0 -24
  63. package/projects/gantt-lite/ng-package.json +0 -7
  64. package/projects/gantt-lite/package.json +0 -10
  65. package/projects/gantt-lite/src/gantt-lite.module.ts +0 -10
  66. package/projects/gantt-lite/src/lib/gantt-lite-base.ts +0 -300
  67. package/projects/gantt-lite/src/lib/gantt-lite.component.html +0 -128
  68. package/projects/gantt-lite/src/lib/gantt-lite.component.scss +0 -323
  69. package/projects/gantt-lite/src/lib/gantt-lite.component.ts +0 -391
  70. package/projects/gantt-lite/src/lib/gantt-lite.helper.ts +0 -124
  71. package/projects/gantt-lite/src/lib/gantt-lite.model.ts +0 -56
  72. package/projects/gantt-lite/src/public-api.ts +0 -5
  73. package/projects/gantt-lite/tsconfig.lib.json +0 -14
  74. package/projects/gantt-lite/tsconfig.lib.prod.json +0 -10
  75. package/projects/gantt-lite/tsconfig.spec.json +0 -14
  76. package/projects/my-app/server.ts +0 -56
  77. package/projects/my-app/src/app/app.component.html +0 -336
  78. package/projects/my-app/src/app/app.component.scss +0 -0
  79. package/projects/my-app/src/app/app.component.spec.ts +0 -29
  80. package/projects/my-app/src/app/app.component.ts +0 -13
  81. package/projects/my-app/src/app/app.config.server.ts +0 -11
  82. package/projects/my-app/src/app/app.config.ts +0 -9
  83. package/projects/my-app/src/app/app.routes.ts +0 -3
  84. package/projects/my-app/src/assets/.gitkeep +0 -0
  85. package/projects/my-app/src/favicon.ico +0 -0
  86. package/projects/my-app/src/index.html +0 -13
  87. package/projects/my-app/src/main.server.ts +0 -7
  88. package/projects/my-app/src/main.ts +0 -6
  89. package/projects/my-app/src/styles.scss +0 -1
  90. package/projects/my-app/tsconfig.app.json +0 -18
  91. package/projects/my-app/tsconfig.spec.json +0 -14
  92. package/tsconfig.json +0 -37
package/README.md CHANGED
@@ -1,26 +1,23 @@
1
- # MyWorkspace
1
+ # GanttLite
2
2
 
3
- This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.3.
4
-
5
- ## Development server
6
-
7
- Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.0.
8
4
 
9
5
  ## Code scaffolding
10
6
 
11
- Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
7
+ Run `ng generate component component-name --project gantt-lite` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project gantt-lite`.
8
+ > Note: Don't forget to add `--project gantt-lite` or else it will be added to the default project in your `angular.json` file.
12
9
 
13
10
  ## Build
14
11
 
15
- Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
12
+ Run `ng build gantt-lite` to build the project. The build artifacts will be stored in the `dist/` directory.
16
13
 
17
- ## Running unit tests
14
+ ## Publishing
18
15
 
19
- Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
16
+ After building your library with `ng build gantt-lite`, go to the dist folder `cd dist/gantt-lite` and run `npm publish`.
20
17
 
21
- ## Running end-to-end tests
18
+ ## Running unit tests
22
19
 
23
- Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
20
+ Run `ng test gantt-lite` to execute the unit tests via [Karma](https://karma-runner.github.io).
24
21
 
25
22
  ## Further help
26
23
 
Binary file
Binary file
@@ -381,10 +381,10 @@ class GanttLiteBase {
381
381
  return d;
382
382
  }
383
383
  }
384
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: GanttLiteBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
385
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.22", type: GanttLiteBase, isStandalone: true, inputs: { rowHeight: "rowHeight", defaultScale: "defaultScale", dataType: "dataType", dateMode: "dateMode", extraColumns: "extraColumns" }, ngImport: i0 }); }
384
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.21", ngImport: i0, type: GanttLiteBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
385
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.21", type: GanttLiteBase, isStandalone: true, inputs: { rowHeight: "rowHeight", defaultScale: "defaultScale", dataType: "dataType", dateMode: "dateMode", extraColumns: "extraColumns" }, ngImport: i0 }); }
386
386
  }
387
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: GanttLiteBase, decorators: [{
387
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.21", ngImport: i0, type: GanttLiteBase, decorators: [{
388
388
  type: Directive
389
389
  }], ctorParameters: () => [], propDecorators: { rowHeight: [{
390
390
  type: Input
@@ -721,12 +721,12 @@ class GanttLiteComponent extends GanttLiteBase {
721
721
  }
722
722
  return this.labelConverter?.getLabelDuration(index, this.defaultScale) ?? 'Error';
723
723
  }
724
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: GanttLiteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
725
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.22", type: GanttLiteComponent, isStandalone: false, selector: "gantt-lite", inputs: { rawTasks: "rawTasks" }, viewQueries: [{ propertyName: "ganttBodyScroll", first: true, predicate: ["ganttBodyScroll"], descendants: true }, { propertyName: "ganttContent", first: true, predicate: ["ganttContent"], descendants: true }, { propertyName: "ganttScroll", first: true, predicate: ["ganttScroll"], descendants: true }, { propertyName: "leftPanel", first: true, predicate: ["leftPanel"], descendants: true }, { propertyName: "timelineHeader", first: true, predicate: ["timelineHeader"], descendants: true }, { propertyName: "leftBtn", first: true, predicate: ["leftBtn"], descendants: true }, { propertyName: "rightBtn", first: true, predicate: ["rightBtn"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"gantt-root\" [style.max-height.px]=\"layout.rootMaxHeight\" [style.min-height.px]=\"100\">\n <!-- TOOLBAR -->\n <div class=\"toolbar\" [style.height.px]=\"buttonsHeight\">\n <div *ngIf=\"dateMode === 'utc' || dataType === 'duration'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scales\" (click)=\"setScale(s)\" [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <div *ngIf=\"dateMode !== 'utc' && dataType === 'calendar'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scalesDate\" (click)=\"setScale(s)\"\n [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <label *ngIf=\"maxSlotsAlert\" style=\"color: red;\">\n Data is too massive to show Gantt smoothly, try changing the scale\n </label>\n </div>\n <!-- TOOLTIP -->\n <div class=\"global-tooltip\" [style.display]=\"tooltipTask ? 'block' : 'none'\">\n <ng-container *ngIf=\"tooltipTask as task\">\n <div *ngFor=\"let column of visibleTooltipColumns\">\n <strong>{{ column?.title }}:</strong>\n {{ column?.valueGetter(task) }}\n </div>\n </ng-container>\n </div>\n <!-- BUTTONS FOR SCROLL GANTT -->\n <div *ngIf=\"!maxSlotsAlert && loading === false\" class=\"floating-nav\">\n <button class=\"nav-btn left\" (mousedown)=\"startScroll('left')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #leftBtn >\n \u2039\n </button>\n <button class=\"nav-btn right\" (mousedown)=\"startScroll('right')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #rightBtn>\n \u203A\n </button>\n </div>\n <!-- LOADING -->\n <div class=\"loading-overlay\" *ngIf=\"loading\" [style.top]=\"'50%'\">\n <div class=\"spinner\"></div>\n </div>\n <!-- SINGLE VERTICAL SCROLL -->\n <div class=\"gantt-body\" #ganttBodyScroll>\n <!-- LEFT PANEL -->\n <div class=\"left-panel\" #leftPanel>\n <div class=\"task-row header\" [style.height.px]=\"headerHeight\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.title }}\n </div>\n </div>\n <div class=\"task-row\" *ngFor=\"let task of tasks\" [style.height.px]=\"rowHeight\"\n (click)=\"selectTask(task, true); $event.stopPropagation()\"\n [class.highlighted-row]=\"selectedTaskId === task.id\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.valueGetter(task) }}\n </div>\n </div>\n </div>\n <!-- RESIZER -->\n <div class=\"resizer\" [style.height.px]=\"layout.resizerHeight\" (mousedown)=\"startResize($event)\">\n </div>\n <!-- RIGHT PANEL -->\n <div class=\"right-panel\" *ngIf=\"!maxSlotsAlert\">\n <!-- TIMELINE -->\n <div class=\"timeline-header\" #timelineHeader>\n <div class=\"timeline-slot\" *ngFor=\"let slot of slots\" [style.width.px]=\"slot.width\">\n {{ slot.label }}\n </div>\n </div>\n <!-- HORIZONTAL SCROLL ONLY -->\n <div class=\"horizontal-scroll\" (scroll)=\"onHorizontalScroll($event)\" #ganttScroll>\n <div class=\"gantt-content\" #ganttContent>\n <!-- GRID -->\n <div class=\"grid-layer\">\n <div *ngFor=\"let slot of slots; let i = index; trackBy: trackByIndex\" class=\"grid-line\"\n [style.left.px]=\"slot.x - 1\">\n </div>\n <!-- final vertical line -->\n <div class=\"grid-line\" [style.left.px]=\"ganttWidth - 1\">\n </div>\n <!-- horizontal lines -->\n <div class=\"horizontal-grid-layer\">\n <div *ngFor=\"let task of tasks; let i = index; trackBy: trackByIndex\"\n class=\"horizontal-line\" [style.top.px]=\"getGridTop(i)\">\n </div>\n <!-- final horizontal line -->\n <div class=\"horizontal-line\" [style.top.px]=\"ganttHeight\">\n </div>\n </div>\n </div>\n <!-- TASKS -->\n <div class=\"tasks-layer\">\n <div *ngFor=\"let task of viewTasks; let i = index; trackBy: trackByIndex\" class=\"task\"\n (mouseenter)=\"showTooltip($event, task)\" (mouseleave)=\"hideTooltip()\"\n (click)=\"selectTask(task, false); $event.stopPropagation()\"\n [class.highlighted-task]=\"selectedTaskId === task.id\" [style.left.px]=\"task.x\"\n [style.top.px]=\"task.y\" [style.width.px]=\"task.width\" [style.height.px]=\"task.height\">\n <div class=\"task-label\">\n {{ task.label }}\n </div>\n </div>\n </div>\n <!-- DEPENDENCIES -->\n <svg class=\"dependencies-svg\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\"\n orient=\"auto\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#868d97\" />\n </marker>\n </defs>\n <g class=\"dependencies-normal\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"dependency\"\n [class.hidden]=\"hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n <g class=\"dependencies-highlighted\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"highlighted-dependency\"\n [class.hidden]=\"!hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n <div class=\"right-panel-dead\" *ngIf=\"maxSlotsAlert\"></div>\n </div>\n</div>", styles: [":host{display:block;width:100%;height:100%}.gantt-root{height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden}.gantt-body{flex:1;display:flex;overflow-y:auto;overflow-x:hidden;border-width:1px;border-style:solid;border-color:#aaac}.toolbar{flex-shrink:0;display:flex;gap:8px;background:#fff;position:sticky;top:0;z-index:50}.toolbar button.active{font-weight:700}.loading-overlay{position:sticky;inset:0;display:flex;align-items:center;justify-content:center;z-index:1000}.global-tooltip{position:fixed;background:#585858e6;color:#fff;padding:8px;border-radius:6px;font-size:12px;z-index:1000;pointer-events:none}.left-panel{flex-shrink:0;background:#fff;border-right:1px solid #dcdcdc}.task-row{display:grid;grid-auto-flow:column;grid-auto-columns:120px;gap:0 10px;font-size:small;align-items:center;border-bottom:1px solid #eee;white-space:nowrap;overflow:hidden}.cell{padding:0 8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.task-row.header{font-size:small;font-weight:600;position:sticky;top:0;background:#fff!important;z-index:1}.task-row:hover{background:#ff00001a}.highlighted-row{background:#ff00004d!important}.resizer{min-width:7px;cursor:col-resize;background:#b4b4b4}.resizer:hover{background:#696969}.right-panel{flex:1;min-width:100px!important;position:relative}.right-panel-dead{flex:1;height:10000px;min-width:100px!important;position:relative;background-color:#696969}.horizontal-scroll{overflow-x:hidden;overflow-y:hidden;position:relative}.gantt-content{position:relative}.timeline-header{display:flex;position:sticky;top:0;overflow:hidden;white-space:nowrap;z-index:20;background:#fff;border-bottom:1px solid #ccc}.timeline-slot{flex:0 0 auto;border-right:1px solid #e0e0e0;padding:8px;box-sizing:border-box;text-align:center;font-size:12px}.highlighted-task{background:#f006!important;border-color:#b71c1c!important;z-index:10}.grid-layer{position:absolute;inset:0;pointer-events:none}.grid-line{position:absolute;top:0;bottom:0;width:1px;background:#c8c8c859}.horizontal-grid-layer{position:absolute;inset:0;pointer-events:none}.horizontal-line{position:absolute;left:0;right:0;height:1px;background:#c8c8c840}.dependencies-svg{overflow:visible}.dependencies-normal,.dependencies-highlighted{pointer-events:none}.dependency{stroke:#9ba2ad;stroke-width:1.6;fill:none;opacity:.35}.highlighted-dependency{stroke:#52555a;stroke-width:2.7;fill:none;opacity:1}.dependencies-svg.hovering .dependency{opacity:.035}.tasks-layer{position:relative;z-index:2}.task{position:absolute;background:#9b94f7bf;opacity:.85;color:#505050;padding-top:4px;border-radius:4px;font-size:11px;white-space:nowrap;min-width:2px}.task:hover{background:#ff000026}.spinner{width:40px;height:40px;border:4px solid #ddd;border-top-color:#3f51b5;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}*{box-sizing:border-box}.floating-nav{position:sticky;top:50%;transform:translateY(-50%);z-index:100;pointer-events:none}.nav-btn{position:absolute;width:45px;height:45px;display:flex;align-items:center;justify-content:center;pointer-events:auto;background:#5c9af866;border:none;color:#535353;font-size:26px;cursor:pointer;backdrop-filter:blur(1px);border-radius:2px;line-height:1;text-align:center}.nav-btn:hover{background:#5c9af8b3}.nav-btn.left{margin-left:13px}.nav-btn.right{right:23px}.task-label{padding-left:6px}.hidden{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
724
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.21", ngImport: i0, type: GanttLiteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
725
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.21", type: GanttLiteComponent, isStandalone: false, selector: "gantt-lite", inputs: { rawTasks: "rawTasks" }, viewQueries: [{ propertyName: "ganttBodyScroll", first: true, predicate: ["ganttBodyScroll"], descendants: true }, { propertyName: "ganttContent", first: true, predicate: ["ganttContent"], descendants: true }, { propertyName: "ganttScroll", first: true, predicate: ["ganttScroll"], descendants: true }, { propertyName: "leftPanel", first: true, predicate: ["leftPanel"], descendants: true }, { propertyName: "timelineHeader", first: true, predicate: ["timelineHeader"], descendants: true }, { propertyName: "leftBtn", first: true, predicate: ["leftBtn"], descendants: true }, { propertyName: "rightBtn", first: true, predicate: ["rightBtn"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"gantt-root\" [style.max-height.px]=\"layout.rootMaxHeight\" [style.min-height.px]=\"100\">\n <!-- TOOLBAR -->\n <div class=\"toolbar\" [style.height.px]=\"buttonsHeight\">\n <div *ngIf=\"dateMode === 'utc' || dataType === 'duration'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scales\" (click)=\"setScale(s)\" [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <div *ngIf=\"dateMode !== 'utc' && dataType === 'calendar'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scalesDate\" (click)=\"setScale(s)\"\n [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <label *ngIf=\"maxSlotsAlert\" style=\"color: red;\">\n Data is too massive to show Gantt smoothly, try changing the scale\n </label>\n </div>\n <!-- TOOLTIP -->\n <div class=\"global-tooltip\" [style.display]=\"tooltipTask ? 'block' : 'none'\">\n <ng-container *ngIf=\"tooltipTask as task\">\n <div *ngFor=\"let column of visibleTooltipColumns\">\n <strong>{{ column?.title }}:</strong>\n {{ column?.valueGetter(task) }}\n </div>\n </ng-container>\n </div>\n <!-- BUTTONS FOR SCROLL GANTT -->\n <div *ngIf=\"!maxSlotsAlert && loading === false\" class=\"floating-nav\">\n <button class=\"nav-btn left\" (mousedown)=\"startScroll('left')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #leftBtn >\n \u2039\n </button>\n <button class=\"nav-btn right\" (mousedown)=\"startScroll('right')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #rightBtn>\n \u203A\n </button>\n </div>\n <!-- LOADING -->\n <div class=\"loading-overlay\" *ngIf=\"loading\" [style.top]=\"'50%'\">\n <div class=\"spinner\"></div>\n </div>\n <!-- SINGLE VERTICAL SCROLL -->\n <div class=\"gantt-body\" #ganttBodyScroll>\n <!-- LEFT PANEL -->\n <div class=\"left-panel\" #leftPanel>\n <div class=\"task-row header\" [style.height.px]=\"headerHeight\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.title }}\n </div>\n </div>\n <div class=\"task-row\" *ngFor=\"let task of tasks\" [style.height.px]=\"rowHeight\"\n (click)=\"selectTask(task, true); $event.stopPropagation()\"\n [class.highlighted-row]=\"selectedTaskId === task.id\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.valueGetter(task) }}\n </div>\n </div>\n </div>\n <!-- RESIZER -->\n <div class=\"resizer\" [style.height.px]=\"layout.resizerHeight\" (mousedown)=\"startResize($event)\">\n </div>\n <!-- RIGHT PANEL -->\n <div class=\"right-panel\" *ngIf=\"!maxSlotsAlert\">\n <!-- TIMELINE -->\n <div class=\"timeline-header\" #timelineHeader>\n <div class=\"timeline-slot\" *ngFor=\"let slot of slots\" [style.width.px]=\"slot.width\">\n {{ slot.label }}\n </div>\n </div>\n <!-- HORIZONTAL SCROLL ONLY -->\n <div class=\"horizontal-scroll\" (scroll)=\"onHorizontalScroll($event)\" #ganttScroll>\n <div class=\"gantt-content\" #ganttContent>\n <!-- GRID -->\n <div class=\"grid-layer\">\n <div *ngFor=\"let slot of slots; let i = index; trackBy: trackByIndex\" class=\"grid-line\"\n [style.left.px]=\"slot.x - 1\">\n </div>\n <!-- final vertical line -->\n <div class=\"grid-line\" [style.left.px]=\"ganttWidth - 1\">\n </div>\n <!-- horizontal lines -->\n <div class=\"horizontal-grid-layer\">\n <div *ngFor=\"let task of tasks; let i = index; trackBy: trackByIndex\"\n class=\"horizontal-line\" [style.top.px]=\"getGridTop(i)\">\n </div>\n <!-- final horizontal line -->\n <div class=\"horizontal-line\" [style.top.px]=\"ganttHeight\">\n </div>\n </div>\n </div>\n <!-- TASKS -->\n <div class=\"tasks-layer\">\n <div *ngFor=\"let task of viewTasks; let i = index; trackBy: trackByIndex\" class=\"task\"\n (mouseenter)=\"showTooltip($event, task)\" (mouseleave)=\"hideTooltip()\"\n (click)=\"selectTask(task, false); $event.stopPropagation()\"\n [class.highlighted-task]=\"selectedTaskId === task.id\" [style.left.px]=\"task.x\"\n [style.top.px]=\"task.y\" [style.width.px]=\"task.width\" [style.height.px]=\"task.height\">\n <div class=\"task-label\">\n {{ task.label }}\n </div>\n </div>\n </div>\n <!-- DEPENDENCIES -->\n <svg class=\"dependencies-svg\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\"\n orient=\"auto\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#868d97\" />\n </marker>\n </defs>\n <g class=\"dependencies-normal\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"dependency\"\n [class.hidden]=\"hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n <g class=\"dependencies-highlighted\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"highlighted-dependency\"\n [class.hidden]=\"!hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n <div class=\"right-panel-dead\" *ngIf=\"maxSlotsAlert\"></div>\n </div>\n</div>", styles: [":host{display:block;width:100%;height:100%}.gantt-root{height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden}.gantt-body{flex:1;display:flex;overflow-y:auto;overflow-x:hidden;border-width:1px;border-style:solid;border-color:#aaac}.toolbar{flex-shrink:0;display:flex;gap:8px;background:#fff;position:sticky;top:0;z-index:50}.toolbar button.active{font-weight:700}.loading-overlay{position:sticky;inset:0;display:flex;align-items:center;justify-content:center;z-index:1000}.global-tooltip{position:fixed;background:#585858e6;color:#fff;padding:8px;border-radius:6px;font-size:12px;z-index:1000;pointer-events:none}.left-panel{flex-shrink:0;background:#fff;border-right:1px solid #dcdcdc}.task-row{display:grid;grid-auto-flow:column;grid-auto-columns:120px;gap:0 10px;font-size:small;align-items:center;border-bottom:1px solid #eee;white-space:nowrap;overflow:hidden}.cell{padding:0 8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.task-row.header{font-size:small;font-weight:600;position:sticky;top:0;background:#fff!important;z-index:1}.task-row:hover{background:#ff00001a}.highlighted-row{background:#ff00004d!important}.resizer{min-width:7px;cursor:col-resize;background:#b4b4b4}.resizer:hover{background:#696969}.right-panel{flex:1;min-width:100px!important;position:relative}.right-panel-dead{flex:1;height:10000px;min-width:100px!important;position:relative;background-color:#696969}.horizontal-scroll{overflow-x:hidden;overflow-y:hidden;position:relative}.gantt-content{position:relative}.timeline-header{display:flex;position:sticky;top:0;overflow:hidden;white-space:nowrap;z-index:20;background:#fff;border-bottom:1px solid #ccc}.timeline-slot{flex:0 0 auto;border-right:1px solid #e0e0e0;padding:8px;box-sizing:border-box;text-align:center;font-size:12px}.highlighted-task{background:#f006!important;border-color:#b71c1c!important;z-index:10}.grid-layer{position:absolute;inset:0;pointer-events:none}.grid-line{position:absolute;top:0;bottom:0;width:1px;background:#c8c8c859}.horizontal-grid-layer{position:absolute;inset:0;pointer-events:none}.horizontal-line{position:absolute;left:0;right:0;height:1px;background:#c8c8c840}.dependencies-svg{overflow:visible}.dependencies-normal,.dependencies-highlighted{pointer-events:none}.dependency{stroke:#9ba2ad;stroke-width:1.6;fill:none;opacity:.35}.highlighted-dependency{stroke:#52555a;stroke-width:2.7;fill:none;opacity:1}.dependencies-svg.hovering .dependency{opacity:.035}.tasks-layer{position:relative;z-index:2}.task{position:absolute;background:#9b94f7bf;opacity:.85;color:#505050;padding-top:4px;border-radius:4px;font-size:11px;white-space:nowrap;min-width:2px}.task:hover{background:#ff000026}.spinner{width:40px;height:40px;border:4px solid #ddd;border-top-color:#3f51b5;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}*{box-sizing:border-box}.floating-nav{position:sticky;top:50%;transform:translateY(-50%);z-index:100;pointer-events:none}.nav-btn{position:absolute;width:45px;height:45px;display:flex;align-items:center;justify-content:center;pointer-events:auto;background:#5c9af866;border:none;color:#535353;font-size:26px;cursor:pointer;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);border-radius:2px;line-height:1;text-align:center}.nav-btn:hover{background:#5c9af8b3}.nav-btn.left{margin-left:13px}.nav-btn.right{right:23px}.task-label{padding-left:6px}.hidden{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
726
726
  }
727
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: GanttLiteComponent, decorators: [{
727
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.21", ngImport: i0, type: GanttLiteComponent, decorators: [{
728
728
  type: Component,
729
- args: [{ selector: 'gantt-lite', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"gantt-root\" [style.max-height.px]=\"layout.rootMaxHeight\" [style.min-height.px]=\"100\">\n <!-- TOOLBAR -->\n <div class=\"toolbar\" [style.height.px]=\"buttonsHeight\">\n <div *ngIf=\"dateMode === 'utc' || dataType === 'duration'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scales\" (click)=\"setScale(s)\" [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <div *ngIf=\"dateMode !== 'utc' && dataType === 'calendar'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scalesDate\" (click)=\"setScale(s)\"\n [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <label *ngIf=\"maxSlotsAlert\" style=\"color: red;\">\n Data is too massive to show Gantt smoothly, try changing the scale\n </label>\n </div>\n <!-- TOOLTIP -->\n <div class=\"global-tooltip\" [style.display]=\"tooltipTask ? 'block' : 'none'\">\n <ng-container *ngIf=\"tooltipTask as task\">\n <div *ngFor=\"let column of visibleTooltipColumns\">\n <strong>{{ column?.title }}:</strong>\n {{ column?.valueGetter(task) }}\n </div>\n </ng-container>\n </div>\n <!-- BUTTONS FOR SCROLL GANTT -->\n <div *ngIf=\"!maxSlotsAlert && loading === false\" class=\"floating-nav\">\n <button class=\"nav-btn left\" (mousedown)=\"startScroll('left')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #leftBtn >\n \u2039\n </button>\n <button class=\"nav-btn right\" (mousedown)=\"startScroll('right')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #rightBtn>\n \u203A\n </button>\n </div>\n <!-- LOADING -->\n <div class=\"loading-overlay\" *ngIf=\"loading\" [style.top]=\"'50%'\">\n <div class=\"spinner\"></div>\n </div>\n <!-- SINGLE VERTICAL SCROLL -->\n <div class=\"gantt-body\" #ganttBodyScroll>\n <!-- LEFT PANEL -->\n <div class=\"left-panel\" #leftPanel>\n <div class=\"task-row header\" [style.height.px]=\"headerHeight\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.title }}\n </div>\n </div>\n <div class=\"task-row\" *ngFor=\"let task of tasks\" [style.height.px]=\"rowHeight\"\n (click)=\"selectTask(task, true); $event.stopPropagation()\"\n [class.highlighted-row]=\"selectedTaskId === task.id\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.valueGetter(task) }}\n </div>\n </div>\n </div>\n <!-- RESIZER -->\n <div class=\"resizer\" [style.height.px]=\"layout.resizerHeight\" (mousedown)=\"startResize($event)\">\n </div>\n <!-- RIGHT PANEL -->\n <div class=\"right-panel\" *ngIf=\"!maxSlotsAlert\">\n <!-- TIMELINE -->\n <div class=\"timeline-header\" #timelineHeader>\n <div class=\"timeline-slot\" *ngFor=\"let slot of slots\" [style.width.px]=\"slot.width\">\n {{ slot.label }}\n </div>\n </div>\n <!-- HORIZONTAL SCROLL ONLY -->\n <div class=\"horizontal-scroll\" (scroll)=\"onHorizontalScroll($event)\" #ganttScroll>\n <div class=\"gantt-content\" #ganttContent>\n <!-- GRID -->\n <div class=\"grid-layer\">\n <div *ngFor=\"let slot of slots; let i = index; trackBy: trackByIndex\" class=\"grid-line\"\n [style.left.px]=\"slot.x - 1\">\n </div>\n <!-- final vertical line -->\n <div class=\"grid-line\" [style.left.px]=\"ganttWidth - 1\">\n </div>\n <!-- horizontal lines -->\n <div class=\"horizontal-grid-layer\">\n <div *ngFor=\"let task of tasks; let i = index; trackBy: trackByIndex\"\n class=\"horizontal-line\" [style.top.px]=\"getGridTop(i)\">\n </div>\n <!-- final horizontal line -->\n <div class=\"horizontal-line\" [style.top.px]=\"ganttHeight\">\n </div>\n </div>\n </div>\n <!-- TASKS -->\n <div class=\"tasks-layer\">\n <div *ngFor=\"let task of viewTasks; let i = index; trackBy: trackByIndex\" class=\"task\"\n (mouseenter)=\"showTooltip($event, task)\" (mouseleave)=\"hideTooltip()\"\n (click)=\"selectTask(task, false); $event.stopPropagation()\"\n [class.highlighted-task]=\"selectedTaskId === task.id\" [style.left.px]=\"task.x\"\n [style.top.px]=\"task.y\" [style.width.px]=\"task.width\" [style.height.px]=\"task.height\">\n <div class=\"task-label\">\n {{ task.label }}\n </div>\n </div>\n </div>\n <!-- DEPENDENCIES -->\n <svg class=\"dependencies-svg\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\"\n orient=\"auto\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#868d97\" />\n </marker>\n </defs>\n <g class=\"dependencies-normal\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"dependency\"\n [class.hidden]=\"hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n <g class=\"dependencies-highlighted\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"highlighted-dependency\"\n [class.hidden]=\"!hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n <div class=\"right-panel-dead\" *ngIf=\"maxSlotsAlert\"></div>\n </div>\n</div>", styles: [":host{display:block;width:100%;height:100%}.gantt-root{height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden}.gantt-body{flex:1;display:flex;overflow-y:auto;overflow-x:hidden;border-width:1px;border-style:solid;border-color:#aaac}.toolbar{flex-shrink:0;display:flex;gap:8px;background:#fff;position:sticky;top:0;z-index:50}.toolbar button.active{font-weight:700}.loading-overlay{position:sticky;inset:0;display:flex;align-items:center;justify-content:center;z-index:1000}.global-tooltip{position:fixed;background:#585858e6;color:#fff;padding:8px;border-radius:6px;font-size:12px;z-index:1000;pointer-events:none}.left-panel{flex-shrink:0;background:#fff;border-right:1px solid #dcdcdc}.task-row{display:grid;grid-auto-flow:column;grid-auto-columns:120px;gap:0 10px;font-size:small;align-items:center;border-bottom:1px solid #eee;white-space:nowrap;overflow:hidden}.cell{padding:0 8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.task-row.header{font-size:small;font-weight:600;position:sticky;top:0;background:#fff!important;z-index:1}.task-row:hover{background:#ff00001a}.highlighted-row{background:#ff00004d!important}.resizer{min-width:7px;cursor:col-resize;background:#b4b4b4}.resizer:hover{background:#696969}.right-panel{flex:1;min-width:100px!important;position:relative}.right-panel-dead{flex:1;height:10000px;min-width:100px!important;position:relative;background-color:#696969}.horizontal-scroll{overflow-x:hidden;overflow-y:hidden;position:relative}.gantt-content{position:relative}.timeline-header{display:flex;position:sticky;top:0;overflow:hidden;white-space:nowrap;z-index:20;background:#fff;border-bottom:1px solid #ccc}.timeline-slot{flex:0 0 auto;border-right:1px solid #e0e0e0;padding:8px;box-sizing:border-box;text-align:center;font-size:12px}.highlighted-task{background:#f006!important;border-color:#b71c1c!important;z-index:10}.grid-layer{position:absolute;inset:0;pointer-events:none}.grid-line{position:absolute;top:0;bottom:0;width:1px;background:#c8c8c859}.horizontal-grid-layer{position:absolute;inset:0;pointer-events:none}.horizontal-line{position:absolute;left:0;right:0;height:1px;background:#c8c8c840}.dependencies-svg{overflow:visible}.dependencies-normal,.dependencies-highlighted{pointer-events:none}.dependency{stroke:#9ba2ad;stroke-width:1.6;fill:none;opacity:.35}.highlighted-dependency{stroke:#52555a;stroke-width:2.7;fill:none;opacity:1}.dependencies-svg.hovering .dependency{opacity:.035}.tasks-layer{position:relative;z-index:2}.task{position:absolute;background:#9b94f7bf;opacity:.85;color:#505050;padding-top:4px;border-radius:4px;font-size:11px;white-space:nowrap;min-width:2px}.task:hover{background:#ff000026}.spinner{width:40px;height:40px;border:4px solid #ddd;border-top-color:#3f51b5;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}*{box-sizing:border-box}.floating-nav{position:sticky;top:50%;transform:translateY(-50%);z-index:100;pointer-events:none}.nav-btn{position:absolute;width:45px;height:45px;display:flex;align-items:center;justify-content:center;pointer-events:auto;background:#5c9af866;border:none;color:#535353;font-size:26px;cursor:pointer;backdrop-filter:blur(1px);border-radius:2px;line-height:1;text-align:center}.nav-btn:hover{background:#5c9af8b3}.nav-btn.left{margin-left:13px}.nav-btn.right{right:23px}.task-label{padding-left:6px}.hidden{display:none}\n"] }]
729
+ args: [{ selector: 'gantt-lite', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"gantt-root\" [style.max-height.px]=\"layout.rootMaxHeight\" [style.min-height.px]=\"100\">\n <!-- TOOLBAR -->\n <div class=\"toolbar\" [style.height.px]=\"buttonsHeight\">\n <div *ngIf=\"dateMode === 'utc' || dataType === 'duration'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scales\" (click)=\"setScale(s)\" [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <div *ngIf=\"dateMode !== 'utc' && dataType === 'calendar'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scalesDate\" (click)=\"setScale(s)\"\n [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <label *ngIf=\"maxSlotsAlert\" style=\"color: red;\">\n Data is too massive to show Gantt smoothly, try changing the scale\n </label>\n </div>\n <!-- TOOLTIP -->\n <div class=\"global-tooltip\" [style.display]=\"tooltipTask ? 'block' : 'none'\">\n <ng-container *ngIf=\"tooltipTask as task\">\n <div *ngFor=\"let column of visibleTooltipColumns\">\n <strong>{{ column?.title }}:</strong>\n {{ column?.valueGetter(task) }}\n </div>\n </ng-container>\n </div>\n <!-- BUTTONS FOR SCROLL GANTT -->\n <div *ngIf=\"!maxSlotsAlert && loading === false\" class=\"floating-nav\">\n <button class=\"nav-btn left\" (mousedown)=\"startScroll('left')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #leftBtn >\n \u2039\n </button>\n <button class=\"nav-btn right\" (mousedown)=\"startScroll('right')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #rightBtn>\n \u203A\n </button>\n </div>\n <!-- LOADING -->\n <div class=\"loading-overlay\" *ngIf=\"loading\" [style.top]=\"'50%'\">\n <div class=\"spinner\"></div>\n </div>\n <!-- SINGLE VERTICAL SCROLL -->\n <div class=\"gantt-body\" #ganttBodyScroll>\n <!-- LEFT PANEL -->\n <div class=\"left-panel\" #leftPanel>\n <div class=\"task-row header\" [style.height.px]=\"headerHeight\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.title }}\n </div>\n </div>\n <div class=\"task-row\" *ngFor=\"let task of tasks\" [style.height.px]=\"rowHeight\"\n (click)=\"selectTask(task, true); $event.stopPropagation()\"\n [class.highlighted-row]=\"selectedTaskId === task.id\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.valueGetter(task) }}\n </div>\n </div>\n </div>\n <!-- RESIZER -->\n <div class=\"resizer\" [style.height.px]=\"layout.resizerHeight\" (mousedown)=\"startResize($event)\">\n </div>\n <!-- RIGHT PANEL -->\n <div class=\"right-panel\" *ngIf=\"!maxSlotsAlert\">\n <!-- TIMELINE -->\n <div class=\"timeline-header\" #timelineHeader>\n <div class=\"timeline-slot\" *ngFor=\"let slot of slots\" [style.width.px]=\"slot.width\">\n {{ slot.label }}\n </div>\n </div>\n <!-- HORIZONTAL SCROLL ONLY -->\n <div class=\"horizontal-scroll\" (scroll)=\"onHorizontalScroll($event)\" #ganttScroll>\n <div class=\"gantt-content\" #ganttContent>\n <!-- GRID -->\n <div class=\"grid-layer\">\n <div *ngFor=\"let slot of slots; let i = index; trackBy: trackByIndex\" class=\"grid-line\"\n [style.left.px]=\"slot.x - 1\">\n </div>\n <!-- final vertical line -->\n <div class=\"grid-line\" [style.left.px]=\"ganttWidth - 1\">\n </div>\n <!-- horizontal lines -->\n <div class=\"horizontal-grid-layer\">\n <div *ngFor=\"let task of tasks; let i = index; trackBy: trackByIndex\"\n class=\"horizontal-line\" [style.top.px]=\"getGridTop(i)\">\n </div>\n <!-- final horizontal line -->\n <div class=\"horizontal-line\" [style.top.px]=\"ganttHeight\">\n </div>\n </div>\n </div>\n <!-- TASKS -->\n <div class=\"tasks-layer\">\n <div *ngFor=\"let task of viewTasks; let i = index; trackBy: trackByIndex\" class=\"task\"\n (mouseenter)=\"showTooltip($event, task)\" (mouseleave)=\"hideTooltip()\"\n (click)=\"selectTask(task, false); $event.stopPropagation()\"\n [class.highlighted-task]=\"selectedTaskId === task.id\" [style.left.px]=\"task.x\"\n [style.top.px]=\"task.y\" [style.width.px]=\"task.width\" [style.height.px]=\"task.height\">\n <div class=\"task-label\">\n {{ task.label }}\n </div>\n </div>\n </div>\n <!-- DEPENDENCIES -->\n <svg class=\"dependencies-svg\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\"\n orient=\"auto\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#868d97\" />\n </marker>\n </defs>\n <g class=\"dependencies-normal\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"dependency\"\n [class.hidden]=\"hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n <g class=\"dependencies-highlighted\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"highlighted-dependency\"\n [class.hidden]=\"!hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n <div class=\"right-panel-dead\" *ngIf=\"maxSlotsAlert\"></div>\n </div>\n</div>", styles: [":host{display:block;width:100%;height:100%}.gantt-root{height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden}.gantt-body{flex:1;display:flex;overflow-y:auto;overflow-x:hidden;border-width:1px;border-style:solid;border-color:#aaac}.toolbar{flex-shrink:0;display:flex;gap:8px;background:#fff;position:sticky;top:0;z-index:50}.toolbar button.active{font-weight:700}.loading-overlay{position:sticky;inset:0;display:flex;align-items:center;justify-content:center;z-index:1000}.global-tooltip{position:fixed;background:#585858e6;color:#fff;padding:8px;border-radius:6px;font-size:12px;z-index:1000;pointer-events:none}.left-panel{flex-shrink:0;background:#fff;border-right:1px solid #dcdcdc}.task-row{display:grid;grid-auto-flow:column;grid-auto-columns:120px;gap:0 10px;font-size:small;align-items:center;border-bottom:1px solid #eee;white-space:nowrap;overflow:hidden}.cell{padding:0 8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.task-row.header{font-size:small;font-weight:600;position:sticky;top:0;background:#fff!important;z-index:1}.task-row:hover{background:#ff00001a}.highlighted-row{background:#ff00004d!important}.resizer{min-width:7px;cursor:col-resize;background:#b4b4b4}.resizer:hover{background:#696969}.right-panel{flex:1;min-width:100px!important;position:relative}.right-panel-dead{flex:1;height:10000px;min-width:100px!important;position:relative;background-color:#696969}.horizontal-scroll{overflow-x:hidden;overflow-y:hidden;position:relative}.gantt-content{position:relative}.timeline-header{display:flex;position:sticky;top:0;overflow:hidden;white-space:nowrap;z-index:20;background:#fff;border-bottom:1px solid #ccc}.timeline-slot{flex:0 0 auto;border-right:1px solid #e0e0e0;padding:8px;box-sizing:border-box;text-align:center;font-size:12px}.highlighted-task{background:#f006!important;border-color:#b71c1c!important;z-index:10}.grid-layer{position:absolute;inset:0;pointer-events:none}.grid-line{position:absolute;top:0;bottom:0;width:1px;background:#c8c8c859}.horizontal-grid-layer{position:absolute;inset:0;pointer-events:none}.horizontal-line{position:absolute;left:0;right:0;height:1px;background:#c8c8c840}.dependencies-svg{overflow:visible}.dependencies-normal,.dependencies-highlighted{pointer-events:none}.dependency{stroke:#9ba2ad;stroke-width:1.6;fill:none;opacity:.35}.highlighted-dependency{stroke:#52555a;stroke-width:2.7;fill:none;opacity:1}.dependencies-svg.hovering .dependency{opacity:.035}.tasks-layer{position:relative;z-index:2}.task{position:absolute;background:#9b94f7bf;opacity:.85;color:#505050;padding-top:4px;border-radius:4px;font-size:11px;white-space:nowrap;min-width:2px}.task:hover{background:#ff000026}.spinner{width:40px;height:40px;border:4px solid #ddd;border-top-color:#3f51b5;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}*{box-sizing:border-box}.floating-nav{position:sticky;top:50%;transform:translateY(-50%);z-index:100;pointer-events:none}.nav-btn{position:absolute;width:45px;height:45px;display:flex;align-items:center;justify-content:center;pointer-events:auto;background:#5c9af866;border:none;color:#535353;font-size:26px;cursor:pointer;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);border-radius:2px;line-height:1;text-align:center}.nav-btn:hover{background:#5c9af8b3}.nav-btn.left{margin-left:13px}.nav-btn.right{right:23px}.task-label{padding-left:6px}.hidden{display:none}\n"] }]
730
730
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { rawTasks: [{
731
731
  type: Input
732
732
  }], ganttBodyScroll: [{
@@ -753,11 +753,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.22", ngImpo
753
753
  }] } });
754
754
 
755
755
  class GanttLiteModule {
756
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: GanttLiteModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
757
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.22", ngImport: i0, type: GanttLiteModule, declarations: [GanttLiteComponent], imports: [CommonModule], exports: [GanttLiteComponent] }); }
758
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: GanttLiteModule, imports: [CommonModule] }); }
756
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.21", ngImport: i0, type: GanttLiteModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
757
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.21", ngImport: i0, type: GanttLiteModule, declarations: [GanttLiteComponent], imports: [CommonModule], exports: [GanttLiteComponent] }); }
758
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.21", ngImport: i0, type: GanttLiteModule, imports: [CommonModule] }); }
759
759
  }
760
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: GanttLiteModule, decorators: [{
760
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.21", ngImport: i0, type: GanttLiteModule, decorators: [{
761
761
  type: NgModule,
762
762
  args: [{
763
763
  declarations: [GanttLiteComponent],
@@ -770,5 +770,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.22", ngImpo
770
770
  * Generated bundle index. Do not edit.
771
771
  */
772
772
 
773
- export { GanttLiteComponent, GanttLiteModule };
774
- //# sourceMappingURL=gantt-lite.mjs.map
773
+ export { GanttLiteBase, GanttLiteComponent, GanttLiteModule, SlotIndexToDateLabelConverter };
774
+ //# sourceMappingURL=fatcore-gantt-lite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fatcore-gantt-lite.mjs","sources":["../../../projects/gantt-lite/src/lib/gantt-lite.helper.ts","../../../projects/gantt-lite/src/lib/gantt-lite-base.ts","../../../projects/gantt-lite/src/lib/gantt-lite.component.ts","../../../projects/gantt-lite/src/lib/gantt-lite.component.html","../../../projects/gantt-lite/src/gantt-lite.module.ts","../../../projects/gantt-lite/src/fatcore-gantt-lite.ts"],"sourcesContent":["import { DateMode } from \"./gantt-lite.model\";\n\nexport class SlotIndexToDateLabelConverter {\n private timeFormatter!: Intl.DateTimeFormat;\n private dayFormatter!: Intl.DateTimeFormat;\n constructor(\n private dateMode: DateMode,\n private originDate: number,\n private slotSeconds: number,\n private hasNegativeDependencySpace: boolean\n ) {\n this.initFormatters();\n }\n\n private initFormatters(): void {\n this.timeFormatter = new Intl.DateTimeFormat([], {\n timeZone: this.dateMode === 'utc' ? 'UTC' : undefined,\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n });\n\n this.dayFormatter = new Intl.DateTimeFormat([], {\n timeZone: this.dateMode === 'utc' ? 'UTC' : undefined,\n day: '2-digit',\n month: '2-digit',\n year: 'numeric'\n });\n}\n\n private get slotMs(): number {\n return this.slotSeconds * 1000;\n }\n\n private indexToDate(index: number): Date {\n const realIndex = this.hasNegativeDependencySpace && index > 0 ? index - 1 : index;\n return new Date(this.originDate + realIndex * this.slotMs);\n }\n\n public getLabelCalendar(index: number, scale: string): string {\n if (this.hasNegativeDependencySpace && index === 0) {\n return 'N/A';\n }\n\n const date = this.indexToDate(index);\n switch (scale) {\n case '1m':\n case '10m':\n case '30m':\n case 'hour':\n case '6 hours':\n case '12 hours':\n return this.formatTime(date);\n case 'day':\n return this.formatDay(date);\n case 'week':\n return this.formatRange(date, 7);\n case 'month':\n return this.formatMonthRange(date);\n case 'year':\n return this.formatYearRange(date);\n default:\n return '';\n }\n }\n\n public getLabelDuration(index: number, scale: string): string {\n if (index === -1) {\n return 'N/A';\n }\n\n switch (scale) {\n case '1m':\n return `${index * 1}m`;\n case '10m':\n return `${index * 10}m`;\n case '30m':\n return `${index * 30}m`;\n case 'hour':\n return `${index}h`;\n case '6 hours':\n return `${index * 6}h`;\n case '12 hours':\n return `${index * 12}h`;\n case 'day':\n return `${index}D`;\n case 'week':\n return `${index * 7}D - ${index * 7 + 7}D`;\n case 'month':\n return `${index * 30}D - ${index * 30 + 30}D`;\n case 'year':\n return `${index * 365}D - ${index * 365 + 365}D`;\n default:\n return '';\n }\n }\n\n private formatTime(date: Date): string {\n return this.timeFormatter.format(date);\n }\n\n private formatDay(date: Date): string {\n return this.dayFormatter.format(date);\n }\n\n private formatRange(start: Date, days: number): string {\n const end = new Date(start);\n end.setDate(end.getDate() + days);\n return `${start.toLocaleDateString()} - ${end.toLocaleDateString()}`;\n }\n\n private formatMonthRange(start: Date): string {\n const date = new Date(start);\n date.setDate(1);\n return date.toLocaleDateString();\n }\n\n private formatYearRange(start: Date): string {\n return `${start.toLocaleDateString()}`;\n }\n}\n","import { Directive, Input } from '@angular/core';\r\nimport { DataType, DateMode, DependencyPath, GanttColumn, GanttScale, GanttTask, ScaleConfig } from './gantt-lite.model';\r\nimport { TimelineSlot } from './gantt-lite.model';\r\n\r\n@Directive()\r\nexport abstract class GanttLiteBase {\r\n @Input() public rowHeight: number = 40;\r\n @Input() public defaultScale: GanttScale = 'day';\r\n @Input() public dataType: DataType = 'duration';\r\n @Input() public dateMode: DateMode = 'local';\r\n @Input() public extraColumns: GanttColumn[] = [];\r\n protected slots: TimelineSlot[] = [];\r\n protected tasks: GanttTask[] = [];\r\n public dependencyPaths: DependencyPath[] = [];\r\n protected scaleSelected: ScaleConfig = this.getScaleConfig(this.defaultScale);\r\n protected headerHeight: number = 32;\r\n protected ganttHeight: number = 0;\r\n protected ganttWidth: number = 0;\r\n protected leftPanelWidth = 320;\r\n protected visibleGridColumns: GanttColumn[] = [];\r\n protected visibleTooltipColumns: GanttColumn[] = [];\r\n protected layout = { rootMaxHeight: 0, bodyHeight: 0, scrollHeight: 0, resizerHeight: 0 };\r\n protected readonly scales: GanttScale[] = ['1m', '10m', '30m', 'hour', '6 hours', '12 hours', 'day', 'week', 'month', 'year'];\r\n protected readonly scalesDate: GanttScale[] = ['1m', '10m', '30m', 'hour', 'day', 'week', 'month', 'year'];\r\n protected readonly negativeSlotWidth = 50;\r\n protected hasNegativeDependencySpace = false;\r\n\r\n constructor() { }\r\n \r\n // recompute all sizes\r\n protected recomputeLayout(): void {\r\n this.layout.rootMaxHeight = this.ganttHeight - this.headerHeight + this.rowHeight - 3;\r\n this.layout.bodyHeight = this.ganttHeight - this.rowHeight / 3;\r\n this.layout.scrollHeight = this.ganttHeight - this.rowHeight;\r\n this.layout.resizerHeight = this.ganttHeight + this.headerHeight - this.rowHeight;\r\n }\r\n\r\n protected get columns(): GanttColumn[] {\r\n return [\r\n ...this.coreColumns,\r\n ...this.extraColumns\r\n ];\r\n }\r\n\r\n // minimum columns to show gantt\r\n protected readonly coreColumns: GanttColumn[] = [\r\n {\r\n id: 'label',\r\n title: 'Name',\r\n valueGetter: t => t.label,\r\n showInGrid: true,\r\n showInTooltip: true\r\n },\r\n {\r\n id: 'start',\r\n title: 'Start',\r\n valueGetter: t => this.getDateString(t.start),\r\n showInGrid: true,\r\n showInTooltip: true,\r\n hidden: () => this.dataType !== 'calendar'\r\n },\r\n {\r\n id: 'end',\r\n title: 'End',\r\n valueGetter: t => this.getDateString(t.end),\r\n showInGrid: true,\r\n showInTooltip: true,\r\n hidden: () => this.dataType !== 'calendar'\r\n },\r\n {\r\n id: 'duration',\r\n title: 'Duration',\r\n valueGetter: t => this.getDuration(t),\r\n showInGrid: true,\r\n showInTooltip: true,\r\n hidden: () => this.dataType !== 'duration'\r\n }\r\n ];\r\n\r\n protected ganttWidthCalcul(): void {\r\n this.ganttWidth = this.slots.length * this.scaleSelected.px;\r\n }\r\n\r\n protected ganttHeightCalcul(): void {\r\n const max = Math.max(...this.tasks.map((t) => t.row));\r\n this.ganttHeight = (max + 2) * this.rowHeight;\r\n }\r\n\r\n protected refreshVisibleColumns(): void {\r\n this.visibleGridColumns = this.columns.filter(c =>\r\n c.showInGrid &&\r\n (!c.hidden || !c.hidden())\r\n );\r\n\r\n this.visibleTooltipColumns = this.columns.filter(c =>\r\n c.showInTooltip &&\r\n (!c.hidden || !c.hidden())\r\n );\r\n }\r\n\r\n protected getRawTaskX(task: GanttTask): number {\r\n return (task.startSlot ?? 0) * this.scaleSelected.px;\r\n }\r\n\r\n protected getDateString(date: Date | number | undefined | null): string {\r\n if (!date) return '';\r\n if (this.dateMode === 'utc') {\r\n return (date as Date)\r\n .toLocaleString([], {\r\n timeZone: 'UTC',\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n })\r\n .replace(',', '');\r\n }\r\n\r\n return (date as Date)\r\n .toLocaleString([], {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n })\r\n .replace(',', '');\r\n }\r\n\r\n protected getDuration(task: GanttTask | undefined | null): string {\r\n if (!task) return '';\r\n\r\n if (typeof task.start !== 'number' || typeof task.end !== 'number') {\r\n throw new Error(`Task ${task.id} is not in duration mode`);\r\n }\r\n\r\n let total = task.end - task.start;\r\n const days = Math.floor(total / 86400);\r\n total %= 86400;\r\n const hours = Math.floor(total / 3600);\r\n total %= 3600;\r\n const minutes = Math.floor(total / 60);\r\n const seconds = total % 60;\r\n let result = '';\r\n\r\n if (days > 0) result += `${days}d `;\r\n if (hours > 0 || days > 0) result += `${hours}h `;\r\n if (minutes > 0 || hours > 0 || days > 0) result += `${minutes}m `;\r\n\r\n result += `${seconds}s`;\r\n return result.trim();\r\n }\r\n\r\n protected getTaskWidth(task: GanttTask): number {\r\n return ((task.endSlot ?? 0) - (task.startSlot ?? 0)) * this.scaleSelected.px;\r\n }\r\n\r\n protected getGridTop(i: number): number {\r\n return i * this.rowHeight;\r\n }\r\n\r\n protected getTaskX(task: GanttTask): number {\r\n const base = (task.startSlot ?? 0) * this.scaleSelected.px;\r\n return this.hasNegativeDependencySpace ? this.negativeSlotWidth + base : base;\r\n }\r\n\r\n protected getTaskY(task: GanttTask): number {\r\n return task.row * this.rowHeight + this.rowHeight / 10;\r\n }\r\n\r\n public trackByIndex(index: number): number {\r\n return index;\r\n }\r\n\r\n // get per arrow the path\r\n protected getDependencyPath(fromId: string, toId: string): string {\r\n const from = this.tasks.find((t) => t.id === fromId);\r\n const to = this.tasks.find((t) => t.id === toId);\r\n if (!from || !to) return '';\r\n const fromRight = this.getTaskX(from) + this.getTaskWidth(from);\r\n const toLeft = this.getTaskX(to);\r\n const fromY = this.getTaskY(from) + this.rowHeight / 2 - this.rowHeight / 12;\r\n const toY = this.getTaskY(to) + this.rowHeight / 2 - this.rowHeight / 12;\r\n\r\n if (from.row === to.row) {\r\n return `\r\n M ${fromRight} ${fromY}\r\n H ${fromRight + 20}\r\n V ${toY}\r\n H ${toLeft}`;\r\n }\r\n\r\n // consistent U-turn style (even if not strictly needed)\r\n const escapeY = toY - this.rowHeight * 0.54;\r\n const midX1 = fromRight + 25;\r\n const midX2 = toLeft - 25;\r\n return `\r\n M ${fromRight} ${fromY}\r\n H ${midX1}\r\n V ${escapeY}\r\n H ${midX2}\r\n V ${toY}\r\n H ${toLeft}`;\r\n }\r\n\r\n // size of columns per minutes\r\n protected getScaleConfig(scale: any): ScaleConfig {\r\n switch (scale) {\r\n case '1m':\r\n return { secondes: 60, px: 120 };\r\n case '10m':\r\n return { secondes: 600, px: 120 };\r\n case '30m':\r\n return { secondes: 1800, px: 120 };\r\n case 'hour':\r\n return { secondes: 3600, px: 120 };\r\n case '6 hours':\r\n return { secondes: 21600, px: 120 };\r\n case '12 hours':\r\n return { secondes: 43200, px: 120 };\r\n case 'day':\r\n return { secondes: 86400, px: 150 };\r\n case 'week':\r\n return { secondes: 604800, px: 200 };\r\n case 'month':\r\n return { secondes: 2592000, px: 350 };\r\n case 'year':\r\n return { secondes: 31536000, px: 500 };\r\n default:\r\n return { secondes: 1800, px: 120 };\r\n }\r\n }\r\n\r\n protected alignOriginByScale(date: Date, defaultScale: GanttScale): Date {\r\n const d = new Date(date);\r\n switch (defaultScale) {\r\n case 'week': {\r\n // align monday\r\n const d = new Date(date);\r\n const day = d.getDay(); // 0 = Sunday, 1 = Monday, ...\r\n const diff = day === 0 ? -6 : 1 - day; // move back to Monday\r\n d.setDate(d.getDate() + diff);\r\n d.setHours(0, 0, 0, 0);\r\n return d\r\n }\r\n case 'month': {\r\n d.setDate(1);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n }\r\n case 'year': {\r\n d.setMonth(0, 1); // Jan 1\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n }\r\n case 'day': {\r\n // shift back by 1 day (buffer slot)\r\n d.setDate(d.getDate() - 1);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n }\r\n case 'hour': {\r\n // shift back by 1 hour\r\n d.setHours(d.getHours() - 1);\r\n d.setMinutes(0, 0, 0);\r\n return d;\r\n }\r\n case '6 hours': {\r\n d.setHours(d.getHours() - 6);\r\n d.setMinutes(0, 0, 0);\r\n return d;\r\n }\r\n case '12 hours': {\r\n d.setHours(d.getHours() - 12);\r\n d.setMinutes(0, 0, 0);\r\n return d;\r\n }\r\n case '30m': {\r\n d.setMinutes(d.getMinutes() - 30);\r\n d.setSeconds(0, 0);\r\n return d;\r\n }\r\n case '10m': {\r\n d.setMinutes(d.getMinutes() - 10);\r\n d.setSeconds(0, 0);\r\n return d;\r\n }\r\n case '1m': {\r\n d.setMinutes(d.getMinutes() - 1);\r\n d.setSeconds(0, 0);\r\n return d;\r\n }\r\n default:\r\n return d;\r\n }\r\n }\r\n}\r\n","import { Component, ElementRef, ViewChild, Input, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { DependencyPath, GanttScale, GanttTask, GanttTaskView } from './gantt-lite.model';\r\nimport { SlotIndexToDateLabelConverter } from './gantt-lite.helper';\r\nimport { GanttLiteBase } from './gantt-lite-base';\r\n\r\n@Component({\r\n selector: 'gantt-lite',\r\n templateUrl: './gantt-lite.component.html',\r\n styleUrls: ['./gantt-lite.component.scss'],\r\n standalone: false,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class GanttLiteComponent extends GanttLiteBase {\r\n @Input()\r\n public set rawTasks(value: GanttTask[]) {\r\n this._rawTasks = value ?? [];\r\n this.recalculteAll();\r\n }\r\n public get rawTasks(): GanttTask[] {\r\n return this._rawTasks;\r\n }\r\n @ViewChild('ganttBodyScroll') private ganttBodyScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('ganttContent') private ganttContent!: ElementRef<HTMLDivElement>;\r\n @ViewChild('ganttScroll') private ganttScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('leftPanel') private leftPanel!: ElementRef<HTMLButtonElement>;\r\n @ViewChild('timelineHeader') private timelineHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('leftBtn') private leftBtn!: ElementRef<HTMLButtonElement>;\r\n @ViewChild('rightBtn') private rightBtn!: ElementRef<HTMLButtonElement>;\r\n public toolbarHeight: number = 27;\r\n public hoveredDependencyIds = new Set<string>();\r\n public selectedTaskId: string | null = null;\r\n public tooltipTask: GanttTask | null = null;\r\n public tooltipX = 0;\r\n public tooltipY = 0;\r\n public maxSlotsAlert: boolean = false;\r\n public loading: boolean = false;\r\n public showLeftBtn = false;\r\n public showRightBtn = true;\r\n public buttonsHeight: number = 20;\r\n public viewTasks: GanttTaskView[] = [];\r\n private _rawTasks: GanttTask[] = [];\r\n private originDate: number = 0;\r\n private resizing = false;\r\n private scrollInterval: any;\r\n private labelConverter: SlotIndexToDateLabelConverter | null = null;\r\n\r\n constructor(private cdr: ChangeDetectorRef) { super(); }\r\n\r\n // recalculate all Gantt\r\n private recalculteAll(): void {\r\n this.loading = true;\r\n this.cdr.markForCheck();\r\n setTimeout(() => {\r\n const start = performance.now();\r\n this.refreshVisibleColumns();\r\n this.scaleSelected = this.getScaleConfig(this.defaultScale);\r\n\r\n if (this.dataType !== 'duration') {\r\n const base = new Date(Math.min(...this.rawTasks.map((t) => (t.start as Date).getTime())));\r\n this.originDate = this.alignOriginByScale(base, this.defaultScale).getTime();\r\n this.labelConverter = new SlotIndexToDateLabelConverter(\r\n this.dateMode,\r\n this.originDate,\r\n this.scaleSelected.secondes,\r\n this.hasNegativeDependencySpace\r\n );\r\n this.buildTaskSlotsFromDates();\r\n } else {\r\n this.labelConverter = new SlotIndexToDateLabelConverter(\r\n this.dateMode,\r\n this.originDate,\r\n this.scaleSelected.secondes,\r\n this.hasNegativeDependencySpace\r\n );\r\n this.buildTaskSlotsFromDuration();\r\n }\r\n this.detectNegativeDependencySpace();\r\n this.calculateTimelineSlots();\r\n this.getAllDependencyPaths();\r\n this.ganttHeightCalcul();\r\n this.ganttWidthCalcul();\r\n this.recomputeLayout();\r\n this.ganttScroll.nativeElement.style.height = this.layout.scrollHeight + 'px';\r\n this.ganttBodyScroll.nativeElement.style.height = this.layout.bodyHeight + 'px';\r\n this.timelineHeader.nativeElement.style.height = this.headerHeight + 'px';\r\n this.ganttContent.nativeElement.style.height = this.ganttHeight - this.rowHeight + 'px';\r\n this.ganttContent.nativeElement.style.width = this.ganttWidth + 'px';\r\n this.leftPanel.nativeElement.style.width = this.leftPanelWidth + 'px';\r\n\r\n this.buildViewTasks();\r\n setTimeout(() => {\r\n this.recenterSelectedTask();\r\n }, 0);\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n requestAnimationFrame(() => {\r\n const end = performance.now();\r\n console.log('frame time including render:', end - start, 'ms');\r\n });\r\n }, 0);\r\n }\r\n \r\n\r\n private buildViewTasks(): void {\r\n const h = this.rowHeight / 1.25;\r\n\r\n this.viewTasks = this.tasks.map((t): GanttTaskView => {\r\n return {\r\n ...t,\r\n x: this.getTaskX(t),\r\n y: this.getTaskY(t),\r\n width: this.getTaskWidth(t),\r\n height: h,\r\n };\r\n });\r\n }\r\n\r\n // click on button 10m, hour, months\r\n public setScale(scale: GanttScale): void {\r\n this.defaultScale = scale;\r\n this.recalculteAll();\r\n }\r\n\r\n\r\n // if task was selected scroll back to it\r\n private recenterSelectedTask(): void {\r\n if (!this.selectedTaskId) {\r\n if (!this.ganttScroll) return;\r\n this.ganttScroll.nativeElement.scrollLeft = 0;\r\n\r\n // force header sync\r\n if (this.timelineHeader?.nativeElement) {\r\n this.timelineHeader.nativeElement.scrollLeft = 0;\r\n }\r\n this.onScrolled();\r\n }\r\n\r\n const task = this.tasks.find((t) => t.id === this.selectedTaskId);\r\n if (!task || !this.ganttScroll) return;\r\n\r\n // scroll X\r\n const viewportWidth = this.ganttScroll.nativeElement.clientWidth;\r\n const targetScrollLeft = this.getTaskX(task) - viewportWidth / 2;\r\n this.ganttScroll.nativeElement.scrollTo({ left: Math.max(targetScrollLeft, 0), behavior: 'auto' });\r\n\r\n // scroll Y\r\n const viewportHeight = this.ganttBodyScroll.nativeElement.clientHeight;\r\n const targetTop = task.row * this.rowHeight;\r\n const scrollTop = targetTop - viewportHeight / 2 + this.rowHeight / 2;\r\n this.ganttBodyScroll.nativeElement.scrollTo({ top: Math.max(scrollTop, 0), behavior: 'auto' });\r\n\r\n this.onScrolled();\r\n }\r\n\r\n // detect if there is a need to add the N/A slot in order to be able to show dependency arrow before 0.\r\n private detectNegativeDependencySpace(): void {\r\n const originTasks = this.tasks.filter((t) => (t.startSlot ?? 0) === 0);\r\n\r\n this.hasNegativeDependencySpace = originTasks.some((task) => {\r\n const fromRight = this.getRawTaskX(task) + this.getTaskWidth(task);\r\n return (task.dependencies ?? []).some((depId: any) => {\r\n const target = this.tasks.find((t) => t.id === depId);\r\n if (!target) return false;\r\n\r\n const toLeft = this.getRawTaskX(target);\r\n // true if dependency goes \"backwards\"\r\n return toLeft < fromRight;\r\n });\r\n });\r\n }\r\n\r\n // scroll buttons left/right => click small go, stay clicked scroll a lot\r\n public startScroll(direction: 'left' | 'right'): void {\r\n // instant first move \r\n this.scrollInterval = setInterval(() => {\r\n this.ganttScroll.nativeElement.scrollLeft += direction === 'left' ? -100 : 100;\r\n this.onScrolled();\r\n }, 50);\r\n }\r\n\r\n // update buttons left/right after a scroll.\r\n private onScrolled(): void {\r\n const el = this.ganttScroll.nativeElement;\r\n const maxScrollLeft = el.scrollWidth - el.clientWidth;\r\n // left button\r\n this.showLeftBtn = el.scrollLeft > 0;\r\n if (this.leftBtn?.nativeElement) {\r\n if (this.showLeftBtn) {\r\n this.leftBtn.nativeElement.style.display = 'block';\r\n this.leftBtn.nativeElement.style.left = this.leftPanel.nativeElement.style.width;\r\n } else {\r\n this.leftBtn.nativeElement.style.display = 'none';\r\n this.leftBtn.nativeElement.style.left = this.leftPanel.nativeElement.style.width;\r\n }\r\n }\r\n // right button\r\n this.showRightBtn = el.scrollLeft < maxScrollLeft - 1 || el.scrollLeft === 0; // small tolerance\r\n if (this.rightBtn?.nativeElement) {\r\n if (this.showRightBtn) {\r\n this.rightBtn.nativeElement.style.display = 'block';\r\n } else {\r\n this.rightBtn.nativeElement.style.display = 'none';\r\n }\r\n }\r\n if (!this.showLeftBtn || !this.showRightBtn) {\r\n this.stopScroll();\r\n }\r\n }\r\n\r\n public stopScroll(): void{\r\n clearInterval(this.scrollInterval);\r\n }\r\n\r\n // to sync header and grid\r\n public onHorizontalScroll(event: Event): void {\r\n this.timelineHeader.nativeElement.scrollLeft = (event.target as HTMLElement).scrollLeft;\r\n }\r\n\r\n // highlight dependencies (arrows)\r\n private updateHoveredDependencies(task: GanttTask | null): void {\r\n this.hoveredDependencyIds.clear();\r\n if (!task) {\r\n return;\r\n }\r\n\r\n // outgoing dependencies\r\n for (const dep of task.dependencies ?? []) {\r\n this.hoveredDependencyIds.add(`${dep}->${task.id}`);\r\n }\r\n\r\n // incoming dependencies\r\n for (const t of this.tasks) {\r\n if ((t.dependencies ?? []).includes(task.id)) {\r\n this.hoveredDependencyIds.add(`${task.id}->${t.id}`);\r\n }\r\n }\r\n }\r\n\r\n // select task left and right panel\r\n public selectTask(task: GanttTask, scroll: boolean): void {\r\n if (this.selectedTaskId === task.id) {\r\n this.selectedTaskId = null;\r\n this.hoveredDependencyIds.clear();\r\n this.hideTooltip();\r\n this.onScrolled();\r\n return;\r\n }\r\n\r\n this.selectedTaskId = task.id;\r\n this.updateHoveredDependencies(task);\r\n this.onScrolled();\r\n if (!scroll || !this.ganttScroll) return;\r\n\r\n const container = this.ganttScroll.nativeElement as HTMLElement;\r\n const viewportWidth = container.clientWidth;\r\n const targetScrollLeft = this.getTaskX(task) - viewportWidth / 2;\r\n\r\n container.scrollTo({\r\n left: Math.max(targetScrollLeft, 0),\r\n behavior: 'smooth',\r\n });\r\n this.onScrolled();\r\n }\r\n\r\n // resize between panel left and right\r\n public startResize(event: MouseEvent): void {\r\n event.preventDefault();\r\n this.resizing = true;\r\n const containerRect = this.ganttBodyScroll.nativeElement.getBoundingClientRect();\r\n const left = containerRect.left;\r\n const min = 50;\r\n const max = containerRect.width - 75;\r\n const moveHandler = (e: MouseEvent): void => {\r\n if (!this.resizing) return;\r\n const x = e.clientX - left;\r\n const width = x < min ? min : x > max ? max : x;\r\n\r\n // direct DOM update (no Angular)\r\n this.leftPanel.nativeElement.style.width = width + 'px';\r\n if (this.leftBtn?.nativeElement) {\r\n this.leftBtn.nativeElement.style.left = `${width}px`;\r\n }\r\n };\r\n\r\n const upHandler = (): void => {\r\n this.resizing = false;\r\n window.removeEventListener('mousemove', moveHandler);\r\n window.removeEventListener('mouseup', upHandler);\r\n };\r\n\r\n window.addEventListener('mousemove', moveHandler);\r\n window.addEventListener('mouseup', upHandler);\r\n }\r\n\r\n public showTooltip(event: MouseEvent, task: GanttTask): void {\r\n this.tooltipTask = task;\r\n const tooltip = document.querySelector('.global-tooltip') as HTMLElement;\r\n if (!tooltip) return;\r\n tooltip.style.left = `${event.clientX + 10}px`;\r\n tooltip.style.top = `${event.clientY - 50}px`;\r\n tooltip.style.display = 'block';\r\n }\r\n\r\n public hideTooltip(): void {\r\n this.tooltipTask = null;\r\n const tooltip = document.querySelector('.global-tooltip') as HTMLElement;\r\n if (!tooltip) return;\r\n tooltip.style.display = 'none';\r\n }\r\n\r\n private buildTaskSlotsFromDates(): void {\r\n const slotMs = this.scaleSelected.secondes * 1000;\r\n this.tasks = this.rawTasks.map((t) => {\r\n if (!(t.start instanceof Date) || !(t.end instanceof Date)) {\r\n throw new Error(`Task \"${t.id}\" must have Date start/end values.`);\r\n }\r\n\r\n const startSlot = ((t.start as Date).getTime() - this.originDate) / slotMs;\r\n const endSlot = ((t.end as Date).getTime() - this.originDate) / slotMs;\r\n return { ...t, startSlot, endSlot };\r\n });\r\n }\r\n\r\n private buildTaskSlotsFromDuration(): void {\r\n this.tasks = this.rawTasks.map((t) => {\r\n if (typeof t.start !== 'number' || typeof t.end !== 'number') {\r\n throw new Error(`Task \"${t.id}\" must have numeric start/end values expressed in minutes.`);\r\n }\r\n\r\n const startSlot = t.start / this.scaleSelected.secondes;\r\n const endSlot = t.end / this.scaleSelected.secondes;\r\n return { ...t, startSlot, endSlot };\r\n });\r\n }\r\n\r\n // get all slots (timeline)\r\n private calculateTimelineSlots(): void {\r\n const maxSlot = Math.max(...this.tasks.map(t => t.endSlot ?? 0));\r\n if (maxSlot > 53000) {\r\n this.maxSlotsAlert = true;\r\n this.slots = [];\r\n return;\r\n }\r\n this.maxSlotsAlert = false;\r\n const buffer = [];\r\n let offsetX = 0;\r\n\r\n if (this.hasNegativeDependencySpace) {\r\n buffer.push({\r\n index: -1,\r\n x: 0,\r\n width: this.negativeSlotWidth,\r\n label: 'N/A'\r\n });\r\n offsetX = this.negativeSlotWidth;\r\n }\r\n\r\n for (let i = 0; i <= maxSlot + 2; i++) {\r\n buffer.push({\r\n index: i,\r\n x: offsetX + i * this.scaleSelected.px,\r\n width: this.scaleSelected.px,\r\n label: this.getSlotLabel(i) ?? 'Error',\r\n });\r\n }\r\n\r\n this.slots = buffer;\r\n }\r\n\r\n // get all paths of arrows\r\n protected getAllDependencyPaths(): void {\r\n this.dependencyPaths = this.tasks.flatMap((task): DependencyPath[] =>\r\n (task.dependencies ?? []).map(\r\n (dep: any): DependencyPath => ({\r\n from: dep,\r\n to: task.id,\r\n id: `${dep}->${task.id}`,\r\n path: this.getDependencyPath(dep, task.id),\r\n })\r\n )\r\n );\r\n }\r\n\r\n // get label for date header\r\n private getSlotLabel(index: number): string {\r\n if (this.dataType === 'calendar') {\r\n return this.labelConverter?.getLabelCalendar(index, this.defaultScale) ?? 'Error';\r\n }\r\n return this.labelConverter?.getLabelDuration(index, this.defaultScale) ?? 'Error';\r\n }\r\n}\r\n","<div class=\"gantt-root\" [style.max-height.px]=\"layout.rootMaxHeight\" [style.min-height.px]=\"100\">\n <!-- TOOLBAR -->\n <div class=\"toolbar\" [style.height.px]=\"buttonsHeight\">\n <div *ngIf=\"dateMode === 'utc' || dataType === 'duration'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scales\" (click)=\"setScale(s)\" [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <div *ngIf=\"dateMode !== 'utc' && dataType === 'calendar'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scalesDate\" (click)=\"setScale(s)\"\n [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <label *ngIf=\"maxSlotsAlert\" style=\"color: red;\">\n Data is too massive to show Gantt smoothly, try changing the scale\n </label>\n </div>\n <!-- TOOLTIP -->\n <div class=\"global-tooltip\" [style.display]=\"tooltipTask ? 'block' : 'none'\">\n <ng-container *ngIf=\"tooltipTask as task\">\n <div *ngFor=\"let column of visibleTooltipColumns\">\n <strong>{{ column?.title }}:</strong>\n {{ column?.valueGetter(task) }}\n </div>\n </ng-container>\n </div>\n <!-- BUTTONS FOR SCROLL GANTT -->\n <div *ngIf=\"!maxSlotsAlert && loading === false\" class=\"floating-nav\">\n <button class=\"nav-btn left\" (mousedown)=\"startScroll('left')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #leftBtn >\n ‹\n </button>\n <button class=\"nav-btn right\" (mousedown)=\"startScroll('right')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #rightBtn>\n ›\n </button>\n </div>\n <!-- LOADING -->\n <div class=\"loading-overlay\" *ngIf=\"loading\" [style.top]=\"'50%'\">\n <div class=\"spinner\"></div>\n </div>\n <!-- SINGLE VERTICAL SCROLL -->\n <div class=\"gantt-body\" #ganttBodyScroll>\n <!-- LEFT PANEL -->\n <div class=\"left-panel\" #leftPanel>\n <div class=\"task-row header\" [style.height.px]=\"headerHeight\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.title }}\n </div>\n </div>\n <div class=\"task-row\" *ngFor=\"let task of tasks\" [style.height.px]=\"rowHeight\"\n (click)=\"selectTask(task, true); $event.stopPropagation()\"\n [class.highlighted-row]=\"selectedTaskId === task.id\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.valueGetter(task) }}\n </div>\n </div>\n </div>\n <!-- RESIZER -->\n <div class=\"resizer\" [style.height.px]=\"layout.resizerHeight\" (mousedown)=\"startResize($event)\">\n </div>\n <!-- RIGHT PANEL -->\n <div class=\"right-panel\" *ngIf=\"!maxSlotsAlert\">\n <!-- TIMELINE -->\n <div class=\"timeline-header\" #timelineHeader>\n <div class=\"timeline-slot\" *ngFor=\"let slot of slots\" [style.width.px]=\"slot.width\">\n {{ slot.label }}\n </div>\n </div>\n <!-- HORIZONTAL SCROLL ONLY -->\n <div class=\"horizontal-scroll\" (scroll)=\"onHorizontalScroll($event)\" #ganttScroll>\n <div class=\"gantt-content\" #ganttContent>\n <!-- GRID -->\n <div class=\"grid-layer\">\n <div *ngFor=\"let slot of slots; let i = index; trackBy: trackByIndex\" class=\"grid-line\"\n [style.left.px]=\"slot.x - 1\">\n </div>\n <!-- final vertical line -->\n <div class=\"grid-line\" [style.left.px]=\"ganttWidth - 1\">\n </div>\n <!-- horizontal lines -->\n <div class=\"horizontal-grid-layer\">\n <div *ngFor=\"let task of tasks; let i = index; trackBy: trackByIndex\"\n class=\"horizontal-line\" [style.top.px]=\"getGridTop(i)\">\n </div>\n <!-- final horizontal line -->\n <div class=\"horizontal-line\" [style.top.px]=\"ganttHeight\">\n </div>\n </div>\n </div>\n <!-- TASKS -->\n <div class=\"tasks-layer\">\n <div *ngFor=\"let task of viewTasks; let i = index; trackBy: trackByIndex\" class=\"task\"\n (mouseenter)=\"showTooltip($event, task)\" (mouseleave)=\"hideTooltip()\"\n (click)=\"selectTask(task, false); $event.stopPropagation()\"\n [class.highlighted-task]=\"selectedTaskId === task.id\" [style.left.px]=\"task.x\"\n [style.top.px]=\"task.y\" [style.width.px]=\"task.width\" [style.height.px]=\"task.height\">\n <div class=\"task-label\">\n {{ task.label }}\n </div>\n </div>\n </div>\n <!-- DEPENDENCIES -->\n <svg class=\"dependencies-svg\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\"\n orient=\"auto\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#868d97\" />\n </marker>\n </defs>\n <g class=\"dependencies-normal\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"dependency\"\n [class.hidden]=\"hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n <g class=\"dependencies-highlighted\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"highlighted-dependency\"\n [class.hidden]=\"!hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n <div class=\"right-panel-dead\" *ngIf=\"maxSlotsAlert\"></div>\n </div>\n</div>","import { NgModule } from \"@angular/core\";\r\nimport { GanttLiteComponent } from \"./lib/gantt-lite.component\";\r\nimport { CommonModule } from \"@angular/common\";\r\n\r\n@NgModule({\r\n declarations: [GanttLiteComponent],\r\n imports: [CommonModule],\r\n exports: [GanttLiteComponent]\r\n})\r\nexport class GanttLiteModule {}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -770,5 +770,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.21", ngImpo
770
770
  * Generated bundle index. Do not edit.
771
771
  */
772
772
 
773
- export { GanttLiteComponent, GanttLiteModule };
773
+ export { GanttLiteBase, GanttLiteComponent, GanttLiteModule, SlotIndexToDateLabelConverter };
774
774
  //# sourceMappingURL=gantt-lite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-lite.mjs","sources":["../../../projects/gantt-lite/src/lib/gantt-lite.helper.ts","../../../projects/gantt-lite/src/lib/gantt-lite-base.ts","../../../projects/gantt-lite/src/lib/gantt-lite.component.ts","../../../projects/gantt-lite/src/lib/gantt-lite.component.html","../../../projects/gantt-lite/src/gantt-lite.module.ts","../../../projects/gantt-lite/src/gantt-lite.ts"],"sourcesContent":["import { DateMode } from \"./gantt-lite.model\";\n\nexport class SlotIndexToDateLabelConverter {\n private timeFormatter!: Intl.DateTimeFormat;\n private dayFormatter!: Intl.DateTimeFormat;\n constructor(\n private dateMode: DateMode,\n private originDate: number,\n private slotSeconds: number,\n private hasNegativeDependencySpace: boolean\n ) {\n this.initFormatters();\n }\n\n private initFormatters(): void {\n this.timeFormatter = new Intl.DateTimeFormat([], {\n timeZone: this.dateMode === 'utc' ? 'UTC' : undefined,\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n });\n\n this.dayFormatter = new Intl.DateTimeFormat([], {\n timeZone: this.dateMode === 'utc' ? 'UTC' : undefined,\n day: '2-digit',\n month: '2-digit',\n year: 'numeric'\n });\n}\n\n private get slotMs(): number {\n return this.slotSeconds * 1000;\n }\n\n private indexToDate(index: number): Date {\n const realIndex = this.hasNegativeDependencySpace && index > 0 ? index - 1 : index;\n return new Date(this.originDate + realIndex * this.slotMs);\n }\n\n public getLabelCalendar(index: number, scale: string): string {\n if (this.hasNegativeDependencySpace && index === 0) {\n return 'N/A';\n }\n\n const date = this.indexToDate(index);\n switch (scale) {\n case '1m':\n case '10m':\n case '30m':\n case 'hour':\n case '6 hours':\n case '12 hours':\n return this.formatTime(date);\n case 'day':\n return this.formatDay(date);\n case 'week':\n return this.formatRange(date, 7);\n case 'month':\n return this.formatMonthRange(date);\n case 'year':\n return this.formatYearRange(date);\n default:\n return '';\n }\n }\n\n public getLabelDuration(index: number, scale: string): string {\n if (index === -1) {\n return 'N/A';\n }\n\n switch (scale) {\n case '1m':\n return `${index * 1}m`;\n case '10m':\n return `${index * 10}m`;\n case '30m':\n return `${index * 30}m`;\n case 'hour':\n return `${index}h`;\n case '6 hours':\n return `${index * 6}h`;\n case '12 hours':\n return `${index * 12}h`;\n case 'day':\n return `${index}D`;\n case 'week':\n return `${index * 7}D - ${index * 7 + 7}D`;\n case 'month':\n return `${index * 30}D - ${index * 30 + 30}D`;\n case 'year':\n return `${index * 365}D - ${index * 365 + 365}D`;\n default:\n return '';\n }\n }\n\n private formatTime(date: Date): string {\n return this.timeFormatter.format(date);\n }\n\n private formatDay(date: Date): string {\n return this.dayFormatter.format(date);\n }\n\n private formatRange(start: Date, days: number): string {\n const end = new Date(start);\n end.setDate(end.getDate() + days);\n return `${start.toLocaleDateString()} - ${end.toLocaleDateString()}`;\n }\n\n private formatMonthRange(start: Date): string {\n const date = new Date(start);\n date.setDate(1);\n return date.toLocaleDateString();\n }\n\n private formatYearRange(start: Date): string {\n return `${start.toLocaleDateString()}`;\n }\n}\n","import { Directive, Input } from '@angular/core';\r\nimport { DataType, DateMode, DependencyPath, GanttColumn, GanttScale, GanttTask, ScaleConfig } from './gantt-lite.model';\r\nimport { TimelineSlot } from './gantt-lite.model';\r\n\r\n@Directive()\r\nexport abstract class GanttLiteBase {\r\n @Input() public rowHeight: number = 40;\r\n @Input() public defaultScale: GanttScale = 'day';\r\n @Input() public dataType: DataType = 'duration';\r\n @Input() public dateMode: DateMode = 'local';\r\n @Input() public extraColumns: GanttColumn[] = [];\r\n protected slots: TimelineSlot[] = [];\r\n protected tasks: GanttTask[] = [];\r\n public dependencyPaths: DependencyPath[] = [];\r\n protected scaleSelected: ScaleConfig = this.getScaleConfig(this.defaultScale);\r\n protected headerHeight: number = 32;\r\n protected ganttHeight: number = 0;\r\n protected ganttWidth: number = 0;\r\n protected leftPanelWidth = 320;\r\n protected visibleGridColumns: GanttColumn[] = [];\r\n protected visibleTooltipColumns: GanttColumn[] = [];\r\n protected layout = { rootMaxHeight: 0, bodyHeight: 0, scrollHeight: 0, resizerHeight: 0 };\r\n protected readonly scales: GanttScale[] = ['1m', '10m', '30m', 'hour', '6 hours', '12 hours', 'day', 'week', 'month', 'year'];\r\n protected readonly scalesDate: GanttScale[] = ['1m', '10m', '30m', 'hour', 'day', 'week', 'month', 'year'];\r\n protected readonly negativeSlotWidth = 50;\r\n protected hasNegativeDependencySpace = false;\r\n\r\n constructor() { }\r\n \r\n // recompute all sizes\r\n protected recomputeLayout(): void {\r\n this.layout.rootMaxHeight = this.ganttHeight - this.headerHeight + this.rowHeight - 3;\r\n this.layout.bodyHeight = this.ganttHeight - this.rowHeight / 3;\r\n this.layout.scrollHeight = this.ganttHeight - this.rowHeight;\r\n this.layout.resizerHeight = this.ganttHeight + this.headerHeight - this.rowHeight;\r\n }\r\n\r\n protected get columns(): GanttColumn[] {\r\n return [\r\n ...this.coreColumns,\r\n ...this.extraColumns\r\n ];\r\n }\r\n\r\n // minimum columns to show gantt\r\n protected readonly coreColumns: GanttColumn[] = [\r\n {\r\n id: 'label',\r\n title: 'Name',\r\n valueGetter: t => t.label,\r\n showInGrid: true,\r\n showInTooltip: true\r\n },\r\n {\r\n id: 'start',\r\n title: 'Start',\r\n valueGetter: t => this.getDateString(t.start),\r\n showInGrid: true,\r\n showInTooltip: true,\r\n hidden: () => this.dataType !== 'calendar'\r\n },\r\n {\r\n id: 'end',\r\n title: 'End',\r\n valueGetter: t => this.getDateString(t.end),\r\n showInGrid: true,\r\n showInTooltip: true,\r\n hidden: () => this.dataType !== 'calendar'\r\n },\r\n {\r\n id: 'duration',\r\n title: 'Duration',\r\n valueGetter: t => this.getDuration(t),\r\n showInGrid: true,\r\n showInTooltip: true,\r\n hidden: () => this.dataType !== 'duration'\r\n }\r\n ];\r\n\r\n protected ganttWidthCalcul(): void {\r\n this.ganttWidth = this.slots.length * this.scaleSelected.px;\r\n }\r\n\r\n protected ganttHeightCalcul(): void {\r\n const max = Math.max(...this.tasks.map((t) => t.row));\r\n this.ganttHeight = (max + 2) * this.rowHeight;\r\n }\r\n\r\n protected refreshVisibleColumns(): void {\r\n this.visibleGridColumns = this.columns.filter(c =>\r\n c.showInGrid &&\r\n (!c.hidden || !c.hidden())\r\n );\r\n\r\n this.visibleTooltipColumns = this.columns.filter(c =>\r\n c.showInTooltip &&\r\n (!c.hidden || !c.hidden())\r\n );\r\n }\r\n\r\n protected getRawTaskX(task: GanttTask): number {\r\n return (task.startSlot ?? 0) * this.scaleSelected.px;\r\n }\r\n\r\n protected getDateString(date: Date | number | undefined | null): string {\r\n if (!date) return '';\r\n if (this.dateMode === 'utc') {\r\n return (date as Date)\r\n .toLocaleString([], {\r\n timeZone: 'UTC',\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n })\r\n .replace(',', '');\r\n }\r\n\r\n return (date as Date)\r\n .toLocaleString([], {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n })\r\n .replace(',', '');\r\n }\r\n\r\n protected getDuration(task: GanttTask | undefined | null): string {\r\n if (!task) return '';\r\n\r\n if (typeof task.start !== 'number' || typeof task.end !== 'number') {\r\n throw new Error(`Task ${task.id} is not in duration mode`);\r\n }\r\n\r\n let total = task.end - task.start;\r\n const days = Math.floor(total / 86400);\r\n total %= 86400;\r\n const hours = Math.floor(total / 3600);\r\n total %= 3600;\r\n const minutes = Math.floor(total / 60);\r\n const seconds = total % 60;\r\n let result = '';\r\n\r\n if (days > 0) result += `${days}d `;\r\n if (hours > 0 || days > 0) result += `${hours}h `;\r\n if (minutes > 0 || hours > 0 || days > 0) result += `${minutes}m `;\r\n\r\n result += `${seconds}s`;\r\n return result.trim();\r\n }\r\n\r\n protected getTaskWidth(task: GanttTask): number {\r\n return ((task.endSlot ?? 0) - (task.startSlot ?? 0)) * this.scaleSelected.px;\r\n }\r\n\r\n protected getGridTop(i: number): number {\r\n return i * this.rowHeight;\r\n }\r\n\r\n protected getTaskX(task: GanttTask): number {\r\n const base = (task.startSlot ?? 0) * this.scaleSelected.px;\r\n return this.hasNegativeDependencySpace ? this.negativeSlotWidth + base : base;\r\n }\r\n\r\n protected getTaskY(task: GanttTask): number {\r\n return task.row * this.rowHeight + this.rowHeight / 10;\r\n }\r\n\r\n public trackByIndex(index: number): number {\r\n return index;\r\n }\r\n\r\n // get per arrow the path\r\n protected getDependencyPath(fromId: string, toId: string): string {\r\n const from = this.tasks.find((t) => t.id === fromId);\r\n const to = this.tasks.find((t) => t.id === toId);\r\n if (!from || !to) return '';\r\n const fromRight = this.getTaskX(from) + this.getTaskWidth(from);\r\n const toLeft = this.getTaskX(to);\r\n const fromY = this.getTaskY(from) + this.rowHeight / 2 - this.rowHeight / 12;\r\n const toY = this.getTaskY(to) + this.rowHeight / 2 - this.rowHeight / 12;\r\n\r\n if (from.row === to.row) {\r\n return `\r\n M ${fromRight} ${fromY}\r\n H ${fromRight + 20}\r\n V ${toY}\r\n H ${toLeft}`;\r\n }\r\n\r\n // consistent U-turn style (even if not strictly needed)\r\n const escapeY = toY - this.rowHeight * 0.54;\r\n const midX1 = fromRight + 25;\r\n const midX2 = toLeft - 25;\r\n return `\r\n M ${fromRight} ${fromY}\r\n H ${midX1}\r\n V ${escapeY}\r\n H ${midX2}\r\n V ${toY}\r\n H ${toLeft}`;\r\n }\r\n\r\n // size of columns per minutes\r\n protected getScaleConfig(scale: any): ScaleConfig {\r\n switch (scale) {\r\n case '1m':\r\n return { secondes: 60, px: 120 };\r\n case '10m':\r\n return { secondes: 600, px: 120 };\r\n case '30m':\r\n return { secondes: 1800, px: 120 };\r\n case 'hour':\r\n return { secondes: 3600, px: 120 };\r\n case '6 hours':\r\n return { secondes: 21600, px: 120 };\r\n case '12 hours':\r\n return { secondes: 43200, px: 120 };\r\n case 'day':\r\n return { secondes: 86400, px: 150 };\r\n case 'week':\r\n return { secondes: 604800, px: 200 };\r\n case 'month':\r\n return { secondes: 2592000, px: 350 };\r\n case 'year':\r\n return { secondes: 31536000, px: 500 };\r\n default:\r\n return { secondes: 1800, px: 120 };\r\n }\r\n }\r\n\r\n protected alignOriginByScale(date: Date, defaultScale: GanttScale): Date {\r\n const d = new Date(date);\r\n switch (defaultScale) {\r\n case 'week': {\r\n // align monday\r\n const d = new Date(date);\r\n const day = d.getDay(); // 0 = Sunday, 1 = Monday, ...\r\n const diff = day === 0 ? -6 : 1 - day; // move back to Monday\r\n d.setDate(d.getDate() + diff);\r\n d.setHours(0, 0, 0, 0);\r\n return d\r\n }\r\n case 'month': {\r\n d.setDate(1);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n }\r\n case 'year': {\r\n d.setMonth(0, 1); // Jan 1\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n }\r\n case 'day': {\r\n // shift back by 1 day (buffer slot)\r\n d.setDate(d.getDate() - 1);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n }\r\n case 'hour': {\r\n // shift back by 1 hour\r\n d.setHours(d.getHours() - 1);\r\n d.setMinutes(0, 0, 0);\r\n return d;\r\n }\r\n case '6 hours': {\r\n d.setHours(d.getHours() - 6);\r\n d.setMinutes(0, 0, 0);\r\n return d;\r\n }\r\n case '12 hours': {\r\n d.setHours(d.getHours() - 12);\r\n d.setMinutes(0, 0, 0);\r\n return d;\r\n }\r\n case '30m': {\r\n d.setMinutes(d.getMinutes() - 30);\r\n d.setSeconds(0, 0);\r\n return d;\r\n }\r\n case '10m': {\r\n d.setMinutes(d.getMinutes() - 10);\r\n d.setSeconds(0, 0);\r\n return d;\r\n }\r\n case '1m': {\r\n d.setMinutes(d.getMinutes() - 1);\r\n d.setSeconds(0, 0);\r\n return d;\r\n }\r\n default:\r\n return d;\r\n }\r\n }\r\n}\r\n","import { Component, ElementRef, ViewChild, Input, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { DependencyPath, GanttScale, GanttTask, GanttTaskView } from './gantt-lite.model';\r\nimport { SlotIndexToDateLabelConverter } from './gantt-lite.helper';\r\nimport { GanttLiteBase } from './gantt-lite-base';\r\n\r\n@Component({\r\n selector: 'gantt-lite',\r\n templateUrl: './gantt-lite.component.html',\r\n styleUrls: ['./gantt-lite.component.scss'],\r\n standalone: false,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class GanttLiteComponent extends GanttLiteBase {\r\n @Input()\r\n public set rawTasks(value: GanttTask[]) {\r\n this._rawTasks = value ?? [];\r\n this.recalculteAll();\r\n }\r\n public get rawTasks(): GanttTask[] {\r\n return this._rawTasks;\r\n }\r\n @ViewChild('ganttBodyScroll') private ganttBodyScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('ganttContent') private ganttContent!: ElementRef<HTMLDivElement>;\r\n @ViewChild('ganttScroll') private ganttScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('leftPanel') private leftPanel!: ElementRef<HTMLButtonElement>;\r\n @ViewChild('timelineHeader') private timelineHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('leftBtn') private leftBtn!: ElementRef<HTMLButtonElement>;\r\n @ViewChild('rightBtn') private rightBtn!: ElementRef<HTMLButtonElement>;\r\n public toolbarHeight: number = 27;\r\n public hoveredDependencyIds = new Set<string>();\r\n public selectedTaskId: string | null = null;\r\n public tooltipTask: GanttTask | null = null;\r\n public tooltipX = 0;\r\n public tooltipY = 0;\r\n public maxSlotsAlert: boolean = false;\r\n public loading: boolean = false;\r\n public showLeftBtn = false;\r\n public showRightBtn = true;\r\n public buttonsHeight: number = 20;\r\n public viewTasks: GanttTaskView[] = [];\r\n private _rawTasks: GanttTask[] = [];\r\n private originDate: number = 0;\r\n private resizing = false;\r\n private scrollInterval: any;\r\n private labelConverter: SlotIndexToDateLabelConverter | null = null;\r\n\r\n constructor(private cdr: ChangeDetectorRef) { super(); }\r\n\r\n // recalculate all Gantt\r\n private recalculteAll(): void {\r\n this.loading = true;\r\n this.cdr.markForCheck();\r\n setTimeout(() => {\r\n const start = performance.now();\r\n this.refreshVisibleColumns();\r\n this.scaleSelected = this.getScaleConfig(this.defaultScale);\r\n\r\n if (this.dataType !== 'duration') {\r\n const base = new Date(Math.min(...this.rawTasks.map((t) => (t.start as Date).getTime())));\r\n this.originDate = this.alignOriginByScale(base, this.defaultScale).getTime();\r\n this.labelConverter = new SlotIndexToDateLabelConverter(\r\n this.dateMode,\r\n this.originDate,\r\n this.scaleSelected.secondes,\r\n this.hasNegativeDependencySpace\r\n );\r\n this.buildTaskSlotsFromDates();\r\n } else {\r\n this.labelConverter = new SlotIndexToDateLabelConverter(\r\n this.dateMode,\r\n this.originDate,\r\n this.scaleSelected.secondes,\r\n this.hasNegativeDependencySpace\r\n );\r\n this.buildTaskSlotsFromDuration();\r\n }\r\n this.detectNegativeDependencySpace();\r\n this.calculateTimelineSlots();\r\n this.getAllDependencyPaths();\r\n this.ganttHeightCalcul();\r\n this.ganttWidthCalcul();\r\n this.recomputeLayout();\r\n this.ganttScroll.nativeElement.style.height = this.layout.scrollHeight + 'px';\r\n this.ganttBodyScroll.nativeElement.style.height = this.layout.bodyHeight + 'px';\r\n this.timelineHeader.nativeElement.style.height = this.headerHeight + 'px';\r\n this.ganttContent.nativeElement.style.height = this.ganttHeight - this.rowHeight + 'px';\r\n this.ganttContent.nativeElement.style.width = this.ganttWidth + 'px';\r\n this.leftPanel.nativeElement.style.width = this.leftPanelWidth + 'px';\r\n\r\n this.buildViewTasks();\r\n setTimeout(() => {\r\n this.recenterSelectedTask();\r\n }, 0);\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n requestAnimationFrame(() => {\r\n const end = performance.now();\r\n console.log('frame time including render:', end - start, 'ms');\r\n });\r\n }, 0);\r\n }\r\n \r\n\r\n private buildViewTasks(): void {\r\n const h = this.rowHeight / 1.25;\r\n\r\n this.viewTasks = this.tasks.map((t): GanttTaskView => {\r\n return {\r\n ...t,\r\n x: this.getTaskX(t),\r\n y: this.getTaskY(t),\r\n width: this.getTaskWidth(t),\r\n height: h,\r\n };\r\n });\r\n }\r\n\r\n // click on button 10m, hour, months\r\n public setScale(scale: GanttScale): void {\r\n this.defaultScale = scale;\r\n this.recalculteAll();\r\n }\r\n\r\n\r\n // if task was selected scroll back to it\r\n private recenterSelectedTask(): void {\r\n if (!this.selectedTaskId) {\r\n if (!this.ganttScroll) return;\r\n this.ganttScroll.nativeElement.scrollLeft = 0;\r\n\r\n // force header sync\r\n if (this.timelineHeader?.nativeElement) {\r\n this.timelineHeader.nativeElement.scrollLeft = 0;\r\n }\r\n this.onScrolled();\r\n }\r\n\r\n const task = this.tasks.find((t) => t.id === this.selectedTaskId);\r\n if (!task || !this.ganttScroll) return;\r\n\r\n // scroll X\r\n const viewportWidth = this.ganttScroll.nativeElement.clientWidth;\r\n const targetScrollLeft = this.getTaskX(task) - viewportWidth / 2;\r\n this.ganttScroll.nativeElement.scrollTo({ left: Math.max(targetScrollLeft, 0), behavior: 'auto' });\r\n\r\n // scroll Y\r\n const viewportHeight = this.ganttBodyScroll.nativeElement.clientHeight;\r\n const targetTop = task.row * this.rowHeight;\r\n const scrollTop = targetTop - viewportHeight / 2 + this.rowHeight / 2;\r\n this.ganttBodyScroll.nativeElement.scrollTo({ top: Math.max(scrollTop, 0), behavior: 'auto' });\r\n\r\n this.onScrolled();\r\n }\r\n\r\n // detect if there is a need to add the N/A slot in order to be able to show dependency arrow before 0.\r\n private detectNegativeDependencySpace(): void {\r\n const originTasks = this.tasks.filter((t) => (t.startSlot ?? 0) === 0);\r\n\r\n this.hasNegativeDependencySpace = originTasks.some((task) => {\r\n const fromRight = this.getRawTaskX(task) + this.getTaskWidth(task);\r\n return (task.dependencies ?? []).some((depId: any) => {\r\n const target = this.tasks.find((t) => t.id === depId);\r\n if (!target) return false;\r\n\r\n const toLeft = this.getRawTaskX(target);\r\n // true if dependency goes \"backwards\"\r\n return toLeft < fromRight;\r\n });\r\n });\r\n }\r\n\r\n // scroll buttons left/right => click small go, stay clicked scroll a lot\r\n public startScroll(direction: 'left' | 'right'): void {\r\n // instant first move \r\n this.scrollInterval = setInterval(() => {\r\n this.ganttScroll.nativeElement.scrollLeft += direction === 'left' ? -100 : 100;\r\n this.onScrolled();\r\n }, 50);\r\n }\r\n\r\n // update buttons left/right after a scroll.\r\n private onScrolled(): void {\r\n const el = this.ganttScroll.nativeElement;\r\n const maxScrollLeft = el.scrollWidth - el.clientWidth;\r\n // left button\r\n this.showLeftBtn = el.scrollLeft > 0;\r\n if (this.leftBtn?.nativeElement) {\r\n if (this.showLeftBtn) {\r\n this.leftBtn.nativeElement.style.display = 'block';\r\n this.leftBtn.nativeElement.style.left = this.leftPanel.nativeElement.style.width;\r\n } else {\r\n this.leftBtn.nativeElement.style.display = 'none';\r\n this.leftBtn.nativeElement.style.left = this.leftPanel.nativeElement.style.width;\r\n }\r\n }\r\n // right button\r\n this.showRightBtn = el.scrollLeft < maxScrollLeft - 1 || el.scrollLeft === 0; // small tolerance\r\n if (this.rightBtn?.nativeElement) {\r\n if (this.showRightBtn) {\r\n this.rightBtn.nativeElement.style.display = 'block';\r\n } else {\r\n this.rightBtn.nativeElement.style.display = 'none';\r\n }\r\n }\r\n if (!this.showLeftBtn || !this.showRightBtn) {\r\n this.stopScroll();\r\n }\r\n }\r\n\r\n public stopScroll(): void{\r\n clearInterval(this.scrollInterval);\r\n }\r\n\r\n // to sync header and grid\r\n public onHorizontalScroll(event: Event): void {\r\n this.timelineHeader.nativeElement.scrollLeft = (event.target as HTMLElement).scrollLeft;\r\n }\r\n\r\n // highlight dependencies (arrows)\r\n private updateHoveredDependencies(task: GanttTask | null): void {\r\n this.hoveredDependencyIds.clear();\r\n if (!task) {\r\n return;\r\n }\r\n\r\n // outgoing dependencies\r\n for (const dep of task.dependencies ?? []) {\r\n this.hoveredDependencyIds.add(`${dep}->${task.id}`);\r\n }\r\n\r\n // incoming dependencies\r\n for (const t of this.tasks) {\r\n if ((t.dependencies ?? []).includes(task.id)) {\r\n this.hoveredDependencyIds.add(`${task.id}->${t.id}`);\r\n }\r\n }\r\n }\r\n\r\n // select task left and right panel\r\n public selectTask(task: GanttTask, scroll: boolean): void {\r\n if (this.selectedTaskId === task.id) {\r\n this.selectedTaskId = null;\r\n this.hoveredDependencyIds.clear();\r\n this.hideTooltip();\r\n this.onScrolled();\r\n return;\r\n }\r\n\r\n this.selectedTaskId = task.id;\r\n this.updateHoveredDependencies(task);\r\n this.onScrolled();\r\n if (!scroll || !this.ganttScroll) return;\r\n\r\n const container = this.ganttScroll.nativeElement as HTMLElement;\r\n const viewportWidth = container.clientWidth;\r\n const targetScrollLeft = this.getTaskX(task) - viewportWidth / 2;\r\n\r\n container.scrollTo({\r\n left: Math.max(targetScrollLeft, 0),\r\n behavior: 'smooth',\r\n });\r\n this.onScrolled();\r\n }\r\n\r\n // resize between panel left and right\r\n public startResize(event: MouseEvent): void {\r\n event.preventDefault();\r\n this.resizing = true;\r\n const containerRect = this.ganttBodyScroll.nativeElement.getBoundingClientRect();\r\n const left = containerRect.left;\r\n const min = 50;\r\n const max = containerRect.width - 75;\r\n const moveHandler = (e: MouseEvent): void => {\r\n if (!this.resizing) return;\r\n const x = e.clientX - left;\r\n const width = x < min ? min : x > max ? max : x;\r\n\r\n // direct DOM update (no Angular)\r\n this.leftPanel.nativeElement.style.width = width + 'px';\r\n if (this.leftBtn?.nativeElement) {\r\n this.leftBtn.nativeElement.style.left = `${width}px`;\r\n }\r\n };\r\n\r\n const upHandler = (): void => {\r\n this.resizing = false;\r\n window.removeEventListener('mousemove', moveHandler);\r\n window.removeEventListener('mouseup', upHandler);\r\n };\r\n\r\n window.addEventListener('mousemove', moveHandler);\r\n window.addEventListener('mouseup', upHandler);\r\n }\r\n\r\n public showTooltip(event: MouseEvent, task: GanttTask): void {\r\n this.tooltipTask = task;\r\n const tooltip = document.querySelector('.global-tooltip') as HTMLElement;\r\n if (!tooltip) return;\r\n tooltip.style.left = `${event.clientX + 10}px`;\r\n tooltip.style.top = `${event.clientY - 50}px`;\r\n tooltip.style.display = 'block';\r\n }\r\n\r\n public hideTooltip(): void {\r\n this.tooltipTask = null;\r\n const tooltip = document.querySelector('.global-tooltip') as HTMLElement;\r\n if (!tooltip) return;\r\n tooltip.style.display = 'none';\r\n }\r\n\r\n private buildTaskSlotsFromDates(): void {\r\n const slotMs = this.scaleSelected.secondes * 1000;\r\n this.tasks = this.rawTasks.map((t) => {\r\n if (!(t.start instanceof Date) || !(t.end instanceof Date)) {\r\n throw new Error(`Task \"${t.id}\" must have Date start/end values.`);\r\n }\r\n\r\n const startSlot = ((t.start as Date).getTime() - this.originDate) / slotMs;\r\n const endSlot = ((t.end as Date).getTime() - this.originDate) / slotMs;\r\n return { ...t, startSlot, endSlot };\r\n });\r\n }\r\n\r\n private buildTaskSlotsFromDuration(): void {\r\n this.tasks = this.rawTasks.map((t) => {\r\n if (typeof t.start !== 'number' || typeof t.end !== 'number') {\r\n throw new Error(`Task \"${t.id}\" must have numeric start/end values expressed in minutes.`);\r\n }\r\n\r\n const startSlot = t.start / this.scaleSelected.secondes;\r\n const endSlot = t.end / this.scaleSelected.secondes;\r\n return { ...t, startSlot, endSlot };\r\n });\r\n }\r\n\r\n // get all slots (timeline)\r\n private calculateTimelineSlots(): void {\r\n const maxSlot = Math.max(...this.tasks.map(t => t.endSlot ?? 0));\r\n if (maxSlot > 53000) {\r\n this.maxSlotsAlert = true;\r\n this.slots = [];\r\n return;\r\n }\r\n this.maxSlotsAlert = false;\r\n const buffer = [];\r\n let offsetX = 0;\r\n\r\n if (this.hasNegativeDependencySpace) {\r\n buffer.push({\r\n index: -1,\r\n x: 0,\r\n width: this.negativeSlotWidth,\r\n label: 'N/A'\r\n });\r\n offsetX = this.negativeSlotWidth;\r\n }\r\n\r\n for (let i = 0; i <= maxSlot + 2; i++) {\r\n buffer.push({\r\n index: i,\r\n x: offsetX + i * this.scaleSelected.px,\r\n width: this.scaleSelected.px,\r\n label: this.getSlotLabel(i) ?? 'Error',\r\n });\r\n }\r\n\r\n this.slots = buffer;\r\n }\r\n\r\n // get all paths of arrows\r\n protected getAllDependencyPaths(): void {\r\n this.dependencyPaths = this.tasks.flatMap((task): DependencyPath[] =>\r\n (task.dependencies ?? []).map(\r\n (dep: any): DependencyPath => ({\r\n from: dep,\r\n to: task.id,\r\n id: `${dep}->${task.id}`,\r\n path: this.getDependencyPath(dep, task.id),\r\n })\r\n )\r\n );\r\n }\r\n\r\n // get label for date header\r\n private getSlotLabel(index: number): string {\r\n if (this.dataType === 'calendar') {\r\n return this.labelConverter?.getLabelCalendar(index, this.defaultScale) ?? 'Error';\r\n }\r\n return this.labelConverter?.getLabelDuration(index, this.defaultScale) ?? 'Error';\r\n }\r\n}\r\n","<div class=\"gantt-root\" [style.max-height.px]=\"layout.rootMaxHeight\" [style.min-height.px]=\"100\">\n <!-- TOOLBAR -->\n <div class=\"toolbar\" [style.height.px]=\"buttonsHeight\">\n <div *ngIf=\"dateMode === 'utc' || dataType === 'duration'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scales\" (click)=\"setScale(s)\" [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <div *ngIf=\"dateMode !== 'utc' && dataType === 'calendar'\">\n <button class=\"gantt-button\" *ngFor=\"let s of scalesDate\" (click)=\"setScale(s)\"\n [class.active]=\"defaultScale === s\">\n {{ s }}\n </button>\n </div>\n <label *ngIf=\"maxSlotsAlert\" style=\"color: red;\">\n Data is too massive to show Gantt smoothly, try changing the scale\n </label>\n </div>\n <!-- TOOLTIP -->\n <div class=\"global-tooltip\" [style.display]=\"tooltipTask ? 'block' : 'none'\">\n <ng-container *ngIf=\"tooltipTask as task\">\n <div *ngFor=\"let column of visibleTooltipColumns\">\n <strong>{{ column?.title }}:</strong>\n {{ column?.valueGetter(task) }}\n </div>\n </ng-container>\n </div>\n <!-- BUTTONS FOR SCROLL GANTT -->\n <div *ngIf=\"!maxSlotsAlert && loading === false\" class=\"floating-nav\">\n <button class=\"nav-btn left\" (mousedown)=\"startScroll('left')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #leftBtn >\n ‹\n </button>\n <button class=\"nav-btn right\" (mousedown)=\"startScroll('right')\"\n (mouseup)=\"stopScroll()\" (mouseleave)=\"stopScroll()\" #rightBtn>\n ›\n </button>\n </div>\n <!-- LOADING -->\n <div class=\"loading-overlay\" *ngIf=\"loading\" [style.top]=\"'50%'\">\n <div class=\"spinner\"></div>\n </div>\n <!-- SINGLE VERTICAL SCROLL -->\n <div class=\"gantt-body\" #ganttBodyScroll>\n <!-- LEFT PANEL -->\n <div class=\"left-panel\" #leftPanel>\n <div class=\"task-row header\" [style.height.px]=\"headerHeight\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.title }}\n </div>\n </div>\n <div class=\"task-row\" *ngFor=\"let task of tasks\" [style.height.px]=\"rowHeight\"\n (click)=\"selectTask(task, true); $event.stopPropagation()\"\n [class.highlighted-row]=\"selectedTaskId === task.id\">\n <div class=\"cell\" *ngFor=\"let column of visibleGridColumns\" [style.width.px]=\"column.width || 120\">\n {{ column?.valueGetter(task) }}\n </div>\n </div>\n </div>\n <!-- RESIZER -->\n <div class=\"resizer\" [style.height.px]=\"layout.resizerHeight\" (mousedown)=\"startResize($event)\">\n </div>\n <!-- RIGHT PANEL -->\n <div class=\"right-panel\" *ngIf=\"!maxSlotsAlert\">\n <!-- TIMELINE -->\n <div class=\"timeline-header\" #timelineHeader>\n <div class=\"timeline-slot\" *ngFor=\"let slot of slots\" [style.width.px]=\"slot.width\">\n {{ slot.label }}\n </div>\n </div>\n <!-- HORIZONTAL SCROLL ONLY -->\n <div class=\"horizontal-scroll\" (scroll)=\"onHorizontalScroll($event)\" #ganttScroll>\n <div class=\"gantt-content\" #ganttContent>\n <!-- GRID -->\n <div class=\"grid-layer\">\n <div *ngFor=\"let slot of slots; let i = index; trackBy: trackByIndex\" class=\"grid-line\"\n [style.left.px]=\"slot.x - 1\">\n </div>\n <!-- final vertical line -->\n <div class=\"grid-line\" [style.left.px]=\"ganttWidth - 1\">\n </div>\n <!-- horizontal lines -->\n <div class=\"horizontal-grid-layer\">\n <div *ngFor=\"let task of tasks; let i = index; trackBy: trackByIndex\"\n class=\"horizontal-line\" [style.top.px]=\"getGridTop(i)\">\n </div>\n <!-- final horizontal line -->\n <div class=\"horizontal-line\" [style.top.px]=\"ganttHeight\">\n </div>\n </div>\n </div>\n <!-- TASKS -->\n <div class=\"tasks-layer\">\n <div *ngFor=\"let task of viewTasks; let i = index; trackBy: trackByIndex\" class=\"task\"\n (mouseenter)=\"showTooltip($event, task)\" (mouseleave)=\"hideTooltip()\"\n (click)=\"selectTask(task, false); $event.stopPropagation()\"\n [class.highlighted-task]=\"selectedTaskId === task.id\" [style.left.px]=\"task.x\"\n [style.top.px]=\"task.y\" [style.width.px]=\"task.width\" [style.height.px]=\"task.height\">\n <div class=\"task-label\">\n {{ task.label }}\n </div>\n </div>\n </div>\n <!-- DEPENDENCIES -->\n <svg class=\"dependencies-svg\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\"\n orient=\"auto\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#868d97\" />\n </marker>\n </defs>\n <g class=\"dependencies-normal\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"dependency\"\n [class.hidden]=\"hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n <g class=\"dependencies-highlighted\">\n <path *ngFor=\"let dep of dependencyPaths\" [attr.d]=\"dep.path\" class=\"highlighted-dependency\"\n [class.hidden]=\"!hoveredDependencyIds.has(dep.id)\" marker-end=\"url(#arrow)\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n <div class=\"right-panel-dead\" *ngIf=\"maxSlotsAlert\"></div>\n </div>\n</div>","import { NgModule } from \"@angular/core\";\r\nimport { GanttLiteComponent } from \"./lib/gantt-lite.component\";\r\nimport { CommonModule } from \"@angular/common\";\r\n\r\n@NgModule({\r\n declarations: [GanttLiteComponent],\r\n imports: [CommonModule],\r\n exports: [GanttLiteComponent]\r\n})\r\nexport class GanttLiteModule {}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
Binary file
@@ -156,4 +156,25 @@ declare class GanttLiteModule {
156
156
  static ɵinj: i0.ɵɵInjectorDeclaration<GanttLiteModule>;
157
157
  }
158
158
 
159
- export { GanttLiteComponent, GanttLiteModule };
159
+ declare class SlotIndexToDateLabelConverter {
160
+ private dateMode;
161
+ private originDate;
162
+ private slotSeconds;
163
+ private hasNegativeDependencySpace;
164
+ private timeFormatter;
165
+ private dayFormatter;
166
+ constructor(dateMode: DateMode, originDate: number, slotSeconds: number, hasNegativeDependencySpace: boolean);
167
+ private initFormatters;
168
+ private get slotMs();
169
+ private indexToDate;
170
+ getLabelCalendar(index: number, scale: string): string;
171
+ getLabelDuration(index: number, scale: string): string;
172
+ private formatTime;
173
+ private formatDay;
174
+ private formatRange;
175
+ private formatMonthRange;
176
+ private formatYearRange;
177
+ }
178
+
179
+ export { GanttLiteBase, GanttLiteComponent, GanttLiteModule, SlotIndexToDateLabelConverter };
180
+ export type { DataType, DateMode, DependencyPath, GanttColumn, GanttData, GanttScale, GanttTask, GanttTaskView, ScaleConfig, TimelineSlot };