From b3c9529e3f773ec0395f4ef877a20500bb36d750 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Tue, 10 Jun 2025 20:48:02 -0700 Subject: [PATCH] Fix image handling in forms --- .../components/admin/FormFieldWrapper.svelte | 7 +- src/lib/components/admin/ImageUploader.svelte | 3 + .../admin/ProjectBrandingForm.svelte | 99 ++++++++++--- src/lib/components/admin/ProjectForm.svelte | 16 +-- .../admin/ProjectMetadataForm.svelte | 134 +++++++++++++++--- src/lib/components/admin/Select.svelte | 2 + src/lib/components/admin/SelectField.svelte | 60 ++++++++ src/lib/types/project.ts | 3 - src/routes/api/albums/[id]/+server.ts | 10 +- src/routes/api/media/[id]/+server.ts | 6 +- src/routes/api/projects/[id]/+server.ts | 34 ++--- 11 files changed, 293 insertions(+), 81 deletions(-) create mode 100644 src/lib/components/admin/SelectField.svelte diff --git a/src/lib/components/admin/FormFieldWrapper.svelte b/src/lib/components/admin/FormFieldWrapper.svelte index 81f9313..3084d61 100644 --- a/src/lib/components/admin/FormFieldWrapper.svelte +++ b/src/lib/components/admin/FormFieldWrapper.svelte @@ -18,12 +18,12 @@ {/if} + {@render children?.()} + {#if helpText}

{helpText}

{/if} - {@render children?.()} - {#if error}

{error}

{/if} @@ -39,7 +39,8 @@ &.has-error { :global(input), - :global(textarea) { + :global(textarea), + :global(select) { border-color: #c33; } } diff --git a/src/lib/components/admin/ImageUploader.svelte b/src/lib/components/admin/ImageUploader.svelte index 17db29d..be7ea2d 100644 --- a/src/lib/components/admin/ImageUploader.svelte +++ b/src/lib/components/admin/ImageUploader.svelte @@ -11,6 +11,7 @@ label: string value?: Media | null onUpload: (media: Media) => void + onRemove?: () => void aspectRatio?: string // e.g., "16:9", "1:1" required?: boolean error?: string @@ -26,6 +27,7 @@ label, value = $bindable(), onUpload, + onRemove, aspectRatio, required = false, error, @@ -182,6 +184,7 @@ altTextValue = '' descriptionValue = '' uploadError = null + onRemove?.() } // Update alt text on server diff --git a/src/lib/components/admin/ProjectBrandingForm.svelte b/src/lib/components/admin/ProjectBrandingForm.svelte index dbab34b..de52b1a 100644 --- a/src/lib/components/admin/ProjectBrandingForm.svelte +++ b/src/lib/components/admin/ProjectBrandingForm.svelte @@ -1,21 +1,26 @@

Branding

- + {#if !showLogoSection && (!formData.logoUrl || formData.logoUrl.trim() === '')} + + {:else} +
+
+

Project Logo

+
+ +
+ {/if}
diff --git a/src/lib/components/admin/ProjectForm.svelte b/src/lib/components/admin/ProjectForm.svelte index b9c14ce..a04cd51 100644 --- a/src/lib/components/admin/ProjectForm.svelte +++ b/src/lib/components/admin/ProjectForm.svelte @@ -7,7 +7,6 @@ import Editor from './Editor.svelte' import ProjectMetadataForm from './ProjectMetadataForm.svelte' import ProjectBrandingForm from './ProjectBrandingForm.svelte' - import ProjectGalleryForm from './ProjectGalleryForm.svelte' import ProjectStylingForm from './ProjectStylingForm.svelte' import Button from './Button.svelte' import StatusDropdown from './StatusDropdown.svelte' @@ -60,11 +59,10 @@ role: data.role || '', projectType: data.projectType || 'work', externalUrl: data.externalUrl || '', - featuredImage: data.featuredImage || null, + featuredImage: data.featuredImage && data.featuredImage.trim() !== '' ? data.featuredImage : null, backgroundColor: data.backgroundColor || '', highlightColor: data.highlightColor || '', - logoUrl: data.logoUrl || '', - gallery: data.gallery || null, + logoUrl: data.logoUrl && data.logoUrl.trim() !== '' ? data.logoUrl : '', status: data.status || 'draft', password: data.password || '', caseStudyContent: data.caseStudyContent || { @@ -142,9 +140,8 @@ role: formData.role, projectType: formData.projectType, externalUrl: formData.externalUrl, - featuredImage: formData.featuredImage, - logoUrl: formData.logoUrl, - gallery: formData.gallery && formData.gallery.length > 0 ? formData.gallery : null, + featuredImage: formData.featuredImage && formData.featuredImage !== '' ? formData.featuredImage : null, + logoUrl: formData.logoUrl && formData.logoUrl !== '' ? formData.logoUrl : null, backgroundColor: formData.backgroundColor, highlightColor: formData.highlightColor, status: formData.status, @@ -266,9 +263,8 @@ handleSave() }} > - - - + + diff --git a/src/lib/components/admin/ProjectMetadataForm.svelte b/src/lib/components/admin/ProjectMetadataForm.svelte index d8fce21..6f18c74 100644 --- a/src/lib/components/admin/ProjectMetadataForm.svelte +++ b/src/lib/components/admin/ProjectMetadataForm.svelte @@ -1,19 +1,71 @@
@@ -34,7 +86,7 @@ placeholder="Short description for project cards" /> - + {#if !showFeaturedImage} + + {:else if showFeaturedImage} +
+
+

Featured Image

+
+ +
+ {/if} {#if formData.status === 'password-protected'} diff --git a/src/lib/components/admin/Select.svelte b/src/lib/components/admin/Select.svelte index 345b288..8721db3 100644 --- a/src/lib/components/admin/Select.svelte +++ b/src/lib/components/admin/Select.svelte @@ -49,6 +49,7 @@ .select-wrapper { position: relative; display: inline-block; + width: 100%; } .select { @@ -59,6 +60,7 @@ transition: all 0.2s ease; appearance: none; padding-right: 36px; + width: 100%; &:focus { outline: none; diff --git a/src/lib/components/admin/SelectField.svelte b/src/lib/components/admin/SelectField.svelte new file mode 100644 index 0000000..cd831b5 --- /dev/null +++ b/src/lib/components/admin/SelectField.svelte @@ -0,0 +1,60 @@ + + + + {#snippet children()} +