@memberjunction/ng-tasks 2.105.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/CHANGELOG.md +10 -0
  3. package/README.md +233 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/lib/components/gantt-task-viewer.component.d.ts +44 -0
  9. package/dist/lib/components/gantt-task-viewer.component.d.ts.map +1 -0
  10. package/dist/lib/components/gantt-task-viewer.component.js +461 -0
  11. package/dist/lib/components/gantt-task-viewer.component.js.map +1 -0
  12. package/dist/lib/components/simple-task-viewer.component.d.ts +36 -0
  13. package/dist/lib/components/simple-task-viewer.component.d.ts.map +1 -0
  14. package/dist/lib/components/simple-task-viewer.component.js +275 -0
  15. package/dist/lib/components/simple-task-viewer.component.js.map +1 -0
  16. package/dist/lib/components/task-detail-panel.component.d.ts +26 -0
  17. package/dist/lib/components/task-detail-panel.component.d.ts.map +1 -0
  18. package/dist/lib/components/task-detail-panel.component.js +294 -0
  19. package/dist/lib/components/task-detail-panel.component.js.map +1 -0
  20. package/dist/lib/components/task.component.d.ts +34 -0
  21. package/dist/lib/components/task.component.d.ts.map +1 -0
  22. package/dist/lib/components/task.component.js +201 -0
  23. package/dist/lib/components/task.component.js.map +1 -0
  24. package/dist/lib/models/task-view.models.d.ts +17 -0
  25. package/dist/lib/models/task-view.models.d.ts.map +1 -0
  26. package/dist/lib/models/task-view.models.js +2 -0
  27. package/dist/lib/models/task-view.models.js.map +1 -0
  28. package/dist/lib/ng-tasks.module.d.ts +14 -0
  29. package/dist/lib/ng-tasks.module.d.ts.map +1 -0
  30. package/dist/lib/ng-tasks.module.js +37 -0
  31. package/dist/lib/ng-tasks.module.js.map +1 -0
  32. package/dist/public-api.d.ts +9 -0
  33. package/dist/public-api.d.ts.map +1 -0
  34. package/dist/public-api.js +12 -0
  35. package/dist/public-api.js.map +1 -0
  36. package/package.json +31 -0
  37. package/src/index.ts +1 -0
  38. package/src/lib/components/gantt-task-viewer.component.ts +524 -0
  39. package/src/lib/components/simple-task-viewer.component.ts +356 -0
  40. package/src/lib/components/task-detail-panel.component.ts +304 -0
  41. package/src/lib/components/task.component.ts +175 -0
  42. package/src/lib/models/task-view.models.ts +19 -0
  43. package/src/lib/ng-tasks.module.ts +22 -0
  44. package/src/lib/types/frappe-gantt.d.ts +32 -0
  45. package/src/public-api.ts +14 -0
  46. package/tsconfig.json +24 -0
@@ -0,0 +1,461 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, HostListener } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { gantt } from 'dhtmlx-gantt';
4
+ import { TaskDetailPanelComponent } from './task-detail-panel.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ const _c0 = ["ganttContainer"];
8
+ function GanttTaskViewerComponent_div_1_Template(rf, ctx) { if (rf & 1) {
9
+ i0.ɵɵelementStart(0, "div", 4);
10
+ i0.ɵɵelement(1, "i", 5);
11
+ i0.ɵɵelementStart(2, "p");
12
+ i0.ɵɵtext(3, "No tasks to display in Gantt view");
13
+ i0.ɵɵelementEnd()();
14
+ } }
15
+ function GanttTaskViewerComponent_div_2_div_3_Template(rf, ctx) { if (rf & 1) {
16
+ const _r1 = i0.ɵɵgetCurrentView();
17
+ i0.ɵɵelementStart(0, "div", 10);
18
+ i0.ɵɵlistener("mousedown", function GanttTaskViewerComponent_div_2_div_3_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.startResize($event)); });
19
+ i0.ɵɵelementEnd();
20
+ } }
21
+ function GanttTaskViewerComponent_div_2_div_4_Template(rf, ctx) { if (rf & 1) {
22
+ const _r3 = i0.ɵɵgetCurrentView();
23
+ i0.ɵɵelementStart(0, "div", 11)(1, "mj-task-detail-panel", 12);
24
+ i0.ɵɵlistener("closePanel", function GanttTaskViewerComponent_div_2_div_4_Template_mj_task_detail_panel_closePanel_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeDetailPanel()); })("openEntityRecord", function GanttTaskViewerComponent_div_2_div_4_Template_mj_task_detail_panel_openEntityRecord_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); });
25
+ i0.ɵɵelementEnd()();
26
+ } if (rf & 2) {
27
+ const ctx_r1 = i0.ɵɵnextContext(2);
28
+ i0.ɵɵstyleProp("width", ctx_r1.detailPanelWidth, "px");
29
+ i0.ɵɵadvance();
30
+ i0.ɵɵproperty("task", ctx_r1.selectedTask)("agentRunId", ctx_r1.getAgentRunId(ctx_r1.selectedTask));
31
+ } }
32
+ function GanttTaskViewerComponent_div_2_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelementStart(0, "div", 6);
34
+ i0.ɵɵelement(1, "div", 7, 0);
35
+ i0.ɵɵtemplate(3, GanttTaskViewerComponent_div_2_div_3_Template, 1, 0, "div", 8)(4, GanttTaskViewerComponent_div_2_div_4_Template, 2, 4, "div", 9);
36
+ i0.ɵɵelementEnd();
37
+ } if (rf & 2) {
38
+ const ctx_r1 = i0.ɵɵnextContext();
39
+ i0.ɵɵadvance(3);
40
+ i0.ɵɵproperty("ngIf", ctx_r1.selectedTask);
41
+ i0.ɵɵadvance();
42
+ i0.ɵɵproperty("ngIf", ctx_r1.selectedTask);
43
+ } }
44
+ /**
45
+ * Gantt chart view for tasks using DHTMLX Gantt
46
+ */
47
+ export class GanttTaskViewerComponent {
48
+ tasks = [];
49
+ taskDependencies = [];
50
+ agentRunMap; // Maps TaskID -> AgentRunID
51
+ taskClicked = new EventEmitter();
52
+ openEntityRecord = new EventEmitter();
53
+ ganttContainer;
54
+ selectedTask = null;
55
+ detailPanelWidth = 400;
56
+ ganttInitialized = false;
57
+ isResizing = false;
58
+ resizeStartX = 0;
59
+ resizeStartWidth = 0;
60
+ ngAfterViewInit() {
61
+ console.log('🔧 ngAfterViewInit called', {
62
+ taskCount: this.tasks?.length || 0,
63
+ hasContainer: !!this.ganttContainer
64
+ });
65
+ if (this.tasks && this.tasks.length > 0 && this.ganttContainer) {
66
+ this.initGantt();
67
+ }
68
+ }
69
+ ngOnChanges() {
70
+ console.log('🔄 ngOnChanges called', {
71
+ initialized: this.ganttInitialized,
72
+ hasContainer: !!this.ganttContainer,
73
+ taskCount: this.tasks?.length || 0
74
+ });
75
+ if (this.ganttInitialized && this.ganttContainer) {
76
+ this.updateGanttData();
77
+ }
78
+ else if (!this.ganttInitialized && this.ganttContainer && this.tasks && this.tasks.length > 0) {
79
+ // Initialize if we have container and tasks but haven't initialized yet
80
+ console.log('🎨 Late initialization - gantt not initialized but container and tasks available');
81
+ this.initGantt();
82
+ }
83
+ }
84
+ ngOnDestroy() {
85
+ if (this.ganttInitialized) {
86
+ gantt.clearAll();
87
+ this.ganttInitialized = false;
88
+ }
89
+ }
90
+ initGantt() {
91
+ try {
92
+ console.log('🎨 Initializing DHTMLX Gantt');
93
+ // IMPORTANT: Clear any previous configuration
94
+ gantt.clearAll();
95
+ // Configure Gantt layout and appearance
96
+ gantt.config.date_format = '%Y-%m-%d %H:%i';
97
+ gantt.config.scale_unit = 'day';
98
+ gantt.config.date_scale = '%d %M';
99
+ gantt.config.subscales = [];
100
+ gantt.config.show_progress = true;
101
+ gantt.config.show_links = true;
102
+ gantt.config.auto_types = true;
103
+ gantt.config.readonly = true; // Read-only for now
104
+ gantt.config.fit_tasks = true; // Auto-fit timeline to tasks
105
+ // Disable auto-scheduling - we calculate dates ourselves based on dependencies
106
+ gantt.config.auto_scheduling = false;
107
+ // Grid configuration
108
+ gantt.config.grid_width = 350;
109
+ gantt.config.row_height = 36;
110
+ gantt.config.scale_height = 0; // Hide date scale - dates are just for positioning
111
+ // Layout configuration - ensure timeline is visible
112
+ gantt.config.layout = {
113
+ css: "gantt_container",
114
+ rows: [
115
+ {
116
+ cols: [
117
+ { view: "grid", group: "grids", scrollY: "scrollVer" },
118
+ { resizer: true, width: 1 },
119
+ { view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer" },
120
+ { view: "scrollbar", id: "scrollVer", group: "vertical" }
121
+ ]
122
+ },
123
+ { view: "scrollbar", id: "scrollHor", group: "horizontal" }
124
+ ]
125
+ };
126
+ // Column configuration - only show task names, hide dates
127
+ gantt.config.columns = [
128
+ { name: 'text', label: 'Task name', tree: true, width: '*' }
129
+ ];
130
+ // Initialize Gantt in the container
131
+ gantt.init(this.ganttContainer.nativeElement);
132
+ this.ganttInitialized = true;
133
+ // Attach click event
134
+ gantt.attachEvent('onTaskClick', (id) => {
135
+ const originalTask = this.tasks.find(t => t.ID === id);
136
+ if (originalTask) {
137
+ this.selectedTask = originalTask;
138
+ this.taskClicked.emit(originalTask);
139
+ }
140
+ return true;
141
+ });
142
+ // Load data
143
+ this.updateGanttData();
144
+ // Force resize after data load to ensure proper rendering
145
+ setTimeout(() => {
146
+ gantt.setSizes();
147
+ }, 0);
148
+ // Expand and select after render completes
149
+ setTimeout(() => {
150
+ this.expandAllAndSelectRoot();
151
+ }, 100);
152
+ console.log('✅ DHTMLX Gantt initialized successfully');
153
+ }
154
+ catch (error) {
155
+ console.error('❌ Error initializing Gantt:', error);
156
+ }
157
+ }
158
+ updateGanttData() {
159
+ if (!this.ganttInitialized)
160
+ return;
161
+ try {
162
+ console.log('📊 Updating Gantt data with', this.tasks.length, 'tasks');
163
+ const ganttData = this.convertToGanttFormat(this.tasks);
164
+ gantt.clearAll();
165
+ gantt.parse(ganttData);
166
+ // Log final parsed data for debugging
167
+ console.log('📋 Gantt data after parse:', {
168
+ tasks: gantt.getTaskByTime(),
169
+ links: gantt.getLinks()
170
+ });
171
+ // Force resize after data update
172
+ setTimeout(() => {
173
+ gantt.setSizes();
174
+ }, 0);
175
+ // Expand and select after render completes
176
+ setTimeout(() => {
177
+ this.expandAllAndSelectRoot();
178
+ }, 100);
179
+ console.log('✅ Gantt data updated');
180
+ }
181
+ catch (error) {
182
+ console.error('❌ Error updating Gantt data:', error);
183
+ }
184
+ }
185
+ convertToGanttFormat(tasks) {
186
+ const data = [];
187
+ const links = [];
188
+ console.log('🔍 Converting tasks:', tasks);
189
+ console.log('🔗 Task dependencies:', this.taskDependencies);
190
+ // Build a map of task ID to task for quick lookup
191
+ const taskMap = new Map();
192
+ tasks.forEach(t => taskMap.set(t.ID, t));
193
+ // Build dependency map: taskId -> array of tasks it depends on
194
+ const dependencyMap = new Map();
195
+ this.taskDependencies.forEach(dep => {
196
+ if (!dependencyMap.has(dep.TaskID)) {
197
+ dependencyMap.set(dep.TaskID, []);
198
+ }
199
+ dependencyMap.get(dep.TaskID).push(dep.DependsOnTaskID);
200
+ });
201
+ // Calculate start dates based on dependencies
202
+ const taskStartDates = new Map();
203
+ const baseDate = new Date();
204
+ baseDate.setHours(0, 0, 0, 0);
205
+ // Recursive function to calculate start date for a task
206
+ const calculateStartDate = (taskId, visited = new Set()) => {
207
+ // Prevent circular dependencies
208
+ if (visited.has(taskId)) {
209
+ return new Date(baseDate);
210
+ }
211
+ visited.add(taskId);
212
+ // If already calculated, return it
213
+ if (taskStartDates.has(taskId)) {
214
+ return taskStartDates.get(taskId);
215
+ }
216
+ const task = taskMap.get(taskId);
217
+ if (!task)
218
+ return new Date(baseDate);
219
+ const dependencies = dependencyMap.get(taskId) || [];
220
+ if (dependencies.length === 0) {
221
+ // No dependencies - use base date or task's actual start date
222
+ const startDate = task.StartedAt ? new Date(task.StartedAt) : new Date(baseDate);
223
+ taskStartDates.set(taskId, startDate);
224
+ return startDate;
225
+ }
226
+ // Has dependencies - start after the latest dependency ends
227
+ let latestEnd = new Date(baseDate);
228
+ for (const depId of dependencies) {
229
+ const depTask = taskMap.get(depId);
230
+ if (depTask) {
231
+ const depStart = calculateStartDate(depId, new Set(visited));
232
+ const depDuration = this.calculateDuration(depTask);
233
+ const depEnd = new Date(depStart);
234
+ depEnd.setDate(depEnd.getDate() + depDuration);
235
+ if (depEnd > latestEnd) {
236
+ latestEnd = depEnd;
237
+ }
238
+ }
239
+ }
240
+ taskStartDates.set(taskId, latestEnd);
241
+ return latestEnd;
242
+ };
243
+ // Calculate start dates for all tasks
244
+ tasks.forEach(task => calculateStartDate(task.ID));
245
+ // Calculate min/max dates for timeline display range
246
+ let minDate = null;
247
+ let maxDate = null;
248
+ tasks.forEach(task => {
249
+ const startDate = taskStartDates.get(task.ID);
250
+ if (startDate) {
251
+ const duration = this.calculateDuration(task);
252
+ const endDate = new Date(startDate);
253
+ endDate.setDate(endDate.getDate() + duration);
254
+ if (!minDate || startDate < minDate) {
255
+ minDate = startDate;
256
+ }
257
+ if (!maxDate || endDate > maxDate) {
258
+ maxDate = endDate;
259
+ }
260
+ }
261
+ });
262
+ // Add 1 day padding before and after
263
+ if (minDate) {
264
+ const paddedStart = new Date(minDate);
265
+ paddedStart.setDate(paddedStart.getDate() - 1);
266
+ gantt.config.start_date = paddedStart;
267
+ }
268
+ if (maxDate) {
269
+ const paddedEnd = new Date(maxDate);
270
+ paddedEnd.setDate(paddedEnd.getDate() + 1);
271
+ gantt.config.end_date = paddedEnd;
272
+ }
273
+ // Now create Gantt tasks with calculated dates
274
+ tasks.forEach((task) => {
275
+ console.log('📝 Processing task:', {
276
+ ID: task.ID,
277
+ Name: task.Name,
278
+ ParentID: task.ParentID
279
+ });
280
+ // Calculate progress (0-1 scale for DHTMLX)
281
+ let progress = (task.PercentComplete || 0) / 100;
282
+ if (task.Status === 'Complete') {
283
+ progress = 1;
284
+ }
285
+ const duration = this.calculateDuration(task);
286
+ const startDate = taskStartDates.get(task.ID) || new Date(baseDate);
287
+ const ganttTask = {
288
+ id: task.ID,
289
+ text: task.Name || 'Untitled Task',
290
+ start_date: this.formatDateForDHTMLX(startDate),
291
+ duration: duration,
292
+ progress: progress
293
+ };
294
+ // Add parent relationship for tree structure (not dependency)
295
+ if (task.ParentID) {
296
+ ganttTask.parent = task.ParentID;
297
+ }
298
+ else {
299
+ // Root tasks need parent: 0
300
+ ganttTask.parent = 0;
301
+ }
302
+ console.log('✅ Created Gantt task:', ganttTask);
303
+ data.push(ganttTask);
304
+ });
305
+ // Create links from TaskDependencyEntity records
306
+ this.taskDependencies.forEach((dep, index) => {
307
+ links.push({
308
+ id: dep.ID || `link_${index}`,
309
+ source: dep.DependsOnTaskID, // The task being depended on
310
+ target: dep.TaskID, // The task that depends on it
311
+ type: '0' // finish-to-start (DHTMLX type 0)
312
+ });
313
+ console.log(`🔗 Created link: ${dep.DependsOnTaskID} -> ${dep.TaskID}`);
314
+ });
315
+ console.log('📊 Final DHTMLX format:', { data, links });
316
+ return { data, links };
317
+ }
318
+ calculateDuration(task) {
319
+ if (task.StartedAt && task.DueAt) {
320
+ const startDate = new Date(task.StartedAt);
321
+ const endDate = new Date(task.DueAt);
322
+ return Math.max(1, Math.ceil((endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24)));
323
+ }
324
+ return 1; // Default to 1 day
325
+ }
326
+ formatDateForDHTMLX(date) {
327
+ const year = date.getFullYear();
328
+ const month = String(date.getMonth() + 1).padStart(2, '0');
329
+ const day = String(date.getDate()).padStart(2, '0');
330
+ return `${year}-${month}-${day} 00:00`;
331
+ }
332
+ getAgentRunId(task) {
333
+ return this.agentRunMap?.get(task.ID) || null;
334
+ }
335
+ closeDetailPanel() {
336
+ this.selectedTask = null;
337
+ }
338
+ onOpenEntityRecord(event) {
339
+ this.openEntityRecord.emit(event);
340
+ }
341
+ startResize(event) {
342
+ this.isResizing = true;
343
+ this.resizeStartX = event.clientX;
344
+ this.resizeStartWidth = this.detailPanelWidth;
345
+ event.preventDefault();
346
+ }
347
+ handleResize(event) {
348
+ if (!this.isResizing)
349
+ return;
350
+ const delta = this.resizeStartX - event.clientX;
351
+ const newWidth = this.resizeStartWidth + delta;
352
+ // Constrain width between min and max
353
+ this.detailPanelWidth = Math.max(300, Math.min(600, newWidth));
354
+ }
355
+ stopResize() {
356
+ if (this.isResizing) {
357
+ this.isResizing = false;
358
+ // Resize gantt chart after panel resize completes
359
+ setTimeout(() => {
360
+ if (this.ganttInitialized) {
361
+ gantt.setSizes();
362
+ }
363
+ }, 0);
364
+ }
365
+ }
366
+ expandAllAndSelectRoot() {
367
+ try {
368
+ // Expand all tasks
369
+ gantt.eachTask((task) => {
370
+ gantt.open(task.id);
371
+ });
372
+ // Find and select the root task (task with parent = 0)
373
+ let rootTask = null;
374
+ gantt.eachTask((task) => {
375
+ if (task.parent === 0 || task.parent === '0') {
376
+ rootTask = task;
377
+ return false; // Stop iteration
378
+ }
379
+ });
380
+ if (rootTask) {
381
+ gantt.selectTask(rootTask.id);
382
+ // Trigger task click event to open detail panel
383
+ const originalTask = this.tasks.find(t => t.ID === rootTask.id);
384
+ if (originalTask) {
385
+ this.selectedTask = originalTask;
386
+ this.taskClicked.emit(originalTask);
387
+ }
388
+ }
389
+ console.log('✅ Expanded all tasks and selected root:', rootTask?.id);
390
+ }
391
+ catch (error) {
392
+ console.error('❌ Error expanding/selecting tasks:', error);
393
+ }
394
+ }
395
+ static ɵfac = function GanttTaskViewerComponent_Factory(t) { return new (t || GanttTaskViewerComponent)(); };
396
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: GanttTaskViewerComponent, selectors: [["mj-gantt-task-viewer"]], viewQuery: function GanttTaskViewerComponent_Query(rf, ctx) { if (rf & 1) {
397
+ i0.ɵɵviewQuery(_c0, 5);
398
+ } if (rf & 2) {
399
+ let _t;
400
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ganttContainer = _t.first);
401
+ } }, hostBindings: function GanttTaskViewerComponent_HostBindings(rf, ctx) { if (rf & 1) {
402
+ i0.ɵɵlistener("mousemove", function GanttTaskViewerComponent_mousemove_HostBindingHandler($event) { return ctx.handleResize($event); }, false, i0.ɵɵresolveDocument)("mouseup", function GanttTaskViewerComponent_mouseup_HostBindingHandler() { return ctx.stopResize(); }, false, i0.ɵɵresolveDocument);
403
+ } }, inputs: { tasks: "tasks", taskDependencies: "taskDependencies", agentRunMap: "agentRunMap" }, outputs: { taskClicked: "taskClicked", openEntityRecord: "openEntityRecord" }, standalone: true, features: [i0.ɵɵNgOnChangesFeature, i0.ɵɵStandaloneFeature], decls: 3, vars: 2, consts: [["ganttContainer", ""], [1, "gantt-task-viewer"], ["class", "no-tasks", 4, "ngIf"], ["class", "gantt-layout", 4, "ngIf"], [1, "no-tasks"], [1, "fas", "fa-chart-gantt"], [1, "gantt-layout"], [1, "gantt-container"], ["class", "gantt-resizer", 3, "mousedown", 4, "ngIf"], ["class", "task-detail-panel", 3, "width", 4, "ngIf"], [1, "gantt-resizer", 3, "mousedown"], [1, "task-detail-panel"], [3, "closePanel", "openEntityRecord", "task", "agentRunId"]], template: function GanttTaskViewerComponent_Template(rf, ctx) { if (rf & 1) {
404
+ i0.ɵɵelementStart(0, "div", 1);
405
+ i0.ɵɵtemplate(1, GanttTaskViewerComponent_div_1_Template, 4, 0, "div", 2)(2, GanttTaskViewerComponent_div_2_Template, 5, 2, "div", 3);
406
+ i0.ɵɵelementEnd();
407
+ } if (rf & 2) {
408
+ i0.ɵɵadvance();
409
+ i0.ɵɵproperty("ngIf", !ctx.tasks || ctx.tasks.length === 0);
410
+ i0.ɵɵadvance();
411
+ i0.ɵɵproperty("ngIf", ctx.tasks && ctx.tasks.length > 0);
412
+ } }, dependencies: [CommonModule, i1.NgIf, TaskDetailPanelComponent], styles: [".gantt-task-viewer[_ngcontent-%COMP%] {\n height: 100%;\n background: white;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .gantt-layout[_ngcontent-%COMP%] {\n display: flex;\n height: 600px;\n position: relative;\n }\n\n .gantt-container[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 400px;\n height: 100%;\n position: relative;\n }\n\n .gantt-resizer[_ngcontent-%COMP%] {\n width: 4px;\n background: #E5E7EB;\n cursor: col-resize;\n flex-shrink: 0;\n transition: background 0.2s;\n }\n\n .gantt-resizer[_ngcontent-%COMP%]:hover {\n background: #3B82F6;\n }\n\n .task-detail-panel[_ngcontent-%COMP%] {\n min-width: 300px;\n max-width: 600px;\n height: 100%;\n border-left: 1px solid #E5E7EB;\n flex-shrink: 0;\n }\n\n \n\n [_nghost-%COMP%] .gantt_container {\n font-family: inherit;\n font-size: 13px;\n }\n\n [_nghost-%COMP%] .gantt_grid_scale, \n [_nghost-%COMP%] .gantt_task_scale {\n background: #F9FAFB;\n border-bottom: 2px solid #E5E7EB;\n }\n\n [_nghost-%COMP%] .gantt_task .gantt_task_content {\n font-weight: 500;\n }\n\n .no-tasks[_ngcontent-%COMP%] {\n text-align: center;\n padding: 80px 20px;\n color: #9CA3AF;\n }\n\n .no-tasks[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n opacity: 0.3;\n margin-bottom: 16px;\n }\n\n .no-tasks[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }"] });
413
+ }
414
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GanttTaskViewerComponent, [{
415
+ type: Component,
416
+ args: [{ selector: 'mj-gantt-task-viewer', standalone: true, imports: [CommonModule, TaskDetailPanelComponent], template: `
417
+ <div class="gantt-task-viewer">
418
+ <div *ngIf="!tasks || tasks.length === 0" class="no-tasks">
419
+ <i class="fas fa-chart-gantt"></i>
420
+ <p>No tasks to display in Gantt view</p>
421
+ </div>
422
+
423
+ <div *ngIf="tasks && tasks.length > 0" class="gantt-layout">
424
+ <div #ganttContainer class="gantt-container"></div>
425
+
426
+ <div *ngIf="selectedTask" class="gantt-resizer"
427
+ (mousedown)="startResize($event)"></div>
428
+
429
+ <div *ngIf="selectedTask" class="task-detail-panel" [style.width.px]="detailPanelWidth">
430
+ <mj-task-detail-panel
431
+ [task]="selectedTask"
432
+ [agentRunId]="getAgentRunId(selectedTask)"
433
+ (closePanel)="closeDetailPanel()"
434
+ (openEntityRecord)="onOpenEntityRecord($event)">
435
+ </mj-task-detail-panel>
436
+ </div>
437
+ </div>
438
+ </div>
439
+ `, styles: ["\n .gantt-task-viewer {\n height: 100%;\n background: white;\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: #E5E7EB;\n cursor: col-resize;\n flex-shrink: 0;\n transition: background 0.2s;\n }\n\n .gantt-resizer:hover {\n background: #3B82F6;\n }\n\n .task-detail-panel {\n min-width: 300px;\n max-width: 600px;\n height: 100%;\n border-left: 1px solid #E5E7EB;\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: #F9FAFB;\n border-bottom: 2px solid #E5E7EB;\n }\n\n :host ::ng-deep .gantt_task .gantt_task_content {\n font-weight: 500;\n }\n\n .no-tasks {\n text-align: center;\n padding: 80px 20px;\n color: #9CA3AF;\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 "] }]
440
+ }], null, { tasks: [{
441
+ type: Input
442
+ }], taskDependencies: [{
443
+ type: Input
444
+ }], agentRunMap: [{
445
+ type: Input
446
+ }], taskClicked: [{
447
+ type: Output
448
+ }], openEntityRecord: [{
449
+ type: Output
450
+ }], ganttContainer: [{
451
+ type: ViewChild,
452
+ args: ['ganttContainer', { static: false }]
453
+ }], handleResize: [{
454
+ type: HostListener,
455
+ args: ['document:mousemove', ['$event']]
456
+ }], stopResize: [{
457
+ type: HostListener,
458
+ args: ['document:mouseup']
459
+ }] }); })();
460
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GanttTaskViewerComponent, { className: "GanttTaskViewerComponent", filePath: "src/lib/components/gantt-task-viewer.component.ts", lineNumber: 114 }); })();
461
+ //# sourceMappingURL=gantt-task-viewer.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-task-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/components/gantt-task-viewer.component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { EventEmitter, OnChanges } from '@angular/core';
2
+ import { TaskEntity } from '@memberjunction/core-entities';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Simple list view for tasks
6
+ */
7
+ export declare class SimpleTaskViewerComponent implements OnChanges {
8
+ tasks: TaskEntity[];
9
+ agentRunMap?: Map<string, string>;
10
+ taskClicked: EventEmitter<TaskEntity>;
11
+ openEntityRecord: EventEmitter<{
12
+ entityName: string;
13
+ recordId: string;
14
+ }>;
15
+ selectedTask: TaskEntity | null;
16
+ detailPanelWidth: number;
17
+ private isResizing;
18
+ private resizeStartX;
19
+ private resizeStartWidth;
20
+ ngOnChanges(): void;
21
+ onTaskClick(task: TaskEntity): void;
22
+ getAgentRunId(task: TaskEntity): string | null;
23
+ closeDetailPanel(): void;
24
+ onOpenEntityRecord(event: {
25
+ entityName: string;
26
+ recordId: string;
27
+ }): void;
28
+ startResize(event: MouseEvent): void;
29
+ handleResize(event: MouseEvent): void;
30
+ stopResize(): void;
31
+ getStatusIcon(status: string): string;
32
+ formatDate(date: Date | null): string;
33
+ static ɵfac: i0.ɵɵFactoryDeclaration<SimpleTaskViewerComponent, never>;
34
+ static ɵcmp: i0.ɵɵComponentDeclaration<SimpleTaskViewerComponent, "mj-simple-task-viewer", never, { "tasks": { "alias": "tasks"; "required": false; }; "agentRunMap": { "alias": "agentRunMap"; "required": false; }; }, { "taskClicked": "taskClicked"; "openEntityRecord": "openEntityRecord"; }, never, never, true, never>;
35
+ }
36
+ //# sourceMappingURL=simple-task-viewer.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-task-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/simple-task-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAgB,MAAM,eAAe,CAAC;AAEhG,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;;AAG3D;;GAEG;AACH,qBAkRa,yBAA0B,YAAW,SAAS;IAChD,KAAK,EAAE,UAAU,EAAE,CAAM;IACzB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,2BAAkC;IAC7C,gBAAgB;oBAAkC,MAAM;kBAAY,MAAM;OAAM;IAEnF,YAAY,EAAE,UAAU,GAAG,IAAI,CAAQ;IACvC,gBAAgB,EAAE,MAAM,CAAO;IAEtC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAE7B,WAAW;IAIJ,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKnC,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAI9C,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;IAIX,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWrC,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM;yCApEjC,yBAAyB;2CAAzB,yBAAyB;CAyErC"}