From faf9ba9e2e0712dff7f62b023b3a5676636ae27e Mon Sep 17 00:00:00 2001 From: nmemmert Date: Wed, 10 Jun 2026 10:56:54 -0400 Subject: [PATCH] Make episode info, general notes, and final script per-chunk fields Each chunk is unique, so these fields no longer share a single project-level value. --- server/data/projects.db-wal | Bin 12392 -> 45352 bytes src/App.jsx | 65 ++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/server/data/projects.db-wal b/server/data/projects.db-wal index a0cf49b8022164cfc8389490946751e8dccf7092..993193216f9c4274449081a6cba1749d756129f8 100644 GIT binary patch literal 45352 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 arlYXU=-L0VR|?)V7_R$j!kcpL;J*RAz|+M5 delta 8 PcmZ4Si0MVbh71D$6q*Db diff --git a/src/App.jsx b/src/App.jsx index 4cf5b69..d15bc70 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -114,6 +114,10 @@ export function migrateChunk(chunk) { return { ...chunk, spilloverEndVerse: Number.isInteger(chunk.spilloverEndVerse) ? chunk.spilloverEndVerse : null, + generalNotes: chunk.generalNotes ?? '', + episodeNumber: chunk.episodeNumber ?? '', + episodeTitle: chunk.episodeTitle ?? '', + finalScript: chunk.finalScript ?? '', }; // already new format } return { @@ -123,6 +127,10 @@ export function migrateChunk(chunk) { application: '', crossReferences: [], spilloverEndVerse: null, + generalNotes: '', + episodeNumber: '', + episodeTitle: '', + finalScript: '', notes: undefined, }; } @@ -187,10 +195,6 @@ export function migrateProject(raw) { if (Array.isArray(raw.chapters)) { return { ...raw, - generalNotes: raw.generalNotes ?? '', - episodeNumber: raw.episodeNumber ?? '', - episodeTitle: raw.episodeTitle ?? '', - finalScript: raw.finalScript ?? '', chapters: raw.chapters.map((ch) => ({ ...ch, chunks: ch.chunks.map(migrateChunk), @@ -205,10 +209,6 @@ export function migrateProject(raw) { translation: raw.translation ?? 'BSB', lastEdited: raw.lastEdited ?? Date.now(), selectedChunkId: raw.selectedChunkId ?? null, - generalNotes: raw.generalNotes ?? '', - episodeNumber: raw.episodeNumber ?? '', - episodeTitle: raw.episodeTitle ?? '', - finalScript: raw.finalScript ?? '', chapters: [ { book: raw.book ?? '', @@ -524,6 +524,11 @@ function buildChunkBodies(project) { ? chunk.crossReferences.join(', ') : 'None.'; + const generalNotes = (chunk.generalNotes ?? '').trim(); + const episodeLabelLine = (chunk.episodeNumber ?? '').trim() || (chunk.episodeTitle ?? '').trim() + ? `Episode: ${[chunk.episodeNumber?.trim(), chunk.episodeTitle?.trim()].filter(Boolean).join(' — ')}\n` + : ''; + const greekWords = chunk.greekWords.length === 0 ? 'None.' : chunk.greekWords.map((word) => { @@ -543,10 +548,10 @@ function buildChunkBodies(project) { return `=== CHUNK ${chunkIndex} — ${ref} - +${episodeLabelLine} Scripture: ${verses} - +${generalNotes ? `\nBackground / General Notes:\n${generalNotes}\n` : ''} Observation: ${observation} @@ -582,7 +587,6 @@ Below is my work organised by passage chunk, including my OIA notes and Greek wo PROJECT: ${project.title} TRANSLATION: ${project.translation} PASSAGE: ${chapterLabel} -${(project.generalNotes ?? '').trim() ? `\nBACKGROUND / GENERAL NOTES:\n${project.generalNotes.trim()}\n` : ''} `; return header + buildChunkBodies(project); @@ -610,9 +614,7 @@ export function buildPronunciationGuide(project) { export function buildPodcastPrompt(project) { const chapters = Array.isArray(project.chapters) ? project.chapters : []; const chapterLabel = chapters.map((ch) => `${ch.book} ${ch.chapter}`).join(', '); - const episodeLabel = (project.episodeNumber ?? '').trim() - ? `EPISODE ${project.episodeNumber.trim()}${(project.episodeTitle ?? '').trim() ? ` — ${project.episodeTitle.trim()}` : ''}` - : (project.episodeTitle ?? '').trim() || 'EPISODE'; + const episodeLabel = 'EPISODE'; const header = `I'm recording an episode of my Bible study podcast "Verse by Verse with Nate: A Journey Through Scripture" and need a full script written from my study notes below. @@ -674,7 +676,6 @@ Here are my study notes, organised by passage chunk, including my OIA notes, cro PROJECT: ${project.title} TRANSLATION: ${project.translation} PASSAGE: ${chapterLabel} -${(project.generalNotes ?? '').trim() ? `\nBACKGROUND / GENERAL NOTES:\n${project.generalNotes.trim()}\n` : ''} `; return header + buildChunkBodies(project); @@ -930,10 +931,6 @@ const App = () => { translation: setup.translation, lastEdited: Date.now(), selectedChunkId: null, - generalNotes: '', - episodeNumber: '', - episodeTitle: '', - finalScript: '', chapters: [ { book: setup.book, @@ -1012,6 +1009,10 @@ const App = () => { application: '', crossReferences: [], greekWords: [], + generalNotes: '', + episodeNumber: '', + episodeTitle: '', + finalScript: '', }; return { ...ch, chunks: [...ch.chunks, newChunk] }; }); @@ -2814,29 +2815,29 @@ const restoreRemoteProject = async (id) => { - {/* Episode metadata for podcast prep */} + {/* Episode metadata for podcast prep — unique per chunk */}

Episode Info

-

Used to label the script when preparing podcast content.

+

Used to label the script when preparing podcast content for this chunk.

updateProject((current) => ({ ...current, episodeNumber: e.target.value }))} + value={selectedChunk?.episodeNumber ?? ''} + onChange={(e) => updateChunk(selectedChunk.id, { episodeNumber: e.target.value })} placeholder="Episode #" className="w-full rounded-2xl border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-200 sm:w-32" /> updateProject((current) => ({ ...current, episodeTitle: e.target.value }))} + value={selectedChunk?.episodeTitle ?? ''} + onChange={(e) => updateChunk(selectedChunk.id, { episodeTitle: e.target.value })} placeholder="Episode title" className="w-full rounded-2xl border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-200" />
- {/* Background / general notes for the project */} + {/* Background / general notes — unique per chunk */}
{!collapsedSections.generalNotes && (