@unbrained/pm-web 2026.8.7 → 2026.8.14

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 (173) hide show
  1. package/CHANGELOG.md +16 -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/github.js +13 -0
  30. package/dist/routes/github.js.map +1 -1
  31. package/dist/routes/oidc.d.ts +10 -0
  32. package/dist/routes/oidc.js +51 -0
  33. package/dist/routes/oidc.js.map +1 -1
  34. package/dist/routes/pm.js +132 -1
  35. package/dist/routes/pm.js.map +1 -1
  36. package/dist/routes/sharing.js +8 -0
  37. package/dist/routes/sharing.js.map +1 -1
  38. package/dist/services/mutation-event-watcher.js +13 -0
  39. package/dist/services/mutation-event-watcher.js.map +1 -1
  40. package/dist/services/pm-runner.d.ts +82 -0
  41. package/dist/services/pm-runner.js +121 -0
  42. package/dist/services/pm-runner.js.map +1 -1
  43. package/dist/services/project-watcher.d.ts +22 -0
  44. package/dist/services/project-watcher.js +51 -0
  45. package/dist/services/project-watcher.js.map +1 -1
  46. package/dist/services/realtime-bus.d.ts +46 -0
  47. package/dist/services/realtime-bus.js +59 -0
  48. package/dist/services/realtime-bus.js.map +1 -1
  49. package/dist/services/sse.d.ts +134 -0
  50. package/dist/services/sse.js +145 -0
  51. package/dist/services/sse.js.map +1 -1
  52. package/manifest.json +1 -1
  53. package/package.json +5 -3
  54. package/public/src/app.js +44 -1
  55. package/public/src/app.js.map +1 -1
  56. package/public/src/app.ts +44 -1
  57. package/public/src/components/modals.js +11 -0
  58. package/public/src/components/modals.js.map +1 -1
  59. package/public/src/components/modals.ts +11 -0
  60. package/public/src/components/toast.js +2 -0
  61. package/public/src/components/toast.js.map +1 -1
  62. package/public/src/components/toast.ts +2 -0
  63. package/public/src/constants.js +21 -4
  64. package/public/src/constants.js.map +1 -1
  65. package/public/src/constants.ts +21 -4
  66. package/public/src/filters.js +10 -7
  67. package/public/src/filters.js.map +1 -1
  68. package/public/src/filters.ts +10 -7
  69. package/public/src/i18n.js +11 -1
  70. package/public/src/i18n.js.map +1 -1
  71. package/public/src/i18n.ts +13 -1
  72. package/public/src/state.js +3 -0
  73. package/public/src/state.js.map +1 -1
  74. package/public/src/state.ts +3 -0
  75. package/public/src/sw.ts +71 -7
  76. package/public/src/theme.js +13 -1
  77. package/public/src/theme.js.map +1 -1
  78. package/public/src/theme.ts +15 -1
  79. package/public/src/types.ts +2 -0
  80. package/public/src/utils.js +26 -1
  81. package/public/src/utils.js.map +1 -1
  82. package/public/src/utils.ts +26 -1
  83. package/public/src/views/activity.js +1 -0
  84. package/public/src/views/activity.js.map +1 -1
  85. package/public/src/views/activity.ts +1 -0
  86. package/public/src/views/admin.js +134 -0
  87. package/public/src/views/admin.js.map +1 -1
  88. package/public/src/views/admin.ts +134 -0
  89. package/public/src/views/auth.js +31 -0
  90. package/public/src/views/auth.js.map +1 -1
  91. package/public/src/views/auth.ts +31 -0
  92. package/public/src/views/calendar.js +3 -0
  93. package/public/src/views/calendar.js.map +1 -1
  94. package/public/src/views/calendar.ts +3 -0
  95. package/public/src/views/comments-audit.js +1 -0
  96. package/public/src/views/comments-audit.js.map +1 -1
  97. package/public/src/views/comments-audit.ts +1 -0
  98. package/public/src/views/config.js +67 -0
  99. package/public/src/views/config.js.map +1 -1
  100. package/public/src/views/config.ts +67 -0
  101. package/public/src/views/context.js +2 -0
  102. package/public/src/views/context.js.map +1 -1
  103. package/public/src/views/context.ts +2 -0
  104. package/public/src/views/create.js +3 -0
  105. package/public/src/views/create.js.map +1 -1
  106. package/public/src/views/create.ts +3 -0
  107. package/public/src/views/dedupe.js +1 -0
  108. package/public/src/views/dedupe.js.map +1 -1
  109. package/public/src/views/dedupe.ts +1 -0
  110. package/public/src/views/export.js +6 -0
  111. package/public/src/views/export.js.map +1 -1
  112. package/public/src/views/export.ts +6 -0
  113. package/public/src/views/github.js +58 -0
  114. package/public/src/views/github.js.map +1 -1
  115. package/public/src/views/github.ts +58 -0
  116. package/public/src/views/graph-canvas.js +18 -0
  117. package/public/src/views/graph-canvas.js.map +1 -1
  118. package/public/src/views/graph-canvas.ts +20 -0
  119. package/public/src/views/graph.js +41 -0
  120. package/public/src/views/graph.js.map +1 -1
  121. package/public/src/views/graph.ts +42 -1
  122. package/public/src/views/groups.js +45 -0
  123. package/public/src/views/groups.js.map +1 -1
  124. package/public/src/views/groups.ts +45 -0
  125. package/public/src/views/guide.js +3 -0
  126. package/public/src/views/guide.js.map +1 -1
  127. package/public/src/views/guide.ts +3 -0
  128. package/public/src/views/health.js +3 -0
  129. package/public/src/views/health.js.map +1 -1
  130. package/public/src/views/health.ts +3 -0
  131. package/public/src/views/items.js +196 -6
  132. package/public/src/views/items.js.map +1 -1
  133. package/public/src/views/items.ts +196 -6
  134. package/public/src/views/normalize.js +2 -0
  135. package/public/src/views/normalize.js.map +1 -1
  136. package/public/src/views/normalize.ts +2 -0
  137. package/public/src/views/packages.js +41 -0
  138. package/public/src/views/packages.js.map +1 -1
  139. package/public/src/views/packages.ts +41 -0
  140. package/public/src/views/plan-execution.js +6 -0
  141. package/public/src/views/plan-execution.js.map +1 -1
  142. package/public/src/views/plan-execution.ts +8 -0
  143. package/public/src/views/plan.js +145 -0
  144. package/public/src/views/plan.js.map +1 -1
  145. package/public/src/views/plan.ts +146 -1
  146. package/public/src/views/projects.js +60 -0
  147. package/public/src/views/projects.js.map +1 -1
  148. package/public/src/views/projects.ts +60 -0
  149. package/public/src/views/router.js +43 -0
  150. package/public/src/views/router.js.map +1 -1
  151. package/public/src/views/router.ts +43 -0
  152. package/public/src/views/search.js +5 -0
  153. package/public/src/views/search.js.map +1 -1
  154. package/public/src/views/search.ts +5 -0
  155. package/public/src/views/settings.js +36 -0
  156. package/public/src/views/settings.js.map +1 -1
  157. package/public/src/views/settings.ts +36 -0
  158. package/public/src/views/shared.js +1 -0
  159. package/public/src/views/shared.js.map +1 -1
  160. package/public/src/views/shared.ts +1 -0
  161. package/public/src/views/sharing.js +32 -0
  162. package/public/src/views/sharing.js.map +1 -1
  163. package/public/src/views/sharing.ts +32 -0
  164. package/public/src/views/stats.js +1 -0
  165. package/public/src/views/stats.js.map +1 -1
  166. package/public/src/views/stats.ts +1 -0
  167. package/public/src/views/templates.js +4 -0
  168. package/public/src/views/templates.js.map +1 -1
  169. package/public/src/views/templates.ts +4 -0
  170. package/public/src/views/validate.js +1 -0
  171. package/public/src/views/validate.js.map +1 -1
  172. package/public/src/views/validate.ts +1 -0
  173. package/public/sw.js +60 -5
@@ -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', `
@@ -5,6 +5,11 @@ import { state } from '../state.js';
5
5
  import { api } from '../api.js';
6
6
  import { bootApp } from '../app.js';
7
7
  import { t, translateError } from '../i18n.js';
8
+ /**
9
+ * Fetches the OIDC provider configuration and shows or hides the single
10
+ * sign-on login button and divider based on whether it is enabled. Both
11
+ * elements are hidden when the config request fails.
12
+ */
8
13
  async function configureOidcLogin() {
9
14
  const button = document.getElementById('oidc-login');
10
15
  const divider = document.getElementById('oidc-divider');
@@ -23,9 +28,20 @@ async function configureOidcLogin() {
23
28
  divider.hidden = true;
24
29
  }
25
30
  }
31
+ /**
32
+ * Redirects the browser to the server endpoint that begins the single
33
+ * sign-on authentication flow.
34
+ */
26
35
  export function startOidcLogin() {
27
36
  window.location.assign('/api/auth/oidc/start');
28
37
  }
38
+ /**
39
+ * Switches the authentication panel between login and register modes,
40
+ * updating tab highlighting, the visible name field, and the translated
41
+ * title, subtitle, and button labels.
42
+ *
43
+ * @param tab - 'login' or 'register'.
44
+ */
29
45
  export function switchAuthTab(tab) {
30
46
  state.authTab = tab;
31
47
  document.getElementById('tab-login')?.classList.toggle('active', tab === 'login');
@@ -46,6 +62,13 @@ export function switchAuthTab(tab) {
46
62
  if (authError)
47
63
  authError.style.display = 'none';
48
64
  }
65
+ /**
66
+ * Handles the form submission: posts the entered credentials to either the
67
+ * login or register endpoint depending on the active tab, stores the returned
68
+ * user, and boots the application. Shows a translated error message on failure.
69
+ *
70
+ * @param e - form submit event.
71
+ */
49
72
  export async function submitAuth(e) {
50
73
  e.preventDefault();
51
74
  const btn = document.getElementById('auth-submit');
@@ -82,6 +105,10 @@ export async function submitAuth(e) {
82
105
  span.textContent = state.authTab === 'login' ? t('auth.button.login') : t('auth.button.register');
83
106
  }
84
107
  }
108
+ /**
109
+ * Signs the current user out by calling the logout endpoint, clears local
110
+ * state, and returns to the login screen.
111
+ */
85
112
  export async function logout() {
86
113
  try {
87
114
  await api('POST', '/auth/logout', {});
@@ -92,6 +119,10 @@ export async function logout() {
92
119
  state.currentProject = null;
93
120
  showAuth();
94
121
  }
122
+ /**
123
+ * Displays the authentication screen, hides the main application view, and
124
+ * refreshes the single sign-on button state.
125
+ */
95
126
  export function showAuth() {
96
127
  const authScreen = document.getElementById('auth-screen');
97
128
  const mainApp = document.getElementById('main-app');
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,11 @@ import { bootApp } from '../app.js';
7
7
  import { t, translateError } from '../i18n.js';
8
8
  import type { User } from '../types.js';
9
9
 
10
+ /**
11
+ * Fetches the OIDC provider configuration and shows or hides the single
12
+ * sign-on login button and divider based on whether it is enabled. Both
13
+ * elements are hidden when the config request fails.
14
+ */
10
15
  async function configureOidcLogin(): Promise<void> {
11
16
  const button = document.getElementById('oidc-login') as HTMLButtonElement | null;
12
17
  const divider = document.getElementById('oidc-divider') as HTMLElement | null;
@@ -22,10 +27,21 @@ async function configureOidcLogin(): Promise<void> {
22
27
  }
23
28
  }
24
29
 
30
+ /**
31
+ * Redirects the browser to the server endpoint that begins the single
32
+ * sign-on authentication flow.
33
+ */
25
34
  export function startOidcLogin(): void {
26
35
  window.location.assign('/api/auth/oidc/start');
27
36
  }
28
37
 
38
+ /**
39
+ * Switches the authentication panel between login and register modes,
40
+ * updating tab highlighting, the visible name field, and the translated
41
+ * title, subtitle, and button labels.
42
+ *
43
+ * @param tab - 'login' or 'register'.
44
+ */
29
45
  export function switchAuthTab(tab: 'login' | 'register'): void {
30
46
  state.authTab = tab;
31
47
  document.getElementById('tab-login')?.classList.toggle('active', tab==='login');
@@ -42,6 +58,13 @@ export function switchAuthTab(tab: 'login' | 'register'): void {
42
58
  if (authError) authError.style.display = 'none';
43
59
  }
44
60
 
61
+ /**
62
+ * Handles the form submission: posts the entered credentials to either the
63
+ * login or register endpoint depending on the active tab, stores the returned
64
+ * user, and boots the application. Shows a translated error message on failure.
65
+ *
66
+ * @param e - form submit event.
67
+ */
45
68
  export async function submitAuth(e: Event): Promise<void> {
46
69
  e.preventDefault();
47
70
  const btn = document.getElementById('auth-submit') as HTMLButtonElement | null;
@@ -78,6 +101,10 @@ export async function submitAuth(e: Event): Promise<void> {
78
101
  }
79
102
  }
80
103
 
104
+ /**
105
+ * Signs the current user out by calling the logout endpoint, clears local
106
+ * state, and returns to the login screen.
107
+ */
81
108
  export async function logout(): Promise<void> {
82
109
  try { await api('POST','/auth/logout',{}); } catch(_) { /* ignore */ }
83
110
  state.user = null;
@@ -86,6 +113,10 @@ export async function logout(): Promise<void> {
86
113
  showAuth();
87
114
  }
88
115
 
116
+ /**
117
+ * Displays the authentication screen, hides the main application view, and
118
+ * refreshes the single sign-on button state.
119
+ */
89
120
  export function showAuth(): void {
90
121
  const authScreen = document.getElementById('auth-screen');
91
122
  const mainApp = document.getElementById('main-app');
@@ -7,6 +7,7 @@ import { escHtml, typeIcon } from '../utils.js';
7
7
  import { skeletonRows } from '../utils.js';
8
8
  import { showModal, createModal } from '../components/modals.js';
9
9
  import { renderItemRow } from './items.js';
10
+ /** Renders the calendar view for the current project: a month grid (offset by state.calOffset) of items with deadlines, prev/next/today navigation, an iCalendar export link, and an upcoming-events list. */
10
11
  export async function renderCalendarView() {
11
12
  const el = document.getElementById('content-calendar');
12
13
  if (!el)
@@ -105,10 +106,12 @@ export async function renderCalendarView() {
105
106
  contentEl.innerHTML = `<div class="empty-state"><div class="empty-state-text">Error: ${escHtml(err instanceof Error ? err.message : String(err))}</div></div>`;
106
107
  }
107
108
  }
109
+ /** Shifts the calendar's month offset by the given direction (-1 back, +1 forward) and re-renders the calendar view. */
108
110
  export function calNav(dir) {
109
111
  state.calOffset = (state.calOffset || 0) + dir;
110
112
  renderCalendarView();
111
113
  }
114
+ /** Opens a modal listing every project item whose deadline falls on the given ISO date string, fetched fresh from the list endpoint. */
112
115
  export function showDayItems(dateStr) {
113
116
  if (!state.currentProject)
114
117
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.js","sourceRoot":"","sources":["calendar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["calendar.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ import { renderItemRow } from './items.js';
10
10
  import type { CalendarListItem, CalendarResponse, ListResponse } from '../api-types.js';
11
11
  import type { Item } from '../types.js';
12
12
 
13
+ /** Renders the calendar view for the current project: a month grid (offset by state.calOffset) of items with deadlines, prev/next/today navigation, an iCalendar export link, and an upcoming-events list. */
13
14
  export async function renderCalendarView(): Promise<void> {
14
15
  const el = document.getElementById('content-calendar');
15
16
  if (!el) return;
@@ -107,11 +108,13 @@ export async function renderCalendarView(): Promise<void> {
107
108
  }
108
109
  }
109
110
 
111
+ /** Shifts the calendar's month offset by the given direction (-1 back, +1 forward) and re-renders the calendar view. */
110
112
  export function calNav(dir: number): void {
111
113
  state.calOffset = (state.calOffset || 0) + dir;
112
114
  renderCalendarView();
113
115
  }
114
116
 
117
+ /** Opens a modal listing every project item whose deadline falls on the given ISO date string, fetched fresh from the list endpoint. */
115
118
  export function showDayItems(dateStr: string): void {
116
119
  if (!state.currentProject) return;
117
120
  createModal('day-items-modal', `Items due ${dateStr}`, '<div class="loading-state"><div class="loading-spinner"></div></div>', '', true);
@@ -4,6 +4,7 @@
4
4
  import { state } from '../state.js';
5
5
  import { api } from '../api.js';
6
6
  import { escHtml, statusBadge, typeIcon } from '../utils.js';
7
+ /** Renders the comments audit for the current project: coverage summary cards, a per-type comment breakdown table, and a list of items with their comment counts. */
7
8
  export async function renderCommentsAuditView() {
8
9
  const el = document.getElementById('content-comments-audit');
9
10
  if (!el)
@@ -1 +1 @@
1
- {"version":3,"file":"comments-audit.js","sourceRoot":"","sources":["comments-audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comments-audit.js","sourceRoot":"","sources":["comments-audit.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import { api } from '../api.js';
6
6
  import { escHtml, statusBadge, typeIcon } from '../utils.js';
7
7
  import type { CommentsAuditResponse, CommentsAuditItem, CommentsAuditSummary, CommentsAuditTypeRow } from '../api-types.js';
8
8
 
9
+ /** Renders the comments audit for the current project: coverage summary cards, a per-type comment breakdown table, and a list of items with their comment counts. */
9
10
  export async function renderCommentsAuditView(): Promise<void> {
10
11
  const el = document.getElementById('content-comments-audit');
11
12
  if (!el) return;