diff --git a/src/lib/components/admin/Button.svelte b/src/lib/components/admin/Button.svelte index 90c3902..ea338a2 100644 --- a/src/lib/components/admin/Button.svelte +++ b/src/lib/components/admin/Button.svelte @@ -1,6 +1,6 @@ - + {/if} + + {#if hasIcon && iconPosition === 'right' && !iconOnly} + + + + {/if} + +{/if} \ No newline at end of file + diff --git a/src/lib/components/admin/MediaUploadModal.svelte b/src/lib/components/admin/MediaUploadModal.svelte new file mode 100644 index 0000000..b99ea1a --- /dev/null +++ b/src/lib/components/admin/MediaUploadModal.svelte @@ -0,0 +1,613 @@ + + + +
+ + + + + + {#if files.length > 0} +
+
+

Files to Upload

+
+ + +
+
+ +
+ {#each files as file, index} +
+
+ {#if file.type.startsWith('image/')} + {file.name} + {:else} +
📄
+ {/if} +
+ +
+
{file.name}
+
{formatFileSize(file.size)}
+ + {#if uploadProgress[file.name]} +
+
+
+ {/if} +
+ + {#if !isUploading} + + {/if} +
+ {/each} +
+
+ {/if} + + + {#if successCount > 0 || uploadErrors.length > 0} +
+ {#if successCount > 0} +
+ ✅ Successfully uploaded {successCount} file{successCount !== 1 ? 's' : ''} + {#if successCount === files.length && uploadErrors.length === 0} +
Closing modal... + {/if} +
+ {/if} + + {#if uploadErrors.length > 0} +
+

Upload Errors:

+ {#each uploadErrors as error} +
❌ {error}
+ {/each} +
+ {/if} +
+ {/if} +
+
+ + diff --git a/src/lib/components/admin/Modal.svelte b/src/lib/components/admin/Modal.svelte index 96a246f..e0f9fd7 100644 --- a/src/lib/components/admin/Modal.svelte +++ b/src/lib/components/admin/Modal.svelte @@ -95,7 +95,7 @@ .modal { background-color: white; - border-radius: 16px; + border-radius: $card-corner-radius; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); position: relative; max-height: 90vh; @@ -126,7 +126,7 @@ } :global(.close-button) { - position: absolute; + position: absolute !important; top: $unit-2x; right: $unit-2x; z-index: 1; diff --git a/src/lib/components/admin/PostDropdown.svelte b/src/lib/components/admin/PostDropdown.svelte index c553174..c8da824 100644 --- a/src/lib/components/admin/PostDropdown.svelte +++ b/src/lib/components/admin/PostDropdown.svelte @@ -19,7 +19,7 @@ if (type === 'essay') { // Essays go straight to the full page - goto('/admin/universe/compose?type=essay') + goto('/admin/posts/new?type=essay') } else if (type === 'post') { // Posts open in modal selectedType = 'post' diff --git a/src/routes/admin/media/+page.svelte b/src/routes/admin/media/+page.svelte index 60c917d..2ffdbd2 100644 --- a/src/routes/admin/media/+page.svelte +++ b/src/routes/admin/media/+page.svelte @@ -7,6 +7,7 @@ import Select from '$lib/components/admin/Select.svelte' import Button from '$lib/components/admin/Button.svelte' import MediaDetailsModal from '$lib/components/admin/MediaDetailsModal.svelte' + import MediaUploadModal from '$lib/components/admin/MediaUploadModal.svelte' import type { Media } from '@prisma/client' let media = $state([]) @@ -41,6 +42,7 @@ // Modal states let selectedMedia = $state(null) let isDetailsModalOpen = $state(false) + let isUploadModalOpen = $state(false) // Multiselect states let selectedMediaIds = $state>(new Set()) @@ -145,6 +147,15 @@ } } + function handleUploadComplete() { + // Reload media list after successful upload + loadMedia(currentPage) + } + + function openUploadModal() { + isUploadModalOpen = true + } + // Multiselect functions function toggleMultiSelectMode() { isMultiSelectMode = !isMultiSelectMode @@ -324,7 +335,7 @@ {viewMode === 'grid' ? '📋' : '🖼️'} {viewMode === 'grid' ? 'List' : 'Grid'} - + {/snippet} @@ -431,7 +442,7 @@ {:else if media.length === 0}

No media files found.

- Upload your first file +
{:else if viewMode === 'grid'}
@@ -636,6 +647,13 @@ onUpdate={handleMediaUpdate} /> + + isUploadModalOpen = false} + onUploadComplete={handleUploadComplete} +/> +