3.6 KiB
Writer Draft/Publish Feature
Overview
Add draft-save and explicit publish workflow to hudozka-writer so editors can save work-in-progress without pushing changes live.
Data Layer
PocketBase pages collection fields (already applied by user):
| Field | Type | Purpose |
|---|---|---|
doc |
JSON | Published document content (read by the main site) |
draft |
JSON | Unpublished work-in-progress, null when no draft |
published |
boolean | Page visibility (renamed from draft, inverted logic) |
Editor Load Behavior
When opening a page:
- If
draftis not null: loaddraftinto the editor, show a banner "You have unpublished changes" with a Discard button. - If
draftis null: loaddocinto the editor, no banner.
Save / Publish / Discard
| Action | API call | Effect |
|---|---|---|
| Save | update(id, { draft: editorContent }) |
Persists WIP without affecting live site |
| Publish | update(id, { doc: editorContent, draft: null }) |
Pushes content live, clears draft |
| Discard | update(id, { draft: null }) |
Drops WIP, reloads editor from doc |
No confirmation dialog on Discard.
Toolbar Changes
Current layout: [formatting...] [MD] [Save]
New layout: [formatting...] [MD] [Save] [Publish]
- Save button: enabled only when editor content differs from the last-saved state. Writes to
draft. - Publish button: enabled when there are any unpublished changes (unsaved edits or existing
draft). Writes todoc, clearsdraft.
After Save: Save button becomes disabled (no new changes), Publish remains enabled (draft exists). After Publish: both buttons become disabled (content is live, no draft).
Draft Banner
Shown above the editor when draft was loaded. Simple bar with text and a Discard button:
[You have unpublished changes] [Discard]
Clicking Discard: sends API call to clear draft, reloads editor content from doc, hides the banner.
Page Visibility Toggle
A checkbox in the app header (near page title/slug): [ ] Published
- Checked = page visible on site (
published: true) - Unchecked = page hidden (
published: false) - Toggling sends
update(id, { published: !current })immediately - Independent of save/publish content flow
Dirty Tracking
Track whether editor content has changed since last load/save:
- On load: snapshot the initial content (serialized
DocV1) - On every editor change: compare current serialized content with snapshot
- After Save: update snapshot to current content
- After Publish: update snapshot to current content
- After Discard: update snapshot to
doccontent
This drives the enabled/disabled state of Save and Publish buttons.
Type Changes
Update PbPage in modules/hudozka-writer/src/types.ts:
- Replace
draft: booleanwithpublished: booleananddraft: DocV1 | null
Files to Modify
modules/hudozka-writer/src/types.ts— updatePbPagetypemodules/hudozka-writer/src/components/Editor.tsx— draft loading, save/publish/discard handlers, dirty trackingmodules/hudozka-writer/src/components/Toolbar.tsx— add Publish button, accept dirty/hasDraft propsmodules/hudozka-writer/src/App.tsx— add published toggle in header, updatehandleDuplicatefor new field names