@unbrained/pm-web 2026.8.10 → 2026.8.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/app.d.ts +16 -0
  3. package/dist/app.js +16 -0
  4. package/dist/app.js.map +1 -1
  5. package/dist/auth.d.ts +5 -0
  6. package/dist/auth.js.map +1 -1
  7. package/dist/board.d.ts +53 -0
  8. package/dist/board.js +48 -0
  9. package/dist/board.js.map +1 -1
  10. package/dist/crypto.d.ts +23 -0
  11. package/dist/crypto.js +32 -0
  12. package/dist/crypto.js.map +1 -1
  13. package/dist/db.d.ts +19 -0
  14. package/dist/db.js +19 -0
  15. package/dist/db.js.map +1 -1
  16. package/dist/ical.d.ts +72 -0
  17. package/dist/ical.js +73 -0
  18. package/dist/ical.js.map +1 -1
  19. package/dist/index.d.ts +11 -0
  20. package/dist/index.js +52 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/middleware/auth.d.ts +8 -0
  23. package/dist/middleware/auth.js.map +1 -1
  24. package/dist/oidc.d.ts +87 -0
  25. package/dist/oidc.js +113 -0
  26. package/dist/oidc.js.map +1 -1
  27. package/dist/routes/admin.js +15 -0
  28. package/dist/routes/admin.js.map +1 -1
  29. package/dist/routes/extensions.js +10 -0
  30. package/dist/routes/extensions.js.map +1 -1
  31. package/dist/routes/github.js +13 -0
  32. package/dist/routes/github.js.map +1 -1
  33. package/dist/routes/oidc.d.ts +10 -0
  34. package/dist/routes/oidc.js +51 -0
  35. package/dist/routes/oidc.js.map +1 -1
  36. package/dist/routes/pm.js +132 -1
  37. package/dist/routes/pm.js.map +1 -1
  38. package/dist/routes/sharing.js +8 -0
  39. package/dist/routes/sharing.js.map +1 -1
  40. package/dist/services/mutation-event-watcher.js +13 -0
  41. package/dist/services/mutation-event-watcher.js.map +1 -1
  42. package/dist/services/package-catalog.d.ts +24 -0
  43. package/dist/services/package-catalog.js +22 -2
  44. package/dist/services/package-catalog.js.map +1 -1
  45. package/dist/services/pm-runner.d.ts +82 -0
  46. package/dist/services/pm-runner.js +121 -0
  47. package/dist/services/pm-runner.js.map +1 -1
  48. package/dist/services/project-watcher.d.ts +22 -0
  49. package/dist/services/project-watcher.js +51 -0
  50. package/dist/services/project-watcher.js.map +1 -1
  51. package/dist/services/realtime-bus.d.ts +46 -0
  52. package/dist/services/realtime-bus.js +59 -0
  53. package/dist/services/realtime-bus.js.map +1 -1
  54. package/dist/services/sse.d.ts +134 -0
  55. package/dist/services/sse.js +145 -0
  56. package/dist/services/sse.js.map +1 -1
  57. package/manifest.json +1 -1
  58. package/package.json +5 -3
  59. package/public/src/app.js +44 -1
  60. package/public/src/app.js.map +1 -1
  61. package/public/src/app.ts +44 -1
  62. package/public/src/components/modals.js +11 -0
  63. package/public/src/components/modals.js.map +1 -1
  64. package/public/src/components/modals.ts +11 -0
  65. package/public/src/components/toast.js +2 -0
  66. package/public/src/components/toast.js.map +1 -1
  67. package/public/src/components/toast.ts +2 -0
  68. package/public/src/constants.js +21 -4
  69. package/public/src/constants.js.map +1 -1
  70. package/public/src/constants.ts +21 -4
  71. package/public/src/filters.js +10 -7
  72. package/public/src/filters.js.map +1 -1
  73. package/public/src/filters.ts +10 -7
  74. package/public/src/i18n/de.json +3 -1
  75. package/public/src/i18n/en.json +3 -1
  76. package/public/src/i18n/es.json +3 -1
  77. package/public/src/i18n/zh.json +3 -1
  78. package/public/src/i18n.js +11 -1
  79. package/public/src/i18n.js.map +1 -1
  80. package/public/src/i18n.ts +13 -1
  81. package/public/src/state.js +3 -0
  82. package/public/src/state.js.map +1 -1
  83. package/public/src/state.ts +3 -0
  84. package/public/src/sw.ts +71 -7
  85. package/public/src/theme.js +13 -1
  86. package/public/src/theme.js.map +1 -1
  87. package/public/src/theme.ts +15 -1
  88. package/public/src/types.ts +2 -0
  89. package/public/src/utils.js +26 -1
  90. package/public/src/utils.js.map +1 -1
  91. package/public/src/utils.ts +26 -1
  92. package/public/src/views/activity.js +1 -0
  93. package/public/src/views/activity.js.map +1 -1
  94. package/public/src/views/activity.ts +1 -0
  95. package/public/src/views/admin.js +134 -0
  96. package/public/src/views/admin.js.map +1 -1
  97. package/public/src/views/admin.ts +134 -0
  98. package/public/src/views/auth.js +31 -0
  99. package/public/src/views/auth.js.map +1 -1
  100. package/public/src/views/auth.ts +31 -0
  101. package/public/src/views/calendar.js +3 -0
  102. package/public/src/views/calendar.js.map +1 -1
  103. package/public/src/views/calendar.ts +3 -0
  104. package/public/src/views/comments-audit.js +1 -0
  105. package/public/src/views/comments-audit.js.map +1 -1
  106. package/public/src/views/comments-audit.ts +1 -0
  107. package/public/src/views/config.js +67 -0
  108. package/public/src/views/config.js.map +1 -1
  109. package/public/src/views/config.ts +67 -0
  110. package/public/src/views/context.js +2 -0
  111. package/public/src/views/context.js.map +1 -1
  112. package/public/src/views/context.ts +2 -0
  113. package/public/src/views/create.js +3 -0
  114. package/public/src/views/create.js.map +1 -1
  115. package/public/src/views/create.ts +3 -0
  116. package/public/src/views/dedupe.js +1 -0
  117. package/public/src/views/dedupe.js.map +1 -1
  118. package/public/src/views/dedupe.ts +1 -0
  119. package/public/src/views/export.js +6 -0
  120. package/public/src/views/export.js.map +1 -1
  121. package/public/src/views/export.ts +6 -0
  122. package/public/src/views/github.js +58 -0
  123. package/public/src/views/github.js.map +1 -1
  124. package/public/src/views/github.ts +58 -0
  125. package/public/src/views/graph-canvas.js +18 -0
  126. package/public/src/views/graph-canvas.js.map +1 -1
  127. package/public/src/views/graph-canvas.ts +20 -0
  128. package/public/src/views/graph.js +41 -0
  129. package/public/src/views/graph.js.map +1 -1
  130. package/public/src/views/graph.ts +42 -1
  131. package/public/src/views/groups.js +45 -0
  132. package/public/src/views/groups.js.map +1 -1
  133. package/public/src/views/groups.ts +45 -0
  134. package/public/src/views/guide.js +3 -0
  135. package/public/src/views/guide.js.map +1 -1
  136. package/public/src/views/guide.ts +3 -0
  137. package/public/src/views/health.js +3 -0
  138. package/public/src/views/health.js.map +1 -1
  139. package/public/src/views/health.ts +3 -0
  140. package/public/src/views/items.js +196 -6
  141. package/public/src/views/items.js.map +1 -1
  142. package/public/src/views/items.ts +196 -6
  143. package/public/src/views/normalize.js +2 -0
  144. package/public/src/views/normalize.js.map +1 -1
  145. package/public/src/views/normalize.ts +2 -0
  146. package/public/src/views/packages.js +67 -5
  147. package/public/src/views/packages.js.map +1 -1
  148. package/public/src/views/packages.ts +74 -5
  149. package/public/src/views/plan-execution.js +6 -0
  150. package/public/src/views/plan-execution.js.map +1 -1
  151. package/public/src/views/plan-execution.ts +8 -0
  152. package/public/src/views/plan.js +145 -0
  153. package/public/src/views/plan.js.map +1 -1
  154. package/public/src/views/plan.ts +146 -1
  155. package/public/src/views/projects.js +60 -0
  156. package/public/src/views/projects.js.map +1 -1
  157. package/public/src/views/projects.ts +60 -0
  158. package/public/src/views/router.js +43 -0
  159. package/public/src/views/router.js.map +1 -1
  160. package/public/src/views/router.ts +43 -0
  161. package/public/src/views/search.js +5 -0
  162. package/public/src/views/search.js.map +1 -1
  163. package/public/src/views/search.ts +5 -0
  164. package/public/src/views/settings.js +36 -0
  165. package/public/src/views/settings.js.map +1 -1
  166. package/public/src/views/settings.ts +36 -0
  167. package/public/src/views/shared.js +1 -0
  168. package/public/src/views/shared.js.map +1 -1
  169. package/public/src/views/shared.ts +1 -0
  170. package/public/src/views/sharing.js +32 -0
  171. package/public/src/views/sharing.js.map +1 -1
  172. package/public/src/views/sharing.ts +32 -0
  173. package/public/src/views/stats.js +1 -0
  174. package/public/src/views/stats.js.map +1 -1
  175. package/public/src/views/stats.ts +1 -0
  176. package/public/src/views/templates.js +4 -0
  177. package/public/src/views/templates.js.map +1 -1
  178. package/public/src/views/templates.ts +4 -0
  179. package/public/src/views/validate.js +1 -0
  180. package/public/src/views/validate.js.map +1 -1
  181. package/public/src/views/validate.ts +1 -0
  182. package/public/sw.js +60 -5
@@ -6,6 +6,12 @@ import { confirmDialog, createModal, showModal, hideModal } from '../components/
6
6
  function getAuditActor(entry) {
7
7
  return entry.actor_name || entry.actor_email || entry.userId || entry.userEmail || '—';
8
8
  }
9
+ /**
10
+ * Maps raw audit-log API entries into the AuditEntry shape used by the admin
11
+ * view, copying only the fields the UI consumes and dropping the rest.
12
+ * @param entries - Raw entries returned by GET /admin/audit.
13
+ * @returns Normalized audit entries for rendering.
14
+ */
9
15
  function normalizeAuditEntries(entries) {
10
16
  return entries.map((entry) => ({
11
17
  id: entry.id,
@@ -16,6 +22,13 @@ function normalizeAuditEntries(entries) {
16
22
  created_at: entry.created_at,
17
23
  }));
18
24
  }
25
+ /**
26
+ * Resolves a human-readable description for one audit entry, preferring the
27
+ * explicit description, then "{action} by {userId}", then the bare action,
28
+ * falling back to an em-dash when nothing is available.
29
+ * @param entry - The audit entry to describe.
30
+ * @returns The best available description string.
31
+ */
19
32
  function getAuditDescription(entry) {
20
33
  if (entry.description)
21
34
  return entry.description;
@@ -34,6 +47,13 @@ let auditFilter = '';
34
47
  let currentPage = 1;
35
48
  const PAGE_SIZE = 20;
36
49
  let adminAuditTotal = 0;
50
+ /**
51
+ * Loads one page of audit-log entries from the admin API into module state
52
+ * (a no-op unless the current user is an admin). Computes the offset from the
53
+ * page number, normalizes the returned entries, and records the total count
54
+ * and current page.
55
+ * @param page - 1-based page index; clamped to a minimum of 1.
56
+ */
37
57
  async function loadAuditData(page = 1) {
38
58
  if (!state.user?.is_admin)
39
59
  return;
@@ -48,6 +68,14 @@ function paginate(items, page) {
48
68
  const start = (page - 1) * PAGE_SIZE;
49
69
  return items.slice(start, start + PAGE_SIZE);
50
70
  }
71
+ /**
72
+ * Builds the HTML for the prev/next pagination controls for a result set,
73
+ * showing the current page out of the total and the item count. Returns an
74
+ * empty string when there is only a single page so callers render nothing.
75
+ * @param totalItems - Total number of items being paginated.
76
+ * @param currentPg - The page currently in view.
77
+ * @returns Pagination markup, or an empty string for a single page.
78
+ */
51
79
  function renderPagination(totalItems, currentPg, hook) {
52
80
  const totalPages = Math.max(1, Math.ceil(totalItems / PAGE_SIZE));
53
81
  if (totalPages <= 1)
@@ -61,6 +89,13 @@ function renderPagination(totalItems, currentPg, hook) {
61
89
  </div>
62
90
  </div>`;
63
91
  }
92
+ /**
93
+ * Renders one admin user as an HTML table row, showing the display name and
94
+ * email, an admin/user role pill, GitHub connection status, the creation
95
+ * date, and buttons to toggle the admin role and delete the user.
96
+ * @param user - The user record to render.
97
+ * @returns A `<tr>` markup string.
98
+ */
64
99
  function renderUserRow(user) {
65
100
  return `
66
101
  <tr>
@@ -83,6 +118,13 @@ function renderUserRow(user) {
83
118
  </td>
84
119
  </tr>`;
85
120
  }
121
+ /**
122
+ * Renders one admin project as an HTML table row, showing the name, slug and
123
+ * prefix, the owner, the linked GitHub repo (or "Not linked"), sync status,
124
+ * the creation date, and a delete button.
125
+ * @param project - The project record to render.
126
+ * @returns A `<tr>` markup string.
127
+ */
86
128
  function renderProjectRow(project) {
87
129
  const repo = project.github_owner && project.github_repo ? `${project.github_owner}/${project.github_repo}` : 'Not linked';
88
130
  return `
@@ -102,6 +144,13 @@ function renderProjectRow(project) {
102
144
  </td>
103
145
  </tr>`;
104
146
  }
147
+ /**
148
+ * Renders one audit-log entry as an HTML table row, showing the resolved
149
+ * actor, an action pill, the target, a truncated details string, and a
150
+ * localized timestamp.
151
+ * @param entry - The audit entry to render.
152
+ * @returns A `<tr>` markup string.
153
+ */
105
154
  function renderAuditRow(entry) {
106
155
  const actor = getAuditActor(entry);
107
156
  const details = getAuditDescription(entry);
@@ -114,6 +163,12 @@ function renderAuditRow(entry) {
114
163
  <td style="white-space:nowrap">${entry.created_at ? new Date(entry.created_at).toLocaleString() : entry.timestamp ? new Date(entry.timestamp).toLocaleString() : '—'}</td>
115
164
  </tr>`;
116
165
  }
166
+ /**
167
+ * Renders one admin group as an HTML card, showing the group name, owner
168
+ * email and member count, an optional description, and a delete button.
169
+ * @param group - The group record to render.
170
+ * @returns A card markup string.
171
+ */
117
172
  function renderGroupCard(group) {
118
173
  return `
119
174
  <div class="admin-group-card">
@@ -125,6 +180,13 @@ function renderGroupCard(group) {
125
180
  ${group.description ? `<p>${escHtml(group.description)}</p>` : ''}
126
181
  </div>`;
127
182
  }
183
+ /**
184
+ * Formats a duration given in seconds into a compact uptime string expressed
185
+ * in hours and minutes (e.g. "3h 12m"), or minutes only (e.g. "5m") when
186
+ * under an hour.
187
+ * @param seconds - Elapsed seconds to format.
188
+ * @returns The formatted uptime string.
189
+ */
128
190
  function formatUptime(seconds) {
129
191
  const h = Math.floor(seconds / 3600);
130
192
  const m = Math.floor((seconds % 3600) / 60);
@@ -132,6 +194,14 @@ function formatUptime(seconds) {
132
194
  return `${h}h ${m}m`;
133
195
  return `${m}m`;
134
196
  }
197
+ /**
198
+ * Renders the full admin view markup from the overview data, applying the
199
+ * current user/project/audit search filters and paging the active tab's list.
200
+ * Includes the header, stat cards, tab bar, and the section for the active
201
+ * tab (users, projects, groups, or audit).
202
+ * @param data - The admin overview (users, projects, groups, and stats).
203
+ * @returns The admin view HTML string.
204
+ */
135
205
  function renderAdmin(data) {
136
206
  // Filter users
137
207
  const filteredUsers = data.users.filter(u => !userFilter || u.email.toLowerCase().includes(userFilter.toLowerCase()) || (u.display_name || '').toLowerCase().includes(userFilter.toLowerCase()));
@@ -247,6 +317,12 @@ function renderAdmin(data) {
247
317
  ${renderPagination(adminAuditTotal, currentPage, 'audit')}`}
248
318
  </section>` : ''}`;
249
319
  }
320
+ /**
321
+ * Mounts the admin view into the #content-admin element. Shows an
322
+ * access-denied state for non-admins, otherwise a loading spinner while it
323
+ * fetches the overview (and the current audit page when on the audit tab) and
324
+ * renders it, surfacing fetch failures in an empty-state block.
325
+ */
250
326
  export async function renderAdminView() {
251
327
  const el = document.getElementById('content-admin');
252
328
  if (!el)
@@ -267,6 +343,12 @@ export async function renderAdminView() {
267
343
  el.innerHTML = `<div class="empty-state"><div class="empty-state-text">Admin failed: ${escHtml(err instanceof Error ? err.message : String(err))}</div></div>`;
268
344
  }
269
345
  }
346
+ /**
347
+ * Toggles a user's admin flag via the admin API, shows a success or error
348
+ * toast, and re-renders the admin view.
349
+ * @param userId - The id of the user to update.
350
+ * @param isAdmin - The desired admin flag.
351
+ */
270
352
  export async function setAdminRole(userId, isAdmin) {
271
353
  try {
272
354
  await api('PATCH', `/admin/users/${encodeURIComponent(userId)}`, { isAdmin });
@@ -277,6 +359,12 @@ export async function setAdminRole(userId, isAdmin) {
277
359
  toast(err instanceof Error ? err.message : String(err), 'error');
278
360
  }
279
361
  }
362
+ /**
363
+ * Switches the active admin tab and resets to the first page. For the audit
364
+ * tab it reloads the first audit page before re-rendering; for other tabs it
365
+ * re-renders from the cached overview.
366
+ * @param tab - The tab to activate.
367
+ */
280
368
  export function adminSwitchTab(tab) {
281
369
  adminTab = tab;
282
370
  currentPage = 1;
@@ -297,6 +385,11 @@ export function adminSwitchTab(tab) {
297
385
  el.innerHTML = renderAdmin(adminData);
298
386
  }
299
387
  }
388
+ /**
389
+ * Updates the user search filter from the filter input, resets to the first
390
+ * page, and re-renders the cached admin view.
391
+ * @param filter - Case-insensitive substring matched against user fields.
392
+ */
300
393
  export function adminFilterUsers(filter) {
301
394
  userFilter = filter;
302
395
  currentPage = 1;
@@ -306,6 +399,11 @@ export function adminFilterUsers(filter) {
306
399
  el.innerHTML = renderAdmin(adminData);
307
400
  }
308
401
  }
402
+ /**
403
+ * Updates the project search filter from the filter input, resets to the
404
+ * first page, and re-renders the cached admin view.
405
+ * @param filter - Case-insensitive substring matched against project fields.
406
+ */
309
407
  export function adminFilterProjects(filter) {
310
408
  projectFilter = filter;
311
409
  currentPage = 1;
@@ -315,6 +413,12 @@ export function adminFilterProjects(filter) {
315
413
  el.innerHTML = renderAdmin(adminData);
316
414
  }
317
415
  }
416
+ /**
417
+ * Updates the audit-log search filter from the filter input, resets to the
418
+ * first page, and reloads the first audit page before re-rendering when the
419
+ * audit tab is active.
420
+ * @param filter - Case-insensitive substring matched against audit fields.
421
+ */
318
422
  export function adminFilterAudit(filter) {
319
423
  auditFilter = filter;
320
424
  currentPage = 1;
@@ -334,6 +438,13 @@ export function adminFilterAudit(filter) {
334
438
  el.innerHTML = renderAdmin(adminData);
335
439
  }
336
440
  }
441
+ /**
442
+ * Navigates the active tab to the given page. Does nothing for negative pages
443
+ * or when no overview is cached. For the audit tab it loads the requested
444
+ * audit page; otherwise it clamps the page to the filtered total and
445
+ * re-renders.
446
+ * @param page - The 1-based page to navigate to.
447
+ */
337
448
  export async function adminSetPage(page) {
338
449
  if (page < 1)
339
450
  return;
@@ -357,6 +468,12 @@ export async function adminSetPage(page) {
357
468
  if (el)
358
469
  el.innerHTML = renderAdmin(adminData);
359
470
  }
471
+ /**
472
+ * Prompts for confirmation, then deletes the user via the admin API, shows a
473
+ * toast, and re-renders the admin view.
474
+ * @param userId - The id of the user to delete.
475
+ * @param userName - Display name used in the confirmation prompt.
476
+ */
360
477
  export async function adminDeleteUser(userId, userName) {
361
478
  confirmDialog(`Delete user "${userName}"?`, 'This action cannot be undone. The user will be permanently removed.', async () => {
362
479
  try {
@@ -369,6 +486,12 @@ export async function adminDeleteUser(userId, userName) {
369
486
  }
370
487
  }, true);
371
488
  }
489
+ /**
490
+ * Prompts for confirmation, then deletes the project and its items via the
491
+ * admin API, shows a toast, and re-renders the admin view.
492
+ * @param projectId - The id of the project to delete.
493
+ * @param projectName - Display name used in the confirmation prompt.
494
+ */
372
495
  export async function adminDeleteProject(projectId, projectName) {
373
496
  confirmDialog(`Delete project "${projectName}"?`, 'This will permanently delete the project and all its items. This action cannot be undone.', async () => {
374
497
  try {
@@ -381,6 +504,12 @@ export async function adminDeleteProject(projectId, projectName) {
381
504
  }
382
505
  }, true);
383
506
  }
507
+ /**
508
+ * Prompts for confirmation, then deletes the group and its memberships via
509
+ * the admin API, shows a toast, and re-renders the admin view.
510
+ * @param groupId - The id of the group to delete.
511
+ * @param groupName - Display name used in the confirmation prompt.
512
+ */
384
513
  export async function adminDeleteGroup(groupId, groupName) {
385
514
  confirmDialog(`Delete group "${groupName}"?`, 'This will permanently remove the group and all its memberships.', async () => {
386
515
  try {
@@ -393,6 +522,11 @@ export async function adminDeleteGroup(groupId, groupName) {
393
522
  }
394
523
  }, true);
395
524
  }
525
+ /**
526
+ * Opens a modal form to create a new group. On submit it validates that a name
527
+ * was entered, POSTs the group to the admin API, shows a toast, closes the
528
+ * modal, and re-renders the admin view.
529
+ */
396
530
  export function adminCreateGroup() {
397
531
  const id = 'admin-create-group-' + Date.now();
398
532
  createModal(id, 'Create Group', `
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["admin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["admin.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,12 @@ function getAuditActor(entry: AuditEntry): string {
55
55
  return entry.actor_name || entry.actor_email || entry.userId || entry.userEmail || '—';
56
56
  }
57
57
 
58
+ /**
59
+ * Maps raw audit-log API entries into the AuditEntry shape used by the admin
60
+ * view, copying only the fields the UI consumes and dropping the rest.
61
+ * @param entries - Raw entries returned by GET /admin/audit.
62
+ * @returns Normalized audit entries for rendering.
63
+ */
58
64
  function normalizeAuditEntries(entries: AuditApiEntry[]): AuditEntry[] {
59
65
  return entries.map((entry) => ({
60
66
  id: entry.id,
@@ -66,6 +72,13 @@ function normalizeAuditEntries(entries: AuditApiEntry[]): AuditEntry[] {
66
72
  }));
67
73
  }
68
74
 
75
+ /**
76
+ * Resolves a human-readable description for one audit entry, preferring the
77
+ * explicit description, then "{action} by {userId}", then the bare action,
78
+ * falling back to an em-dash when nothing is available.
79
+ * @param entry - The audit entry to describe.
80
+ * @returns The best available description string.
81
+ */
69
82
  function getAuditDescription(entry: AuditEntry): string {
70
83
  if (entry.description) return entry.description;
71
84
  if (entry.userId && entry.action) return `${entry.action} by ${entry.userId}`;
@@ -83,6 +96,13 @@ let currentPage = 1;
83
96
  const PAGE_SIZE = 20;
84
97
  let adminAuditTotal = 0;
85
98
 
99
+ /**
100
+ * Loads one page of audit-log entries from the admin API into module state
101
+ * (a no-op unless the current user is an admin). Computes the offset from the
102
+ * page number, normalizes the returned entries, and records the total count
103
+ * and current page.
104
+ * @param page - 1-based page index; clamped to a minimum of 1.
105
+ */
86
106
  async function loadAuditData(page = 1): Promise<void> {
87
107
  if (!state.user?.is_admin) return;
88
108
  const safePage = Math.max(1, page);
@@ -98,6 +118,14 @@ function paginate<T>(items: T[], page: number): T[] {
98
118
  return items.slice(start, start + PAGE_SIZE);
99
119
  }
100
120
 
121
+ /**
122
+ * Builds the HTML for the prev/next pagination controls for a result set,
123
+ * showing the current page out of the total and the item count. Returns an
124
+ * empty string when there is only a single page so callers render nothing.
125
+ * @param totalItems - Total number of items being paginated.
126
+ * @param currentPg - The page currently in view.
127
+ * @returns Pagination markup, or an empty string for a single page.
128
+ */
101
129
  function renderPagination(totalItems: number, currentPg: number, hook: string): string {
102
130
  const totalPages = Math.max(1, Math.ceil(totalItems / PAGE_SIZE));
103
131
  if (totalPages <= 1) return '';
@@ -111,6 +139,13 @@ function renderPagination(totalItems: number, currentPg: number, hook: string):
111
139
  </div>`;
112
140
  }
113
141
 
142
+ /**
143
+ * Renders one admin user as an HTML table row, showing the display name and
144
+ * email, an admin/user role pill, GitHub connection status, the creation
145
+ * date, and buttons to toggle the admin role and delete the user.
146
+ * @param user - The user record to render.
147
+ * @returns A `<tr>` markup string.
148
+ */
114
149
  function renderUserRow(user: AdminUser): string {
115
150
  return `
116
151
  <tr>
@@ -134,6 +169,13 @@ function renderUserRow(user: AdminUser): string {
134
169
  </tr>`;
135
170
  }
136
171
 
172
+ /**
173
+ * Renders one admin project as an HTML table row, showing the name, slug and
174
+ * prefix, the owner, the linked GitHub repo (or "Not linked"), sync status,
175
+ * the creation date, and a delete button.
176
+ * @param project - The project record to render.
177
+ * @returns A `<tr>` markup string.
178
+ */
137
179
  function renderProjectRow(project: AdminProject): string {
138
180
  const repo = project.github_owner && project.github_repo ? `${project.github_owner}/${project.github_repo}` : 'Not linked';
139
181
  return `
@@ -154,6 +196,13 @@ function renderProjectRow(project: AdminProject): string {
154
196
  </tr>`;
155
197
  }
156
198
 
199
+ /**
200
+ * Renders one audit-log entry as an HTML table row, showing the resolved
201
+ * actor, an action pill, the target, a truncated details string, and a
202
+ * localized timestamp.
203
+ * @param entry - The audit entry to render.
204
+ * @returns A `<tr>` markup string.
205
+ */
157
206
  function renderAuditRow(entry: AuditEntry): string {
158
207
  const actor = getAuditActor(entry);
159
208
  const details = getAuditDescription(entry);
@@ -167,6 +216,12 @@ function renderAuditRow(entry: AuditEntry): string {
167
216
  </tr>`;
168
217
  }
169
218
 
219
+ /**
220
+ * Renders one admin group as an HTML card, showing the group name, owner
221
+ * email and member count, an optional description, and a delete button.
222
+ * @param group - The group record to render.
223
+ * @returns A card markup string.
224
+ */
170
225
  function renderGroupCard(group: AdminGroup): string {
171
226
  return `
172
227
  <div class="admin-group-card">
@@ -179,6 +234,13 @@ function renderGroupCard(group: AdminGroup): string {
179
234
  </div>`;
180
235
  }
181
236
 
237
+ /**
238
+ * Formats a duration given in seconds into a compact uptime string expressed
239
+ * in hours and minutes (e.g. "3h 12m"), or minutes only (e.g. "5m") when
240
+ * under an hour.
241
+ * @param seconds - Elapsed seconds to format.
242
+ * @returns The formatted uptime string.
243
+ */
182
244
  function formatUptime(seconds: number): string {
183
245
  const h = Math.floor(seconds / 3600);
184
246
  const m = Math.floor((seconds % 3600) / 60);
@@ -186,6 +248,14 @@ function formatUptime(seconds: number): string {
186
248
  return `${m}m`;
187
249
  }
188
250
 
251
+ /**
252
+ * Renders the full admin view markup from the overview data, applying the
253
+ * current user/project/audit search filters and paging the active tab's list.
254
+ * Includes the header, stat cards, tab bar, and the section for the active
255
+ * tab (users, projects, groups, or audit).
256
+ * @param data - The admin overview (users, projects, groups, and stats).
257
+ * @returns The admin view HTML string.
258
+ */
189
259
  function renderAdmin(data: AdminOverview): string {
190
260
  // Filter users
191
261
  const filteredUsers = data.users.filter(u =>
@@ -312,6 +382,12 @@ function renderAdmin(data: AdminOverview): string {
312
382
  </section>` : ''}`;
313
383
  }
314
384
 
385
+ /**
386
+ * Mounts the admin view into the #content-admin element. Shows an
387
+ * access-denied state for non-admins, otherwise a loading spinner while it
388
+ * fetches the overview (and the current audit page when on the audit tab) and
389
+ * renders it, surfacing fetch failures in an empty-state block.
390
+ */
315
391
  export async function renderAdminView(): Promise<void> {
316
392
  const el = document.getElementById('content-admin');
317
393
  if (!el) return;
@@ -331,6 +407,12 @@ export async function renderAdminView(): Promise<void> {
331
407
  }
332
408
  }
333
409
 
410
+ /**
411
+ * Toggles a user's admin flag via the admin API, shows a success or error
412
+ * toast, and re-renders the admin view.
413
+ * @param userId - The id of the user to update.
414
+ * @param isAdmin - The desired admin flag.
415
+ */
334
416
  export async function setAdminRole(userId: string, isAdmin: boolean): Promise<void> {
335
417
  try {
336
418
  await api('PATCH', `/admin/users/${encodeURIComponent(userId)}`, { isAdmin });
@@ -341,6 +423,12 @@ export async function setAdminRole(userId: string, isAdmin: boolean): Promise<vo
341
423
  }
342
424
  }
343
425
 
426
+ /**
427
+ * Switches the active admin tab and resets to the first page. For the audit
428
+ * tab it reloads the first audit page before re-rendering; for other tabs it
429
+ * re-renders from the cached overview.
430
+ * @param tab - The tab to activate.
431
+ */
344
432
  export function adminSwitchTab(tab: 'users' | 'projects' | 'groups' | 'audit'): void {
345
433
  adminTab = tab;
346
434
  currentPage = 1;
@@ -360,6 +448,11 @@ export function adminSwitchTab(tab: 'users' | 'projects' | 'groups' | 'audit'):
360
448
  }
361
449
  }
362
450
 
451
+ /**
452
+ * Updates the user search filter from the filter input, resets to the first
453
+ * page, and re-renders the cached admin view.
454
+ * @param filter - Case-insensitive substring matched against user fields.
455
+ */
363
456
  export function adminFilterUsers(filter: string): void {
364
457
  userFilter = filter;
365
458
  currentPage = 1;
@@ -369,6 +462,11 @@ export function adminFilterUsers(filter: string): void {
369
462
  }
370
463
  }
371
464
 
465
+ /**
466
+ * Updates the project search filter from the filter input, resets to the
467
+ * first page, and re-renders the cached admin view.
468
+ * @param filter - Case-insensitive substring matched against project fields.
469
+ */
372
470
  export function adminFilterProjects(filter: string): void {
373
471
  projectFilter = filter;
374
472
  currentPage = 1;
@@ -378,6 +476,12 @@ export function adminFilterProjects(filter: string): void {
378
476
  }
379
477
  }
380
478
 
479
+ /**
480
+ * Updates the audit-log search filter from the filter input, resets to the
481
+ * first page, and reloads the first audit page before re-rendering when the
482
+ * audit tab is active.
483
+ * @param filter - Case-insensitive substring matched against audit fields.
484
+ */
381
485
  export function adminFilterAudit(filter: string): void {
382
486
  auditFilter = filter;
383
487
  currentPage = 1;
@@ -395,6 +499,13 @@ export function adminFilterAudit(filter: string): void {
395
499
  }
396
500
  }
397
501
 
502
+ /**
503
+ * Navigates the active tab to the given page. Does nothing for negative pages
504
+ * or when no overview is cached. For the audit tab it loads the requested
505
+ * audit page; otherwise it clamps the page to the filtered total and
506
+ * re-renders.
507
+ * @param page - The 1-based page to navigate to.
508
+ */
398
509
  export async function adminSetPage(page: number): Promise<void> {
399
510
  if (page < 1) return;
400
511
  if (!adminData) return;
@@ -422,6 +533,12 @@ export async function adminSetPage(page: number): Promise<void> {
422
533
  if (el) el.innerHTML = renderAdmin(adminData);
423
534
  }
424
535
 
536
+ /**
537
+ * Prompts for confirmation, then deletes the user via the admin API, shows a
538
+ * toast, and re-renders the admin view.
539
+ * @param userId - The id of the user to delete.
540
+ * @param userName - Display name used in the confirmation prompt.
541
+ */
425
542
  export async function adminDeleteUser(userId: string, userName: string): Promise<void> {
426
543
  confirmDialog(
427
544
  `Delete user "${userName}"?`,
@@ -439,6 +556,12 @@ export async function adminDeleteUser(userId: string, userName: string): Promise
439
556
  );
440
557
  }
441
558
 
559
+ /**
560
+ * Prompts for confirmation, then deletes the project and its items via the
561
+ * admin API, shows a toast, and re-renders the admin view.
562
+ * @param projectId - The id of the project to delete.
563
+ * @param projectName - Display name used in the confirmation prompt.
564
+ */
442
565
  export async function adminDeleteProject(projectId: string, projectName: string): Promise<void> {
443
566
  confirmDialog(
444
567
  `Delete project "${projectName}"?`,
@@ -456,6 +579,12 @@ export async function adminDeleteProject(projectId: string, projectName: string)
456
579
  );
457
580
  }
458
581
 
582
+ /**
583
+ * Prompts for confirmation, then deletes the group and its memberships via
584
+ * the admin API, shows a toast, and re-renders the admin view.
585
+ * @param groupId - The id of the group to delete.
586
+ * @param groupName - Display name used in the confirmation prompt.
587
+ */
459
588
  export async function adminDeleteGroup(groupId: string, groupName: string): Promise<void> {
460
589
  confirmDialog(
461
590
  `Delete group "${groupName}"?`,
@@ -473,6 +602,11 @@ export async function adminDeleteGroup(groupId: string, groupName: string): Prom
473
602
  );
474
603
  }
475
604
 
605
+ /**
606
+ * Opens a modal form to create a new group. On submit it validates that a name
607
+ * was entered, POSTs the group to the admin API, shows a toast, closes the
608
+ * modal, and re-renders the admin view.
609
+ */
476
610
  export function adminCreateGroup(): void {
477
611
  const id = 'admin-create-group-' + Date.now();
478
612
  createModal(id, 'Create Group', `