@memberjunction/ng-tasks 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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @memberjunction/ng-tasks@6.2.0-edge.0 build /home/runner/work/MJ/MJ/packages/Angular/Generic/tasks
2
+ > @memberjunction/ng-tasks@6.2.0-edge.1 build /home/runner/work/MJ/MJ/packages/Angular/Generic/tasks
3
3
  > ngc
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,68 @@
1
1
  # @memberjunction/ng-tasks
2
2
 
3
+ ## 6.2.0-edge.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 80905a1: Rename public class members and exported functions to PascalCase, per MJ's naming convention,
8
+ **without breaking a single consumer**.
9
+
10
+ Every renamed symbol keeps its old name beside the new one as a `@deprecated` stub that forwards to
11
+ it — a delegating method or function, a getter/setter pair for a property, and for Angular a
12
+ readable accessor pair for an `@Input` and a second `@Output` sharing the same `EventEmitter`, so a
13
+ template still binding the old name keeps receiving events. Old names still compile, still resolve,
14
+ and still behave identically; the deprecation tag rides through to the published `.d.ts`, so editors
15
+ point callers at the replacement. Where a package re-exports through an explicit `export { … }`
16
+ list, the new name is added alongside the old, so the correct name is actually on the public surface
17
+ rather than merely declared.
18
+
19
+ The rename is deliberately refused wherever a mechanical stub would not be equivalent, because
20
+ several of those shapes change a type contract while still compiling in the package that declares
21
+ them:
22
+ - an **optional** property or parameter property — TypeScript has no optional accessor, so a stub
23
+ would promote `foo?` to a required member and break every object literal that omits it;
24
+ - a class that is a **data shape** (no methods, or `@ObjectType`/`@InputType`) — object literals are
25
+ assigned to it, and an accessor stub changes what they must supply;
26
+ - a property whose **subclass redeclares it**, since TypeScript forbids a property overriding an
27
+ accessor (TS2610);
28
+ - a name whose PascalCase form is **already bound** in that file or class;
29
+ - decorated members, `get`/`set` pairs behind a decorator, generators, destructured parameters,
30
+ overload sets and abstract members.
31
+
32
+ **One wire-visible consequence, for version skew only.** `BaseInfo.toJSON` walks `_`-prefixed
33
+ backing fields and emits them through their public getter, preferring the PascalCase one. Renaming
34
+ the 23 field aliases in `MJCore/src/generic` therefore changes what `AllMetadata` carries:
35
+ `EntityInfo.spCreate` and friends now serialize as `SpCreate`. A same-version client is unaffected —
36
+ `copyInitData` accepts a value through a settable accessor, so either spelling lands on the right
37
+ field. An OLDER client against a newer server has no such path in its `copyInitData` and drops those
38
+ fields silently. Same-version deployments, which is the supported configuration, see no change.
39
+
40
+ Each package was verified against its own pre-change baseline rather than against zero, because
41
+ several packages in this repo do not typecheck cleanly to begin with. Angular packages were verified
42
+ with `ngc`, not `tsc`: a plain typecheck does not compile templates, and an earlier write-only
43
+ `@Input` alias passed `tsc` while breaking six template reads.
44
+
45
+ - Updated dependencies [a50948e]
46
+ - Updated dependencies [0eeb89d]
47
+ - Updated dependencies [a3539d2]
48
+ - Updated dependencies [41274aa]
49
+ - Updated dependencies [67f6c85]
50
+ - Updated dependencies [eb3a8d3]
51
+ - Updated dependencies [e1dd673]
52
+ - Updated dependencies [307da67]
53
+ - Updated dependencies [a7da50b]
54
+ - Updated dependencies [1d43161]
55
+ - Updated dependencies [7110019]
56
+ - Updated dependencies [17cc774]
57
+ - Updated dependencies [80905a1]
58
+ - Updated dependencies [6b08ebf]
59
+ - @memberjunction/core-entities@6.2.0-edge.1
60
+ - @memberjunction/ai-core-plus@6.2.0-edge.1
61
+ - @memberjunction/core@6.2.0-edge.1
62
+ - @memberjunction/global@6.2.0-edge.1
63
+ - @memberjunction/ng-shared-generic@6.2.0-edge.1
64
+ - @memberjunction/ai-engine-base@6.2.0-edge.1
65
+
3
66
  ## 6.2.0-edge.0
4
67
 
5
68
  ### Patch Changes
@@ -5,17 +5,60 @@ import * as i0 from "@angular/core";
5
5
  * Gantt chart view for tasks using DHTMLX Gantt
6
6
  */
7
7
  export declare class GanttTaskViewerComponent implements OnChanges, AfterViewInit, OnDestroy {
8
- tasks: MJTaskEntity[];
9
- taskDependencies: MJTaskDependencyEntity[];
10
- agentRunMap?: Map<string, string>;
8
+ Tasks: MJTaskEntity[];
9
+ /** @deprecated Use {@link Tasks}. */
10
+ set tasks(value: MJTaskEntity[]);
11
+ /** @deprecated Use {@link Tasks}. */
12
+ get tasks(): MJTaskEntity[];
13
+ TaskDependencies: MJTaskDependencyEntity[];
14
+ /** @deprecated Use {@link TaskDependencies}. */
15
+ set taskDependencies(value: MJTaskDependencyEntity[]);
16
+ /** @deprecated Use {@link TaskDependencies}. */
17
+ get taskDependencies(): MJTaskDependencyEntity[];
18
+ AgentRunMap?: Map<string, string>;
19
+ /** @deprecated Use {@link AgentRunMap}. */
20
+ set agentRunMap(value: Map<string, string> | undefined);
21
+ /** @deprecated Use {@link AgentRunMap}. */
22
+ get agentRunMap(): Map<string, string> | undefined;
23
+ TaskClicked: EventEmitter<MJTaskEntity>;
24
+ /**
25
+ * @deprecated Use {@link TaskClicked}.
26
+ *
27
+ * The same emitter under the old binding name, so a template still binding
28
+ * (taskClicked) keeps working. Must stay AFTER TaskClicked: class fields
29
+ * initialise in order, and the other way round this captures undefined.
30
+ */
11
31
  taskClicked: EventEmitter<MJTaskEntity>;
32
+ OpenEntityRecord: EventEmitter<{
33
+ entityName: string;
34
+ recordId: string;
35
+ }>;
36
+ /**
37
+ * @deprecated Use {@link OpenEntityRecord}.
38
+ *
39
+ * The same emitter under the old binding name, so a template still binding
40
+ * (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields
41
+ * initialise in order, and the other way round this captures undefined.
42
+ */
12
43
  openEntityRecord: EventEmitter<{
13
44
  entityName: string;
14
45
  recordId: string;
15
46
  }>;
16
- ganttContainer: ElementRef<HTMLDivElement>;
17
- selectedTask: MJTaskEntity | null;
18
- detailPanelWidth: number;
47
+ GanttContainer: ElementRef<HTMLDivElement>;
48
+ /** @deprecated Use {@link GanttContainer}. */
49
+ get ganttContainer(): ElementRef<HTMLDivElement>;
50
+ /** @deprecated Use {@link GanttContainer}. */
51
+ set ganttContainer(value: ElementRef<HTMLDivElement>);
52
+ SelectedTask: MJTaskEntity | null;
53
+ /** @deprecated Use {@link SelectedTask}. */
54
+ get selectedTask(): MJTaskEntity | null;
55
+ /** @deprecated Use {@link SelectedTask}. */
56
+ set selectedTask(value: MJTaskEntity | null);
57
+ DetailPanelWidth: number;
58
+ /** @deprecated Use {@link DetailPanelWidth}. */
59
+ get detailPanelWidth(): number;
60
+ /** @deprecated Use {@link DetailPanelWidth}. */
61
+ set detailPanelWidth(value: number);
19
62
  IsGanttLoading: boolean;
20
63
  private ganttLib;
21
64
  private ganttInitialized;
@@ -30,17 +73,28 @@ export declare class GanttTaskViewerComponent implements OnChanges, AfterViewIni
30
73
  private convertToGanttFormat;
31
74
  private calculateDuration;
32
75
  private formatDateForDHTMLX;
76
+ GetAgentRunId(task: MJTaskEntity): string | null;
77
+ /** @deprecated Use {@link GetAgentRunId}. */
33
78
  getAgentRunId(task: MJTaskEntity): string | null;
79
+ CloseDetailPanel(): void;
80
+ /** @deprecated Use {@link CloseDetailPanel}. */
34
81
  closeDetailPanel(): void;
82
+ OnOpenEntityRecord(event: {
83
+ entityName: string;
84
+ recordId: string;
85
+ }): void;
86
+ /** @deprecated Use {@link OnOpenEntityRecord}. */
35
87
  onOpenEntityRecord(event: {
36
88
  entityName: string;
37
89
  recordId: string;
38
90
  }): void;
91
+ StartResize(event: MouseEvent): void;
92
+ /** @deprecated Use {@link StartResize}. */
39
93
  startResize(event: MouseEvent): void;
40
94
  handleResize(event: MouseEvent): void;
41
95
  stopResize(): void;
42
96
  private expandAllAndSelectRoot;
43
97
  static ɵfac: i0.ɵɵFactoryDeclaration<GanttTaskViewerComponent, never>;
44
- static ɵcmp: i0.ɵɵComponentDeclaration<GanttTaskViewerComponent, "mj-gantt-task-viewer", never, { "tasks": { "alias": "tasks"; "required": false; }; "taskDependencies": { "alias": "taskDependencies"; "required": false; }; "agentRunMap": { "alias": "agentRunMap"; "required": false; }; }, { "taskClicked": "taskClicked"; "openEntityRecord": "openEntityRecord"; }, never, never, true, never>;
98
+ static ɵcmp: i0.ɵɵComponentDeclaration<GanttTaskViewerComponent, "mj-gantt-task-viewer", never, { "Tasks": { "alias": "Tasks"; "required": false; }; "tasks": { "alias": "tasks"; "required": false; }; "TaskDependencies": { "alias": "TaskDependencies"; "required": false; }; "taskDependencies": { "alias": "taskDependencies"; "required": false; }; "AgentRunMap": { "alias": "AgentRunMap"; "required": false; }; "agentRunMap": { "alias": "agentRunMap"; "required": false; }; }, { "TaskClicked": "TaskClicked"; "taskClicked": "taskClicked"; "OpenEntityRecord": "OpenEntityRecord"; "openEntityRecord": "openEntityRecord"; }, never, never, true, never>;
45
99
  }
46
100
  //# sourceMappingURL=gantt-task-viewer.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gantt-task-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/gantt-task-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAa,SAAS,EAAgB,MAAM,eAAe,CAAC;AAEjJ,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;;AAMrF;;GAEG;AACH,qBA6Ha,wBAAyB,YAAW,SAAS,EAAE,aAAa,EAAE,SAAS;IACzE,KAAK,EAAE,YAAY,EAAE,CAAM;IAC3B,gBAAgB,EAAE,sBAAsB,EAAE,CAAM;IAChD,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,6BAAoC;IAC/C,gBAAgB;oBAAkC,MAAM;kBAAY,MAAM;OAAM;IAE1C,cAAc,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAErF,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IACzC,gBAAgB,EAAE,MAAM,CAAO;IAC/B,cAAc,UAAQ;IAE7B,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAEvB,eAAe;IAoBrB,WAAW;IAkBX,WAAW;IAOX,OAAO,CAAC,SAAS;IAiFjB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,oBAAoB;IA8J5B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,mBAAmB;IAOpB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI;IAIhD,gBAAgB,IAAI,IAAI;IAIxB,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIzE,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQ3C,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAWrC,UAAU,IAAI,IAAI;IAYlB,OAAO,CAAC,sBAAsB;yCA3YnB,wBAAwB;2CAAxB,wBAAwB;CA4apC"}
1
+ {"version":3,"file":"gantt-task-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/gantt-task-viewer.component.ts"],"names":[],"mappings":"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"}
@@ -60,14 +60,78 @@ function GanttTaskViewerComponent_Conditional_2_Template(rf, ctx) { if (rf & 1)
60
60
  * Gantt chart view for tasks using DHTMLX Gantt
61
61
  */
62
62
  export class GanttTaskViewerComponent {
63
- tasks = [];
64
- taskDependencies = [];
65
- agentRunMap; // Maps TaskID -> AgentRunID
66
- taskClicked = new EventEmitter();
67
- openEntityRecord = new EventEmitter();
68
- ganttContainer;
69
- selectedTask = null;
70
- detailPanelWidth = 400;
63
+ Tasks = [];
64
+ /** @deprecated Use {@link Tasks}. */
65
+ set tasks(value) {
66
+ this.Tasks = value;
67
+ }
68
+ /** @deprecated Use {@link Tasks}. */
69
+ get tasks() {
70
+ return this.Tasks;
71
+ }
72
+ TaskDependencies = [];
73
+ /** @deprecated Use {@link TaskDependencies}. */
74
+ set taskDependencies(value) {
75
+ this.TaskDependencies = value;
76
+ }
77
+ /** @deprecated Use {@link TaskDependencies}. */
78
+ get taskDependencies() {
79
+ return this.TaskDependencies;
80
+ }
81
+ AgentRunMap;
82
+ /** @deprecated Use {@link AgentRunMap}. */
83
+ set agentRunMap(value) {
84
+ this.AgentRunMap = value;
85
+ }
86
+ /** @deprecated Use {@link AgentRunMap}. */
87
+ get agentRunMap() {
88
+ return this.AgentRunMap;
89
+ } // Maps TaskID -> AgentRunID
90
+ TaskClicked = new EventEmitter();
91
+ /**
92
+ * @deprecated Use {@link TaskClicked}.
93
+ *
94
+ * The same emitter under the old binding name, so a template still binding
95
+ * (taskClicked) keeps working. Must stay AFTER TaskClicked: class fields
96
+ * initialise in order, and the other way round this captures undefined.
97
+ */
98
+ taskClicked = this.TaskClicked;
99
+ OpenEntityRecord = new EventEmitter();
100
+ /**
101
+ * @deprecated Use {@link OpenEntityRecord}.
102
+ *
103
+ * The same emitter under the old binding name, so a template still binding
104
+ * (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields
105
+ * initialise in order, and the other way round this captures undefined.
106
+ */
107
+ openEntityRecord = this.OpenEntityRecord;
108
+ GanttContainer;
109
+ /** @deprecated Use {@link GanttContainer}. */
110
+ get ganttContainer() {
111
+ return this.GanttContainer;
112
+ }
113
+ /** @deprecated Use {@link GanttContainer}. */
114
+ set ganttContainer(value) {
115
+ this.GanttContainer = value;
116
+ }
117
+ SelectedTask = null;
118
+ /** @deprecated Use {@link SelectedTask}. */
119
+ get selectedTask() {
120
+ return this.SelectedTask;
121
+ }
122
+ /** @deprecated Use {@link SelectedTask}. */
123
+ set selectedTask(value) {
124
+ this.SelectedTask = value;
125
+ }
126
+ DetailPanelWidth = 400;
127
+ /** @deprecated Use {@link DetailPanelWidth}. */
128
+ get detailPanelWidth() {
129
+ return this.DetailPanelWidth;
130
+ }
131
+ /** @deprecated Use {@link DetailPanelWidth}. */
132
+ set detailPanelWidth(value) {
133
+ this.DetailPanelWidth = value;
134
+ }
71
135
  IsGanttLoading = true;
72
136
  ganttLib = null;
73
137
  ganttInitialized = false;
@@ -76,14 +140,14 @@ export class GanttTaskViewerComponent {
76
140
  resizeStartWidth = 0;
77
141
  async ngAfterViewInit() {
78
142
  console.log('🔧 ngAfterViewInit called', {
79
- taskCount: this.tasks?.length || 0,
80
- hasContainer: !!this.ganttContainer
143
+ taskCount: this.Tasks?.length || 0,
144
+ hasContainer: !!this.GanttContainer
81
145
  });
82
146
  try {
83
147
  const module = await import('dhtmlx-gantt');
84
148
  this.ganttLib = module.gantt;
85
149
  this.IsGanttLoading = false;
86
- if (this.tasks && this.tasks.length > 0 && this.ganttContainer) {
150
+ if (this.Tasks && this.Tasks.length > 0 && this.GanttContainer) {
87
151
  this.initGantt();
88
152
  }
89
153
  }
@@ -95,15 +159,15 @@ export class GanttTaskViewerComponent {
95
159
  ngOnChanges() {
96
160
  console.log('🔄 ngOnChanges called', {
97
161
  initialized: this.ganttInitialized,
98
- hasContainer: !!this.ganttContainer,
99
- taskCount: this.tasks?.length || 0
162
+ hasContainer: !!this.GanttContainer,
163
+ taskCount: this.Tasks?.length || 0
100
164
  });
101
165
  if (!this.ganttLib)
102
166
  return; // Library not yet loaded
103
- if (this.ganttInitialized && this.ganttContainer) {
167
+ if (this.ganttInitialized && this.GanttContainer) {
104
168
  this.updateGanttData();
105
169
  }
106
- else if (!this.ganttInitialized && this.ganttContainer && this.tasks && this.tasks.length > 0) {
170
+ else if (!this.ganttInitialized && this.GanttContainer && this.Tasks && this.Tasks.length > 0) {
107
171
  // Initialize if we have container and tasks but haven't initialized yet
108
172
  console.log('🎨 Late initialization - gantt not initialized but container and tasks available');
109
173
  this.initGantt();
@@ -157,14 +221,14 @@ export class GanttTaskViewerComponent {
157
221
  { name: 'text', label: 'Task name', tree: true, width: '*' }
158
222
  ];
159
223
  // Initialize Gantt in the container
160
- g.init(this.ganttContainer.nativeElement);
224
+ g.init(this.GanttContainer.nativeElement);
161
225
  this.ganttInitialized = true;
162
226
  // Attach click event
163
227
  g.attachEvent('onTaskClick', (id) => {
164
- const originalTask = this.tasks.find(t => UUIDsEqual(t.ID, id));
228
+ const originalTask = this.Tasks.find(t => UUIDsEqual(t.ID, id));
165
229
  if (originalTask) {
166
- this.selectedTask = originalTask;
167
- this.taskClicked.emit(originalTask);
230
+ this.SelectedTask = originalTask;
231
+ this.TaskClicked.emit(originalTask);
168
232
  }
169
233
  return true;
170
234
  });
@@ -188,9 +252,9 @@ export class GanttTaskViewerComponent {
188
252
  if (!this.ganttInitialized)
189
253
  return;
190
254
  try {
191
- console.log('📊 Updating Gantt data with', this.tasks.length, 'tasks');
255
+ console.log('📊 Updating Gantt data with', this.Tasks.length, 'tasks');
192
256
  const g = this.ganttLib;
193
- const ganttData = this.convertToGanttFormat(this.tasks);
257
+ const ganttData = this.convertToGanttFormat(this.Tasks);
194
258
  g.clearAll();
195
259
  g.parse(ganttData);
196
260
  // Log final parsed data for debugging
@@ -216,13 +280,13 @@ export class GanttTaskViewerComponent {
216
280
  const data = [];
217
281
  const links = [];
218
282
  console.log('🔍 Converting tasks:', tasks);
219
- console.log('🔗 Task dependencies:', this.taskDependencies);
283
+ console.log('🔗 Task dependencies:', this.TaskDependencies);
220
284
  // Build a map of task ID to task for quick lookup
221
285
  const taskMap = new Map();
222
286
  tasks.forEach(t => taskMap.set(t.ID, t));
223
287
  // Build dependency map: taskId -> array of tasks it depends on
224
288
  const dependencyMap = new Map();
225
- this.taskDependencies.forEach(dep => {
289
+ this.TaskDependencies.forEach(dep => {
226
290
  if (!dependencyMap.has(dep.TaskID)) {
227
291
  dependencyMap.set(dep.TaskID, []);
228
292
  }
@@ -334,7 +398,7 @@ export class GanttTaskViewerComponent {
334
398
  data.push(ganttTask);
335
399
  });
336
400
  // Create links from MJTaskDependencyEntity records
337
- this.taskDependencies.forEach((dep, index) => {
401
+ this.TaskDependencies.forEach((dep, index) => {
338
402
  links.push({
339
403
  id: dep.ID || `link_${index}`,
340
404
  source: dep.DependsOnTaskID, // The task being depended on
@@ -360,28 +424,44 @@ export class GanttTaskViewerComponent {
360
424
  const day = String(date.getDate()).padStart(2, '0');
361
425
  return `${year}-${month}-${day} 00:00`;
362
426
  }
427
+ GetAgentRunId(task) {
428
+ return this.AgentRunMap?.get(task.ID) || null;
429
+ }
430
+ /** @deprecated Use {@link GetAgentRunId}. */
363
431
  getAgentRunId(task) {
364
- return this.agentRunMap?.get(task.ID) || null;
432
+ return this.GetAgentRunId(task);
433
+ }
434
+ CloseDetailPanel() {
435
+ this.SelectedTask = null;
365
436
  }
437
+ /** @deprecated Use {@link CloseDetailPanel}. */
366
438
  closeDetailPanel() {
367
- this.selectedTask = null;
439
+ return this.CloseDetailPanel();
440
+ }
441
+ OnOpenEntityRecord(event) {
442
+ this.OpenEntityRecord.emit(event);
368
443
  }
444
+ /** @deprecated Use {@link OnOpenEntityRecord}. */
369
445
  onOpenEntityRecord(event) {
370
- this.openEntityRecord.emit(event);
446
+ return this.OnOpenEntityRecord(event);
371
447
  }
372
- startResize(event) {
448
+ StartResize(event) {
373
449
  this.isResizing = true;
374
450
  this.resizeStartX = event.clientX;
375
- this.resizeStartWidth = this.detailPanelWidth;
451
+ this.resizeStartWidth = this.DetailPanelWidth;
376
452
  event.preventDefault();
377
453
  }
454
+ /** @deprecated Use {@link StartResize}. */
455
+ startResize(event) {
456
+ return this.StartResize(event);
457
+ }
378
458
  handleResize(event) {
379
459
  if (!this.isResizing)
380
460
  return;
381
461
  const delta = this.resizeStartX - event.clientX;
382
462
  const newWidth = this.resizeStartWidth + delta;
383
463
  // Constrain width between min and max
384
- this.detailPanelWidth = Math.max(300, Math.min(600, newWidth));
464
+ this.DetailPanelWidth = Math.max(300, Math.min(600, newWidth));
385
465
  }
386
466
  stopResize() {
387
467
  if (this.isResizing) {
@@ -412,10 +492,10 @@ export class GanttTaskViewerComponent {
412
492
  if (rootTaskId != null) {
413
493
  g.selectTask(rootTaskId);
414
494
  // Trigger task click event to open detail panel
415
- const originalTask = this.tasks.find(t => UUIDsEqual(t.ID, String(rootTaskId)));
495
+ const originalTask = this.Tasks.find(t => UUIDsEqual(t.ID, String(rootTaskId)));
416
496
  if (originalTask) {
417
- this.selectedTask = originalTask;
418
- this.taskClicked.emit(originalTask);
497
+ this.SelectedTask = originalTask;
498
+ this.TaskClicked.emit(originalTask);
419
499
  }
420
500
  }
421
501
  console.log('✅ Expanded all tasks and selected root:', rootTaskId);
@@ -429,10 +509,10 @@ export class GanttTaskViewerComponent {
429
509
  i0.ɵɵviewQuery(_c0, 5);
430
510
  } if (rf & 2) {
431
511
  let _t;
432
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ganttContainer = _t.first);
512
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.GanttContainer = _t.first);
433
513
  } }, hostBindings: function GanttTaskViewerComponent_HostBindings(rf, ctx) { if (rf & 1) {
434
514
  i0.ɵɵlistener("mousemove", function GanttTaskViewerComponent_mousemove_HostBindingHandler($event) { return ctx.handleResize($event); }, i0.ɵɵresolveDocument)("mouseup", function GanttTaskViewerComponent_mouseup_HostBindingHandler() { return ctx.stopResize(); }, i0.ɵɵresolveDocument);
435
- } }, inputs: { tasks: "tasks", taskDependencies: "taskDependencies", agentRunMap: "agentRunMap" }, outputs: { taskClicked: "taskClicked", openEntityRecord: "openEntityRecord" }, features: [i0.ɵɵNgOnChangesFeature], decls: 3, vars: 2, consts: [["ganttContainer", ""], [1, "gantt-task-viewer"], [1, "loading-container"], ["text", "Loading Gantt chart..."], [1, "no-tasks"], [1, "gantt-layout"], [1, "fas", "fa-chart-gantt"], [1, "gantt-container"], [1, "gantt-resizer"], [1, "task-detail-panel", 3, "width"], [1, "gantt-resizer", 3, "mousedown"], [1, "task-detail-panel"], [3, "closePanel", "openEntityRecord", "task", "agentRunId"]], template: function GanttTaskViewerComponent_Template(rf, ctx) { if (rf & 1) {
515
+ } }, inputs: { Tasks: "Tasks", tasks: "tasks", TaskDependencies: "TaskDependencies", taskDependencies: "taskDependencies", AgentRunMap: "AgentRunMap", agentRunMap: "agentRunMap" }, outputs: { TaskClicked: "TaskClicked", taskClicked: "taskClicked", OpenEntityRecord: "OpenEntityRecord", openEntityRecord: "openEntityRecord" }, features: [i0.ɵɵNgOnChangesFeature], decls: 3, vars: 2, consts: [["ganttContainer", ""], [1, "gantt-task-viewer"], [1, "loading-container"], ["text", "Loading Gantt chart..."], [1, "no-tasks"], [1, "gantt-layout"], [1, "fas", "fa-chart-gantt"], [1, "gantt-container"], [1, "gantt-resizer"], [1, "task-detail-panel", 3, "width"], [1, "gantt-resizer", 3, "mousedown"], [1, "task-detail-panel"], [3, "closePanel", "openEntityRecord", "task", "agentRunId"]], template: function GanttTaskViewerComponent_Template(rf, ctx) { if (rf & 1) {
436
516
  i0.ɵɵelementStart(0, "div", 1);
437
517
  i0.ɵɵconditionalCreate(1, GanttTaskViewerComponent_Conditional_1_Template, 2, 0, "div", 2);
438
518
  i0.ɵɵconditionalCreate(2, GanttTaskViewerComponent_Conditional_2_Template, 2, 2);
@@ -484,17 +564,27 @@ export class GanttTaskViewerComponent {
484
564
  }
485
565
  </div>
486
566
  `, styles: ["\n .gantt-task-viewer {\n height: 100%;\n background: var(--mj-bg-surface);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .gantt-layout {\n display: flex;\n height: 600px;\n position: relative;\n }\n\n .gantt-container {\n flex: 1;\n min-width: 400px;\n height: 100%;\n position: relative;\n }\n\n .gantt-resizer {\n width: 4px;\n background: var(--mj-border-default);\n cursor: col-resize;\n flex-shrink: 0;\n transition: background 0.2s;\n }\n\n .gantt-resizer:hover {\n background: var(--mj-brand-primary);\n }\n\n .task-detail-panel {\n min-width: 300px;\n max-width: 600px;\n height: 100%;\n border-left: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n /* Override DHTMLX Gantt default styles */\n :host ::ng-deep .gantt_container {\n font-family: inherit;\n font-size: 13px;\n }\n\n :host ::ng-deep .gantt_grid_scale,\n :host ::ng-deep .gantt_task_scale {\n background: var(--mj-bg-surface-sunken);\n border-bottom: 2px solid var(--mj-border-default);\n }\n\n :host ::ng-deep .gantt_task .gantt_task_content {\n font-weight: 500;\n }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 80px 20px;\n }\n\n .no-tasks {\n text-align: center;\n padding: 80px 20px;\n color: var(--mj-text-disabled);\n }\n\n .no-tasks i {\n font-size: 64px;\n opacity: 0.3;\n margin-bottom: 16px;\n }\n\n .no-tasks p {\n margin: 0;\n font-size: 14px;\n }\n "] }]
487
- }], null, { tasks: [{
567
+ }], null, { Tasks: [{
568
+ type: Input
569
+ }], tasks: [{
570
+ type: Input
571
+ }], TaskDependencies: [{
488
572
  type: Input
489
573
  }], taskDependencies: [{
490
574
  type: Input
575
+ }], AgentRunMap: [{
576
+ type: Input
491
577
  }], agentRunMap: [{
492
578
  type: Input
579
+ }], TaskClicked: [{
580
+ type: Output
493
581
  }], taskClicked: [{
494
582
  type: Output
583
+ }], OpenEntityRecord: [{
584
+ type: Output
495
585
  }], openEntityRecord: [{
496
586
  type: Output
497
- }], ganttContainer: [{
587
+ }], GanttContainer: [{
498
588
  type: ViewChild,
499
589
  args: ['ganttContainer', { static: false }]
500
590
  }], handleResize: [{