@jbctechsolutions/mcp-office365 2.5.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.
- package/LICENSE +21 -0
- package/README.md +667 -0
- package/dist/applescript/account-repository.d.ts +30 -0
- package/dist/applescript/account-repository.d.ts.map +1 -0
- package/dist/applescript/account-repository.js +38 -0
- package/dist/applescript/account-repository.js.map +1 -0
- package/dist/applescript/account-scripts.d.ts +21 -0
- package/dist/applescript/account-scripts.d.ts.map +1 -0
- package/dist/applescript/account-scripts.js +180 -0
- package/dist/applescript/account-scripts.js.map +1 -0
- package/dist/applescript/calendar-manager.d.ts +44 -0
- package/dist/applescript/calendar-manager.d.ts.map +1 -0
- package/dist/applescript/calendar-manager.js +92 -0
- package/dist/applescript/calendar-manager.js.map +1 -0
- package/dist/applescript/calendar-writer.d.ts +36 -0
- package/dist/applescript/calendar-writer.d.ts.map +1 -0
- package/dist/applescript/calendar-writer.js +94 -0
- package/dist/applescript/calendar-writer.js.map +1 -0
- package/dist/applescript/content-readers.d.ts +114 -0
- package/dist/applescript/content-readers.d.ts.map +1 -0
- package/dist/applescript/content-readers.js +328 -0
- package/dist/applescript/content-readers.js.map +1 -0
- package/dist/applescript/executor.d.ts +60 -0
- package/dist/applescript/executor.d.ts.map +1 -0
- package/dist/applescript/executor.js +173 -0
- package/dist/applescript/executor.js.map +1 -0
- package/dist/applescript/index.d.ts +20 -0
- package/dist/applescript/index.d.ts.map +1 -0
- package/dist/applescript/index.js +29 -0
- package/dist/applescript/index.js.map +1 -0
- package/dist/applescript/mail-sender.d.ts +38 -0
- package/dist/applescript/mail-sender.d.ts.map +1 -0
- package/dist/applescript/mail-sender.js +67 -0
- package/dist/applescript/mail-sender.js.map +1 -0
- package/dist/applescript/parser.d.ts +235 -0
- package/dist/applescript/parser.d.ts.map +1 -0
- package/dist/applescript/parser.js +496 -0
- package/dist/applescript/parser.js.map +1 -0
- package/dist/applescript/repository.d.ts +64 -0
- package/dist/applescript/repository.d.ts.map +1 -0
- package/dist/applescript/repository.js +444 -0
- package/dist/applescript/repository.js.map +1 -0
- package/dist/applescript/scripts.d.ts +265 -0
- package/dist/applescript/scripts.d.ts.map +1 -0
- package/dist/applescript/scripts.js +1483 -0
- package/dist/applescript/scripts.js.map +1 -0
- package/dist/approval/hash.d.ts +87 -0
- package/dist/approval/hash.d.ts.map +1 -0
- package/dist/approval/hash.js +102 -0
- package/dist/approval/hash.js.map +1 -0
- package/dist/approval/index.d.ts +13 -0
- package/dist/approval/index.d.ts.map +1 -0
- package/dist/approval/index.js +7 -0
- package/dist/approval/index.js.map +1 -0
- package/dist/approval/token-manager.d.ts +51 -0
- package/dist/approval/token-manager.d.ts.map +1 -0
- package/dist/approval/token-manager.js +111 -0
- package/dist/approval/token-manager.js.map +1 -0
- package/dist/approval/types.d.ts +44 -0
- package/dist/approval/types.d.ts.map +1 -0
- package/dist/approval/types.js +6 -0
- package/dist/approval/types.js.map +1 -0
- package/dist/cli.d.ts +30 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +143 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -0
- package/dist/database/connection.d.ts +77 -0
- package/dist/database/connection.d.ts.map +1 -0
- package/dist/database/connection.js +130 -0
- package/dist/database/connection.js.map +1 -0
- package/dist/database/index.d.ts +11 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +11 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/queries.d.ts +93 -0
- package/dist/database/queries.d.ts.map +1 -0
- package/dist/database/queries.js +430 -0
- package/dist/database/queries.js.map +1 -0
- package/dist/database/repository.d.ts +198 -0
- package/dist/database/repository.d.ts.map +1 -0
- package/dist/database/repository.js +199 -0
- package/dist/database/repository.js.map +1 -0
- package/dist/graph/attachments.d.ts +72 -0
- package/dist/graph/attachments.d.ts.map +1 -0
- package/dist/graph/attachments.js +207 -0
- package/dist/graph/attachments.js.map +1 -0
- package/dist/graph/auth/config.d.ts +34 -0
- package/dist/graph/auth/config.d.ts.map +1 -0
- package/dist/graph/auth/config.js +78 -0
- package/dist/graph/auth/config.js.map +1 -0
- package/dist/graph/auth/device-code-flow.d.ts +55 -0
- package/dist/graph/auth/device-code-flow.d.ts.map +1 -0
- package/dist/graph/auth/device-code-flow.js +180 -0
- package/dist/graph/auth/device-code-flow.js.map +1 -0
- package/dist/graph/auth/index.d.ts +13 -0
- package/dist/graph/auth/index.d.ts.map +1 -0
- package/dist/graph/auth/index.js +13 -0
- package/dist/graph/auth/index.js.map +1 -0
- package/dist/graph/auth/token-cache.d.ts +41 -0
- package/dist/graph/auth/token-cache.d.ts.map +1 -0
- package/dist/graph/auth/token-cache.js +105 -0
- package/dist/graph/auth/token-cache.js.map +1 -0
- package/dist/graph/client/batch.d.ts +38 -0
- package/dist/graph/client/batch.d.ts.map +1 -0
- package/dist/graph/client/batch.js +33 -0
- package/dist/graph/client/batch.js.map +1 -0
- package/dist/graph/client/cache.d.ts +64 -0
- package/dist/graph/client/cache.d.ts.map +1 -0
- package/dist/graph/client/cache.js +108 -0
- package/dist/graph/client/cache.js.map +1 -0
- package/dist/graph/client/graph-client.d.ts +630 -0
- package/dist/graph/client/graph-client.d.ts.map +1 -0
- package/dist/graph/client/graph-client.js +1771 -0
- package/dist/graph/client/graph-client.js.map +1 -0
- package/dist/graph/client/index.d.ts +12 -0
- package/dist/graph/client/index.d.ts.map +1 -0
- package/dist/graph/client/index.js +12 -0
- package/dist/graph/client/index.js.map +1 -0
- package/dist/graph/content-readers.d.ts +106 -0
- package/dist/graph/content-readers.d.ts.map +1 -0
- package/dist/graph/content-readers.js +321 -0
- package/dist/graph/content-readers.js.map +1 -0
- package/dist/graph/index.d.ts +18 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +23 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/mailbox-adapter.d.ts +30 -0
- package/dist/graph/mailbox-adapter.d.ts.map +1 -0
- package/dist/graph/mailbox-adapter.js +59 -0
- package/dist/graph/mailbox-adapter.js.map +1 -0
- package/dist/graph/mappers/contact-mapper.d.ts +14 -0
- package/dist/graph/mappers/contact-mapper.d.ts.map +1 -0
- package/dist/graph/mappers/contact-mapper.js +20 -0
- package/dist/graph/mappers/contact-mapper.js.map +1 -0
- package/dist/graph/mappers/email-mapper.d.ts +14 -0
- package/dist/graph/mappers/email-mapper.d.ts.map +1 -0
- package/dist/graph/mappers/email-mapper.js +44 -0
- package/dist/graph/mappers/email-mapper.js.map +1 -0
- package/dist/graph/mappers/event-mapper.d.ts +14 -0
- package/dist/graph/mappers/event-mapper.d.ts.map +1 -0
- package/dist/graph/mappers/event-mapper.js +31 -0
- package/dist/graph/mappers/event-mapper.js.map +1 -0
- package/dist/graph/mappers/folder-mapper.d.ts +22 -0
- package/dist/graph/mappers/folder-mapper.d.ts.map +1 -0
- package/dist/graph/mappers/folder-mapper.js +51 -0
- package/dist/graph/mappers/folder-mapper.js.map +1 -0
- package/dist/graph/mappers/index.d.ts +16 -0
- package/dist/graph/mappers/index.d.ts.map +1 -0
- package/dist/graph/mappers/index.js +16 -0
- package/dist/graph/mappers/index.js.map +1 -0
- package/dist/graph/mappers/task-mapper.d.ts +20 -0
- package/dist/graph/mappers/task-mapper.d.ts.map +1 -0
- package/dist/graph/mappers/task-mapper.js +27 -0
- package/dist/graph/mappers/task-mapper.js.map +1 -0
- package/dist/graph/mappers/utils.d.ts +97 -0
- package/dist/graph/mappers/utils.d.ts.map +1 -0
- package/dist/graph/mappers/utils.js +186 -0
- package/dist/graph/mappers/utils.js.map +1 -0
- package/dist/graph/repository.d.ts +1104 -0
- package/dist/graph/repository.d.ts.map +1 -0
- package/dist/graph/repository.js +2999 -0
- package/dist/graph/repository.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6052 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/html-stripper.d.ts +41 -0
- package/dist/parsers/html-stripper.d.ts.map +1 -0
- package/dist/parsers/html-stripper.js +179 -0
- package/dist/parsers/html-stripper.js.map +1 -0
- package/dist/parsers/index.d.ts +12 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +12 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/olk15.d.ts +87 -0
- package/dist/parsers/olk15.d.ts.map +1 -0
- package/dist/parsers/olk15.js +368 -0
- package/dist/parsers/olk15.js.map +1 -0
- package/dist/signature.d.ts +22 -0
- package/dist/signature.d.ts.map +1 -0
- package/dist/signature.js +89 -0
- package/dist/signature.js.map +1 -0
- package/dist/tools/calendar-permissions.d.ts +79 -0
- package/dist/tools/calendar-permissions.d.ts.map +1 -0
- package/dist/tools/calendar-permissions.js +121 -0
- package/dist/tools/calendar-permissions.js.map +1 -0
- package/dist/tools/calendar.d.ts +208 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +247 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/categories.d.ts +94 -0
- package/dist/tools/categories.d.ts.map +1 -0
- package/dist/tools/categories.js +117 -0
- package/dist/tools/categories.js.map +1 -0
- package/dist/tools/checklist-items.d.ts +89 -0
- package/dist/tools/checklist-items.d.ts.map +1 -0
- package/dist/tools/checklist-items.js +140 -0
- package/dist/tools/checklist-items.js.map +1 -0
- package/dist/tools/contacts.d.ts +94 -0
- package/dist/tools/contacts.d.ts.map +1 -0
- package/dist/tools/contacts.js +134 -0
- package/dist/tools/contacts.js.map +1 -0
- package/dist/tools/excel.d.ts +96 -0
- package/dist/tools/excel.d.ts.map +1 -0
- package/dist/tools/excel.js +165 -0
- package/dist/tools/excel.js.map +1 -0
- package/dist/tools/focused-overrides.d.ts +70 -0
- package/dist/tools/focused-overrides.d.ts.map +1 -0
- package/dist/tools/focused-overrides.js +117 -0
- package/dist/tools/focused-overrides.js.map +1 -0
- package/dist/tools/index.d.ts +22 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +34 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/linked-resources.d.ts +74 -0
- package/dist/tools/linked-resources.d.ts.map +1 -0
- package/dist/tools/linked-resources.js +122 -0
- package/dist/tools/linked-resources.js.map +1 -0
- package/dist/tools/mail-rules.d.ts +98 -0
- package/dist/tools/mail-rules.d.ts.map +1 -0
- package/dist/tools/mail-rules.js +169 -0
- package/dist/tools/mail-rules.js.map +1 -0
- package/dist/tools/mail-send.d.ts +314 -0
- package/dist/tools/mail-send.d.ts.map +1 -0
- package/dist/tools/mail-send.js +555 -0
- package/dist/tools/mail-send.js.map +1 -0
- package/dist/tools/mail.d.ts +127 -0
- package/dist/tools/mail.d.ts.map +1 -0
- package/dist/tools/mail.js +311 -0
- package/dist/tools/mail.js.map +1 -0
- package/dist/tools/mailbox-organization.d.ts +301 -0
- package/dist/tools/mailbox-organization.d.ts.map +1 -0
- package/dist/tools/mailbox-organization.js +541 -0
- package/dist/tools/mailbox-organization.js.map +1 -0
- package/dist/tools/meetings.d.ts +114 -0
- package/dist/tools/meetings.d.ts.map +1 -0
- package/dist/tools/meetings.js +110 -0
- package/dist/tools/meetings.js.map +1 -0
- package/dist/tools/notes.d.ts +74 -0
- package/dist/tools/notes.d.ts.map +1 -0
- package/dist/tools/notes.js +136 -0
- package/dist/tools/notes.js.map +1 -0
- package/dist/tools/onedrive.d.ts +194 -0
- package/dist/tools/onedrive.d.ts.map +1 -0
- package/dist/tools/onedrive.js +257 -0
- package/dist/tools/onedrive.js.map +1 -0
- package/dist/tools/people.d.ts +129 -0
- package/dist/tools/people.d.ts.map +1 -0
- package/dist/tools/people.js +195 -0
- package/dist/tools/people.js.map +1 -0
- package/dist/tools/planner-visualization.d.ts +91 -0
- package/dist/tools/planner-visualization.d.ts.map +1 -0
- package/dist/tools/planner-visualization.js +192 -0
- package/dist/tools/planner-visualization.js.map +1 -0
- package/dist/tools/planner.d.ts +288 -0
- package/dist/tools/planner.d.ts.map +1 -0
- package/dist/tools/planner.js +368 -0
- package/dist/tools/planner.js.map +1 -0
- package/dist/tools/scheduling.d.ts +49 -0
- package/dist/tools/scheduling.d.ts.map +1 -0
- package/dist/tools/scheduling.js +115 -0
- package/dist/tools/scheduling.js.map +1 -0
- package/dist/tools/sharepoint.d.ts +115 -0
- package/dist/tools/sharepoint.d.ts.map +1 -0
- package/dist/tools/sharepoint.js +99 -0
- package/dist/tools/sharepoint.js.map +1 -0
- package/dist/tools/task-attachments.d.ts +74 -0
- package/dist/tools/task-attachments.d.ts.map +1 -0
- package/dist/tools/task-attachments.js +122 -0
- package/dist/tools/task-attachments.js.map +1 -0
- package/dist/tools/tasks.d.ts +74 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +126 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/teams.d.ts +389 -0
- package/dist/tools/teams.d.ts.map +1 -0
- package/dist/tools/teams.js +546 -0
- package/dist/tools/teams.js.map +1 -0
- package/dist/types/calendar.d.ts +60 -0
- package/dist/types/calendar.d.ts.map +1 -0
- package/dist/types/calendar.js +15 -0
- package/dist/types/calendar.js.map +1 -0
- package/dist/types/contacts.d.ts +96 -0
- package/dist/types/contacts.d.ts.map +1 -0
- package/dist/types/contacts.js +41 -0
- package/dist/types/contacts.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mail.d.ts +108 -0
- package/dist/types/mail.d.ts.map +1 -0
- package/dist/types/mail.js +40 -0
- package/dist/types/mail.js.map +1 -0
- package/dist/types/notes.d.ts +26 -0
- package/dist/types/notes.d.ts.map +1 -0
- package/dist/types/notes.js +6 -0
- package/dist/types/notes.js.map +1 -0
- package/dist/types/tasks.d.ts +31 -0
- package/dist/types/tasks.d.ts.map +1 -0
- package/dist/types/tasks.js +6 -0
- package/dist/types/tasks.js.map +1 -0
- package/dist/utils/dates.d.ts +66 -0
- package/dist/utils/dates.d.ts.map +1 -0
- package/dist/utils/dates.js +94 -0
- package/dist/utils/dates.js.map +1 -0
- package/dist/utils/errors.d.ts +218 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +306 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/visualization/html.d.ts +26 -0
- package/dist/visualization/html.d.ts.map +1 -0
- package/dist/visualization/html.js +306 -0
- package/dist/visualization/html.js.map +1 -0
- package/dist/visualization/markdown.d.ts +25 -0
- package/dist/visualization/markdown.d.ts.map +1 -0
- package/dist/visualization/markdown.js +186 -0
- package/dist/visualization/markdown.js.map +1 -0
- package/dist/visualization/mermaid.d.ts +25 -0
- package/dist/visualization/mermaid.d.ts.map +1 -0
- package/dist/visualization/mermaid.js +158 -0
- package/dist/visualization/mermaid.js.map +1 -0
- package/dist/visualization/svg.d.ts +25 -0
- package/dist/visualization/svg.d.ts.map +1 -0
- package/dist/visualization/svg.js +282 -0
- package/dist/visualization/svg.js.map +1 -0
- package/dist/visualization/types.d.ts +43 -0
- package/dist/visualization/types.d.ts.map +1 -0
- package/dist/visualization/types.js +34 -0
- package/dist/visualization/types.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 JBC Tech Solutions, LLC
|
|
3
|
+
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Self-contained HTML visualization renderer for Planner data.
|
|
7
|
+
* All styles are inline -- no external dependencies.
|
|
8
|
+
*/
|
|
9
|
+
import { PRIORITY_LABELS, PRIORITY_COLORS, getTaskStatus, } from './types.js';
|
|
10
|
+
function escapeHtml(text) {
|
|
11
|
+
return text
|
|
12
|
+
.replace(/&/g, '&')
|
|
13
|
+
.replace(/</g, '<')
|
|
14
|
+
.replace(/>/g, '>')
|
|
15
|
+
.replace(/"/g, '"');
|
|
16
|
+
}
|
|
17
|
+
function priorityColor(priority) {
|
|
18
|
+
return PRIORITY_COLORS[priority] ?? '#95a5a6';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Render a Kanban board as self-contained HTML with CSS Grid.
|
|
22
|
+
*/
|
|
23
|
+
export function renderKanbanHtml(data) {
|
|
24
|
+
const colCount = Math.max(data.buckets.length, 1);
|
|
25
|
+
let cardsHtml = '';
|
|
26
|
+
for (const bucket of data.buckets) {
|
|
27
|
+
const bucketTasks = data.tasks.filter((t) => t.bucketId === bucket.id);
|
|
28
|
+
let tasksHtml = '';
|
|
29
|
+
for (const task of bucketTasks) {
|
|
30
|
+
const pColor = priorityColor(task.priority);
|
|
31
|
+
const pLabel = PRIORITY_LABELS[task.priority] ?? `P${task.priority}`;
|
|
32
|
+
const assignees = task.assignments.length > 0 ? task.assignments.join(', ') : 'Unassigned';
|
|
33
|
+
const due = task.dueDateTime != null
|
|
34
|
+
? (new Date(task.dueDateTime).toISOString().split('T')[0] ?? '')
|
|
35
|
+
: 'No due date';
|
|
36
|
+
tasksHtml += `
|
|
37
|
+
<div class="kanban-card" style="border-left:4px solid ${pColor};background:#fff;border-radius:6px;padding:10px;margin-bottom:8px;box-shadow:0 1px 3px rgba(0,0,0,0.12);cursor:default;" title="Assignees: ${escapeHtml(assignees)} Due: ${escapeHtml(due)} Priority: ${escapeHtml(pLabel)}">
|
|
38
|
+
<div style="font-weight:600;margin-bottom:4px;">${escapeHtml(task.title)}</div>
|
|
39
|
+
<div style="font-size:12px;color:#666;">
|
|
40
|
+
<span style="display:inline-block;background:${pColor};color:#fff;padding:1px 6px;border-radius:3px;font-size:11px;">${escapeHtml(pLabel)}</span>
|
|
41
|
+
<span style="margin-left:6px;">${task.percentComplete}%</span>
|
|
42
|
+
</div>
|
|
43
|
+
</div>`;
|
|
44
|
+
}
|
|
45
|
+
if (bucketTasks.length === 0) {
|
|
46
|
+
tasksHtml = '<div style="color:#999;font-style:italic;padding:10px;">No tasks</div>';
|
|
47
|
+
}
|
|
48
|
+
cardsHtml += `
|
|
49
|
+
<div class="kanban-column" style="background:#f4f5f7;border-radius:8px;padding:12px;min-width:220px;">
|
|
50
|
+
<div style="font-weight:700;font-size:14px;margin-bottom:10px;padding-bottom:8px;border-bottom:2px solid #ddd;">${escapeHtml(bucket.name)} <span style="color:#999;font-weight:400;">(${bucketTasks.length})</span></div>
|
|
51
|
+
${tasksHtml}
|
|
52
|
+
</div>`;
|
|
53
|
+
}
|
|
54
|
+
return `<!DOCTYPE html>
|
|
55
|
+
<html lang="en">
|
|
56
|
+
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(data.plan.title)} - Kanban</title></head>
|
|
57
|
+
<body style="margin:0;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#e8eaed;">
|
|
58
|
+
<h1 style="margin:0 0 16px 0;font-size:22px;">${escapeHtml(data.plan.title)} - Kanban Board</h1>
|
|
59
|
+
<div style="display:grid;grid-template-columns:repeat(${colCount},minmax(240px,1fr));gap:16px;overflow-x:auto;">
|
|
60
|
+
${cardsHtml}
|
|
61
|
+
</div>
|
|
62
|
+
</body>
|
|
63
|
+
</html>`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Render a Gantt chart as self-contained HTML with CSS positioning.
|
|
67
|
+
*/
|
|
68
|
+
export function renderGanttHtml(data) {
|
|
69
|
+
// Collect all tasks that have at least one date
|
|
70
|
+
const tasksWithDates = data.tasks.filter((t) => t.startDateTime != null || t.dueDateTime != null);
|
|
71
|
+
const allTasks = tasksWithDates.length > 0 ? tasksWithDates : data.tasks;
|
|
72
|
+
// Determine date range
|
|
73
|
+
const dates = [];
|
|
74
|
+
for (const task of allTasks) {
|
|
75
|
+
if (task.startDateTime != null)
|
|
76
|
+
dates.push(new Date(task.startDateTime));
|
|
77
|
+
if (task.dueDateTime != null)
|
|
78
|
+
dates.push(new Date(task.dueDateTime));
|
|
79
|
+
}
|
|
80
|
+
if (dates.length === 0) {
|
|
81
|
+
return `<!DOCTYPE html>
|
|
82
|
+
<html lang="en">
|
|
83
|
+
<head><meta charset="UTF-8"><title>${escapeHtml(data.plan.title)} - Gantt</title></head>
|
|
84
|
+
<body style="margin:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
|
|
85
|
+
<h1>${escapeHtml(data.plan.title)} - Gantt Chart</h1>
|
|
86
|
+
<p>No tasks with dates to display.</p>
|
|
87
|
+
</body>
|
|
88
|
+
</html>`;
|
|
89
|
+
}
|
|
90
|
+
const minDate = new Date(Math.min(...dates.map((d) => d.getTime())));
|
|
91
|
+
const maxDate = new Date(Math.max(...dates.map((d) => d.getTime())));
|
|
92
|
+
// Add some padding
|
|
93
|
+
minDate.setDate(minDate.getDate() - 1);
|
|
94
|
+
maxDate.setDate(maxDate.getDate() + 1);
|
|
95
|
+
const totalDays = Math.max(Math.ceil((maxDate.getTime() - minDate.getTime()) / 86400000), 1);
|
|
96
|
+
const rowHeight = 36;
|
|
97
|
+
const labelWidth = 200;
|
|
98
|
+
const chartWidth = 800;
|
|
99
|
+
const headerHeight = 40;
|
|
100
|
+
// Date axis labels (show ~8 evenly spaced dates)
|
|
101
|
+
const dateAxisCount = Math.min(totalDays, 8);
|
|
102
|
+
let dateAxisHtml = '';
|
|
103
|
+
for (let i = 0; i <= dateAxisCount; i++) {
|
|
104
|
+
const d = new Date(minDate.getTime() + (i / dateAxisCount) * (maxDate.getTime() - minDate.getTime()));
|
|
105
|
+
const x = (i / dateAxisCount) * chartWidth;
|
|
106
|
+
dateAxisHtml += `<div style="position:absolute;left:${labelWidth + x}px;top:10px;font-size:11px;color:#666;transform:translateX(-50%);">${d.toISOString().split('T')[0]}</div>`;
|
|
107
|
+
}
|
|
108
|
+
let barsHtml = '';
|
|
109
|
+
let rowIndex = 0;
|
|
110
|
+
for (const task of allTasks) {
|
|
111
|
+
const start = task.startDateTime != null ? new Date(task.startDateTime) : task.dueDateTime != null ? new Date(new Date(task.dueDateTime).getTime() - 7 * 86400000) : minDate;
|
|
112
|
+
const end = task.dueDateTime != null ? new Date(task.dueDateTime) : new Date(start.getTime() + 7 * 86400000);
|
|
113
|
+
const startOffset = Math.max(0, (start.getTime() - minDate.getTime()) / (maxDate.getTime() - minDate.getTime())) * chartWidth;
|
|
114
|
+
const barWidth = Math.max(10, ((end.getTime() - start.getTime()) / (maxDate.getTime() - minDate.getTime())) * chartWidth);
|
|
115
|
+
const y = headerHeight + rowIndex * rowHeight;
|
|
116
|
+
const pColor = priorityColor(task.priority);
|
|
117
|
+
const progressWidth = (task.percentComplete / 100) * barWidth;
|
|
118
|
+
barsHtml += `
|
|
119
|
+
<div style="position:absolute;left:0;top:${y}px;width:${labelWidth - 10}px;height:${rowHeight}px;display:flex;align-items:center;padding-left:8px;font-size:13px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;">${escapeHtml(task.title)}</div>
|
|
120
|
+
<div style="position:absolute;left:${labelWidth + startOffset}px;top:${y + 6}px;width:${barWidth}px;height:${rowHeight - 14}px;background:#ddd;border-radius:4px;overflow:hidden;">
|
|
121
|
+
<div style="width:${progressWidth}px;height:100%;background:${pColor};border-radius:4px 0 0 4px;"></div>
|
|
122
|
+
</div>`;
|
|
123
|
+
rowIndex++;
|
|
124
|
+
}
|
|
125
|
+
const totalHeight = headerHeight + rowIndex * rowHeight + 20;
|
|
126
|
+
return `<!DOCTYPE html>
|
|
127
|
+
<html lang="en">
|
|
128
|
+
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(data.plan.title)} - Gantt</title></head>
|
|
129
|
+
<body style="margin:0;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#fafafa;">
|
|
130
|
+
<h1 style="font-size:22px;margin:0 0 16px 0;">${escapeHtml(data.plan.title)} - Gantt Chart</h1>
|
|
131
|
+
<div style="position:relative;width:${labelWidth + chartWidth}px;height:${totalHeight}px;background:#fff;border:1px solid #e0e0e0;border-radius:8px;overflow:hidden;padding:0;">
|
|
132
|
+
${dateAxisHtml}
|
|
133
|
+
${barsHtml}
|
|
134
|
+
</div>
|
|
135
|
+
</body>
|
|
136
|
+
</html>`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Render a summary dashboard as self-contained HTML.
|
|
140
|
+
*/
|
|
141
|
+
export function renderSummaryHtml(data) {
|
|
142
|
+
let notStarted = 0;
|
|
143
|
+
let inProgress = 0;
|
|
144
|
+
let completed = 0;
|
|
145
|
+
let overdue = 0;
|
|
146
|
+
for (const task of data.tasks) {
|
|
147
|
+
const status = getTaskStatus(task);
|
|
148
|
+
if (status === 'completed')
|
|
149
|
+
completed++;
|
|
150
|
+
else if (status === 'overdue')
|
|
151
|
+
overdue++;
|
|
152
|
+
else if (status === 'in-progress')
|
|
153
|
+
inProgress++;
|
|
154
|
+
else
|
|
155
|
+
notStarted++;
|
|
156
|
+
}
|
|
157
|
+
const total = data.tasks.length;
|
|
158
|
+
// Assignee workload
|
|
159
|
+
const assigneeMap = new Map();
|
|
160
|
+
for (const task of data.tasks) {
|
|
161
|
+
for (const assignee of task.assignments) {
|
|
162
|
+
assigneeMap.set(assignee, (assigneeMap.get(assignee) ?? 0) + 1);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
let assigneeRows = '';
|
|
166
|
+
for (const [assignee, count] of [...assigneeMap.entries()].sort((a, b) => b[1] - a[1])) {
|
|
167
|
+
assigneeRows += `<tr><td style="padding:6px 12px;border-bottom:1px solid #eee;">${escapeHtml(assignee)}</td><td style="padding:6px 12px;border-bottom:1px solid #eee;text-align:center;">${count}</td></tr>`;
|
|
168
|
+
}
|
|
169
|
+
const statCard = (label, value, color) => `<div style="background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 1px 3px rgba(0,0,0,0.1);text-align:center;min-width:120px;">
|
|
170
|
+
<div style="font-size:28px;font-weight:700;color:${color};">${value}</div>
|
|
171
|
+
<div style="font-size:13px;color:#666;margin-top:4px;">${label}</div>
|
|
172
|
+
</div>`;
|
|
173
|
+
// Priority distribution
|
|
174
|
+
const priorityCounts = {};
|
|
175
|
+
for (const task of data.tasks) {
|
|
176
|
+
priorityCounts[task.priority] = (priorityCounts[task.priority] ?? 0) + 1;
|
|
177
|
+
}
|
|
178
|
+
let priorityBars = '';
|
|
179
|
+
for (const [p, count] of Object.entries(priorityCounts).sort(([a], [b]) => Number(a) - Number(b))) {
|
|
180
|
+
const pNum = Number(p);
|
|
181
|
+
const pct = total > 0 ? (count / total) * 100 : 0;
|
|
182
|
+
const color = priorityColor(pNum);
|
|
183
|
+
const label = PRIORITY_LABELS[pNum] ?? `P${p}`;
|
|
184
|
+
priorityBars += `
|
|
185
|
+
<div style="display:flex;align-items:center;margin-bottom:6px;">
|
|
186
|
+
<div style="width:80px;font-size:13px;">${escapeHtml(label)}</div>
|
|
187
|
+
<div style="flex:1;background:#eee;border-radius:4px;height:20px;overflow:hidden;">
|
|
188
|
+
<div style="width:${pct}%;height:100%;background:${color};border-radius:4px;"></div>
|
|
189
|
+
</div>
|
|
190
|
+
<div style="width:40px;text-align:right;font-size:13px;margin-left:8px;">${count}</div>
|
|
191
|
+
</div>`;
|
|
192
|
+
}
|
|
193
|
+
return `<!DOCTYPE html>
|
|
194
|
+
<html lang="en">
|
|
195
|
+
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(data.plan.title)} - Summary</title></head>
|
|
196
|
+
<body style="margin:0;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#f0f2f5;">
|
|
197
|
+
<h1 style="font-size:22px;margin:0 0 20px 0;">${escapeHtml(data.plan.title)} - Summary Dashboard</h1>
|
|
198
|
+
<div style="display:flex;gap:16px;flex-wrap:wrap;margin-bottom:24px;">
|
|
199
|
+
${statCard('Total Tasks', total, '#2c3e50')}
|
|
200
|
+
${statCard('Not Started', notStarted, '#95a5a6')}
|
|
201
|
+
${statCard('In Progress', inProgress, '#3498db')}
|
|
202
|
+
${statCard('Completed', completed, '#2ecc71')}
|
|
203
|
+
${statCard('Overdue', overdue, '#e74c3c')}
|
|
204
|
+
</div>
|
|
205
|
+
${priorityBars ? `<div style="background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 1px 3px rgba(0,0,0,0.1);margin-bottom:24px;max-width:500px;">
|
|
206
|
+
<h2 style="font-size:16px;margin:0 0 12px 0;">Priority Distribution</h2>
|
|
207
|
+
${priorityBars}
|
|
208
|
+
</div>` : ''}
|
|
209
|
+
${assigneeRows ? `<div style="background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 1px 3px rgba(0,0,0,0.1);max-width:400px;">
|
|
210
|
+
<h2 style="font-size:16px;margin:0 0 12px 0;">Assignee Workload</h2>
|
|
211
|
+
<table style="width:100%;border-collapse:collapse;">
|
|
212
|
+
<thead><tr><th style="text-align:left;padding:6px 12px;border-bottom:2px solid #ddd;">Assignee</th><th style="text-align:center;padding:6px 12px;border-bottom:2px solid #ddd;">Tasks</th></tr></thead>
|
|
213
|
+
<tbody>${assigneeRows}</tbody>
|
|
214
|
+
</table>
|
|
215
|
+
</div>` : ''}
|
|
216
|
+
</body>
|
|
217
|
+
</html>`;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Render a burndown chart as self-contained HTML with an inline SVG line chart.
|
|
221
|
+
*/
|
|
222
|
+
export function renderBurndownHtml(data) {
|
|
223
|
+
const allDates = new Set();
|
|
224
|
+
for (const task of data.tasks) {
|
|
225
|
+
if (task.startDateTime != null)
|
|
226
|
+
allDates.add(new Date(task.startDateTime).toISOString().split('T')[0]);
|
|
227
|
+
if (task.dueDateTime != null)
|
|
228
|
+
allDates.add(new Date(task.dueDateTime).toISOString().split('T')[0]);
|
|
229
|
+
if (task.completedDateTime != null)
|
|
230
|
+
allDates.add(new Date(task.completedDateTime).toISOString().split('T')[0]);
|
|
231
|
+
}
|
|
232
|
+
const sortedDates = [...allDates].sort();
|
|
233
|
+
if (sortedDates.length === 0) {
|
|
234
|
+
return `<!DOCTYPE html>
|
|
235
|
+
<html lang="en"><head><meta charset="UTF-8"><title>${escapeHtml(data.plan.title)} - Burndown</title></head>
|
|
236
|
+
<body style="margin:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
|
|
237
|
+
<h1>${escapeHtml(data.plan.title)} - Burndown Chart</h1>
|
|
238
|
+
<p>No date data available for burndown chart.</p>
|
|
239
|
+
</body></html>`;
|
|
240
|
+
}
|
|
241
|
+
const total = data.tasks.length;
|
|
242
|
+
const remaining = [];
|
|
243
|
+
for (const date of sortedDates) {
|
|
244
|
+
const completedByDate = data.tasks.filter((t) => t.completedDateTime != null && new Date(t.completedDateTime).toISOString().split('T')[0] <= date).length;
|
|
245
|
+
remaining.push(total - completedByDate);
|
|
246
|
+
}
|
|
247
|
+
// SVG chart dimensions
|
|
248
|
+
const svgW = 700;
|
|
249
|
+
const svgH = 350;
|
|
250
|
+
const pad = { top: 30, right: 30, bottom: 60, left: 50 };
|
|
251
|
+
const chartW = svgW - pad.left - pad.right;
|
|
252
|
+
const chartH = svgH - pad.top - pad.bottom;
|
|
253
|
+
const n = sortedDates.length;
|
|
254
|
+
const yMax = Math.max(total, 1);
|
|
255
|
+
// Actual line points
|
|
256
|
+
const points = remaining.map((r, i) => {
|
|
257
|
+
const x = pad.left + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2);
|
|
258
|
+
const y = pad.top + chartH - (r / yMax) * chartH;
|
|
259
|
+
return `${x},${y}`;
|
|
260
|
+
});
|
|
261
|
+
// Ideal burndown line (straight from total to 0)
|
|
262
|
+
const idealStart = `${pad.left},${pad.top}`;
|
|
263
|
+
const idealEnd = `${pad.left + chartW},${pad.top + chartH}`;
|
|
264
|
+
// X-axis labels
|
|
265
|
+
let xLabels = '';
|
|
266
|
+
const labelCount = Math.min(n, 8);
|
|
267
|
+
for (let i = 0; i < labelCount; i++) {
|
|
268
|
+
const idx = Math.floor(i * (n - 1) / Math.max(labelCount - 1, 1));
|
|
269
|
+
const x = pad.left + (n > 1 ? (idx / (n - 1)) * chartW : chartW / 2);
|
|
270
|
+
xLabels += `<text x="${x}" y="${svgH - 15}" text-anchor="middle" font-size="11" fill="#666" transform="rotate(-30,${x},${svgH - 15})">${sortedDates[idx]}</text>`;
|
|
271
|
+
}
|
|
272
|
+
// Y-axis labels
|
|
273
|
+
let yLabels = '';
|
|
274
|
+
const yTicks = 5;
|
|
275
|
+
for (let i = 0; i <= yTicks; i++) {
|
|
276
|
+
const val = Math.round((i / yTicks) * yMax);
|
|
277
|
+
const y = pad.top + chartH - (i / yTicks) * chartH;
|
|
278
|
+
yLabels += `<text x="${pad.left - 8}" y="${y + 4}" text-anchor="end" font-size="11" fill="#666">${val}</text>`;
|
|
279
|
+
yLabels += `<line x1="${pad.left}" y1="${y}" x2="${pad.left + chartW}" y2="${y}" stroke="#eee" stroke-width="1"/>`;
|
|
280
|
+
}
|
|
281
|
+
// Data point circles
|
|
282
|
+
const circles = remaining.map((r, i) => {
|
|
283
|
+
const x = pad.left + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2);
|
|
284
|
+
const y = pad.top + chartH - (r / yMax) * chartH;
|
|
285
|
+
return `<circle cx="${x}" cy="${y}" r="4" fill="#3498db" stroke="#fff" stroke-width="2"/>`;
|
|
286
|
+
}).join('');
|
|
287
|
+
return `<!DOCTYPE html>
|
|
288
|
+
<html lang="en">
|
|
289
|
+
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(data.plan.title)} - Burndown</title></head>
|
|
290
|
+
<body style="margin:0;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#fafafa;">
|
|
291
|
+
<h1 style="font-size:22px;margin:0 0 16px 0;">${escapeHtml(data.plan.title)} - Burndown Chart</h1>
|
|
292
|
+
<svg width="${svgW}" height="${svgH}" style="background:#fff;border:1px solid #e0e0e0;border-radius:8px;">
|
|
293
|
+
${yLabels}
|
|
294
|
+
<line x1="${pad.left}" y1="${pad.top}" x2="${pad.left}" y2="${pad.top + chartH}" stroke="#ccc" stroke-width="1"/>
|
|
295
|
+
<line x1="${pad.left}" y1="${pad.top + chartH}" x2="${pad.left + chartW}" y2="${pad.top + chartH}" stroke="#ccc" stroke-width="1"/>
|
|
296
|
+
<line x1="${idealStart.split(',')[0]}" y1="${idealStart.split(',')[1]}" x2="${idealEnd.split(',')[0]}" y2="${idealEnd.split(',')[1]}" stroke="#e74c3c" stroke-width="2" stroke-dasharray="6,4" opacity="0.5"/>
|
|
297
|
+
<polyline points="${points.join(' ')}" fill="none" stroke="#3498db" stroke-width="2.5"/>
|
|
298
|
+
${circles}
|
|
299
|
+
${xLabels}
|
|
300
|
+
<text x="${svgW / 2}" y="${svgH - 2}" text-anchor="middle" font-size="12" fill="#333">Date</text>
|
|
301
|
+
<text x="14" y="${svgH / 2}" text-anchor="middle" font-size="12" fill="#333" transform="rotate(-90,14,${svgH / 2})">Remaining</text>
|
|
302
|
+
</svg>
|
|
303
|
+
</body>
|
|
304
|
+
</html>`;
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/visualization/html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AAEH,OAAO,EAEL,eAAe,EACf,eAAe,EACf,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA2B;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAElD,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;QACvE,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAW,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YAC3F,MAAM,GAAG,GAAW,IAAI,CAAC,WAAW,IAAI,IAAI;gBAC1C,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAChE,CAAC,CAAC,aAAa,CAAC;YAClB,SAAS,IAAI;gEAC6C,MAAM,8IAA8I,UAAU,CAAC,SAAS,CAAC,aAAa,UAAU,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,MAAM,CAAC;4DAC7O,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;2DAEvB,MAAM,kEAAkE,UAAU,CAAC,MAAM,CAAC;6CACxG,IAAI,CAAC,eAAe;;eAElD,CAAC;QACZ,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,SAAS,GAAG,wEAAwE,CAAC;QACvF,CAAC;QACD,SAAS,IAAI;;0HAEyG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,+CAA+C,WAAW,CAAC,MAAM;UACxM,SAAS;aACN,CAAC;IACZ,CAAC;IAED,OAAO;;wGAE+F,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;kDAEjF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;0DACnB,QAAQ;MAC5D,SAAS;;;QAGP,CAAC;AACT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAA2B;IACzD,gDAAgD;IAChD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;IAClG,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAEzE,uBAAuB;IACvB,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACzE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;;qCAE0B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;QAExD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;;QAG3B,CAAC;IACP,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,mBAAmB;IACnB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7F,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,UAAU,GAAG,GAAG,CAAC;IACvB,MAAM,UAAU,GAAG,GAAG,CAAC;IACvB,MAAM,YAAY,GAAG,EAAE,CAAC;IAExB,iDAAiD;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7C,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,UAAU,CAAC;QAC3C,YAAY,IAAI,sCAAsC,UAAU,GAAG,CAAC,sEAAsE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClL,CAAC;IAED,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7K,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC7G,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC;QAC9H,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QAC1H,MAAM,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;QAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC;QAE9D,QAAQ,IAAI;iDACiC,CAAC,YAAY,UAAU,GAAG,EAAE,aAAa,SAAS,kIAAkI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;2CAChN,UAAU,GAAG,WAAW,UAAU,CAAC,GAAG,CAAC,YAAY,QAAQ,aAAa,SAAS,GAAG,EAAE;4BACrG,aAAa,6BAA6B,MAAM;aAC/D,CAAC;QACV,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,EAAE,CAAC;IAE7D,OAAO;;wGAE+F,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;kDAEjF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;wCACrC,UAAU,GAAG,UAAU,aAAa,WAAW;MACjF,YAAY;MACZ,QAAQ;;;QAGN,CAAC;AACT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA2B;IAC3D,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,WAAW;YAAE,SAAS,EAAE,CAAC;aACnC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;aACpC,IAAI,MAAM,KAAK,aAAa;YAAE,UAAU,EAAE,CAAC;;YAC3C,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAEhC,oBAAoB;IACpB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,YAAY,IAAI,kEAAkE,UAAU,CAAC,QAAQ,CAAC,qFAAqF,KAAK,YAAY,CAAC;IAC/M,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa,EAAU,EAAE,CACvE;0DACsD,KAAK,MAAM,KAAK;gEACV,KAAK;YACzD,CAAC;IAEX,wBAAwB;IACxB,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;QAC/C,YAAY,IAAI;;kDAE8B,UAAU,CAAC,KAAK,CAAC;;8BAErC,GAAG,4BAA4B,KAAK;;mFAEiB,KAAK;aAC3E,CAAC;IACZ,CAAC;IAED,OAAO;;wGAE+F,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;kDAEjF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;MAEvE,QAAQ,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC;MACzC,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,CAAC;MAC9C,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,CAAC;MAC9C,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC;MAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;;IAEzC,YAAY,CAAC,CAAC,CAAC;;MAEb,YAAY;SACT,CAAC,CAAC,CAAC,EAAE;IACV,YAAY,CAAC,CAAC,CAAC;;;;eAIJ,YAAY;;SAElB,CAAC,CAAC,CAAC,EAAE;;QAEN,CAAC;AACT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA2B;IAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QACxG,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QACpG,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAClH,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;qDAC0C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;QAExE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;eAEpB,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAChC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,IAAI,IAAI,CACzG,CAAC,MAAM,CAAC;QACT,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC;IAC1C,CAAC;IAED,uBAAuB;IACvB,MAAM,IAAI,GAAG,GAAG,CAAC;IACjB,MAAM,IAAI,GAAG,GAAG,CAAC;IACjB,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IAC3C,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEhC,qBAAqB;IACrB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;QACjD,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC;IAE5D,gBAAgB;IAChB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrE,OAAO,IAAI,YAAY,CAAC,QAAQ,IAAI,GAAG,EAAE,2EAA2E,CAAC,IAAI,IAAI,GAAG,EAAE,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;IACpK,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;QACnD,OAAO,IAAI,YAAY,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,kDAAkD,GAAG,SAAS,CAAC;QAC/G,OAAO,IAAI,aAAa,GAAG,CAAC,IAAI,SAAS,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,MAAM,SAAS,CAAC,oCAAoC,CAAC;IACrH,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;QACjD,OAAO,eAAe,CAAC,SAAS,CAAC,yDAAyD,CAAC;IAC7F,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;wGAE+F,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;kDAEjF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC7D,IAAI,aAAa,IAAI;MAC/B,OAAO;gBACG,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,GAAG,MAAM;gBAClE,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,GAAG,MAAM,SAAS,GAAG,CAAC,IAAI,GAAG,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,MAAM;gBACpF,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBAC/G,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;MAClC,OAAO;MACP,OAAO;eACE,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;sBACjB,IAAI,GAAG,CAAC,8EAA8E,IAAI,GAAG,CAAC;;;QAG5G,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 JBC Tech Solutions, LLC
|
|
3
|
+
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Markdown visualization renderer for Planner data.
|
|
7
|
+
*/
|
|
8
|
+
import { type PlanVisualizationData } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Render a Kanban board as markdown tables grouped by bucket.
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderKanbanMarkdown(data: PlanVisualizationData): string;
|
|
13
|
+
/**
|
|
14
|
+
* Render a Gantt chart as a Mermaid code block inside markdown.
|
|
15
|
+
*/
|
|
16
|
+
export declare function renderGanttMarkdown(data: PlanVisualizationData): string;
|
|
17
|
+
/**
|
|
18
|
+
* Render a summary dashboard as markdown with stats and assignee workload tables.
|
|
19
|
+
*/
|
|
20
|
+
export declare function renderSummaryMarkdown(data: PlanVisualizationData): string;
|
|
21
|
+
/**
|
|
22
|
+
* Render a burndown chart as a date-indexed markdown table.
|
|
23
|
+
*/
|
|
24
|
+
export declare function renderBurndownMarkdown(data: PlanVisualizationData): string;
|
|
25
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/visualization/markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CA+CxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAwCvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAiDzE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAoC1E"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 JBC Tech Solutions, LLC
|
|
3
|
+
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Markdown visualization renderer for Planner data.
|
|
7
|
+
*/
|
|
8
|
+
import { PRIORITY_LABELS, getTaskStatus, } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Render a Kanban board as markdown tables grouped by bucket.
|
|
11
|
+
*/
|
|
12
|
+
export function renderKanbanMarkdown(data) {
|
|
13
|
+
const lines = [`# ${data.plan.title} - Kanban Board`, ''];
|
|
14
|
+
for (const bucket of data.buckets) {
|
|
15
|
+
const bucketTasks = data.tasks.filter((t) => t.bucketId === bucket.id);
|
|
16
|
+
lines.push(`## ${bucket.name}`, '');
|
|
17
|
+
lines.push('| Title | Priority | Assignees | % Complete | Due Date |');
|
|
18
|
+
lines.push('|-------|----------|-----------|------------|----------|');
|
|
19
|
+
if (bucketTasks.length === 0) {
|
|
20
|
+
lines.push('| _No tasks_ | | | | |');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
for (const task of bucketTasks) {
|
|
24
|
+
const priority = PRIORITY_LABELS[task.priority] ?? `P${task.priority}`;
|
|
25
|
+
const assignees = task.assignments.length > 0 ? task.assignments.join(', ') : '-';
|
|
26
|
+
const due = task.dueDateTime != null
|
|
27
|
+
? new Date(task.dueDateTime).toISOString().split('T')[0]
|
|
28
|
+
: '-';
|
|
29
|
+
lines.push(`| ${task.title} | ${priority} | ${assignees} | ${task.percentComplete}% | ${due} |`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
lines.push('');
|
|
33
|
+
}
|
|
34
|
+
// Handle tasks not assigned to any known bucket
|
|
35
|
+
const knownBucketIds = new Set(data.buckets.map((b) => b.id));
|
|
36
|
+
const orphanTasks = data.tasks.filter((t) => !knownBucketIds.has(t.bucketId));
|
|
37
|
+
if (orphanTasks.length > 0) {
|
|
38
|
+
lines.push('## Unassigned Bucket', '');
|
|
39
|
+
lines.push('| Title | Priority | Assignees | % Complete | Due Date |');
|
|
40
|
+
lines.push('|-------|----------|-----------|------------|----------|');
|
|
41
|
+
for (const task of orphanTasks) {
|
|
42
|
+
const priority = PRIORITY_LABELS[task.priority] ?? `P${task.priority}`;
|
|
43
|
+
const assignees = task.assignments.length > 0 ? task.assignments.join(', ') : '-';
|
|
44
|
+
const due = task.dueDateTime != null
|
|
45
|
+
? new Date(task.dueDateTime).toISOString().split('T')[0]
|
|
46
|
+
: '-';
|
|
47
|
+
lines.push(`| ${task.title} | ${priority} | ${assignees} | ${task.percentComplete}% | ${due} |`);
|
|
48
|
+
}
|
|
49
|
+
lines.push('');
|
|
50
|
+
}
|
|
51
|
+
return lines.join('\n');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Render a Gantt chart as a Mermaid code block inside markdown.
|
|
55
|
+
*/
|
|
56
|
+
export function renderGanttMarkdown(data) {
|
|
57
|
+
const lines = [
|
|
58
|
+
`# ${data.plan.title} - Gantt Chart`,
|
|
59
|
+
'',
|
|
60
|
+
'```mermaid',
|
|
61
|
+
'gantt',
|
|
62
|
+
' dateFormat YYYY-MM-DD',
|
|
63
|
+
` title ${data.plan.title}`,
|
|
64
|
+
];
|
|
65
|
+
for (const bucket of data.buckets) {
|
|
66
|
+
const bucketTasks = data.tasks.filter((t) => t.bucketId === bucket.id);
|
|
67
|
+
if (bucketTasks.length === 0)
|
|
68
|
+
continue;
|
|
69
|
+
lines.push(` section ${bucket.name}`);
|
|
70
|
+
for (const task of bucketTasks) {
|
|
71
|
+
const start = task.startDateTime != null
|
|
72
|
+
? new Date(task.startDateTime).toISOString().split('T')[0]
|
|
73
|
+
: null;
|
|
74
|
+
const end = task.dueDateTime != null
|
|
75
|
+
? new Date(task.dueDateTime).toISOString().split('T')[0]
|
|
76
|
+
: null;
|
|
77
|
+
const status = task.percentComplete === 100 ? 'done, ' : task.percentComplete > 0 ? 'active, ' : '';
|
|
78
|
+
if (start != null && end != null) {
|
|
79
|
+
lines.push(` ${task.title} :${status}${start}, ${end}`);
|
|
80
|
+
}
|
|
81
|
+
else if (start != null) {
|
|
82
|
+
lines.push(` ${task.title} :${status}${start}, 7d`);
|
|
83
|
+
}
|
|
84
|
+
else if (end != null) {
|
|
85
|
+
// Estimate start as 7 days before due
|
|
86
|
+
const estimatedStart = new Date(end);
|
|
87
|
+
estimatedStart.setDate(estimatedStart.getDate() - 7);
|
|
88
|
+
const startStr = estimatedStart.toISOString().split('T')[0];
|
|
89
|
+
lines.push(` ${task.title} :${status}${startStr}, ${end}`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
lines.push(` ${task.title} :${status}2026-01-01, 7d`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
lines.push('```', '');
|
|
97
|
+
return lines.join('\n');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Render a summary dashboard as markdown with stats and assignee workload tables.
|
|
101
|
+
*/
|
|
102
|
+
export function renderSummaryMarkdown(data) {
|
|
103
|
+
const total = data.tasks.length;
|
|
104
|
+
let notStarted = 0;
|
|
105
|
+
let inProgress = 0;
|
|
106
|
+
let completed = 0;
|
|
107
|
+
let overdue = 0;
|
|
108
|
+
for (const task of data.tasks) {
|
|
109
|
+
const status = getTaskStatus(task);
|
|
110
|
+
if (status === 'completed')
|
|
111
|
+
completed++;
|
|
112
|
+
else if (status === 'overdue')
|
|
113
|
+
overdue++;
|
|
114
|
+
else if (status === 'in-progress')
|
|
115
|
+
inProgress++;
|
|
116
|
+
else
|
|
117
|
+
notStarted++;
|
|
118
|
+
}
|
|
119
|
+
const lines = [
|
|
120
|
+
`# ${data.plan.title} - Summary`,
|
|
121
|
+
'',
|
|
122
|
+
'## Task Statistics',
|
|
123
|
+
'',
|
|
124
|
+
'| Metric | Count |',
|
|
125
|
+
'|--------|-------|',
|
|
126
|
+
`| Total Tasks | ${total} |`,
|
|
127
|
+
`| Not Started | ${notStarted} |`,
|
|
128
|
+
`| In Progress | ${inProgress} |`,
|
|
129
|
+
`| Completed | ${completed} |`,
|
|
130
|
+
`| Overdue | ${overdue} |`,
|
|
131
|
+
'',
|
|
132
|
+
];
|
|
133
|
+
// Assignee workload
|
|
134
|
+
const assigneeMap = new Map();
|
|
135
|
+
for (const task of data.tasks) {
|
|
136
|
+
for (const assignee of task.assignments) {
|
|
137
|
+
assigneeMap.set(assignee, (assigneeMap.get(assignee) ?? 0) + 1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (assigneeMap.size > 0) {
|
|
141
|
+
lines.push('## Assignee Workload', '');
|
|
142
|
+
lines.push('| Assignee | Task Count |');
|
|
143
|
+
lines.push('|----------|------------|');
|
|
144
|
+
for (const [assignee, count] of [...assigneeMap.entries()].sort((a, b) => b[1] - a[1])) {
|
|
145
|
+
lines.push(`| ${assignee} | ${count} |`);
|
|
146
|
+
}
|
|
147
|
+
lines.push('');
|
|
148
|
+
}
|
|
149
|
+
return lines.join('\n');
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Render a burndown chart as a date-indexed markdown table.
|
|
153
|
+
*/
|
|
154
|
+
export function renderBurndownMarkdown(data) {
|
|
155
|
+
const lines = [`# ${data.plan.title} - Burndown`, ''];
|
|
156
|
+
// Collect relevant dates
|
|
157
|
+
const tasksWithDue = data.tasks.filter((t) => t.dueDateTime);
|
|
158
|
+
if (tasksWithDue.length === 0) {
|
|
159
|
+
lines.push('_No tasks with due dates to generate burndown chart._', '');
|
|
160
|
+
return lines.join('\n');
|
|
161
|
+
}
|
|
162
|
+
const allDates = new Set();
|
|
163
|
+
for (const task of data.tasks) {
|
|
164
|
+
if (task.startDateTime != null)
|
|
165
|
+
allDates.add(new Date(task.startDateTime).toISOString().split('T')[0]);
|
|
166
|
+
if (task.dueDateTime != null)
|
|
167
|
+
allDates.add(new Date(task.dueDateTime).toISOString().split('T')[0]);
|
|
168
|
+
if (task.completedDateTime != null)
|
|
169
|
+
allDates.add(new Date(task.completedDateTime).toISOString().split('T')[0]);
|
|
170
|
+
}
|
|
171
|
+
const sortedDates = [...allDates].sort();
|
|
172
|
+
if (sortedDates.length === 0) {
|
|
173
|
+
lines.push('_No date data available._', '');
|
|
174
|
+
return lines.join('\n');
|
|
175
|
+
}
|
|
176
|
+
lines.push('| Date | Remaining Tasks | Completed |');
|
|
177
|
+
lines.push('|------|-----------------|-----------|');
|
|
178
|
+
const total = data.tasks.length;
|
|
179
|
+
for (const date of sortedDates) {
|
|
180
|
+
const completedByDate = data.tasks.filter((t) => t.completedDateTime != null && new Date(t.completedDateTime).toISOString().split('T')[0] <= date).length;
|
|
181
|
+
lines.push(`| ${date} | ${total - completedByDate} | ${completedByDate} |`);
|
|
182
|
+
}
|
|
183
|
+
lines.push('');
|
|
184
|
+
return lines.join('\n');
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/visualization/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 JBC Tech Solutions, LLC
|
|
3
|
+
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Mermaid diagram renderer for Planner data.
|
|
7
|
+
*/
|
|
8
|
+
import { type PlanVisualizationData } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Render a Gantt chart in pure Mermaid gantt syntax.
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderGanttMermaid(data: PlanVisualizationData): string;
|
|
13
|
+
/**
|
|
14
|
+
* Render a Kanban board using Mermaid block-beta diagram.
|
|
15
|
+
*/
|
|
16
|
+
export declare function renderKanbanMermaid(data: PlanVisualizationData): string;
|
|
17
|
+
/**
|
|
18
|
+
* Render a summary pie chart in Mermaid syntax.
|
|
19
|
+
*/
|
|
20
|
+
export declare function renderSummaryMermaid(data: PlanVisualizationData): string;
|
|
21
|
+
/**
|
|
22
|
+
* Render a burndown chart using Mermaid xychart-beta.
|
|
23
|
+
*/
|
|
24
|
+
export declare function renderBurndownMermaid(data: PlanVisualizationData): string;
|
|
25
|
+
//# sourceMappingURL=mermaid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/visualization/mermaid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,KAAK,qBAAqB,EAAiB,MAAM,YAAY,CAAC;AAEvE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAwCtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAgCvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CA8BxE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAyCzE"}
|