From 4b2ae9482b8d0ffa308f0be5923cf9450dfaabce Mon Sep 17 00:00:00 2001 From: Joshua Ryder Date: Wed, 1 Oct 2025 23:00:51 -0400 Subject: [PATCH] Add complete edit functionality for sermons with update API endpoint and enhanced Bible reference management --- pages/admin.vue | 114 +++++++++++++++++++++----- pages/index.vue | 2 +- server/api/sermons/update/[id].put.ts | 58 +++++++++++++ 3 files changed, 154 insertions(+), 20 deletions(-) create mode 100644 server/api/sermons/update/[id].put.ts diff --git a/pages/admin.vue b/pages/admin.vue index 4128cbc..64fbcff 100644 --- a/pages/admin.vue +++ b/pages/admin.vue @@ -20,13 +20,13 @@
-

Manage Existing Sermons

+

Select Sermon to Manage

+
@@ -62,9 +70,21 @@
- +
-

Create New Sermon

+
+

+ {{ editingSermonId ? 'Edit Sermon' : 'Create New Sermon' }} +

+ +
@@ -202,7 +222,7 @@ :disabled="loading" class="flex-1 py-3 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50" > - {{ loading ? 'Creating...' : 'Create Sermon' }} + {{ loading ? (editingSermonId ? 'Updating...' : 'Creating...') : (editingSermonId ? 'Update Sermon' : 'Create Sermon') }} (null) const bibleReferences = ref([{ version: 'ESV', reference: '', text: '' }]) const formData = ref({ date: '', @@ -269,21 +290,33 @@ async function handleSubmit() { ) const bible_references = JSON.stringify(validReferences) - await $fetch('/api/sermons', { - method: 'POST', - body: { - slug, - title: formData.value.title, - date: formData.value.date, - bible_references, - personal_appliance: formData.value.personal_appliance, - pastors_challenge: formData.value.pastors_challenge - } - }) + const body = { + slug, + title: formData.value.title, + date: formData.value.date, + bible_references, + personal_appliance: formData.value.personal_appliance, + pastors_challenge: formData.value.pastors_challenge + } - success.value = 'Sermon created successfully!' + if (editingSermonId.value) { + // Update existing sermon + await $fetch(`/api/sermons/update/${editingSermonId.value}`, { + method: 'PUT', + body + }) + success.value = 'Sermon updated successfully!' + } else { + // Create new sermon + await $fetch('/api/sermons', { + method: 'POST', + body + }) + success.value = 'Sermon created successfully!' + } // Reset form + editingSermonId.value = null formData.value = { date: '', title: '', @@ -291,18 +324,61 @@ async function handleSubmit() { pastors_challenge: '' } bibleReferences.value = [{ version: 'ESV', reference: '', text: '' }] + + // Refresh sermon list + await refreshSermons() // Redirect after 2 seconds setTimeout(() => { navigateTo('/') }, 2000) } catch (e: any) { - error.value = e.data?.message || 'Failed to create sermon' + error.value = e.data?.message || `Failed to ${editingSermonId.value ? 'update' : 'create'} sermon` } finally { loading.value = false } } +function cancelEdit() { + editingSermonId.value = null + formData.value = { + date: '', + title: '', + personal_appliance: '', + pastors_challenge: '' + } + bibleReferences.value = [{ version: 'ESV', reference: '', text: '' }] +} + +function handleEdit() { + if (!selectedSermonId.value) return + + const sermon = allSermons.value?.find((s: any) => s.id === parseInt(selectedSermonId.value)) + if (!sermon) return + + // Set editing mode + editingSermonId.value = sermon.id + + // Load sermon data into form + formData.value = { + date: sermon.date, + title: sermon.title, + personal_appliance: sermon.personal_appliance, + pastors_challenge: sermon.pastors_challenge + } + + // Parse and load Bible references + try { + bibleReferences.value = JSON.parse(sermon.bible_references) + } catch { + // Fallback for old format + bibleReferences.value = [{ version: 'ESV', reference: sermon.bible_references, text: '' }] + } + + // Scroll to form + window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' }) +} + async function handleDelete() { if (!selectedSermonId.value) return diff --git a/pages/index.vue b/pages/index.vue index 0f381c2..9dc8ada 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -14,7 +14,7 @@ to="/admin" class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 font-medium text-sm" > - Create New Sermon + Manage Sermons