@memberjunction/ng-gantt 6.2.0-edge.0 → 6.2.0-edge.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
- ganttContainer: ElementRef<HTMLDivElement>;
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
- loading: boolean;
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":"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"}
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
- ganttContainer;
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
- loading = true;
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.loading = false;
214
+ this.Loading = false;
199
215
  this.cdr.detectChanges();
200
- if (this.Items.length > 0 && this.ganttContainer) {
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.loading = false;
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.ganttContainer) {
233
+ if (this.initialized && this.GanttContainer) {
218
234
  this.updateData();
219
235
  }
220
- else if (!this.initialized && this.ganttContainer && this.Items.length > 0) {
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.ganttContainer.nativeElement);
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.ganttContainer?.nativeElement) {
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.ganttContainer.nativeElement);
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.ganttContainer.nativeElement.addEventListener('dblclick', dblClickHandler);
317
+ this.GanttContainer.nativeElement.addEventListener('dblclick', dblClickHandler);
302
318
  this.destroyDblClick = () => {
303
- this.ganttContainer?.nativeElement?.removeEventListener('dblclick', dblClickHandler);
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.ganttContainer.nativeElement,
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.ganttContainer = _t.first);
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
- }], ganttContainer: [{
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.0",
3
+ "version": "6.2.0-edge.1",
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.0",
16
+ "@memberjunction/ng-test-utils": "6.2.0-edge.1",
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.0",
24
+ "@memberjunction/global": "6.2.0-edge.1",
25
25
  "dhtmlx-gantt": "^9.1.1",
26
26
  "tslib": "^2.8.1"
27
27
  },