hzl-web 1.18.8 → 1.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +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;AAmFD,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAoMpE"}
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"}
package/dist/server.js CHANGED
@@ -46,10 +46,18 @@ export function createWebServer(options) {
46
46
  });
47
47
  // Get blocked tasks map from service
48
48
  const blockedMap = taskService.getBlockedByMap();
49
- // Merge blocked info into tasks
49
+ // Get subtask counts for parent tasks (filtered + total)
50
+ const subtaskCounts = taskService.getSubtaskCounts({
51
+ sinceDays: days,
52
+ project: project ?? undefined,
53
+ });
54
+ const subtaskTotals = taskService.getSubtaskCounts();
55
+ // Merge blocked info and subtask counts into tasks
50
56
  const tasks = rows.map((row) => ({
51
57
  ...row,
52
58
  blocked_by: blockedMap.get(row.task_id) ?? null,
59
+ subtask_count: subtaskCounts.get(row.task_id) ?? 0,
60
+ subtask_total: subtaskTotals.get(row.task_id) ?? 0,
53
61
  }));
54
62
  json(res, { tasks, since, project });
55
63
  }
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,MAAM,CAAC;AAM/E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAgB/C,8BAA8B;AAC9B,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,EAAE;CACV,CAAC;AAgDF,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAC3B,MAAM,EAAE,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,GAAmB,EAAE,IAAa,EAAE,MAAM,GAAG,GAAG;IAC5D,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,kBAAkB;QAClC,wDAAwD;KACzD,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,OAAO,GAAG,WAAW;IAC1D,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,GAAmB,EAAE,KAAc;IACtD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACjF,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAsB;IACpD,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAEpE,iBAAiB;IACjB,SAAS,WAAW,CAAC,MAAuB,EAAE,GAAmB;QAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEtC,yBAAyB;QACzB,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC;YACjC,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,OAAO,IAAI,SAAS;SAC9B,CAAC,CAAC;QAEH,qCAAqC;QACrC,MAAM,UAAU,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;QAEjD,yDAAyD;QACzD,MAAM,aAAa,GAAG,WAAW,CAAC,gBAAgB,CAAC;YACjD,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,OAAO,IAAI,SAAS;SAC9B,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,WAAW,CAAC,gBAAgB,EAAE,CAAC;QAErD,mDAAmD;QACnD,MAAM,KAAK,GAA2B,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACvD,GAAG,GAAG;YACN,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;YAC/C,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YAClD,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;SACnD,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,SAAS,gBAAgB,CAAC,MAAc,EAAE,GAAmB;QAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,GAAG,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,yCAAyC;QACzC,MAAM,UAAU,GAAG,WAAW,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAE/D,MAAM,UAAU,GAAuB;YACrC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU;SACX,CAAC;QAEF,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,cAAc,CAAC,MAAc,EAAE,GAAmB;QACzD,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjD,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;YACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;YAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,GAAmB;QAC5D,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,YAAY,CAAC,MAAuB,EAAE,GAAmB;QAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAEzD,6BAA6B;QAC7B,MAAM,SAAS,GAAG,UAAU,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAErE,gEAAgE;QAChE,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAoB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,EAAE,EAAE,CAAC,CAAC,KAAK;YACX,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;YACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;YAC5B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI;SAC5C,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,SAAS,WAAW,CAAC,GAAmB;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;QAErC,MAAM,QAAQ,GAAkB;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;QAEF,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,SAAS,UAAU,CAAC,GAAmB;QACrC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,0BAA0B;YAC1C,yBAAyB,EAAE,oGAAoG;YAC/H,wBAAwB,EAAE,SAAS;YACnC,iBAAiB,EAAE,MAAM;YACzB,iBAAiB,EAAE,aAAa;SACjC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,CAAC;IAED,kBAAkB;IAClB,SAAS,aAAa,CAAC,GAAoB,EAAE,GAAmB;QAC9D,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,iBAAiB;YACjB,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACrB,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC9B,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC/B,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC9B,WAAW,CAAC,GAAG,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,wBAAwB;YACxB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC5D,IAAI,SAAS,EAAE,CAAC;gBACd,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;YAED,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC1E,IAAI,aAAa,EAAE,CAAC;gBAClB,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAChF,IAAI,gBAAgB,EAAE,CAAC;gBACrB,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAE3C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE1B,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACnB,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,OAAO,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACJ,IAAI;QACJ,IAAI;QACJ,GAAG,EAAE,UAAU,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE;KACjE,CAAC;AACJ,CAAC"}
@@ -142,6 +142,92 @@ describe('hzl-web server', () => {
142
142
  const blockedTask = tasks.find((t) => t.title === 'Blocked Task');
143
143
  expect(blockedTask?.blocked_by).toContain(blocker.task_id);
144
144
  });
145
+ it('includes subtask_count for parent tasks', async () => {
146
+ const parent = taskService.createTask({
147
+ title: 'Parent Task',
148
+ project: 'test-project',
149
+ });
150
+ taskService.createTask({
151
+ title: 'Child 1',
152
+ project: 'test-project',
153
+ parent_id: parent.task_id,
154
+ });
155
+ taskService.createTask({
156
+ title: 'Child 2',
157
+ project: 'test-project',
158
+ parent_id: parent.task_id,
159
+ });
160
+ createServer(4515);
161
+ const { data } = await fetchJson('/api/tasks');
162
+ const tasks = data.tasks;
163
+ const parentTask = tasks.find((t) => t.title === 'Parent Task');
164
+ expect(parentTask?.subtask_count).toBe(2);
165
+ });
166
+ it('excludes archived subtasks from subtask_count', async () => {
167
+ const parent = taskService.createTask({
168
+ title: 'Parent Task',
169
+ project: 'test-project',
170
+ });
171
+ const child1 = taskService.createTask({
172
+ title: 'Child 1',
173
+ project: 'test-project',
174
+ parent_id: parent.task_id,
175
+ });
176
+ taskService.createTask({
177
+ title: 'Child 2',
178
+ project: 'test-project',
179
+ parent_id: parent.task_id,
180
+ });
181
+ // Archive child1
182
+ taskService.setStatus(child1.task_id, TaskStatus.Ready);
183
+ taskService.claimTask(child1.task_id);
184
+ taskService.completeTask(child1.task_id);
185
+ taskService.archiveTask(child1.task_id);
186
+ createServer(4516);
187
+ const { data } = await fetchJson('/api/tasks');
188
+ const tasks = data.tasks;
189
+ const parentTask = tasks.find((t) => t.title === 'Parent Task');
190
+ expect(parentTask?.subtask_count).toBe(1);
191
+ });
192
+ it('filters subtask_count by project', async () => {
193
+ projectService.createProject('other-project');
194
+ const parentA = taskService.createTask({
195
+ title: 'Parent A',
196
+ project: 'test-project',
197
+ });
198
+ const parentB = taskService.createTask({
199
+ title: 'Parent B',
200
+ project: 'other-project',
201
+ });
202
+ taskService.createTask({
203
+ title: 'Child A-1',
204
+ project: 'test-project',
205
+ parent_id: parentA.task_id,
206
+ });
207
+ taskService.createTask({
208
+ title: 'Child A-2',
209
+ project: 'test-project',
210
+ parent_id: parentA.task_id,
211
+ });
212
+ taskService.createTask({
213
+ title: 'Child B-1',
214
+ project: 'other-project',
215
+ parent_id: parentB.task_id,
216
+ });
217
+ createServer(4517);
218
+ // Filter by test-project - should only see Parent A with count 2
219
+ const { data: dataA } = await fetchJson('/api/tasks?project=test-project');
220
+ const tasksA = dataA.tasks;
221
+ const parentTaskA = tasksA.find((t) => t.title === 'Parent A');
222
+ expect(parentTaskA?.subtask_count).toBe(2);
223
+ // Parent B should not be in results
224
+ expect(tasksA.find((t) => t.title === 'Parent B')).toBeUndefined();
225
+ // Filter by other-project - should only see Parent B with count 1
226
+ const { data: dataB } = await fetchJson('/api/tasks?project=other-project');
227
+ const tasksB = dataB.tasks;
228
+ const parentTaskB = tasksB.find((t) => t.title === 'Parent B');
229
+ expect(parentTaskB?.subtask_count).toBe(1);
230
+ });
145
231
  });
146
232
  describe('GET /api/tasks/:id', () => {
147
233
  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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"}
@@ -189,6 +189,79 @@
189
189
  accent-color: var(--accent);
190
190
  }
191
191
 
192
+ /* Settings Dropdown */
193
+ .settings-group {
194
+ position: relative;
195
+ }
196
+
197
+ .settings-toggle {
198
+ display: flex;
199
+ align-items: center;
200
+ justify-content: center;
201
+ background: var(--bg-primary);
202
+ color: var(--text-secondary);
203
+ border: 1px solid var(--border);
204
+ padding: 6px 8px;
205
+ border-radius: 4px;
206
+ cursor: pointer;
207
+ }
208
+
209
+ .settings-toggle:hover {
210
+ border-color: var(--accent);
211
+ color: var(--text-primary);
212
+ }
213
+
214
+ .settings-dropdown {
215
+ display: none;
216
+ position: absolute;
217
+ top: 100%;
218
+ right: 0;
219
+ margin-top: 4px;
220
+ background: var(--bg-secondary);
221
+ border: 1px solid var(--border);
222
+ border-radius: 6px;
223
+ padding: 12px;
224
+ z-index: 100;
225
+ min-width: 180px;
226
+ }
227
+
228
+ .settings-dropdown.open {
229
+ display: block;
230
+ }
231
+
232
+ .settings-section {
233
+ margin-bottom: 12px;
234
+ }
235
+
236
+ .settings-section:last-child {
237
+ margin-bottom: 0;
238
+ }
239
+
240
+ .settings-label {
241
+ display: block;
242
+ font-size: 11px;
243
+ color: var(--text-muted);
244
+ margin-bottom: 6px;
245
+ text-transform: uppercase;
246
+ letter-spacing: 0.5px;
247
+ }
248
+
249
+ .settings-section select {
250
+ width: 100%;
251
+ font-family: var(--font-mono);
252
+ font-size: 12px;
253
+ background: var(--bg-primary);
254
+ color: var(--text-primary);
255
+ border: 1px solid var(--border);
256
+ padding: 4px 8px;
257
+ border-radius: 4px;
258
+ }
259
+
260
+ .column-checkboxes {
261
+ display: flex;
262
+ flex-direction: column;
263
+ }
264
+
192
265
  /* Kanban Board */
193
266
  .board {
194
267
  display: flex;
@@ -259,10 +332,33 @@
259
332
  border-color: var(--accent);
260
333
  }
261
334
 
335
+ .card-header {
336
+ display: flex;
337
+ align-items: center;
338
+ justify-content: space-between;
339
+ gap: 8px;
340
+ margin-bottom: 4px;
341
+ }
342
+
343
+ .card-header-left {
344
+ display: flex;
345
+ align-items: center;
346
+ gap: 6px;
347
+ min-width: 0;
348
+ }
349
+
350
+ .card-emoji {
351
+ font-size: 12px;
352
+ flex-shrink: 0;
353
+ }
354
+
355
+ .card-parent {
356
+ box-shadow: 0 0 0 1px var(--family-color);
357
+ }
358
+
262
359
  .card-id {
263
360
  font-size: 10px;
264
361
  color: var(--text-muted);
265
- margin-bottom: 4px;
266
362
  }
267
363
 
268
364
  .card-title {
@@ -293,6 +389,26 @@
293
389
  color: var(--accent);
294
390
  }
295
391
 
392
+ .card-progress {
393
+ color: var(--accent);
394
+ background: rgba(245, 158, 11, 0.15);
395
+ padding: 2px 6px;
396
+ border-radius: 3px;
397
+ font-size: 10px;
398
+ flex-shrink: 0;
399
+ }
400
+
401
+ .card-progress.complete {
402
+ color: var(--status-done);
403
+ background: rgba(34, 197, 94, 0.15);
404
+ }
405
+
406
+ .card-subtask-count {
407
+ font-size: 11px;
408
+ color: var(--text-muted);
409
+ margin-bottom: 6px;
410
+ }
411
+
296
412
  .card-blocked {
297
413
  font-size: 10px;
298
414
  color: var(--status-blocked);
@@ -741,34 +857,49 @@
741
857
  <option value="">All projects</option>
742
858
  </select>
743
859
  </div>
744
- <div class="filter-group">
745
- <label class="filter-label">Refresh:</label>
746
- <select id="refreshFilter">
747
- <option value="1000">1s</option>
748
- <option value="2000">2s</option>
749
- <option value="5000" selected>5s</option>
750
- <option value="10000">10s</option>
751
- <option value="30000">30s</option>
752
- </select>
753
- </div>
754
- <div class="filter-group">
755
- <button class="columns-toggle" id="columnsToggle">Columns</button>
756
- <div class="columns-dropdown" id="columnsDropdown">
757
- <label class="column-checkbox">
758
- <input type="checkbox" value="backlog" checked> Backlog
759
- </label>
760
- <label class="column-checkbox">
761
- <input type="checkbox" value="ready" checked> Ready
762
- </label>
763
- <label class="column-checkbox">
764
- <input type="checkbox" value="in_progress" checked> In Progress
765
- </label>
766
- <label class="column-checkbox">
767
- <input type="checkbox" value="blocked" checked> Blocked
768
- </label>
769
- <label class="column-checkbox">
770
- <input type="checkbox" value="done" checked> Done
771
- </label>
860
+ <div class="filter-group settings-group">
861
+ <button class="settings-toggle" id="settingsToggle" title="Settings">
862
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
863
+ <path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492zM5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0z"/>
864
+ <path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52l-.094-.319zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.377l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115l.094-.319z"/>
865
+ </svg>
866
+ </button>
867
+ <div class="settings-dropdown" id="settingsDropdown">
868
+ <div class="settings-section">
869
+ <label class="settings-label">Refresh</label>
870
+ <select id="refreshFilter">
871
+ <option value="1000">1s</option>
872
+ <option value="2000">2s</option>
873
+ <option value="5000" selected>5s</option>
874
+ <option value="10000">10s</option>
875
+ <option value="30000">30s</option>
876
+ </select>
877
+ </div>
878
+ <div class="settings-section">
879
+ <label class="settings-label">Columns</label>
880
+ <div class="column-checkboxes">
881
+ <label class="column-checkbox">
882
+ <input type="checkbox" value="backlog" checked> Backlog
883
+ </label>
884
+ <label class="column-checkbox">
885
+ <input type="checkbox" value="ready" checked> Ready
886
+ </label>
887
+ <label class="column-checkbox">
888
+ <input type="checkbox" value="in_progress" checked> In Progress
889
+ </label>
890
+ <label class="column-checkbox">
891
+ <input type="checkbox" value="blocked" checked> Blocked
892
+ </label>
893
+ <label class="column-checkbox">
894
+ <input type="checkbox" value="done" checked> Done
895
+ </label>
896
+ </div>
897
+ </div>
898
+ <div class="settings-section">
899
+ <label class="column-checkbox">
900
+ <input type="checkbox" id="showSubtasks" checked> Show subtasks
901
+ </label>
902
+ </div>
772
903
  </div>
773
904
  </div>
774
905
  </div>
@@ -877,6 +1008,8 @@
877
1008
  let graphInstance = null;
878
1009
  let graphInitialized = false;
879
1010
  let nodeStatusMap = new Map();
1011
+ let pendingModalRequestId = 0; // Track modal fetch requests to avoid race conditions
1012
+ let isPolling = false; // Guard against concurrent poll() calls
880
1013
 
881
1014
  // DOM Elements
882
1015
  const dateFilter = document.getElementById('dateFilter');
@@ -894,8 +1027,9 @@
894
1027
  const modalBody = document.getElementById('modalBody');
895
1028
  const hamburgerBtn = document.getElementById('hamburgerBtn');
896
1029
  const mobileTabs = document.getElementById('mobileTabs');
897
- const columnsToggle = document.getElementById('columnsToggle');
898
- const columnsDropdown = document.getElementById('columnsDropdown');
1030
+ const settingsToggle = document.getElementById('settingsToggle');
1031
+ const settingsDropdown = document.getElementById('settingsDropdown');
1032
+ const showSubtasksCheckbox = document.getElementById('showSubtasks');
899
1033
  const viewToggle = document.getElementById('viewToggle');
900
1034
  const board = document.getElementById('board');
901
1035
  const graphContainer = document.getElementById('graphContainer');
@@ -904,9 +1038,81 @@
904
1038
  // Column visibility
905
1039
  const COLUMNS = ['backlog', 'ready', 'in_progress', 'blocked', 'done'];
906
1040
 
1041
+ // Emoji family system for parent/child task indicators
1042
+ const FAMILY_EMOJIS = [
1043
+ '🔷', '🔶', '🔴', '🟢', '🔵', '🟡', '🟣', '🟠',
1044
+ '⬛', '⬜', '🔳', '🔲', '▪️', '▫️', '◾', '◽',
1045
+ '💠', '🔹', '🔸', '♦️', '♠️', '♣️', '♥️', '🃏',
1046
+ '⭐', '🌟', '✨', '💫', '🔆', '🔅', '☀️', '🌙',
1047
+ '🎯', '🎪', '🎨', '🎭', '🎬', '🎮', '🎲', '🎸',
1048
+ '🔑', '🔐', '🔒', '🔓', '🗝️', '⚡', '💡', '🔔'
1049
+ ];
1050
+
1051
+ // djb2 hash for deterministic emoji assignment
1052
+ function getTaskEmoji(taskId) {
1053
+ let hash = 5381;
1054
+ for (let i = 0; i < taskId.length; i++) {
1055
+ hash = ((hash << 5) + hash) ^ taskId.charCodeAt(i);
1056
+ }
1057
+ return FAMILY_EMOJIS[Math.abs(hash) % FAMILY_EMOJIS.length];
1058
+ }
1059
+
1060
+ function getTaskFamilyColor(taskId) {
1061
+ let hash = 5381;
1062
+ for (let i = 0; i < taskId.length; i++) {
1063
+ hash = ((hash << 5) + hash) ^ taskId.charCodeAt(i);
1064
+ }
1065
+ const hue = Math.abs(hash) % 360;
1066
+ return `hsl(${hue} 55% 55%)`;
1067
+ }
1068
+
1069
+ // Build emoji map with suffix numbers for children
1070
+ function buildEmojiMap(taskList) {
1071
+ // Build set of known task IDs for visible parent detection
1072
+ const taskIds = new Set(taskList.map(t => t.task_id));
1073
+
1074
+ // Group visible children by parent for suffix ordering
1075
+ // Only children whose parent is visible get suffix numbers
1076
+ const childrenByParent = new Map();
1077
+
1078
+ for (const task of taskList) {
1079
+ if (task.parent_id && taskIds.has(task.parent_id)) {
1080
+ if (!childrenByParent.has(task.parent_id)) {
1081
+ childrenByParent.set(task.parent_id, []);
1082
+ }
1083
+ childrenByParent.get(task.parent_id).push(task);
1084
+ }
1085
+ }
1086
+
1087
+ // Sort children by task_id for stable suffix ordering
1088
+ for (const children of childrenByParent.values()) {
1089
+ children.sort((a, b) => a.task_id.localeCompare(b.task_id));
1090
+ }
1091
+
1092
+ // Build emoji assignments
1093
+ const emojiMap = new Map(); // task_id -> { emoji, suffix }
1094
+
1095
+ for (const task of taskList) {
1096
+ if (task.parent_id) {
1097
+ // Child task: always use parent's emoji for family consistency
1098
+ // (even if parent is filtered out)
1099
+ const emoji = getTaskEmoji(task.parent_id);
1100
+ // Only show suffix if parent is visible (siblings can be compared)
1101
+ const siblings = childrenByParent.get(task.parent_id) || [];
1102
+ const suffix = siblings.length > 0 ? siblings.indexOf(task) + 1 : null;
1103
+ emojiMap.set(task.task_id, { emoji, suffix: suffix || null });
1104
+ } else {
1105
+ // Parent or standalone task: use own emoji, no suffix
1106
+ emojiMap.set(task.task_id, { emoji: getTaskEmoji(task.task_id), suffix: null });
1107
+ }
1108
+ }
1109
+
1110
+ return emojiMap;
1111
+ }
1112
+
907
1113
  function updateColumnVisibility() {
908
1114
  COLUMNS.forEach(status => {
909
- const checkbox = columnsDropdown.querySelector(`input[value="${status}"]`);
1115
+ const checkbox = settingsDropdown.querySelector(`input[value="${status}"]`);
910
1116
  const column = document.querySelector(`.column[data-status="${status}"]`);
911
1117
  if (column && checkbox) {
912
1118
  column.classList.toggle('hidden', !checkbox.checked);
@@ -924,11 +1130,14 @@
924
1130
  if (prefs.projectFilter) projectFilter.value = prefs.projectFilter;
925
1131
  if (prefs.refreshFilter) refreshFilter.value = prefs.refreshFilter;
926
1132
  if (Array.isArray(prefs.columnVisibility)) {
927
- columnsDropdown.querySelectorAll('input[type="checkbox"]').forEach(cb => {
1133
+ settingsDropdown.querySelectorAll('.column-checkboxes input[type="checkbox"]').forEach(cb => {
928
1134
  cb.checked = prefs.columnVisibility.includes(cb.value);
929
1135
  });
930
1136
  updateColumnVisibility();
931
1137
  }
1138
+ if (prefs.showSubtasks !== undefined) {
1139
+ showSubtasksCheckbox.checked = prefs.showSubtasks;
1140
+ }
932
1141
  if (prefs.activeView && prefs.activeView !== 'kanban') {
933
1142
  // Defer view switch until after ForceGraph may have loaded
934
1143
  setTimeout(() => setActiveView(prefs.activeView), 100);
@@ -943,8 +1152,9 @@
943
1152
  projectFilter: projectFilter.value,
944
1153
  refreshFilter: refreshFilter.value,
945
1154
  columnVisibility: Array.from(
946
- columnsDropdown.querySelectorAll('input[type="checkbox"]:checked')
1155
+ settingsDropdown.querySelectorAll('.column-checkboxes input[type="checkbox"]:checked')
947
1156
  ).map(cb => cb.value),
1157
+ showSubtasks: showSubtasksCheckbox.checked,
948
1158
  activeView: activeView,
949
1159
  };
950
1160
  localStorage.setItem('hzl-dashboard-prefs', JSON.stringify(prefs));
@@ -1258,10 +1468,43 @@
1258
1468
  }
1259
1469
 
1260
1470
  // Render functions
1261
- function renderCard(task) {
1471
+ function renderCard(task, emojiInfo, showSubtasks) {
1262
1472
  const isBlocked = task.blocked_by && task.blocked_by.length > 0;
1263
1473
  const status = isBlocked ? 'blocked' : task.status;
1264
1474
 
1475
+ const isParentTask = (task.subtask_total ?? 0) > 0;
1476
+ const parentStyle = isParentTask
1477
+ ? `style="--family-color: ${getTaskFamilyColor(task.task_id)}"`
1478
+ : '';
1479
+
1480
+ // Build emoji indicator
1481
+ let emojiHtml = '';
1482
+ if (emojiInfo) {
1483
+ const { emoji, suffix } = emojiInfo;
1484
+ emojiHtml = suffix
1485
+ ? `<span class="card-emoji">${emoji}-${suffix}</span>`
1486
+ : `<span class="card-emoji">${emoji}</span>`;
1487
+ }
1488
+
1489
+ // Build subtask count (for parents regardless of subtasks visibility)
1490
+ let subtaskHtml = '';
1491
+ const visibleCount = task.subtask_count ?? 0;
1492
+ const totalCount = task.subtask_total ?? visibleCount;
1493
+ if (totalCount > 0) {
1494
+ const label = totalCount === 1 ? 'subtask' : 'subtasks';
1495
+ const countLabel = visibleCount === totalCount
1496
+ ? `${visibleCount} ${label}`
1497
+ : `${visibleCount}/${totalCount} ${label}`;
1498
+ subtaskHtml = `<div class="card-subtask-count">[${countLabel}]</div>`;
1499
+ }
1500
+
1501
+ // Build progress badge
1502
+ let progressHtml = '';
1503
+ if (task.progress !== null && task.progress !== undefined && task.progress > 0) {
1504
+ const progressClass = task.progress >= 100 ? 'card-progress complete' : 'card-progress';
1505
+ progressHtml = `<span class="${progressClass}">${task.progress}%</span>`;
1506
+ }
1507
+
1265
1508
  let extra = '';
1266
1509
  if (isBlocked) {
1267
1510
  extra = `<div class="card-blocked">Blocked by: ${task.blocked_by.map(id => id.slice(0, 8)).join(', ')}</div>`;
@@ -1272,9 +1515,16 @@
1272
1515
  }
1273
1516
 
1274
1517
  return `
1275
- <div class="card" data-task-id="${task.task_id}">
1276
- <div class="card-id">${task.task_id.slice(0, 8)}</div>
1518
+ <div class="card${isParentTask ? ' card-parent' : ''}" data-task-id="${task.task_id}" ${parentStyle}>
1519
+ <div class="card-header">
1520
+ <div class="card-header-left">
1521
+ ${emojiHtml}
1522
+ <span class="card-id">${task.task_id.slice(0, 8)}</span>
1523
+ </div>
1524
+ ${progressHtml}
1525
+ </div>
1277
1526
  <div class="card-title">${escapeHtml(task.title)}</div>
1527
+ ${subtaskHtml}
1278
1528
  <div class="card-meta">
1279
1529
  <span class="card-project">${escapeHtml(task.project)}</span>
1280
1530
  ${task.assignee ? `<span class="card-agent">${task.assignee.slice(0, 8)}</span>` : ''}
@@ -1304,7 +1554,16 @@
1304
1554
  }
1305
1555
 
1306
1556
  function renderBoard() {
1307
- const columns = groupTasksByStatus(tasks);
1557
+ const showSubtasks = showSubtasksCheckbox.checked;
1558
+ const emojiMap = buildEmojiMap(tasks);
1559
+
1560
+ // Filter tasks if subtasks are hidden
1561
+ let visibleTasks = tasks;
1562
+ if (!showSubtasks) {
1563
+ visibleTasks = tasks.filter(t => !t.parent_id);
1564
+ }
1565
+
1566
+ const columns = groupTasksByStatus(visibleTasks);
1308
1567
 
1309
1568
  for (const [status, statusTasks] of Object.entries(columns)) {
1310
1569
  const container = document.getElementById(`cards-${status}`);
@@ -1315,7 +1574,10 @@
1315
1574
  if (statusTasks.length === 0) {
1316
1575
  container.innerHTML = '<div class="empty-column">No tasks</div>';
1317
1576
  } else {
1318
- container.innerHTML = statusTasks.map(renderCard).join('');
1577
+ container.innerHTML = statusTasks.map(task => {
1578
+ const emojiInfo = emojiMap.get(task.task_id);
1579
+ return renderCard(task, emojiInfo, showSubtasks);
1580
+ }).join('');
1319
1581
  }
1320
1582
  }
1321
1583
  if (countEl) countEl.textContent = statusTasks.length;
@@ -1323,32 +1585,36 @@
1323
1585
  }
1324
1586
 
1325
1587
  // Render mobile cards for active tab
1326
- renderMobileCards();
1588
+ renderMobileCards(showSubtasks, emojiMap);
1327
1589
 
1328
- // Add click handlers
1329
- document.querySelectorAll('.card').forEach(card => {
1330
- card.addEventListener('click', () => openTaskModal(card.dataset.taskId));
1331
- });
1590
+ // Card click handlers are set up via event delegation in init
1332
1591
  }
1333
1592
 
1334
- function renderMobileCards() {
1593
+ function renderMobileCards(showSubtasks, emojiMap) {
1335
1594
  const container = document.getElementById('mobileCardsContainer');
1336
1595
  if (!container) return;
1337
1596
 
1338
- const columns = groupTasksByStatus(tasks);
1597
+ // Use same filtering as desktop
1598
+ let visibleTasks = tasks;
1599
+ if (!showSubtasks) {
1600
+ visibleTasks = tasks.filter(t => !t.parent_id);
1601
+ }
1602
+
1603
+ const columns = groupTasksByStatus(visibleTasks);
1339
1604
 
1340
1605
  container.innerHTML = Object.entries(columns).map(([status, statusTasks]) => `
1341
1606
  <div class="mobile-cards ${status === activeTab ? 'active' : ''}" data-status="${status}">
1342
1607
  ${statusTasks.length === 0
1343
1608
  ? '<div class="empty-column">No tasks</div>'
1344
- : statusTasks.map(renderCard).join('')
1609
+ : statusTasks.map(task => {
1610
+ const emojiInfo = emojiMap.get(task.task_id);
1611
+ return renderCard(task, emojiInfo, showSubtasks);
1612
+ }).join('')
1345
1613
  }
1346
1614
  </div>
1347
1615
  `).join('');
1348
1616
 
1349
- container.querySelectorAll('.card').forEach(card => {
1350
- card.addEventListener('click', () => openTaskModal(card.dataset.taskId));
1351
- });
1617
+ // Card click handlers are set up via event delegation in init
1352
1618
  }
1353
1619
 
1354
1620
  function renderActivity() {
@@ -1380,10 +1646,16 @@
1380
1646
  }
1381
1647
 
1382
1648
  async function openTaskModal(taskId) {
1649
+ // Track this request to handle rapid clicks (race condition prevention)
1650
+ const requestId = ++pendingModalRequestId;
1651
+
1383
1652
  try {
1384
1653
  const data = await fetchTaskDetail(taskId);
1385
- selectedTask = data;
1386
1654
 
1655
+ // Discard stale response if a newer request was made
1656
+ if (requestId !== pendingModalRequestId) return;
1657
+
1658
+ selectedTask = data;
1387
1659
  modalTitle.textContent = data.task.title;
1388
1660
 
1389
1661
  let html = `
@@ -1500,6 +1772,10 @@
1500
1772
 
1501
1773
  // Polling
1502
1774
  async function poll() {
1775
+ // Guard against concurrent poll calls (e.g., rapid tab switching)
1776
+ if (isPolling) return;
1777
+ isPolling = true;
1778
+
1503
1779
  try {
1504
1780
  const [newTasks, newEvents, stats] = await Promise.all([
1505
1781
  fetchTasks(),
@@ -1528,6 +1804,8 @@
1528
1804
  } catch (error) {
1529
1805
  console.error('Poll failed:', error);
1530
1806
  updateConnectionStatus(false);
1807
+ } finally {
1808
+ isPolling = false;
1531
1809
  }
1532
1810
  }
1533
1811
 
@@ -1634,7 +1912,7 @@
1634
1912
  if (e.key === 'Escape') {
1635
1913
  closeModal();
1636
1914
  activityPanel.classList.remove('open');
1637
- columnsDropdown.classList.remove('open');
1915
+ settingsDropdown.classList.remove('open');
1638
1916
  }
1639
1917
  });
1640
1918
 
@@ -1667,21 +1945,30 @@
1667
1945
  filters.style.display = filters.style.display === 'none' ? 'flex' : 'none';
1668
1946
  });
1669
1947
 
1670
- // Column visibility dropdown
1671
- columnsToggle.addEventListener('click', (e) => {
1948
+ // Settings dropdown
1949
+ settingsToggle.addEventListener('click', (e) => {
1672
1950
  e.stopPropagation();
1673
- columnsDropdown.classList.toggle('open');
1951
+ settingsDropdown.classList.toggle('open');
1674
1952
  });
1675
1953
 
1676
1954
  document.addEventListener('click', () => {
1677
- columnsDropdown.classList.remove('open');
1955
+ settingsDropdown.classList.remove('open');
1678
1956
  });
1679
1957
 
1680
- columnsDropdown.addEventListener('click', (e) => e.stopPropagation());
1958
+ settingsDropdown.addEventListener('click', (e) => e.stopPropagation());
1959
+
1960
+ // Column visibility checkboxes
1961
+ settingsDropdown.querySelectorAll('.column-checkboxes input').forEach(cb => {
1962
+ cb.addEventListener('change', () => {
1963
+ updateColumnVisibility();
1964
+ savePreferences();
1965
+ });
1966
+ });
1681
1967
 
1682
- columnsDropdown.addEventListener('change', () => {
1683
- updateColumnVisibility();
1968
+ // Show subtasks toggle
1969
+ showSubtasksCheckbox.addEventListener('change', () => {
1684
1970
  savePreferences();
1971
+ renderBoard();
1685
1972
  });
1686
1973
 
1687
1974
  // View toggle (Kanban/Graph)
@@ -1729,6 +2016,17 @@
1729
2016
  }
1730
2017
  });
1731
2018
 
2019
+ // Event delegation for card clicks (avoids re-adding handlers on every render)
2020
+ board.addEventListener('click', (e) => {
2021
+ const card = e.target.closest('.card');
2022
+ if (card) openTaskModal(card.dataset.taskId);
2023
+ });
2024
+
2025
+ document.getElementById('mobileCardsContainer').addEventListener('click', (e) => {
2026
+ const card = e.target.closest('.card');
2027
+ if (card) openTaskModal(card.dataset.taskId);
2028
+ });
2029
+
1732
2030
  // Initialize
1733
2031
  loadPreferences();
1734
2032
  startPolling();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hzl-web",
3
- "version": "1.18.8",
3
+ "version": "1.19.1",
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.18.8"
55
+ "hzl-core": "1.19.1"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/node": "^20.10.0",