@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.
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +10 -0
- package/README.md +233 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/components/gantt-task-viewer.component.d.ts +44 -0
- package/dist/lib/components/gantt-task-viewer.component.d.ts.map +1 -0
- package/dist/lib/components/gantt-task-viewer.component.js +461 -0
- package/dist/lib/components/gantt-task-viewer.component.js.map +1 -0
- package/dist/lib/components/simple-task-viewer.component.d.ts +36 -0
- package/dist/lib/components/simple-task-viewer.component.d.ts.map +1 -0
- package/dist/lib/components/simple-task-viewer.component.js +275 -0
- package/dist/lib/components/simple-task-viewer.component.js.map +1 -0
- package/dist/lib/components/task-detail-panel.component.d.ts +26 -0
- package/dist/lib/components/task-detail-panel.component.d.ts.map +1 -0
- package/dist/lib/components/task-detail-panel.component.js +294 -0
- package/dist/lib/components/task-detail-panel.component.js.map +1 -0
- package/dist/lib/components/task.component.d.ts +34 -0
- package/dist/lib/components/task.component.d.ts.map +1 -0
- package/dist/lib/components/task.component.js +201 -0
- package/dist/lib/components/task.component.js.map +1 -0
- package/dist/lib/models/task-view.models.d.ts +17 -0
- package/dist/lib/models/task-view.models.d.ts.map +1 -0
- package/dist/lib/models/task-view.models.js +2 -0
- package/dist/lib/models/task-view.models.js.map +1 -0
- package/dist/lib/ng-tasks.module.d.ts +14 -0
- package/dist/lib/ng-tasks.module.d.ts.map +1 -0
- package/dist/lib/ng-tasks.module.js +37 -0
- package/dist/lib/ng-tasks.module.js.map +1 -0
- package/dist/public-api.d.ts +9 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +12 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +31 -0
- package/src/index.ts +1 -0
- package/src/lib/components/gantt-task-viewer.component.ts +524 -0
- package/src/lib/components/simple-task-viewer.component.ts +356 -0
- package/src/lib/components/task-detail-panel.component.ts +304 -0
- package/src/lib/components/task.component.ts +175 -0
- package/src/lib/models/task-view.models.ts +19 -0
- package/src/lib/ng-tasks.module.ts +22 -0
- package/src/lib/types/frappe-gantt.d.ts +32 -0
- package/src/public-api.ts +14 -0
- 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"}
|