Codeman maintainer
ac6fe6ef79
feat(multiuser): phase 5b, frontend (identity boot + admin panel)
...
- public/admin-ui.js (new, self-contained): on boot fetches GET /api/me and
stores window.__codemanUser; installs a fetch interceptor that opens a
change-password modal on any 403 PASSWORD_CHANGE_REQUIRED (and on boot when
mustChangePassword is set); for a multi-user admin, injects a "Users" tab into
the existing App Settings modal (create/reset/disable/enable/promote/demote/
grant-bypass/delete with typed confirm + one-time-password reveal). No header
button, so the mobile-header policy stays green; nothing renders in single-user
mode.
- me-routes: GET /api/me returns a `multiUser` flag so the UI distinguishes a
single-user admin (no admin UI) from a multi-user admin.
- index.html: load admin-ui.js after settings-ui.js, before session-ui.js.
Tests: test/admin-ui.test.ts (JSDOM: identity boot, Users-tab injection gating by
role/mode, forced change-password modal, script-order wiring). Backend verified
end-to-end by test/admin-routes.test.ts against a live server. A full Playwright
pass is recommended before merge.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-20 04:31:30 +02:00
..
2026-06-08 15:41:46 +02:00
2026-06-14 22:43:17 +02:00
2026-07-09 16:00:06 -04:00
2026-07-20 01:36:21 +02:00
2026-07-12 12:19:10 -04:00
2026-06-10 01:38:40 +02:00
2026-07-20 04:26:44 +02:00
2026-07-20 04:31:30 +02:00
2026-02-26 16:44:34 +01:00
2026-01-27 23:15:25 +01:00
2026-06-09 20:02:15 +02:00
2026-07-12 17:50:21 +02:00
2026-06-14 12:46:58 -04:00
2026-06-19 17:58:06 -04:00
2026-06-19 17:58:06 -04:00
2026-02-12 13:44:07 +01:00
2026-03-07 07:33:44 +01:00
2026-02-26 16:44:34 +01:00
2026-07-20 02:48:14 +02:00
2026-06-16 18:08:45 +02:00
2026-03-01 16:50:23 +01:00
2026-06-08 11:01:34 -04:00
2026-06-14 12:46:58 -04:00
2026-06-11 10:16:47 +02:00
2026-06-10 22:47:02 +02:00
2026-07-12 19:06:12 +02:00
2026-07-12 18:42:36 +02:00
2026-07-12 19:25:42 +02:00
2026-06-29 11:35:56 +05:30
2026-03-01 16:50:23 +01:00
2026-06-14 22:24:46 +02:00
2026-06-14 12:25:49 -04:00
2026-06-08 09:56:06 -04:00
2026-07-20 01:36:21 +02:00
2026-07-19 17:38:01 +02:00
2026-07-20 01:36:21 +02:00
2026-06-14 08:43:57 +02:00
2026-06-14 08:43:57 +02:00
2026-06-12 09:09:14 -04:00
2026-07-12 17:50:21 +02:00
2026-06-10 01:30:43 +02:00
2026-06-07 04:33:11 +02:00
2026-06-10 01:30:43 +02:00
2026-06-09 20:02:15 +02:00
2026-06-08 09:56:06 -04:00
2026-06-19 13:10:17 -04:00
2026-07-12 17:50:21 +02:00
2026-07-12 18:06:59 +02:00
2026-07-12 20:06:32 +02:00
2026-06-14 22:35:29 +02:00
2026-06-10 01:30:43 +02:00
2026-06-10 03:41:04 +02:00
2026-06-12 09:09:14 -04:00
2026-05-12 09:57:08 +02:00
2026-07-12 12:42:14 +02:00
2026-07-10 14:38:52 -04:00
2026-06-10 01:30:43 +02:00
2026-07-12 19:06:12 +02:00
2026-06-10 18:06:45 +02:00
2026-03-07 07:33:44 +01:00
2026-06-14 22:21:13 +02:00
2026-02-26 16:44:34 +01:00
2026-07-13 00:38:56 +02:00
2026-07-20 03:26:21 +02:00
2026-02-18 12:51:35 +01:00
2026-06-08 11:01:34 -04:00
2026-07-19 15:32:45 +02:00
2026-02-12 13:44:07 +01:00
2026-02-26 15:58:26 +01:00
2026-06-10 01:30:43 +02:00
2026-03-21 19:23:37 +01:00
2026-03-21 07:20:18 +01:00
2026-07-20 04:02:46 +02:00
2026-06-08 10:27:18 -04:00
2026-02-26 16:44:34 +01:00
2026-02-12 18:26:16 +01:00
2026-06-09 20:02:17 +02:00
2026-06-08 18:01:20 +02:00
2026-06-10 01:30:43 +02:00
2026-06-10 01:30:43 +02:00
2026-01-21 22:36:45 +01:00
2026-06-10 01:30:43 +02:00
2026-02-19 14:00:10 +01:00
2026-01-21 14:01:47 +01:00
2026-06-10 18:06:45 +02:00
2026-03-01 16:50:23 +01:00
2026-06-19 16:58:40 +02:00
2026-07-12 19:49:58 +02:00
2026-07-12 19:49:58 +02:00
2026-06-08 15:46:10 +02:00
2026-03-07 07:33:44 +01:00
2026-02-26 16:44:34 +01:00
2026-06-10 20:41:34 +02:00
2026-03-07 07:33:44 +01:00
2026-03-07 07:33:44 +01:00
2026-03-07 07:33:44 +01:00
2026-07-12 18:21:42 +02:00
2026-01-25 07:52:40 +01:00
2026-03-01 14:33:18 +01:00
2026-02-26 16:44:34 +01:00
2026-07-20 01:36:21 +02:00
2026-06-10 03:41:04 +02:00
2026-02-18 18:14:13 +01:00
2026-06-19 12:35:16 -04:00
2026-06-09 20:02:15 +02:00
2026-06-10 17:08:36 +02:00
2026-06-14 07:33:52 +02:00
2026-07-12 19:49:58 +02:00
2026-06-10 20:41:34 +02:00
2026-06-10 01:30:43 +02:00
2026-07-09 11:47:38 -04:00
2026-07-12 17:50:21 +02:00
2026-06-10 04:07:26 +02:00
2026-06-17 23:41:47 +08:00
2026-02-26 16:44:34 +01:00
2026-06-10 01:30:43 +02:00
2026-06-10 16:23:57 +02:00
2026-07-12 19:58:32 +02:00
2026-06-10 01:30:43 +02:00
2026-06-09 20:02:15 +02:00
2026-06-10 01:30:43 +02:00
2026-03-07 07:33:44 +01:00
2026-02-28 14:45:39 +01:00
2026-01-22 11:30:10 +01:00
2026-05-12 10:11:47 +02:00
2026-06-15 01:43:15 +02:00
2026-06-14 22:38:19 +02:00
2026-02-28 17:39:44 +01:00
2026-02-28 17:39:44 +01:00
2026-01-21 07:19:49 +01:00
2026-02-26 16:44:34 +01:00
2026-06-10 18:06:45 +02:00
2026-07-10 14:39:19 -04:00
2026-06-10 13:34:45 -04:00
2026-06-30 19:52:49 -04:00
2026-07-12 12:39:46 +02:00
2026-06-09 15:39:03 -04:00
2026-02-26 16:44:34 +01:00
2026-07-16 09:33:39 +02:00
2026-06-09 15:39:03 -04:00
2026-07-12 18:33:18 +02:00
2026-07-12 19:49:58 +02:00
2026-07-12 19:49:58 +02:00
2026-07-10 11:14:26 -04:00
2026-05-25 23:28:58 +02:00
2026-01-25 21:29:35 +01:00
2026-07-20 03:26:21 +02:00
2026-06-10 20:41:34 +02:00
2026-06-14 07:33:52 +02:00
2026-07-20 02:58:51 +02:00
2026-01-22 11:30:10 +01:00
2026-07-12 12:42:36 +02:00
2026-06-18 10:00:04 +02:00
2026-07-12 18:42:36 +02:00
2026-07-12 18:42:36 +02:00
2026-07-12 18:42:36 +02:00