You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
30.**Session completion fix + two-dashboard architecture.** Two changes:
14
+
-**Session "Mark Complete" bug fix**: `hx-vals` always sends form-encoded data regardless of `hx-headers` Content-Type. `UpdateSessionAPI` expects JSON, so the decode failed → 400 error → red notification bar. Replaced with `Chronicle.apiFetch()` onclick handler using `data-url` and `data-name` attributes. Also fixes XSS risk from session name interpolation into JSON template string.
15
+
-**Two-dashboard architecture**: Split campaign dashboard into two independently customizable dashboards:
16
+
-**Campaign Page** (`GET /campaigns/:id`) — visible to all members and public visitors. The "front page" of the campaign.
17
+
-**Owner Dashboard** (`GET /campaigns/:id/dashboard`) — visible only to campaign owner. Campaign management with quick links (Settings, Customize, Members, Plugins), category grid, and recent entities.
18
+
New migration (000006) adds `owner_dashboard_layout` JSON column. Full CRUD: model field + parser, repository query updates, service methods with shared `validateDashboardLayout()` helper, handler + routes, `OwnerDashboardPage` templ component, sidebar "Dashboard" link for owners, and second dashboard editor section in Customization Hub.
19
+
20
+
### Previous Update
13
21
29.**Journal + Sessions + Audio Attachments sprint.** Four changes:
14
22
-**Journal save bug fix**: `journal.js` referenced `window.Chronicle._tiptapBundle` which doesn't exist — the TipTap bundle is `window.TipTap`. Fixed the reference so TipTap editor loads correctly and notes save.
15
23
-**Session edit UI**: Added edit button + modal on session detail page. Pre-populates all fields (name, date, summary, status, recurrence). Submits JSON PUT to existing `UpdateSessionAPI` endpoint. Visible to Scribe+ users.
Copy file name to clipboardExpand all lines: .ai/todo.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -58,6 +58,7 @@ Known broken or missing things, ordered by severity.
58
58
-[x]**Timeline event creation from timeline page** — Already implemented: "Create Event" button in header opens modal with full form (name, date, description, category, visibility, color, multi-day, recurrence). POST to standalone-events API.
59
59
-[x]**Calendar shows as pending plugin in admin** — Fixed: set calendar and API to PluginActive, added 5 missing active plugins to registry.
60
60
-[x]**False "confirm before leaving" dialog** — Fixed: added htmx:beforeRedirect listener to clear dirty form state before HTMX redirects.
61
+
-[x]**Session "Mark Complete" button fails with red error bar** — `hx-vals` sends form-encoded data but `UpdateSessionAPI` expects JSON. Replaced with `Chronicle.apiFetch()` onclick. Also fixed XSS risk from session name interpolation into JSON string.
- Campaign settings page has image upload and color picker sections
91
95
96
+
## Two-Dashboard Architecture
97
+
98
+
Campaigns have two independently customizable dashboards:
99
+
100
+
-**Campaign Page** (`GET /campaigns/:id`) — visible to all members and public visitors. The "front page" of the campaign. Layout stored in `dashboard_layout` column.
101
+
-**Owner Dashboard** (`GET /campaigns/:id/dashboard`) — visible only to campaign owner. Management-focused dashboard with quick links (Settings, Customize, Members, Plugins), category grid, and recent entities. Layout stored in `owner_dashboard_layout` column (migration 000006).
102
+
103
+
Both dashboards use the same `DashboardBlockSwitch` dispatcher and are editable via the Customization Hub (Dashboard tab shows both editors side-by-side). The dashboard editor widget mounts with different `data-endpoint` values pointing to the respective layout APIs.
104
+
92
105
## Dashboard Block Types
93
106
94
107
The campaigns plugin defines the central `DashboardBlockSwitch` dispatcher. Supported block types:
0 commit comments