hzl-web 1.28.3 → 1.30.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.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,UAAU,EAEX,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAqFD,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CA6MpE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,UAAU,EAGX,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAqFD,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAyOpE"}
package/dist/server.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { createServer } from 'http';
2
+ import { AmbiguousPrefixError, } from 'hzl-core';
2
3
  import { DASHBOARD_HTML } from './ui-embed.js';
3
4
  // Date filter presets in days
4
5
  const DATE_PRESETS = {
@@ -36,19 +37,31 @@ export function createWebServer(options) {
36
37
  const { port, host = '0.0.0.0', taskService, eventStore } = options;
37
38
  // Route handlers
38
39
  function handleTasks(params, res) {
39
- const since = params.get('since') || '3d';
40
+ const dueMonth = params.get('due_month');
40
41
  const project = params.get('project');
42
+ const since = params.get('since') || '3d';
41
43
  const days = DATE_PRESETS[since] ?? 3;
42
- // Get tasks from service
43
- const rows = taskService.listTasks({
44
- sinceDays: days,
45
- project: project ?? undefined,
46
- });
44
+ // Get tasks from service (service validates dueMonth format/range)
45
+ let rows;
46
+ try {
47
+ rows = taskService.listTasks({
48
+ ...(dueMonth ? { dueMonth } : { sinceDays: days }),
49
+ project: project ?? undefined,
50
+ });
51
+ }
52
+ catch (err) {
53
+ // Only treat dueMonth validation errors as 400; re-throw others (e.g. DB errors → 500)
54
+ if (err instanceof Error && (err.message.startsWith('Invalid dueMonth') || err.message.startsWith('Invalid month'))) {
55
+ json(res, { error: err.message }, 400);
56
+ return;
57
+ }
58
+ throw err;
59
+ }
47
60
  // Get blocked tasks map from service
48
61
  const blockedMap = taskService.getBlockedByMap();
49
62
  // Get subtask counts for parent tasks (filtered + total)
50
63
  const subtaskCounts = taskService.getSubtaskCounts({
51
- sinceDays: days,
64
+ ...(dueMonth ? {} : { sinceDays: days }),
52
65
  project: project ?? undefined,
53
66
  });
54
67
  const subtaskTotals = taskService.getSubtaskCounts();
@@ -59,16 +72,32 @@ export function createWebServer(options) {
59
72
  subtask_count: subtaskCounts.get(row.task_id) ?? 0,
60
73
  subtask_total: subtaskTotals.get(row.task_id) ?? 0,
61
74
  }));
62
- json(res, { tasks, since, project });
75
+ json(res, { tasks, since: dueMonth ? undefined : since, project, due_month: dueMonth ?? undefined });
63
76
  }
64
77
  function handleTaskDetail(taskId, res) {
65
- const task = taskService.getTaskById(taskId);
78
+ let resolvedId;
79
+ try {
80
+ const result = taskService.resolveTaskId(taskId);
81
+ if (!result) {
82
+ notFound(res, `Task not found: ${taskId}`);
83
+ return;
84
+ }
85
+ resolvedId = result;
86
+ }
87
+ catch (e) {
88
+ if (e instanceof AmbiguousPrefixError) {
89
+ json(res, { error: e.message }, 400);
90
+ return;
91
+ }
92
+ throw e;
93
+ }
94
+ const task = taskService.getTaskById(resolvedId);
66
95
  if (!task) {
67
96
  notFound(res, `Task not found: ${taskId}`);
68
97
  return;
69
98
  }
70
99
  // Get blocking dependencies from service
71
- const blocked_by = taskService.getBlockingDependencies(taskId);
100
+ const blocked_by = taskService.getBlockingDependencies(resolvedId);
72
101
  const taskDetail = {
73
102
  task_id: task.task_id,
74
103
  title: task.title,
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -228,6 +228,116 @@ describe('hzl-web server', () => {
228
228
  const parentTaskB = tasksB.find((t) => t.title === 'Parent B');
229
229
  expect(parentTaskB?.subtask_count).toBe(1);
230
230
  });
231
+ it('returns tasks filtered by due_month', async () => {
232
+ createServer(4530);
233
+ taskService.createTask({
234
+ title: 'Feb task',
235
+ project: 'test-project',
236
+ due_at: '2026-02-15T00:00:00Z',
237
+ });
238
+ taskService.createTask({
239
+ title: 'Jan task',
240
+ project: 'test-project',
241
+ due_at: '2026-01-10T00:00:00Z',
242
+ });
243
+ const { data } = await fetchJson('/api/tasks?due_month=2026-02');
244
+ const tasks = data.tasks;
245
+ expect(tasks).toHaveLength(1);
246
+ expect(tasks[0].title).toBe('Feb task');
247
+ expect(tasks[0].due_at).toBe('2026-02-15T00:00:00Z');
248
+ });
249
+ it('applies project filter with due_month', async () => {
250
+ createServer(4531);
251
+ projectService.createProject('other-project');
252
+ taskService.createTask({
253
+ title: 'Feb in test',
254
+ project: 'test-project',
255
+ due_at: '2026-02-15T00:00:00Z',
256
+ });
257
+ taskService.createTask({
258
+ title: 'Feb in other',
259
+ project: 'other-project',
260
+ due_at: '2026-02-15T00:00:00Z',
261
+ });
262
+ const { data } = await fetchJson('/api/tasks?due_month=2026-02&project=test-project');
263
+ const tasks = data.tasks;
264
+ expect(tasks).toHaveLength(1);
265
+ expect(tasks[0].title).toBe('Feb in test');
266
+ });
267
+ it('returns 400 for invalid due_month format', async () => {
268
+ createServer(4532);
269
+ const { status } = await fetchJson('/api/tasks?due_month=abc');
270
+ expect(status).toBe(400);
271
+ });
272
+ it('returns 400 for invalid month in due_month', async () => {
273
+ createServer(4533);
274
+ const { status } = await fetchJson('/api/tasks?due_month=2026-13');
275
+ expect(status).toBe(400);
276
+ });
277
+ it('excludes tasks without due_at from due_month query', async () => {
278
+ createServer(4534);
279
+ taskService.createTask({
280
+ title: 'No due date',
281
+ project: 'test-project',
282
+ });
283
+ taskService.createTask({
284
+ title: 'Has due date',
285
+ project: 'test-project',
286
+ due_at: '2026-02-15T00:00:00Z',
287
+ });
288
+ const { data } = await fetchJson('/api/tasks?due_month=2026-02');
289
+ const tasks = data.tasks;
290
+ expect(tasks).toHaveLength(1);
291
+ expect(tasks[0].title).toBe('Has due date');
292
+ });
293
+ it('includes due_month in response metadata when querying by month', async () => {
294
+ createServer(4535);
295
+ const { data } = await fetchJson('/api/tasks?due_month=2026-02');
296
+ const response = data;
297
+ expect(response.due_month).toBe('2026-02');
298
+ expect(response.since).toBeUndefined();
299
+ });
300
+ it('returns 400 for month 00 in due_month', async () => {
301
+ createServer(4536);
302
+ const { status } = await fetchJson('/api/tasks?due_month=2026-00');
303
+ expect(status).toBe(400);
304
+ });
305
+ it('ignores since param when due_month is present', async () => {
306
+ createServer(4538);
307
+ taskService.createTask({
308
+ title: 'Feb task',
309
+ project: 'test-project',
310
+ due_at: '2026-02-15T00:00:00Z',
311
+ });
312
+ // Set updated_at far in the past
313
+ const allTasks = taskService.listTasks({});
314
+ const task = allTasks.find(t => t.title === 'Feb task');
315
+ db.prepare('UPDATE tasks_current SET updated_at = ? WHERE task_id = ?')
316
+ .run('2025-01-01T00:00:00Z', task.task_id);
317
+ // since=1d would normally exclude this old task, but due_month should take precedence
318
+ const { data } = await fetchJson('/api/tasks?due_month=2026-02&since=1d');
319
+ const tasks = data.tasks;
320
+ expect(tasks).toHaveLength(1);
321
+ expect(tasks[0].title).toBe('Feb task');
322
+ });
323
+ it('returns subtask counts for parent tasks in due_month mode', async () => {
324
+ createServer(4537);
325
+ const parent = taskService.createTask({
326
+ title: 'Parent with due date',
327
+ project: 'test-project',
328
+ due_at: '2026-02-15T00:00:00Z',
329
+ });
330
+ taskService.createTask({
331
+ title: 'Child task',
332
+ project: 'test-project',
333
+ parent_id: parent.task_id,
334
+ });
335
+ const { data } = await fetchJson('/api/tasks?due_month=2026-02');
336
+ const tasks = data.tasks;
337
+ const parentTask = tasks.find(t => t.title === 'Parent with due date');
338
+ expect(parentTask?.subtask_count).toBe(1);
339
+ expect(parentTask?.subtask_total).toBe(1);
340
+ });
231
341
  });
232
342
  describe('GET /api/tasks/:id', () => {
233
343
  it('returns task detail', async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"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"}
@@ -1031,6 +1031,158 @@
1031
1031
  display: block;
1032
1032
  }
1033
1033
  }
1034
+
1035
+ /* Calendar View */
1036
+ .calendar-container {
1037
+ padding: 16px 24px;
1038
+ max-width: 1200px;
1039
+ margin: 0 auto;
1040
+ }
1041
+ .calendar-container.hidden { display: none; }
1042
+ .calendar-header {
1043
+ display: flex;
1044
+ align-items: center;
1045
+ gap: 12px;
1046
+ margin-bottom: 16px;
1047
+ }
1048
+ .calendar-nav-btn {
1049
+ font-family: var(--font-mono);
1050
+ font-size: 14px;
1051
+ background: var(--bg-card);
1052
+ color: var(--text-primary);
1053
+ border: 1px solid var(--border);
1054
+ border-radius: 6px;
1055
+ padding: 4px 10px;
1056
+ cursor: pointer;
1057
+ }
1058
+ .calendar-nav-btn:hover { background: var(--bg-hover); }
1059
+ .calendar-month-label {
1060
+ font-size: 18px;
1061
+ font-weight: 600;
1062
+ color: var(--text-primary);
1063
+ min-width: 200px;
1064
+ text-align: center;
1065
+ }
1066
+ .calendar-grid {
1067
+ display: grid;
1068
+ grid-template-columns: repeat(7, 1fr);
1069
+ gap: 1px;
1070
+ background: var(--border);
1071
+ border: 1px solid var(--border);
1072
+ border-radius: 8px;
1073
+ overflow: hidden;
1074
+ }
1075
+ .calendar-day-header {
1076
+ background: var(--bg-card);
1077
+ color: var(--text-muted);
1078
+ font-size: 12px;
1079
+ font-weight: 600;
1080
+ text-align: center;
1081
+ padding: 8px 4px;
1082
+ text-transform: uppercase;
1083
+ }
1084
+ .calendar-day {
1085
+ background: var(--bg-card);
1086
+ min-height: 100px;
1087
+ padding: 4px;
1088
+ display: flex;
1089
+ flex-direction: column;
1090
+ }
1091
+ .calendar-day.other-month {
1092
+ opacity: 0.35;
1093
+ }
1094
+ .calendar-day.today {
1095
+ border: 2px solid var(--accent);
1096
+ border-radius: 2px;
1097
+ }
1098
+ .calendar-day-number {
1099
+ font-size: 12px;
1100
+ color: var(--text-secondary);
1101
+ margin-bottom: 4px;
1102
+ font-weight: 500;
1103
+ }
1104
+ .calendar-day.today .calendar-day-number {
1105
+ color: var(--accent);
1106
+ font-weight: 700;
1107
+ }
1108
+ .calendar-day-tasks {
1109
+ display: flex;
1110
+ flex-direction: column;
1111
+ gap: 2px;
1112
+ flex: 1;
1113
+ }
1114
+ .calendar-mini-card { border-left-color: var(--text-muted); }
1115
+ .calendar-mini-card[data-status="backlog"] { border-left-color: var(--status-backlog); }
1116
+ .calendar-mini-card[data-status="ready"] { border-left-color: var(--status-ready); }
1117
+ .calendar-mini-card[data-status="in_progress"] { border-left-color: var(--status-in-progress); }
1118
+ .calendar-mini-card[data-status="blocked"] { border-left-color: var(--status-blocked); }
1119
+ .calendar-mini-card[data-status="done"] { border-left-color: var(--status-done); }
1120
+ .calendar-mini-card {
1121
+ background: var(--bg-primary);
1122
+ border-left: 3px solid;
1123
+ border-radius: 3px;
1124
+ padding: 2px 4px;
1125
+ cursor: pointer;
1126
+ display: flex;
1127
+ align-items: center;
1128
+ gap: 4px;
1129
+ overflow: hidden;
1130
+ }
1131
+ .calendar-mini-card:hover { background: var(--bg-hover); }
1132
+ .calendar-mini-title {
1133
+ font-size: 11px;
1134
+ color: var(--text-primary);
1135
+ white-space: nowrap;
1136
+ overflow: hidden;
1137
+ text-overflow: ellipsis;
1138
+ flex: 1;
1139
+ }
1140
+ .calendar-mini-project {
1141
+ font-size: 9px;
1142
+ color: var(--text-muted);
1143
+ background: var(--bg-card);
1144
+ padding: 0 4px;
1145
+ border-radius: 3px;
1146
+ white-space: nowrap;
1147
+ flex-shrink: 0;
1148
+ }
1149
+ .calendar-more-link {
1150
+ font-size: 11px;
1151
+ color: var(--accent);
1152
+ cursor: pointer;
1153
+ padding: 1px 4px;
1154
+ }
1155
+ .calendar-more-link:hover { text-decoration: underline; }
1156
+ .calendar-popover {
1157
+ position: absolute;
1158
+ z-index: 100;
1159
+ background: var(--bg-card);
1160
+ border: 1px solid var(--border);
1161
+ border-radius: 8px;
1162
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
1163
+ padding: 8px;
1164
+ min-width: 200px;
1165
+ max-width: 280px;
1166
+ max-height: 300px;
1167
+ overflow-y: auto;
1168
+ }
1169
+ .calendar-popover-header {
1170
+ font-size: 12px;
1171
+ font-weight: 600;
1172
+ color: var(--text-secondary);
1173
+ margin-bottom: 6px;
1174
+ padding-bottom: 4px;
1175
+ border-bottom: 1px solid var(--border);
1176
+ }
1177
+ .calendar-popover .calendar-mini-card {
1178
+ margin-bottom: 2px;
1179
+ }
1180
+ .calendar-empty-state {
1181
+ text-align: center;
1182
+ color: var(--text-muted);
1183
+ padding: 32px 16px;
1184
+ font-size: 14px;
1185
+ }
1034
1186
  </style>
1035
1187
  </head>
1036
1188
  <body>
@@ -1040,6 +1192,7 @@
1040
1192
  <span class="logo">hzl dashboard</span>
1041
1193
  <div class="view-toggle" id="viewToggle">
1042
1194
  <button class="view-btn active" data-view="kanban">Kanban</button>
1195
+ <button class="view-btn" data-view="calendar">Calendar</button>
1043
1196
  <button class="view-btn" data-view="graph">Graph</button>
1044
1197
  </div>
1045
1198
  </div>
@@ -1164,6 +1317,9 @@
1164
1317
  </div>
1165
1318
  </main>
1166
1319
 
1320
+ <!-- Calendar View Container -->
1321
+ <div id="calendarContainer" class="calendar-container hidden"></div>
1322
+
1167
1323
  <!-- Graph View Container -->
1168
1324
  <div id="graphContainer" class="graph-container hidden">
1169
1325
  <div class="graph-loading" id="graphLoading">
@@ -1216,6 +1372,8 @@
1216
1372
  let nodeStatusMap = new Map();
1217
1373
  let pendingModalRequestId = 0; // Track modal fetch requests to avoid race conditions
1218
1374
  let isPolling = false; // Guard against concurrent poll() calls
1375
+ let calendarYear = new Date().getFullYear();
1376
+ let calendarMonth = new Date().getMonth(); // 0-indexed
1219
1377
 
1220
1378
  // DOM Elements
1221
1379
  const dateFilter = document.getElementById('dateFilter');
@@ -1238,6 +1396,7 @@
1238
1396
  const showSubtasksCheckbox = document.getElementById('showSubtasks');
1239
1397
  const viewToggle = document.getElementById('viewToggle');
1240
1398
  const board = document.getElementById('board');
1399
+ const calendarContainer = document.getElementById('calendarContainer');
1241
1400
  const graphContainer = document.getElementById('graphContainer');
1242
1401
  const graphLoading = document.getElementById('graphLoading');
1243
1402
 
@@ -1631,9 +1790,15 @@
1631
1790
 
1632
1791
  // API calls
1633
1792
  async function fetchTasks() {
1634
- const since = dateFilter.value;
1635
1793
  const project = projectFilter.value;
1636
- const url = `/api/tasks?since=${since}${project ? `&project=${encodeURIComponent(project)}` : ''}`;
1794
+ let url;
1795
+ if (activeView === 'calendar') {
1796
+ const mm = String(calendarMonth + 1).padStart(2, '0');
1797
+ url = `/api/tasks?due_month=${calendarYear}-${mm}${project ? `&project=${encodeURIComponent(project)}` : ''}`;
1798
+ } else {
1799
+ const since = dateFilter.value;
1800
+ url = `/api/tasks?since=${since}${project ? `&project=${encodeURIComponent(project)}` : ''}`;
1801
+ }
1637
1802
  const res = await fetch(url);
1638
1803
  if (!res.ok) throw new Error('Failed to fetch tasks');
1639
1804
  const data = await res.json();
@@ -1713,7 +1878,7 @@
1713
1878
 
1714
1879
  let extra = '';
1715
1880
  if (isBlocked) {
1716
- extra = `<div class="card-blocked">Blocked by: ${task.blocked_by.map(id => id.slice(0, 8)).join(', ')}</div>`;
1881
+ extra = `<div class="card-blocked">Blocked by: ${task.blocked_by.map(id => escapeHtml(id.slice(0, 8))).join(', ')}</div>`;
1717
1882
  }
1718
1883
  if (task.status === 'in_progress' && task.lease_until) {
1719
1884
  const remaining = formatTimeRemaining(task.lease_until);
@@ -1733,7 +1898,7 @@
1733
1898
  ${subtaskHtml}
1734
1899
  <div class="card-meta">
1735
1900
  <span class="card-project">${escapeHtml(task.project)}</span>
1736
- ${task.assignee ? `<span class="card-agent">${task.assignee.slice(0, 8)}</span>` : ''}
1901
+ ${task.assignee ? `<span class="card-agent">${escapeHtml(task.assignee.slice(0, 8))}</span>` : ''}
1737
1902
  </div>
1738
1903
  ${extra}
1739
1904
  </div>
@@ -1759,6 +1924,217 @@
1759
1924
  return columns;
1760
1925
  }
1761
1926
 
1927
+ // Calendar state shared between renderCalendar and popover
1928
+ let calendarTasksByDay = {};
1929
+
1930
+ function renderMiniCard(task) {
1931
+ return `<div class="calendar-mini-card" data-task-id="${task.task_id}" data-status="${task.status}">
1932
+ <span class="calendar-mini-title">${escapeHtml(task.title)}</span>
1933
+ <span class="calendar-mini-project">${escapeHtml(task.project)}</span>
1934
+ </div>`;
1935
+ }
1936
+
1937
+ function renderCalendar() {
1938
+ const now = new Date();
1939
+ const isCurrentMonth = calendarYear === now.getFullYear() && calendarMonth === now.getMonth();
1940
+ const todayDate = now.getDate();
1941
+ const MAX_CARDS = 3;
1942
+
1943
+ // Filter to current month in local timezone and group by day in single pass
1944
+ // (Server already filters by project via ?project= param, no client-side filter needed)
1945
+ calendarTasksByDay = {};
1946
+ let monthTaskCount = 0;
1947
+ for (const t of tasks) {
1948
+ if (!t.due_at) continue;
1949
+ const d = new Date(t.due_at);
1950
+ if (d.getFullYear() !== calendarYear || d.getMonth() !== calendarMonth) continue;
1951
+ const day = d.getDate();
1952
+ if (!calendarTasksByDay[day]) calendarTasksByDay[day] = [];
1953
+ calendarTasksByDay[day].push(t);
1954
+ monthTaskCount++;
1955
+ }
1956
+
1957
+ // Month label
1958
+ const monthLabel = new Date(calendarYear, calendarMonth, 1)
1959
+ .toLocaleDateString(undefined, { month: 'long', year: 'numeric' });
1960
+
1961
+ // First day of month (0=Sun) and number of days
1962
+ const firstDow = new Date(calendarYear, calendarMonth, 1).getDay();
1963
+ const daysInMonth = new Date(calendarYear, calendarMonth + 1, 0).getDate();
1964
+ const daysInPrevMonth = new Date(calendarYear, calendarMonth, 0).getDate();
1965
+
1966
+ // Build header
1967
+ let html = `
1968
+ <div class="calendar-header">
1969
+ <button class="calendar-nav-btn" id="calPrev">&larr;</button>
1970
+ <div class="calendar-month-label">${escapeHtml(monthLabel)}</div>
1971
+ <button class="calendar-nav-btn" id="calNext">&rarr;</button>
1972
+ <button class="calendar-nav-btn" id="calToday">Today</button>
1973
+ </div>
1974
+ `;
1975
+
1976
+ // Empty state message (grid still renders for visual context)
1977
+ if (monthTaskCount === 0) {
1978
+ html += `<div class="calendar-empty-state">No tasks with due dates in ${escapeHtml(monthLabel)}</div>`;
1979
+ }
1980
+
1981
+ html += `<div class="calendar-grid">`;
1982
+
1983
+ // Day-of-week headers
1984
+ const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
1985
+ for (const d of dayNames) {
1986
+ html += `<div class="calendar-day-header">${d}</div>`;
1987
+ }
1988
+
1989
+ // Leading days from previous month
1990
+ for (let i = firstDow - 1; i >= 0; i--) {
1991
+ const day = daysInPrevMonth - i;
1992
+ html += `<div class="calendar-day other-month"><span class="calendar-day-number">${day}</span></div>`;
1993
+ }
1994
+
1995
+ // Current month days
1996
+ for (let d = 1; d <= daysInMonth; d++) {
1997
+ const isToday = isCurrentMonth && d === todayDate;
1998
+ const dateStr = `${calendarYear}-${String(calendarMonth + 1).padStart(2, '0')}-${String(d).padStart(2, '0')}`;
1999
+ html += `<div class="calendar-day${isToday ? ' today' : ''}" data-date="${dateStr}">`;
2000
+ html += `<span class="calendar-day-number">${d}</span>`;
2001
+ html += `<div class="calendar-day-tasks">`;
2002
+
2003
+ const dayTasks = calendarTasksByDay[d] || [];
2004
+ const visible = dayTasks.slice(0, MAX_CARDS);
2005
+ for (const t of visible) {
2006
+ html += renderMiniCard(t);
2007
+ }
2008
+ if (dayTasks.length > MAX_CARDS) {
2009
+ html += `<div class="calendar-more-link" data-date="${dateStr}">+${dayTasks.length - MAX_CARDS} more</div>`;
2010
+ }
2011
+
2012
+ html += `</div></div>`;
2013
+ }
2014
+
2015
+ // Trailing days to fill last week
2016
+ const totalCells = firstDow + daysInMonth;
2017
+ const trailingDays = (7 - (totalCells % 7)) % 7;
2018
+ for (let d = 1; d <= trailingDays; d++) {
2019
+ html += `<div class="calendar-day other-month"><span class="calendar-day-number">${d}</span></div>`;
2020
+ }
2021
+
2022
+ html += `</div>`;
2023
+ calendarContainer.innerHTML = html;
2024
+
2025
+ // Wire navigation (named functions to avoid re-adding anonymous listeners)
2026
+ document.getElementById('calPrev').addEventListener('click', navPrev);
2027
+ document.getElementById('calNext').addEventListener('click', navNext);
2028
+ document.getElementById('calToday').addEventListener('click', navToday);
2029
+ }
2030
+
2031
+ function navPrev() {
2032
+ calendarMonth--;
2033
+ if (calendarMonth < 0) { calendarMonth = 11; calendarYear--; }
2034
+ poll();
2035
+ }
2036
+ function navNext() {
2037
+ calendarMonth++;
2038
+ if (calendarMonth > 11) { calendarMonth = 0; calendarYear++; }
2039
+ poll();
2040
+ }
2041
+ function navToday() {
2042
+ const today = new Date();
2043
+ calendarYear = today.getFullYear();
2044
+ calendarMonth = today.getMonth();
2045
+ poll();
2046
+ }
2047
+
2048
+ // Calendar popover for "+N more" links
2049
+ let activePopover = null;
2050
+ let popoverOutsideListener = null;
2051
+
2052
+ function dismissPopover() {
2053
+ if (popoverOutsideListener) {
2054
+ document.removeEventListener('click', popoverOutsideListener);
2055
+ popoverOutsideListener = null;
2056
+ }
2057
+ if (activePopover) {
2058
+ activePopover.remove();
2059
+ activePopover = null;
2060
+ }
2061
+ }
2062
+
2063
+ function showCalendarPopover(dateStr, anchorEl) {
2064
+ dismissPopover();
2065
+
2066
+ // Reuse grouped data from renderCalendar instead of re-filtering
2067
+ const [y, m, d] = dateStr.split('-').map(Number);
2068
+ const dayTasks = calendarTasksByDay[d] || [];
2069
+
2070
+ if (dayTasks.length === 0) return;
2071
+
2072
+ // Format date for header
2073
+ const headerDate = new Date(y, m - 1, d)
2074
+ .toLocaleDateString(undefined, { month: 'long', day: 'numeric' });
2075
+
2076
+ const popover = document.createElement('div');
2077
+ popover.className = 'calendar-popover';
2078
+ popover.innerHTML = `<div class="calendar-popover-header">${escapeHtml(headerDate)}</div>`
2079
+ + dayTasks.map(t => renderMiniCard(t)).join('');
2080
+
2081
+ // Position below the anchor, clamped to viewport edges
2082
+ const rect = anchorEl.getBoundingClientRect();
2083
+ const popoverWidth = 280; // matches CSS max-width
2084
+ const popoverMaxHeight = 300; // matches CSS max-height
2085
+ const left = Math.min(rect.left, window.innerWidth - popoverWidth - 8);
2086
+ // If popover would overflow bottom, position above the anchor instead
2087
+ const spaceBelow = window.innerHeight - rect.bottom - 8;
2088
+ const top = spaceBelow >= popoverMaxHeight
2089
+ ? rect.bottom + 4
2090
+ : Math.max(8, rect.top - popoverMaxHeight - 4);
2091
+ popover.style.position = 'fixed';
2092
+ popover.style.left = left + 'px';
2093
+ popover.style.top = top + 'px';
2094
+
2095
+ document.body.appendChild(popover);
2096
+ activePopover = popover;
2097
+
2098
+ // Dismiss on click-outside (next tick to avoid immediate dismiss)
2099
+ setTimeout(() => {
2100
+ popoverOutsideListener = function onClickOutside(e) {
2101
+ if (activePopover && !activePopover.contains(e.target)) {
2102
+ dismissPopover();
2103
+ }
2104
+ };
2105
+ document.addEventListener('click', popoverOutsideListener);
2106
+ }, 0);
2107
+ }
2108
+
2109
+ // Event delegation for calendar interactions
2110
+ calendarContainer.addEventListener('click', (e) => {
2111
+ // "+N more" link
2112
+ const moreLink = e.target.closest('.calendar-more-link');
2113
+ if (moreLink) {
2114
+ e.stopPropagation();
2115
+ showCalendarPopover(moreLink.dataset.date, moreLink);
2116
+ return;
2117
+ }
2118
+
2119
+ // Mini card click → open task modal
2120
+ const card = e.target.closest('.calendar-mini-card');
2121
+ if (card) {
2122
+ dismissPopover();
2123
+ openTaskModal(card.dataset.taskId);
2124
+ return;
2125
+ }
2126
+ });
2127
+
2128
+ // Also handle clicks inside popover (which is appended to body, not calendarContainer)
2129
+ document.addEventListener('click', (e) => {
2130
+ if (!activePopover) return;
2131
+ const card = e.target.closest('.calendar-popover .calendar-mini-card');
2132
+ if (card) {
2133
+ dismissPopover();
2134
+ openTaskModal(card.dataset.taskId);
2135
+ }
2136
+ });
2137
+
1762
2138
  function renderBoard() {
1763
2139
  const showSubtasks = showSubtasksCheckbox.checked;
1764
2140
  const emojiMap = buildEmojiMap(tasks);
@@ -1897,6 +2273,12 @@
1897
2273
  <div class="modal-meta-label">Created</div>
1898
2274
  <div class="modal-meta-value">${formatTime(data.task.created_at)}</div>
1899
2275
  </div>
2276
+ ${data.task.due_at ? `
2277
+ <div class="modal-meta-item">
2278
+ <div class="modal-meta-label">Due Date</div>
2279
+ <div class="modal-meta-value">${new Date(data.task.due_at).toLocaleDateString()}</div>
2280
+ </div>
2281
+ ` : ''}
1900
2282
  </div>
1901
2283
  </div>
1902
2284
  `;
@@ -1908,7 +2290,7 @@
1908
2290
  <div class="modal-meta">
1909
2291
  <div class="modal-meta-item">
1910
2292
  <div class="modal-meta-label">Agent</div>
1911
- <div class="modal-meta-value">${data.task.assignee}</div>
2293
+ <div class="modal-meta-value">${escapeHtml(data.task.assignee)}</div>
1912
2294
  </div>
1913
2295
  ${data.task.lease_until ? `
1914
2296
  <div class="modal-meta-item">
@@ -2092,9 +2474,13 @@
2092
2474
  projectFilter.innerHTML = '<option value="">All projects</option>' +
2093
2475
  stats.projects.map(p => `<option value="${escapeHtml(p)}" ${p === currentProject ? 'selected' : ''}>${escapeHtml(p)}</option>`).join('');
2094
2476
 
2095
- renderBoard();
2477
+ if (activeView === 'calendar') {
2478
+ renderCalendar();
2479
+ } else {
2480
+ renderBoard();
2481
+ updateGraphData();
2482
+ }
2096
2483
  renderActivity();
2097
- updateGraphData();
2098
2484
 
2099
2485
  lastPollTime = Date.now();
2100
2486
  updateConnectionStatus(true);
@@ -2286,6 +2672,11 @@
2286
2672
 
2287
2673
  // View toggle (Kanban/Graph)
2288
2674
  function setActiveView(view) {
2675
+ // Dismiss calendar popover when leaving calendar view
2676
+ if (activeView === 'calendar' && view !== 'calendar') {
2677
+ dismissPopover();
2678
+ }
2679
+
2289
2680
  activeView = view;
2290
2681
 
2291
2682
  // Update toggle buttons
@@ -2294,32 +2685,28 @@
2294
2685
  });
2295
2686
 
2296
2687
  // Show/hide containers
2297
- if (view === 'kanban') {
2298
- board.style.display = '';
2299
- graphContainer.classList.add('hidden');
2300
- mobileTabs.style.display = '';
2301
- document.getElementById('mobileCardsContainer').style.display = '';
2688
+ board.style.display = view === 'kanban' ? '' : 'none';
2689
+ calendarContainer.classList.toggle('hidden', view !== 'calendar');
2690
+ graphContainer.classList.toggle('hidden', view !== 'graph');
2691
+ mobileTabs.style.display = view === 'kanban' ? '' : 'none';
2692
+ document.getElementById('mobileCardsContainer').style.display = view === 'kanban' ? '' : 'none';
2302
2693
 
2303
- // Pause graph to save CPU/memory when not visible
2304
- if (graphInstance) {
2305
- graphInstance.pauseAnimation();
2306
- }
2307
- } else {
2308
- board.style.display = 'none';
2309
- graphContainer.classList.remove('hidden');
2310
- mobileTabs.style.display = 'none';
2311
- document.getElementById('mobileCardsContainer').style.display = 'none';
2694
+ // Hide date filter when calendar is active (calendar has its own month navigation)
2695
+ dateFilter.closest('.filter-group').style.display = view === 'calendar' ? 'none' : '';
2312
2696
 
2313
- // Initialize graph on first view
2697
+ // Pause/resume graph
2698
+ if (view === 'graph') {
2314
2699
  if (!graphInitialized && typeof ForceGraph !== 'undefined') {
2315
2700
  initGraph();
2316
2701
  } else if (graphInstance) {
2317
- // Resume graph animation when switching back
2318
2702
  graphInstance.resumeAnimation();
2319
2703
  }
2704
+ } else if (graphInstance) {
2705
+ graphInstance.pauseAnimation();
2320
2706
  }
2321
2707
 
2322
2708
  savePreferences();
2709
+ poll();
2323
2710
  }
2324
2711
 
2325
2712
  viewToggle.addEventListener('click', (e) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hzl-web",
3
- "version": "1.28.3",
3
+ "version": "1.30.0",
4
4
  "description": "Web dashboard for HZL - A Kanban-style task monitoring UI.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -52,7 +52,7 @@
52
52
  "visualization"
53
53
  ],
54
54
  "dependencies": {
55
- "hzl-core": "1.28.3"
55
+ "hzl-core": "1.30.0"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/node": "^25.2.1",