@memberjunction/ng-gantt 6.2.0-edge.0 → 6.2.0-edge.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.
|
@@ -81,9 +81,17 @@ export declare class MjGanttChartComponent implements AfterViewInit, OnChanges,
|
|
|
81
81
|
BeforeColumnResize: EventEmitter<BeforeColumnResizeEventArgs>;
|
|
82
82
|
/** Fired after a grid column is resized. */
|
|
83
83
|
AfterColumnResize: EventEmitter<AfterColumnResizeEventArgs>;
|
|
84
|
-
|
|
84
|
+
GanttContainer: ElementRef<HTMLDivElement>;
|
|
85
|
+
/** @deprecated Use {@link GanttContainer}. */
|
|
86
|
+
get ganttContainer(): ElementRef<HTMLDivElement>;
|
|
87
|
+
/** @deprecated Use {@link GanttContainer}. */
|
|
88
|
+
set ganttContainer(value: ElementRef<HTMLDivElement>);
|
|
85
89
|
/** @internal */
|
|
86
|
-
|
|
90
|
+
Loading: boolean;
|
|
91
|
+
/** @deprecated Use {@link Loading}. */
|
|
92
|
+
get loading(): boolean;
|
|
93
|
+
/** @deprecated Use {@link Loading}. */
|
|
94
|
+
set loading(value: boolean);
|
|
87
95
|
private gantt;
|
|
88
96
|
private initialized;
|
|
89
97
|
private _zoomLevel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gantt-chart.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/gantt-chart.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,UAAU,EAAa,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAsD,MAAM,eAAe,CAAC;AAGtM,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpI,OAAO,EACH,wBAAwB,EACxB,yBAAyB,EAMzB,KAAK,kBAAkB,EAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EAM5B,MAAM,wBAAwB,CAAC;;AA2BhC;;;;;;;;;;;;;;;GAeG;AACH,qBAkFa,qBAAsB,YAAW,aAAa,EAAE,SAAS,EAAE,SAAS;IAC7E,8CAA8C;IACrC,KAAK,EAAE,aAAa,EAAE,CAAM;IAErC,+CAA+C;IACtC,KAAK,EAAE,aAAa,EAAE,CAAM;IAErC,0CAA0C;IACjC,MAAM,SAAW;IAE1B,+CAA+C;IACtC,QAAQ,UAAQ;IAEzB,kCAAkC;IACzB,YAAY,UAAQ;IAE7B,4EAA4E;IACnE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAQ;IAEjD,gFAAgF;IACvE,UAAU,UAAQ;IAE3B,uDAAuD;IAC9C,gBAAgB,UAAS;IAElC;;;OAGG;IACM,gBAAgB,UAAQ;IAEjC,2DAA2D;IAClD,gBAAgB,UAAQ;IAEjC;;;;;;OAMG;IACM,kBAAkB,UAAQ;IAEnC,gFAAgF;IACvE,cAAc,UAAQ;IAE/B,IACI,SAAS,CAAC,KAAK,EAAE,MAAM,EAU1B;IACD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IACI,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,EAEpD;IACD,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzC;IAED;;;OAGG;IACH,IACI,SAAS,CAAC,KAAK,EAAE,kBAAkB,EAStC;IACD,IAAI,SAAS,IAAI,kBAAkB,CAElC;IAED,uDAAuD;IAC7C,WAAW,sCAA6C;IAElE,8DAA8D;IACpD,iBAAiB,sCAA6C;IAExE,8EAA8E;IACpE,WAAW,sCAA6C;IAElE,uFAAuF;IAC7E,gBAAgB,0CAAiD;IAE3E,uDAAuD;IAC7C,eAAe,yCAAgD;IAEzE,2DAA2D;IACjD,gBAAgB,0CAAiD;IAE3E,0DAA0D;IAChD,eAAe,yCAAgD;IAEzE,gDAAgD;IACtC,kBAAkB,4CAAmD;IAE/E,4CAA4C;IAClC,iBAAiB,2CAAkD;IAE7B,cAAc,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAE5F,gBAAgB;IAChB,OAAO,UAAQ;
|
|
1
|
+
{"version":3,"file":"gantt-chart.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/gantt-chart.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -147,9 +147,25 @@ export class MjGanttChartComponent {
|
|
|
147
147
|
BeforeColumnResize = new EventEmitter();
|
|
148
148
|
/** Fired after a grid column is resized. */
|
|
149
149
|
AfterColumnResize = new EventEmitter();
|
|
150
|
-
|
|
150
|
+
GanttContainer;
|
|
151
|
+
/** @deprecated Use {@link GanttContainer}. */
|
|
152
|
+
get ganttContainer() {
|
|
153
|
+
return this.GanttContainer;
|
|
154
|
+
}
|
|
155
|
+
/** @deprecated Use {@link GanttContainer}. */
|
|
156
|
+
set ganttContainer(value) {
|
|
157
|
+
this.GanttContainer = value;
|
|
158
|
+
}
|
|
151
159
|
/** @internal */
|
|
152
|
-
|
|
160
|
+
Loading = true;
|
|
161
|
+
/** @deprecated Use {@link Loading}. */
|
|
162
|
+
get loading() {
|
|
163
|
+
return this.Loading;
|
|
164
|
+
}
|
|
165
|
+
/** @deprecated Use {@link Loading}. */
|
|
166
|
+
set loading(value) {
|
|
167
|
+
this.Loading = value;
|
|
168
|
+
}
|
|
153
169
|
gantt = null;
|
|
154
170
|
initialized = false;
|
|
155
171
|
_zoomLevel = 'week';
|
|
@@ -195,16 +211,16 @@ export class MjGanttChartComponent {
|
|
|
195
211
|
try {
|
|
196
212
|
const module = await import('dhtmlx-gantt');
|
|
197
213
|
this.gantt = module.gantt;
|
|
198
|
-
this.
|
|
214
|
+
this.Loading = false;
|
|
199
215
|
this.cdr.detectChanges();
|
|
200
|
-
if (this.Items.length > 0 && this.
|
|
216
|
+
if (this.Items.length > 0 && this.GanttContainer) {
|
|
201
217
|
this.initGantt();
|
|
202
218
|
this.cdr.markForCheck();
|
|
203
219
|
}
|
|
204
220
|
}
|
|
205
221
|
catch (error) {
|
|
206
222
|
console.error('@memberjunction/ng-gantt: Failed to load dhtmlx-gantt:', error);
|
|
207
|
-
this.
|
|
223
|
+
this.Loading = false;
|
|
208
224
|
this.cdr.markForCheck();
|
|
209
225
|
}
|
|
210
226
|
}
|
|
@@ -214,10 +230,10 @@ export class MjGanttChartComponent {
|
|
|
214
230
|
if (changes['Height'] && this.initialized) {
|
|
215
231
|
this.gantt.setSizes();
|
|
216
232
|
}
|
|
217
|
-
if (this.initialized && this.
|
|
233
|
+
if (this.initialized && this.GanttContainer) {
|
|
218
234
|
this.updateData();
|
|
219
235
|
}
|
|
220
|
-
else if (!this.initialized && this.
|
|
236
|
+
else if (!this.initialized && this.GanttContainer && this.Items.length > 0) {
|
|
221
237
|
this.initGantt();
|
|
222
238
|
}
|
|
223
239
|
}
|
|
@@ -254,14 +270,14 @@ export class MjGanttChartComponent {
|
|
|
254
270
|
this.applyGridConfig(g);
|
|
255
271
|
this.initTooltips(g);
|
|
256
272
|
// Initialize
|
|
257
|
-
g.init(this.
|
|
273
|
+
g.init(this.GanttContainer.nativeElement);
|
|
258
274
|
this.initialized = true;
|
|
259
275
|
this.initZoom(g);
|
|
260
276
|
this.bindGridCellTooltips(g);
|
|
261
277
|
this.bindGridEvents(g);
|
|
262
278
|
// ResizeObserver ensures DHTMLX layout recalculates whenever container gets valid non-zero dimensions
|
|
263
279
|
this.resizeObserver?.disconnect();
|
|
264
|
-
if (typeof ResizeObserver !== 'undefined' && this.
|
|
280
|
+
if (typeof ResizeObserver !== 'undefined' && this.GanttContainer?.nativeElement) {
|
|
265
281
|
this.resizeObserver = new ResizeObserver((entries) => {
|
|
266
282
|
for (const entry of entries) {
|
|
267
283
|
if (entry.contentRect.width > 0 && entry.contentRect.height > 0 && this.initialized && this.gantt) {
|
|
@@ -269,7 +285,7 @@ export class MjGanttChartComponent {
|
|
|
269
285
|
}
|
|
270
286
|
}
|
|
271
287
|
});
|
|
272
|
-
this.resizeObserver.observe(this.
|
|
288
|
+
this.resizeObserver.observe(this.GanttContainer.nativeElement);
|
|
273
289
|
}
|
|
274
290
|
// Event: click
|
|
275
291
|
g.attachEvent('onTaskClick', (id) => {
|
|
@@ -298,9 +314,9 @@ export class MjGanttChartComponent {
|
|
|
298
314
|
}
|
|
299
315
|
}
|
|
300
316
|
};
|
|
301
|
-
this.
|
|
317
|
+
this.GanttContainer.nativeElement.addEventListener('dblclick', dblClickHandler);
|
|
302
318
|
this.destroyDblClick = () => {
|
|
303
|
-
this.
|
|
319
|
+
this.GanttContainer?.nativeElement?.removeEventListener('dblclick', dblClickHandler);
|
|
304
320
|
};
|
|
305
321
|
// Event: drag/resize (only fires if not readonly)
|
|
306
322
|
if (!this.ReadOnly) {
|
|
@@ -514,7 +530,7 @@ export class MjGanttChartComponent {
|
|
|
514
530
|
levels: BuildDefaultGanttZoomLevels(),
|
|
515
531
|
trigger: 'wheel',
|
|
516
532
|
useKey: 'ctrlKey',
|
|
517
|
-
element: () => this.
|
|
533
|
+
element: () => this.GanttContainer.nativeElement,
|
|
518
534
|
handler: (event) => this.handleWheelZoom(event),
|
|
519
535
|
});
|
|
520
536
|
zoom.setLevel(this._zoomLevel);
|
|
@@ -570,7 +586,7 @@ export class MjGanttChartComponent {
|
|
|
570
586
|
i0.ɵɵviewQuery(_c0, 5);
|
|
571
587
|
} if (rf & 2) {
|
|
572
588
|
let _t;
|
|
573
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
589
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.GanttContainer = _t.first);
|
|
574
590
|
} }, inputs: { Items: "Items", Links: "Links", Height: "Height", ReadOnly: "ReadOnly", ShowProgress: "ShowProgress", Columns: "Columns", EnableZoom: "EnableZoom", ShowZoomControls: "ShowZoomControls", EnableGridScroll: "EnableGridScroll", EnableGridResize: "EnableGridResize", EnableColumnResize: "EnableColumnResize", EnableTooltips: "EnableTooltips", GridWidth: "GridWidth", ColumnWidths: "ColumnWidths", ZoomLevel: "ZoomLevel" }, outputs: { ItemClicked: "ItemClicked", ItemDoubleClicked: "ItemDoubleClicked", ItemChanged: "ItemChanged", BeforeZoomChange: "BeforeZoomChange", AfterZoomChange: "AfterZoomChange", BeforeGridResize: "BeforeGridResize", AfterGridResize: "AfterGridResize", BeforeColumnResize: "BeforeColumnResize", AfterColumnResize: "AfterColumnResize" }, features: [i0.ɵɵNgOnChangesFeature], decls: 4, vars: 6, consts: [["ganttContainer", ""], [1, "mj-gantt-loading"], ["role", "group", "aria-label", "Gantt zoom", 1, "mj-gantt-zoom"], [1, "mj-gantt-container"], ["type", "button", "title", "Zoom out (Ctrl + scroll)", 1, "mj-gantt-zoom__btn", 3, "click", "disabled"], ["aria-hidden", "true"], [1, "mj-gantt-zoom__label"], ["type", "button", "title", "Zoom in (Ctrl + scroll)", 1, "mj-gantt-zoom__btn", 3, "click", "disabled"]], template: function MjGanttChartComponent_Template(rf, ctx) { if (rf & 1) {
|
|
575
591
|
i0.ɵɵconditionalCreate(0, MjGanttChartComponent_Conditional_0_Template, 2, 0, "div", 1);
|
|
576
592
|
i0.ɵɵconditionalCreate(1, MjGanttChartComponent_Conditional_1_Template, 9, 3, "div", 2);
|
|
@@ -653,7 +669,7 @@ export class MjGanttChartComponent {
|
|
|
653
669
|
type: Output
|
|
654
670
|
}], AfterColumnResize: [{
|
|
655
671
|
type: Output
|
|
656
|
-
}],
|
|
672
|
+
}], GanttContainer: [{
|
|
657
673
|
type: ViewChild,
|
|
658
674
|
args: ['ganttContainer', { static: false }]
|
|
659
675
|
}] }); })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gantt-chart.component.js","sourceRoot":"","sources":["../../../src/lib/components/gantt-chart.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ElementRef, ViewChild, AfterViewInit, OnChanges, OnDestroy, SimpleChanges, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GanttItemData, GanttLinkData, GanttColumnDef, GanttItemClickedEvent, GanttItemChangedEvent } from '../models/gantt.models';\nimport {\n AfterZoomChangeEventArgs,\n BeforeZoomChangeEventArgs,\n BuildDefaultGanttZoomLevels,\n GanttZoomPercent,\n IsGanttZoomLevelName,\n NextZoomInLevel,\n NextZoomOutLevel,\n type GanttZoomLevelName,\n} from '../models/gantt-zoom';\nimport {\n AfterColumnResizeEventArgs,\n AfterGridResizeEventArgs,\n BeforeColumnResizeEventArgs,\n BeforeGridResizeEventArgs,\n ClampGanttGridWidth,\n GANTT_DEFAULT_GRID_WIDTH,\n GANTT_MAX_GRID_WIDTH,\n GANTT_MIN_GRID_WIDTH,\n SanitizeColumnWidths,\n} from '../models/gantt-layout';\nimport {\n BuildGanttTaskTooltipHtml,\n EnsureGanttTooltipStyles,\n GANTT_GRID_CELL_TOOLTIP_SELECTOR,\n} from '../models/gantt-tooltip';\nimport type { GanttStatic, GridColumn, Task as DHTask, Link as DHLink } from 'dhtmlx-gantt';\n\n/** Default grid columns if none are provided. Pixel widths so the grid can scroll. */\nconst DEFAULT_COLUMNS: GanttColumnDef[] = [\n { Name: 'text', Label: 'Name', Tree: true, Width: 220 },\n { Name: 'start_date', Label: 'Start', Align: 'center', Width: 96 },\n { Name: 'duration', Label: 'Days', Align: 'center', Width: 64 },\n { Name: 'progress', Label: '%', Align: 'center', Width: 52, Template: (obj: DHTask) => Math.round((obj.progress || 0) * 100) + '%' },\n];\n\ninterface DhxGridColumn {\n name: string;\n label: string;\n width: number;\n align?: 'left' | 'center' | 'right';\n tree?: boolean;\n template?: (item: DHTask) => string;\n resize?: boolean;\n min_width?: number;\n}\n\n/**\n * Generic Gantt chart component wrapping DHTMLX Gantt.\n *\n * Renders items as bars on a timeline with hierarchy, dependency arrows,\n * and progress indicators. The library is loaded lazily via dynamic import.\n *\n * @example\n * ```html\n * <mj-gantt-chart\n * [Items]=\"projectTasks\"\n * [Links]=\"taskDependencies\"\n * [Height]=\"'600px'\"\n * (ItemClicked)=\"onTaskClicked($event)\">\n * </mj-gantt-chart>\n * ```\n */\n@Component({\n selector: 'mj-gantt-chart',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./gantt-theme.css'],\n template: `\n @if (loading) {\n <div class=\"mj-gantt-loading\">Loading Gantt chart...</div>\n }\n @if (ShowZoomControls && !loading) {\n <div class=\"mj-gantt-zoom\" role=\"group\" aria-label=\"Gantt zoom\">\n <button type=\"button\" class=\"mj-gantt-zoom__btn\" (click)=\"ZoomOut()\"\n [disabled]=\"!CanZoomOut\" title=\"Zoom out (Ctrl + scroll)\">\n <span aria-hidden=\"true\">−</span>\n </button>\n <span class=\"mj-gantt-zoom__label\">{{ CurrentZoomPercent }}%</span>\n <button type=\"button\" class=\"mj-gantt-zoom__btn\" (click)=\"ZoomIn()\"\n [disabled]=\"!CanZoomIn\" title=\"Zoom in (Ctrl + scroll)\">\n <span aria-hidden=\"true\">+</span>\n </button>\n </div>\n }\n <div #ganttContainer class=\"mj-gantt-container\" [style.height]=\"Height\"\n [style.display]=\"loading ? 'none' : 'block'\"></div>\n `,\n styles: [`\n :host { display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 0; flex: 1; font-family: var(--mj-font-family); }\n\n .mj-gantt-container {\n width: 100%;\n height: 100%;\n min-height: 0;\n flex: 1;\n position: relative;\n }\n\n .mj-gantt-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--mj-space-16) var(--mj-space-5);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n }\n\n .mj-gantt-zoom {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-1);\n margin-bottom: var(--mj-space-2);\n }\n .mj-gantt-zoom__btn {\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: var(--mj-text-base);\n line-height: 1;\n }\n .mj-gantt-zoom__btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n }\n .mj-gantt-zoom__btn:disabled {\n color: var(--mj-text-disabled);\n cursor: default;\n }\n .mj-gantt-zoom__label {\n min-width: 3.25rem;\n text-align: center;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n }\n\n :host ::ng-deep .gantt_task .gantt_task_content { font-weight: var(--mj-font-medium); }\n `]\n})\nexport class MjGanttChartComponent implements AfterViewInit, OnChanges, OnDestroy {\n /** Items (bars) to render on the timeline. */\n @Input() Items: GanttItemData[] = [];\n\n /** Dependency links (arrows) between items. */\n @Input() Links: GanttLinkData[] = [];\n\n /** CSS height for the chart container. */\n @Input() Height = '500px';\n\n /** Disables drag, resize, and link editing. */\n @Input() ReadOnly = true;\n\n /** Show progress fill on bars. */\n @Input() ShowProgress = true;\n\n /** Grid column definitions. Defaults to Name, Start, Duration, Progress. */\n @Input() Columns: GanttColumnDef[] | null = null;\n\n /** When true, Ctrl/Cmd + wheel and ZoomIn/ZoomOut change the timeline scale. */\n @Input() EnableZoom = true;\n\n /** Show built-in +/- zoom controls above the chart. */\n @Input() ShowZoomControls = false;\n\n /**\n * Give the left grid its own horizontal scrollbar so columns can be\n * wider than the pane without growing the timeline.\n */\n @Input() EnableGridScroll = true;\n\n /** Show the splitter between the grid and the timeline. */\n @Input() EnableGridResize = true;\n\n /**\n * Ask DHTMLX to allow dragging grid column borders.\n * Column-border resize is a DHTMLX Gantt PRO feature — the GPL/community\n * build we ship does not render those handles. The grid/timeline splitter\n * (`EnableGridResize`) still works. Hover the Name cell or bar for the\n * full title when the column is too narrow.\n */\n @Input() EnableColumnResize = true;\n\n /** Show the full item name (and dates) on hover for truncated grid/bar text. */\n @Input() EnableTooltips = true;\n\n @Input()\n set GridWidth(value: number) {\n const next = ClampGanttGridWidth(value);\n if (next === this._gridWidth) {\n return;\n }\n this._gridWidth = next;\n if (this.initialized && this.gantt) {\n this.gantt.config.grid_width = next;\n this.gantt.setSizes();\n }\n }\n get GridWidth(): number {\n return this._gridWidth;\n }\n\n @Input()\n set ColumnWidths(value: Record<string, number> | null) {\n this._columnWidths = SanitizeColumnWidths(value);\n }\n get ColumnWidths(): Record<string, number> {\n return this._columnWidths;\n }\n\n /**\n * Timeline scale to apply. Callers can bind a persisted level here.\n * Defaults to week (100%).\n */\n @Input()\n set ZoomLevel(value: GanttZoomLevelName) {\n if (!IsGanttZoomLevelName(value) || value === this._zoomLevel) {\n return;\n }\n if (this.initialized && this.EnableZoom) {\n this.applyZoom(value);\n return;\n }\n this._zoomLevel = value;\n }\n get ZoomLevel(): GanttZoomLevelName {\n return this._zoomLevel;\n }\n\n /** Emitted when an item bar or grid row is clicked. */\n @Output() ItemClicked = new EventEmitter<GanttItemClickedEvent>();\n\n /** Emitted when an item bar or grid row is double-clicked. */\n @Output() ItemDoubleClicked = new EventEmitter<GanttItemClickedEvent>();\n\n /** Emitted when an item is changed via drag/resize (only if not ReadOnly). */\n @Output() ItemChanged = new EventEmitter<GanttItemChangedEvent>();\n\n /** Fired before a zoom change. Set `event.Cancel = true` to keep the current level. */\n @Output() BeforeZoomChange = new EventEmitter<BeforeZoomChangeEventArgs>();\n\n /** Fired after a zoom change that was not canceled. */\n @Output() AfterZoomChange = new EventEmitter<AfterZoomChangeEventArgs>();\n\n /** Fired before the grid/timeline splitter drag starts. */\n @Output() BeforeGridResize = new EventEmitter<BeforeGridResizeEventArgs>();\n\n /** Fired after the grid/timeline splitter is released. */\n @Output() AfterGridResize = new EventEmitter<AfterGridResizeEventArgs>();\n\n /** Fired before a grid column resize starts. */\n @Output() BeforeColumnResize = new EventEmitter<BeforeColumnResizeEventArgs>();\n\n /** Fired after a grid column is resized. */\n @Output() AfterColumnResize = new EventEmitter<AfterColumnResizeEventArgs>();\n\n @ViewChild('ganttContainer', { static: false }) ganttContainer!: ElementRef<HTMLDivElement>;\n\n /** @internal */\n loading = true;\n private gantt: GanttStatic | null = null;\n private initialized = false;\n private _zoomLevel: GanttZoomLevelName = 'week';\n private zoomInitialized = false;\n private _gridWidth = GANTT_DEFAULT_GRID_WIDTH;\n private _columnWidths: Record<string, number> = {};\n private readonly cdr = inject(ChangeDetectorRef);\n\n public get CurrentGridWidth(): number {\n return this._gridWidth;\n }\n\n public get CurrentColumnWidths(): Record<string, number> {\n return { ...this._columnWidths };\n }\n\n public get CurrentZoomPercent(): number {\n return GanttZoomPercent(this._zoomLevel);\n }\n\n public get CanZoomIn(): boolean {\n return NextZoomInLevel(this._zoomLevel) != null;\n }\n\n public get CanZoomOut(): boolean {\n return NextZoomOutLevel(this._zoomLevel) != null;\n }\n\n /** One step toward hour / more detail. */\n public ZoomIn(): void {\n const next = NextZoomInLevel(this._zoomLevel);\n if (next) {\n this.applyZoom(next);\n }\n }\n\n /** One step toward year / more context. */\n public ZoomOut(): void {\n const next = NextZoomOutLevel(this._zoomLevel);\n if (next) {\n this.applyZoom(next);\n }\n }\n\n public SetZoomLevel(level: GanttZoomLevelName): void {\n if (IsGanttZoomLevelName(level)) {\n this.applyZoom(level);\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n try {\n const module = await import('dhtmlx-gantt');\n this.gantt = module.gantt;\n this.loading = false;\n this.cdr.detectChanges();\n\n if (this.Items.length > 0 && this.ganttContainer) {\n this.initGantt();\n this.cdr.markForCheck();\n }\n } catch (error) {\n console.error('@memberjunction/ng-gantt: Failed to load dhtmlx-gantt:', error);\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.gantt) return;\n\n if (changes['Height'] && this.initialized) {\n this.gantt.setSizes();\n }\n\n if (this.initialized && this.ganttContainer) {\n this.updateData();\n } else if (!this.initialized && this.ganttContainer && this.Items.length > 0) {\n this.initGantt();\n }\n }\n\n private destroyDblClick?: () => void;\n private resizeObserver?: ResizeObserver;\n\n ngOnDestroy(): void {\n this.destroyDblClick?.();\n this.destroyDblClick = undefined;\n this.resizeObserver?.disconnect();\n this.resizeObserver = undefined;\n if (this.initialized && this.gantt) {\n this.gantt.clearAll();\n this.initialized = false;\n }\n }\n\n /** Rebuilds the Gantt data from the current `Items` and `Links` inputs. */\n public Refresh(): void {\n if (this.initialized) {\n this.updateData();\n }\n }\n\n private initGantt(): void {\n const g = this.gantt!;\n g.clearAll();\n\n // Configuration\n g.config.date_format = '%Y-%m-%d %H:%i';\n g.config.show_progress = this.ShowProgress;\n g.config.show_links = true;\n g.config.readonly = this.ReadOnly;\n g.config.details_on_dblclick = false;\n g.config.open_tree_initially = true;\n g.config.fit_tasks = true;\n g.config.row_height = 36;\n this.applyGridConfig(g);\n this.initTooltips(g);\n\n // Initialize\n g.init(this.ganttContainer.nativeElement);\n this.initialized = true;\n this.initZoom(g);\n this.bindGridCellTooltips(g);\n this.bindGridEvents(g);\n\n // ResizeObserver ensures DHTMLX layout recalculates whenever container gets valid non-zero dimensions\n this.resizeObserver?.disconnect();\n if (typeof ResizeObserver !== 'undefined' && this.ganttContainer?.nativeElement) {\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0 && this.initialized && this.gantt) {\n this.gantt.setSizes();\n }\n }\n });\n this.resizeObserver.observe(this.ganttContainer.nativeElement);\n }\n\n // Event: click\n g.attachEvent('onTaskClick', (id: string) => {\n const item = this.Items.find(i => UUIDsEqual(i.ID, id));\n if (item) {\n this.ItemClicked.emit({ Item: item });\n }\n return true;\n });\n\n // Event: dblclick (via DHTMLX attachEvent)\n g.attachEvent('onTaskDblClick', (id: string) => {\n const item = this.Items.find(i => UUIDsEqual(i.ID, id));\n if (item) {\n this.ItemDoubleClicked.emit({ Item: item });\n }\n return false; // Suppress default DHTMLX lightbox\n });\n\n // Native DOM dblclick listener guarantees double click fires even when readonly = true\n this.destroyDblClick?.();\n const dblClickHandler = (e: MouseEvent) => {\n const taskId = g.locate(e);\n if (taskId !== null && taskId !== undefined) {\n const item = this.Items.find(i => UUIDsEqual(i.ID, String(taskId)));\n if (item) {\n this.ItemDoubleClicked.emit({ Item: item });\n }\n }\n };\n this.ganttContainer.nativeElement.addEventListener('dblclick', dblClickHandler);\n this.destroyDblClick = () => {\n this.ganttContainer?.nativeElement?.removeEventListener('dblclick', dblClickHandler);\n };\n\n // Event: drag/resize (only fires if not readonly)\n if (!this.ReadOnly) {\n g.attachEvent('onAfterTaskDrag', (id: string) => {\n const task = g.getTask(id);\n const item = this.Items.find(i => UUIDsEqual(i.ID, id));\n if (item && task) {\n this.ItemChanged.emit({\n Item: item,\n NewStartDate: task.start_date as unknown as Date,\n NewEndDate: task.end_date as unknown as Date,\n NewDuration: task.duration as number,\n });\n }\n });\n }\n\n this.updateData();\n\n // Force layout after render\n setTimeout(() => g.setSizes(), 0);\n }\n\n private updateData(): void {\n if (!this.initialized || !this.gantt) return;\n const g = this.gantt;\n\n const data: Partial<DHTask>[] = this.Items.map(item => {\n const startDate = item.StartDate instanceof Date ? item.StartDate : new Date(item.StartDate);\n let duration = item.Duration ?? 1;\n if (item.EndDate) {\n const endDate = item.EndDate instanceof Date ? item.EndDate : new Date(item.EndDate);\n duration = Math.max(1, Math.ceil((endDate.getTime() - startDate.getTime()) / 86400000));\n }\n\n const rawProgress = item.Progress ?? 0;\n const progress = rawProgress > 1 ? rawProgress / 100 : rawProgress;\n\n return {\n id: item.ID,\n text: item.Name,\n start_date: this.formatDate(startDate) as any,\n duration,\n progress,\n parent: item.ParentID || 0,\n open: item.Open !== false,\n };\n });\n\n const links: Partial<DHLink>[] = this.Links.map(link => ({\n id: link.ID,\n source: link.SourceID,\n target: link.TargetID,\n type: this.mapLinkType(link.Type),\n }));\n\n g.clearAll();\n g.parse({ data: data as DHTask[], links: links as DHLink[] });\n\n setTimeout(() => g.setSizes(), 0);\n }\n\n private applyGridConfig(g: GanttStatic): void {\n g.config.autofit = false;\n g.config.keep_grid_width = true;\n g.config.grid_elastic_columns = false;\n g.config.min_grid_column_width = 48;\n g.config.grid_width = this._gridWidth;\n g.config.columns = this.buildGridColumns();\n if (this.EnableGridScroll || this.EnableGridResize) {\n g.config.layout = this.buildScrollableLayout();\n }\n }\n\n private buildGridColumns(): DhxGridColumn[] {\n const cols = this.Columns ?? DEFAULT_COLUMNS;\n return cols.map((col) => {\n const mapped: DhxGridColumn = {\n name: col.Name,\n label: col.Label,\n width: this.resolveColumnWidth(col),\n min_width: 48,\n resize: this.EnableColumnResize && col.Resize !== false,\n };\n if (col.Align) {\n mapped.align = col.Align;\n }\n if (col.Tree) {\n mapped.tree = true;\n }\n if (col.Template) {\n mapped.template = col.Template;\n }\n return mapped;\n });\n }\n\n private resolveColumnWidth(col: GanttColumnDef): number {\n const override = this._columnWidths[col.Name];\n if (typeof override === 'number' && override >= 40) {\n return Math.round(override);\n }\n if (typeof col.Width === 'number' && col.Width > 0) {\n return col.Width;\n }\n if (typeof col.Width === 'string' && col.Width !== '*') {\n const parsed = Number(col.Width);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n return 120;\n }\n\n private buildScrollableLayout(): GanttStatic['config']['layout'] {\n return {\n css: 'gantt_container',\n cols: [\n {\n width: this._gridWidth,\n min_width: GANTT_MIN_GRID_WIDTH,\n max_width: GANTT_MAX_GRID_WIDTH,\n rows: [\n { view: 'grid', scrollable: true, scrollX: 'gridScroll', scrollY: 'scrollVer' },\n { view: 'scrollbar', id: 'gridScroll', height: 20 },\n ],\n },\n { resizer: this.EnableGridResize, width: 1 },\n {\n rows: [\n { view: 'timeline', scrollX: 'scrollHor', scrollY: 'scrollVer' },\n { view: 'scrollbar', id: 'scrollHor', height: 20 },\n ],\n },\n { view: 'scrollbar', id: 'scrollVer' },\n ],\n };\n }\n\n private bindGridEvents(g: GanttStatic): void {\n g.attachEvent('onGridResizeStart', (oldWidth: number) => {\n const before = new BeforeGridResizeEventArgs(oldWidth);\n this.BeforeGridResize.emit(before);\n return !before.Cancel;\n });\n g.attachEvent('onGridResizeEnd', (oldWidth: number, newWidth: number) => {\n const width = ClampGanttGridWidth(newWidth);\n this._gridWidth = width;\n this.AfterGridResize.emit(new AfterGridResizeEventArgs(width, oldWidth));\n this.cdr.markForCheck();\n return true;\n });\n g.attachEvent('onColumnResizeStart', (_index: number, column: GridColumn) => {\n const name = String(column.name ?? '');\n const before = new BeforeColumnResizeEventArgs(name, Number(column.width) || 0);\n this.BeforeColumnResize.emit(before);\n return !before.Cancel;\n });\n g.attachEvent('onColumnResizeEnd', (_index: number, column: GridColumn, newWidth: number) => {\n const name = String(column.name ?? '');\n this._columnWidths = { ...this._columnWidths, [name]: Math.round(newWidth) };\n this.AfterColumnResize.emit(new AfterColumnResizeEventArgs(\n name,\n Math.round(newWidth),\n this.CurrentColumnWidths,\n ));\n this.cdr.markForCheck();\n return true;\n });\n }\n\n private initTooltips(g: GanttStatic): void {\n if (!this.EnableTooltips) {\n return;\n }\n EnsureGanttTooltipStyles();\n g.plugins({ tooltip: true });\n g.templates.tooltip_text = (start, end, task) => this.tooltipHtmlForTask(task, start, end);\n }\n\n private bindGridCellTooltips(g: GanttStatic): void {\n const tooltips = g.ext?.tooltips;\n if (!this.EnableTooltips || !tooltips) {\n return;\n }\n tooltips.detach(GANTT_GRID_CELL_TOOLTIP_SELECTOR);\n tooltips.tooltipFor({\n selector: GANTT_GRID_CELL_TOOLTIP_SELECTOR,\n html: (event) => this.gridCellTooltip(g, event),\n });\n }\n\n private gridCellTooltip(g: GanttStatic, event: Event): string | void {\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n const cell = target.closest<HTMLElement>('[data-column-name]');\n const columnName = cell?.getAttribute('data-column-name');\n if (!columnName || !this.isNameColumn(columnName)) {\n return;\n }\n const id = g.locate(event);\n if (id == null || id === '' || !g.isTaskExists(id)) {\n return;\n }\n return this.tooltipHtmlForTask(g.getTask(id));\n }\n\n private isNameColumn(columnName: string): boolean {\n const cols = this.Columns ?? DEFAULT_COLUMNS;\n return cols.some((col, index) =>\n col.Name === columnName && (col.Tree === true || col.Name === 'text' || index === 0),\n );\n }\n\n private tooltipHtmlForTask(\n task: DHTask,\n start?: Date,\n end?: Date,\n ): string | void {\n const html = BuildGanttTaskTooltipHtml({\n Name: String(task?.text ?? ''),\n Start: start ?? task?.start_date ?? null,\n End: end ?? task?.end_date ?? null,\n Progress: typeof task?.progress === 'number' ? task.progress : null,\n });\n return html || undefined;\n }\n\n private initZoom(g: GanttStatic): void {\n if (!this.EnableZoom || this.zoomInitialized) {\n return;\n }\n const zoom = g.ext?.zoom;\n if (!zoom) {\n return;\n }\n zoom.init({\n levels: BuildDefaultGanttZoomLevels(),\n trigger: 'wheel',\n useKey: 'ctrlKey',\n element: () => this.ganttContainer.nativeElement,\n handler: (event: Event) => this.handleWheelZoom(event),\n });\n zoom.setLevel(this._zoomLevel);\n this.zoomInitialized = true;\n }\n\n private handleWheelZoom(event: Event): void {\n const wheel = event as WheelEvent;\n if (!wheel.ctrlKey && !wheel.metaKey) {\n return;\n }\n wheel.preventDefault();\n if (wheel.deltaY < 0) {\n this.ZoomIn();\n } else {\n this.ZoomOut();\n }\n }\n\n private applyZoom(toLevel: GanttZoomLevelName): void {\n if (!this.EnableZoom || toLevel === this._zoomLevel) {\n return;\n }\n const fromLevel = this._zoomLevel;\n const before = new BeforeZoomChangeEventArgs(\n fromLevel,\n toLevel,\n GanttZoomPercent(fromLevel),\n GanttZoomPercent(toLevel),\n );\n this.BeforeZoomChange.emit(before);\n if (before.Cancel) {\n return;\n }\n this._zoomLevel = toLevel;\n if (this.zoomInitialized) {\n this.gantt?.ext.zoom.setLevel(toLevel);\n }\n this.AfterZoomChange.emit(new AfterZoomChangeEventArgs(\n toLevel,\n GanttZoomPercent(toLevel),\n fromLevel,\n ));\n this.cdr.markForCheck();\n }\n\n private formatDate(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day} 00:00`;\n }\n\n private mapLinkType(type?: string): string {\n switch (type) {\n case 'FS': return '0';\n case 'SS': return '1';\n case 'FF': return '2';\n case 'SF': return '3';\n default: return '0';\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gantt-chart.component.js","sourceRoot":"","sources":["../../../src/lib/components/gantt-chart.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ElementRef, ViewChild, AfterViewInit, OnChanges, OnDestroy, SimpleChanges, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GanttItemData, GanttLinkData, GanttColumnDef, GanttItemClickedEvent, GanttItemChangedEvent } from '../models/gantt.models';\nimport {\n AfterZoomChangeEventArgs,\n BeforeZoomChangeEventArgs,\n BuildDefaultGanttZoomLevels,\n GanttZoomPercent,\n IsGanttZoomLevelName,\n NextZoomInLevel,\n NextZoomOutLevel,\n type GanttZoomLevelName,\n} from '../models/gantt-zoom';\nimport {\n AfterColumnResizeEventArgs,\n AfterGridResizeEventArgs,\n BeforeColumnResizeEventArgs,\n BeforeGridResizeEventArgs,\n ClampGanttGridWidth,\n GANTT_DEFAULT_GRID_WIDTH,\n GANTT_MAX_GRID_WIDTH,\n GANTT_MIN_GRID_WIDTH,\n SanitizeColumnWidths,\n} from '../models/gantt-layout';\nimport {\n BuildGanttTaskTooltipHtml,\n EnsureGanttTooltipStyles,\n GANTT_GRID_CELL_TOOLTIP_SELECTOR,\n} from '../models/gantt-tooltip';\nimport type { GanttStatic, GridColumn, Task as DHTask, Link as DHLink } from 'dhtmlx-gantt';\n\n/** Default grid columns if none are provided. Pixel widths so the grid can scroll. */\nconst DEFAULT_COLUMNS: GanttColumnDef[] = [\n { Name: 'text', Label: 'Name', Tree: true, Width: 220 },\n { Name: 'start_date', Label: 'Start', Align: 'center', Width: 96 },\n { Name: 'duration', Label: 'Days', Align: 'center', Width: 64 },\n { Name: 'progress', Label: '%', Align: 'center', Width: 52, Template: (obj: DHTask) => Math.round((obj.progress || 0) * 100) + '%' },\n];\n\ninterface DhxGridColumn {\n name: string;\n label: string;\n width: number;\n align?: 'left' | 'center' | 'right';\n tree?: boolean;\n template?: (item: DHTask) => string;\n resize?: boolean;\n min_width?: number;\n}\n\n/**\n * Generic Gantt chart component wrapping DHTMLX Gantt.\n *\n * Renders items as bars on a timeline with hierarchy, dependency arrows,\n * and progress indicators. The library is loaded lazily via dynamic import.\n *\n * @example\n * ```html\n * <mj-gantt-chart\n * [Items]=\"projectTasks\"\n * [Links]=\"taskDependencies\"\n * [Height]=\"'600px'\"\n * (ItemClicked)=\"onTaskClicked($event)\">\n * </mj-gantt-chart>\n * ```\n */\n@Component({\n selector: 'mj-gantt-chart',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./gantt-theme.css'],\n template: `\n @if (loading) {\n <div class=\"mj-gantt-loading\">Loading Gantt chart...</div>\n }\n @if (ShowZoomControls && !loading) {\n <div class=\"mj-gantt-zoom\" role=\"group\" aria-label=\"Gantt zoom\">\n <button type=\"button\" class=\"mj-gantt-zoom__btn\" (click)=\"ZoomOut()\"\n [disabled]=\"!CanZoomOut\" title=\"Zoom out (Ctrl + scroll)\">\n <span aria-hidden=\"true\">−</span>\n </button>\n <span class=\"mj-gantt-zoom__label\">{{ CurrentZoomPercent }}%</span>\n <button type=\"button\" class=\"mj-gantt-zoom__btn\" (click)=\"ZoomIn()\"\n [disabled]=\"!CanZoomIn\" title=\"Zoom in (Ctrl + scroll)\">\n <span aria-hidden=\"true\">+</span>\n </button>\n </div>\n }\n <div #ganttContainer class=\"mj-gantt-container\" [style.height]=\"Height\"\n [style.display]=\"loading ? 'none' : 'block'\"></div>\n `,\n styles: [`\n :host { display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 0; flex: 1; font-family: var(--mj-font-family); }\n\n .mj-gantt-container {\n width: 100%;\n height: 100%;\n min-height: 0;\n flex: 1;\n position: relative;\n }\n\n .mj-gantt-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--mj-space-16) var(--mj-space-5);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n }\n\n .mj-gantt-zoom {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-1);\n margin-bottom: var(--mj-space-2);\n }\n .mj-gantt-zoom__btn {\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: var(--mj-text-base);\n line-height: 1;\n }\n .mj-gantt-zoom__btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n }\n .mj-gantt-zoom__btn:disabled {\n color: var(--mj-text-disabled);\n cursor: default;\n }\n .mj-gantt-zoom__label {\n min-width: 3.25rem;\n text-align: center;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n }\n\n :host ::ng-deep .gantt_task .gantt_task_content { font-weight: var(--mj-font-medium); }\n `]\n})\nexport class MjGanttChartComponent implements AfterViewInit, OnChanges, OnDestroy {\n /** Items (bars) to render on the timeline. */\n @Input() Items: GanttItemData[] = [];\n\n /** Dependency links (arrows) between items. */\n @Input() Links: GanttLinkData[] = [];\n\n /** CSS height for the chart container. */\n @Input() Height = '500px';\n\n /** Disables drag, resize, and link editing. */\n @Input() ReadOnly = true;\n\n /** Show progress fill on bars. */\n @Input() ShowProgress = true;\n\n /** Grid column definitions. Defaults to Name, Start, Duration, Progress. */\n @Input() Columns: GanttColumnDef[] | null = null;\n\n /** When true, Ctrl/Cmd + wheel and ZoomIn/ZoomOut change the timeline scale. */\n @Input() EnableZoom = true;\n\n /** Show built-in +/- zoom controls above the chart. */\n @Input() ShowZoomControls = false;\n\n /**\n * Give the left grid its own horizontal scrollbar so columns can be\n * wider than the pane without growing the timeline.\n */\n @Input() EnableGridScroll = true;\n\n /** Show the splitter between the grid and the timeline. */\n @Input() EnableGridResize = true;\n\n /**\n * Ask DHTMLX to allow dragging grid column borders.\n * Column-border resize is a DHTMLX Gantt PRO feature — the GPL/community\n * build we ship does not render those handles. The grid/timeline splitter\n * (`EnableGridResize`) still works. Hover the Name cell or bar for the\n * full title when the column is too narrow.\n */\n @Input() EnableColumnResize = true;\n\n /** Show the full item name (and dates) on hover for truncated grid/bar text. */\n @Input() EnableTooltips = true;\n\n @Input()\n set GridWidth(value: number) {\n const next = ClampGanttGridWidth(value);\n if (next === this._gridWidth) {\n return;\n }\n this._gridWidth = next;\n if (this.initialized && this.gantt) {\n this.gantt.config.grid_width = next;\n this.gantt.setSizes();\n }\n }\n get GridWidth(): number {\n return this._gridWidth;\n }\n\n @Input()\n set ColumnWidths(value: Record<string, number> | null) {\n this._columnWidths = SanitizeColumnWidths(value);\n }\n get ColumnWidths(): Record<string, number> {\n return this._columnWidths;\n }\n\n /**\n * Timeline scale to apply. Callers can bind a persisted level here.\n * Defaults to week (100%).\n */\n @Input()\n set ZoomLevel(value: GanttZoomLevelName) {\n if (!IsGanttZoomLevelName(value) || value === this._zoomLevel) {\n return;\n }\n if (this.initialized && this.EnableZoom) {\n this.applyZoom(value);\n return;\n }\n this._zoomLevel = value;\n }\n get ZoomLevel(): GanttZoomLevelName {\n return this._zoomLevel;\n }\n\n /** Emitted when an item bar or grid row is clicked. */\n @Output() ItemClicked = new EventEmitter<GanttItemClickedEvent>();\n\n /** Emitted when an item bar or grid row is double-clicked. */\n @Output() ItemDoubleClicked = new EventEmitter<GanttItemClickedEvent>();\n\n /** Emitted when an item is changed via drag/resize (only if not ReadOnly). */\n @Output() ItemChanged = new EventEmitter<GanttItemChangedEvent>();\n\n /** Fired before a zoom change. Set `event.Cancel = true` to keep the current level. */\n @Output() BeforeZoomChange = new EventEmitter<BeforeZoomChangeEventArgs>();\n\n /** Fired after a zoom change that was not canceled. */\n @Output() AfterZoomChange = new EventEmitter<AfterZoomChangeEventArgs>();\n\n /** Fired before the grid/timeline splitter drag starts. */\n @Output() BeforeGridResize = new EventEmitter<BeforeGridResizeEventArgs>();\n\n /** Fired after the grid/timeline splitter is released. */\n @Output() AfterGridResize = new EventEmitter<AfterGridResizeEventArgs>();\n\n /** Fired before a grid column resize starts. */\n @Output() BeforeColumnResize = new EventEmitter<BeforeColumnResizeEventArgs>();\n\n /** Fired after a grid column is resized. */\n @Output() AfterColumnResize = new EventEmitter<AfterColumnResizeEventArgs>();\n\n @ViewChild('ganttContainer', { static: false }) GanttContainer!: ElementRef<HTMLDivElement>;\n\n /** @deprecated Use {@link GanttContainer}. */\n get ganttContainer(): ElementRef<HTMLDivElement> {\n return this.GanttContainer;\n }\n /** @deprecated Use {@link GanttContainer}. */\n set ganttContainer(value: ElementRef<HTMLDivElement>) {\n this.GanttContainer = value;\n }\n\n /** @internal */\n Loading = true;\n\n /** @deprecated Use {@link Loading}. */\n get loading() {\n return this.Loading;\n }\n /** @deprecated Use {@link Loading}. */\n set loading(value) {\n this.Loading = value;\n }\n private gantt: GanttStatic | null = null;\n private initialized = false;\n private _zoomLevel: GanttZoomLevelName = 'week';\n private zoomInitialized = false;\n private _gridWidth = GANTT_DEFAULT_GRID_WIDTH;\n private _columnWidths: Record<string, number> = {};\n private readonly cdr = inject(ChangeDetectorRef);\n\n public get CurrentGridWidth(): number {\n return this._gridWidth;\n }\n\n public get CurrentColumnWidths(): Record<string, number> {\n return { ...this._columnWidths };\n }\n\n public get CurrentZoomPercent(): number {\n return GanttZoomPercent(this._zoomLevel);\n }\n\n public get CanZoomIn(): boolean {\n return NextZoomInLevel(this._zoomLevel) != null;\n }\n\n public get CanZoomOut(): boolean {\n return NextZoomOutLevel(this._zoomLevel) != null;\n }\n\n /** One step toward hour / more detail. */\n public ZoomIn(): void {\n const next = NextZoomInLevel(this._zoomLevel);\n if (next) {\n this.applyZoom(next);\n }\n }\n\n /** One step toward year / more context. */\n public ZoomOut(): void {\n const next = NextZoomOutLevel(this._zoomLevel);\n if (next) {\n this.applyZoom(next);\n }\n }\n\n public SetZoomLevel(level: GanttZoomLevelName): void {\n if (IsGanttZoomLevelName(level)) {\n this.applyZoom(level);\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n try {\n const module = await import('dhtmlx-gantt');\n this.gantt = module.gantt;\n this.Loading = false;\n this.cdr.detectChanges();\n\n if (this.Items.length > 0 && this.GanttContainer) {\n this.initGantt();\n this.cdr.markForCheck();\n }\n } catch (error) {\n console.error('@memberjunction/ng-gantt: Failed to load dhtmlx-gantt:', error);\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.gantt) return;\n\n if (changes['Height'] && this.initialized) {\n this.gantt.setSizes();\n }\n\n if (this.initialized && this.GanttContainer) {\n this.updateData();\n } else if (!this.initialized && this.GanttContainer && this.Items.length > 0) {\n this.initGantt();\n }\n }\n\n private destroyDblClick?: () => void;\n private resizeObserver?: ResizeObserver;\n\n ngOnDestroy(): void {\n this.destroyDblClick?.();\n this.destroyDblClick = undefined;\n this.resizeObserver?.disconnect();\n this.resizeObserver = undefined;\n if (this.initialized && this.gantt) {\n this.gantt.clearAll();\n this.initialized = false;\n }\n }\n\n /** Rebuilds the Gantt data from the current `Items` and `Links` inputs. */\n public Refresh(): void {\n if (this.initialized) {\n this.updateData();\n }\n }\n\n private initGantt(): void {\n const g = this.gantt!;\n g.clearAll();\n\n // Configuration\n g.config.date_format = '%Y-%m-%d %H:%i';\n g.config.show_progress = this.ShowProgress;\n g.config.show_links = true;\n g.config.readonly = this.ReadOnly;\n g.config.details_on_dblclick = false;\n g.config.open_tree_initially = true;\n g.config.fit_tasks = true;\n g.config.row_height = 36;\n this.applyGridConfig(g);\n this.initTooltips(g);\n\n // Initialize\n g.init(this.GanttContainer.nativeElement);\n this.initialized = true;\n this.initZoom(g);\n this.bindGridCellTooltips(g);\n this.bindGridEvents(g);\n\n // ResizeObserver ensures DHTMLX layout recalculates whenever container gets valid non-zero dimensions\n this.resizeObserver?.disconnect();\n if (typeof ResizeObserver !== 'undefined' && this.GanttContainer?.nativeElement) {\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0 && this.initialized && this.gantt) {\n this.gantt.setSizes();\n }\n }\n });\n this.resizeObserver.observe(this.GanttContainer.nativeElement);\n }\n\n // Event: click\n g.attachEvent('onTaskClick', (id: string) => {\n const item = this.Items.find(i => UUIDsEqual(i.ID, id));\n if (item) {\n this.ItemClicked.emit({ Item: item });\n }\n return true;\n });\n\n // Event: dblclick (via DHTMLX attachEvent)\n g.attachEvent('onTaskDblClick', (id: string) => {\n const item = this.Items.find(i => UUIDsEqual(i.ID, id));\n if (item) {\n this.ItemDoubleClicked.emit({ Item: item });\n }\n return false; // Suppress default DHTMLX lightbox\n });\n\n // Native DOM dblclick listener guarantees double click fires even when readonly = true\n this.destroyDblClick?.();\n const dblClickHandler = (e: MouseEvent) => {\n const taskId = g.locate(e);\n if (taskId !== null && taskId !== undefined) {\n const item = this.Items.find(i => UUIDsEqual(i.ID, String(taskId)));\n if (item) {\n this.ItemDoubleClicked.emit({ Item: item });\n }\n }\n };\n this.GanttContainer.nativeElement.addEventListener('dblclick', dblClickHandler);\n this.destroyDblClick = () => {\n this.GanttContainer?.nativeElement?.removeEventListener('dblclick', dblClickHandler);\n };\n\n // Event: drag/resize (only fires if not readonly)\n if (!this.ReadOnly) {\n g.attachEvent('onAfterTaskDrag', (id: string) => {\n const task = g.getTask(id);\n const item = this.Items.find(i => UUIDsEqual(i.ID, id));\n if (item && task) {\n this.ItemChanged.emit({\n Item: item,\n NewStartDate: task.start_date as unknown as Date,\n NewEndDate: task.end_date as unknown as Date,\n NewDuration: task.duration as number,\n });\n }\n });\n }\n\n this.updateData();\n\n // Force layout after render\n setTimeout(() => g.setSizes(), 0);\n }\n\n private updateData(): void {\n if (!this.initialized || !this.gantt) return;\n const g = this.gantt;\n\n const data: Partial<DHTask>[] = this.Items.map(item => {\n const startDate = item.StartDate instanceof Date ? item.StartDate : new Date(item.StartDate);\n let duration = item.Duration ?? 1;\n if (item.EndDate) {\n const endDate = item.EndDate instanceof Date ? item.EndDate : new Date(item.EndDate);\n duration = Math.max(1, Math.ceil((endDate.getTime() - startDate.getTime()) / 86400000));\n }\n\n const rawProgress = item.Progress ?? 0;\n const progress = rawProgress > 1 ? rawProgress / 100 : rawProgress;\n\n return {\n id: item.ID,\n text: item.Name,\n start_date: this.formatDate(startDate) as any,\n duration,\n progress,\n parent: item.ParentID || 0,\n open: item.Open !== false,\n };\n });\n\n const links: Partial<DHLink>[] = this.Links.map(link => ({\n id: link.ID,\n source: link.SourceID,\n target: link.TargetID,\n type: this.mapLinkType(link.Type),\n }));\n\n g.clearAll();\n g.parse({ data: data as DHTask[], links: links as DHLink[] });\n\n setTimeout(() => g.setSizes(), 0);\n }\n\n private applyGridConfig(g: GanttStatic): void {\n g.config.autofit = false;\n g.config.keep_grid_width = true;\n g.config.grid_elastic_columns = false;\n g.config.min_grid_column_width = 48;\n g.config.grid_width = this._gridWidth;\n g.config.columns = this.buildGridColumns();\n if (this.EnableGridScroll || this.EnableGridResize) {\n g.config.layout = this.buildScrollableLayout();\n }\n }\n\n private buildGridColumns(): DhxGridColumn[] {\n const cols = this.Columns ?? DEFAULT_COLUMNS;\n return cols.map((col) => {\n const mapped: DhxGridColumn = {\n name: col.Name,\n label: col.Label,\n width: this.resolveColumnWidth(col),\n min_width: 48,\n resize: this.EnableColumnResize && col.Resize !== false,\n };\n if (col.Align) {\n mapped.align = col.Align;\n }\n if (col.Tree) {\n mapped.tree = true;\n }\n if (col.Template) {\n mapped.template = col.Template;\n }\n return mapped;\n });\n }\n\n private resolveColumnWidth(col: GanttColumnDef): number {\n const override = this._columnWidths[col.Name];\n if (typeof override === 'number' && override >= 40) {\n return Math.round(override);\n }\n if (typeof col.Width === 'number' && col.Width > 0) {\n return col.Width;\n }\n if (typeof col.Width === 'string' && col.Width !== '*') {\n const parsed = Number(col.Width);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n return 120;\n }\n\n private buildScrollableLayout(): GanttStatic['config']['layout'] {\n return {\n css: 'gantt_container',\n cols: [\n {\n width: this._gridWidth,\n min_width: GANTT_MIN_GRID_WIDTH,\n max_width: GANTT_MAX_GRID_WIDTH,\n rows: [\n { view: 'grid', scrollable: true, scrollX: 'gridScroll', scrollY: 'scrollVer' },\n { view: 'scrollbar', id: 'gridScroll', height: 20 },\n ],\n },\n { resizer: this.EnableGridResize, width: 1 },\n {\n rows: [\n { view: 'timeline', scrollX: 'scrollHor', scrollY: 'scrollVer' },\n { view: 'scrollbar', id: 'scrollHor', height: 20 },\n ],\n },\n { view: 'scrollbar', id: 'scrollVer' },\n ],\n };\n }\n\n private bindGridEvents(g: GanttStatic): void {\n g.attachEvent('onGridResizeStart', (oldWidth: number) => {\n const before = new BeforeGridResizeEventArgs(oldWidth);\n this.BeforeGridResize.emit(before);\n return !before.Cancel;\n });\n g.attachEvent('onGridResizeEnd', (oldWidth: number, newWidth: number) => {\n const width = ClampGanttGridWidth(newWidth);\n this._gridWidth = width;\n this.AfterGridResize.emit(new AfterGridResizeEventArgs(width, oldWidth));\n this.cdr.markForCheck();\n return true;\n });\n g.attachEvent('onColumnResizeStart', (_index: number, column: GridColumn) => {\n const name = String(column.name ?? '');\n const before = new BeforeColumnResizeEventArgs(name, Number(column.width) || 0);\n this.BeforeColumnResize.emit(before);\n return !before.Cancel;\n });\n g.attachEvent('onColumnResizeEnd', (_index: number, column: GridColumn, newWidth: number) => {\n const name = String(column.name ?? '');\n this._columnWidths = { ...this._columnWidths, [name]: Math.round(newWidth) };\n this.AfterColumnResize.emit(new AfterColumnResizeEventArgs(\n name,\n Math.round(newWidth),\n this.CurrentColumnWidths,\n ));\n this.cdr.markForCheck();\n return true;\n });\n }\n\n private initTooltips(g: GanttStatic): void {\n if (!this.EnableTooltips) {\n return;\n }\n EnsureGanttTooltipStyles();\n g.plugins({ tooltip: true });\n g.templates.tooltip_text = (start, end, task) => this.tooltipHtmlForTask(task, start, end);\n }\n\n private bindGridCellTooltips(g: GanttStatic): void {\n const tooltips = g.ext?.tooltips;\n if (!this.EnableTooltips || !tooltips) {\n return;\n }\n tooltips.detach(GANTT_GRID_CELL_TOOLTIP_SELECTOR);\n tooltips.tooltipFor({\n selector: GANTT_GRID_CELL_TOOLTIP_SELECTOR,\n html: (event) => this.gridCellTooltip(g, event),\n });\n }\n\n private gridCellTooltip(g: GanttStatic, event: Event): string | void {\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n const cell = target.closest<HTMLElement>('[data-column-name]');\n const columnName = cell?.getAttribute('data-column-name');\n if (!columnName || !this.isNameColumn(columnName)) {\n return;\n }\n const id = g.locate(event);\n if (id == null || id === '' || !g.isTaskExists(id)) {\n return;\n }\n return this.tooltipHtmlForTask(g.getTask(id));\n }\n\n private isNameColumn(columnName: string): boolean {\n const cols = this.Columns ?? DEFAULT_COLUMNS;\n return cols.some((col, index) =>\n col.Name === columnName && (col.Tree === true || col.Name === 'text' || index === 0),\n );\n }\n\n private tooltipHtmlForTask(\n task: DHTask,\n start?: Date,\n end?: Date,\n ): string | void {\n const html = BuildGanttTaskTooltipHtml({\n Name: String(task?.text ?? ''),\n Start: start ?? task?.start_date ?? null,\n End: end ?? task?.end_date ?? null,\n Progress: typeof task?.progress === 'number' ? task.progress : null,\n });\n return html || undefined;\n }\n\n private initZoom(g: GanttStatic): void {\n if (!this.EnableZoom || this.zoomInitialized) {\n return;\n }\n const zoom = g.ext?.zoom;\n if (!zoom) {\n return;\n }\n zoom.init({\n levels: BuildDefaultGanttZoomLevels(),\n trigger: 'wheel',\n useKey: 'ctrlKey',\n element: () => this.GanttContainer.nativeElement,\n handler: (event: Event) => this.handleWheelZoom(event),\n });\n zoom.setLevel(this._zoomLevel);\n this.zoomInitialized = true;\n }\n\n private handleWheelZoom(event: Event): void {\n const wheel = event as WheelEvent;\n if (!wheel.ctrlKey && !wheel.metaKey) {\n return;\n }\n wheel.preventDefault();\n if (wheel.deltaY < 0) {\n this.ZoomIn();\n } else {\n this.ZoomOut();\n }\n }\n\n private applyZoom(toLevel: GanttZoomLevelName): void {\n if (!this.EnableZoom || toLevel === this._zoomLevel) {\n return;\n }\n const fromLevel = this._zoomLevel;\n const before = new BeforeZoomChangeEventArgs(\n fromLevel,\n toLevel,\n GanttZoomPercent(fromLevel),\n GanttZoomPercent(toLevel),\n );\n this.BeforeZoomChange.emit(before);\n if (before.Cancel) {\n return;\n }\n this._zoomLevel = toLevel;\n if (this.zoomInitialized) {\n this.gantt?.ext.zoom.setLevel(toLevel);\n }\n this.AfterZoomChange.emit(new AfterZoomChangeEventArgs(\n toLevel,\n GanttZoomPercent(toLevel),\n fromLevel,\n ));\n this.cdr.markForCheck();\n }\n\n private formatDate(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day} 00:00`;\n }\n\n private mapLinkType(type?: string): string {\n switch (type) {\n case 'FS': return '0';\n case 'SS': return '1';\n case 'FF': return '2';\n case 'SF': return '3';\n default: return '0';\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-gantt",
|
|
3
|
-
"version": "6.2.0-edge.
|
|
3
|
+
"version": "6.2.0-edge.2",
|
|
4
4
|
"description": "MemberJunction: Generic Gantt chart component wrapping DHTMLX Gantt",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@angular/compiler": "21.2.22",
|
|
15
15
|
"@angular/compiler-cli": "21.2.22",
|
|
16
|
-
"@memberjunction/ng-test-utils": "6.2.0-edge.
|
|
16
|
+
"@memberjunction/ng-test-utils": "6.2.0-edge.2",
|
|
17
17
|
"vitest": "^4.0.18"
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"@angular/core": "^21.2.22"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
24
|
+
"@memberjunction/global": "6.2.0-edge.2",
|
|
25
25
|
"dhtmlx-gantt": "^9.1.1",
|
|
26
26
|
"tslib": "^2.8.1"
|
|
27
27
|
},
|