jedmund-svelte/src/lib/components/admin/PostMetadataPopover.svelte
Justin Edmund c6ce13a530 Simplify posts
We had a lot of unnecessary complexity here due to post types that never ended up getting used.

We also made the post slug field reactive and bound to the title field.

We also fixed filters on the Universe admin page so we can filter by unpublished posts too (WIP)

We also fixed the hover state of BackButton
2025-06-11 00:53:54 -07:00

98 lines
1.7 KiB
Svelte

<script lang="ts">
import GenericMetadataPopover, { type MetadataConfig } from './GenericMetadataPopover.svelte'
type Props = {
post: any
postType: 'post' | 'essay'
slug: string
tags: string[]
tagInput: string
triggerElement: HTMLElement
onAddTag: () => void
onRemoveTag: (tag: string) => void
onDelete: () => void
onClose?: () => void
onFieldUpdate?: (key: string, value: any) => void
}
let {
post,
postType,
slug = $bindable(),
tags = $bindable(),
tagInput = $bindable(),
triggerElement,
onAddTag,
onRemoveTag,
onDelete,
onClose = () => {},
onFieldUpdate
}: Props = $props()
function handleFieldUpdate(key: string, value: any) {
if (key === 'slug') {
slug = value
onFieldUpdate?.(key, value)
} else if (key === 'tagInput') {
tagInput = value
}
}
const config: MetadataConfig = {
title: 'Post Settings',
fields: [
{
type: 'input',
key: 'slug',
label: 'Slug',
placeholder: 'post-slug'
},
{
type: 'tags',
key: 'tags',
label: 'Tags',
placeholder: 'Add tags...'
},
{
type: 'metadata',
key: 'metadata'
}
],
deleteButton: {
label: 'Delete Post',
action: onDelete
}
}
// Create a reactive data object
let popoverData = $state({
slug,
tags,
tagInput,
createdAt: post.createdAt,
updatedAt: post.updatedAt,
publishedAt: post.publishedAt
})
// Sync changes back
$effect(() => {
popoverData = {
slug,
tags,
tagInput,
createdAt: post.createdAt,
updatedAt: post.updatedAt,
publishedAt: post.publishedAt
}
})
</script>
<GenericMetadataPopover
{config}
bind:data={popoverData}
{triggerElement}
onUpdate={handleFieldUpdate}
{onAddTag}
{onRemoveTag}
{onClose}
/>