feat: sort private pages by alphabet

This commit is contained in:
Lewis Wynne 2026-02-07 02:41:44 +00:00
parent c10ebb3c1d
commit 629983ea77
3 changed files with 9 additions and 8 deletions

View file

@ -33,10 +33,11 @@ export function enrichPostsWithDates(posts: Post[]): PostWithDates[] {
return posts.map(enrichPostWithDates); return posts.map(enrichPostWithDates);
} }
function sortPosts(posts: PostWithDates[]): PostWithDates[] { function sortPosts(posts: PostWithDates[], { alphabetically = false } = {}): PostWithDates[] {
return posts.slice().sort((a, b) => { return posts.slice().sort((a, b) => {
if (a.data.pinned && !b.data.pinned) return -1; if (a.data.pinned && !b.data.pinned) return -1;
if (!a.data.pinned && b.data.pinned) return 1; if (!a.data.pinned && b.data.pinned) return 1;
if (alphabetically) return a.data.title.localeCompare(b.data.title);
return b.dates.created.getTime() - a.dates.created.getTime(); return b.dates.created.getTime() - a.dates.created.getTime();
}); });
} }
@ -49,7 +50,7 @@ export function resolveRelatedPosts(
return slugs.flatMap(s => bySlug.get(s) ?? []); return slugs.flatMap(s => bySlug.get(s) ?? []);
} }
export function organizePostsByCategory(posts: PostWithDates[]): { export function organizePostsByCategory(posts: PostWithDates[], { sortAlphabetically = false } = {}): {
grouped: Record<string, PostWithDates[]>; grouped: Record<string, PostWithDates[]>;
categories: string[]; categories: string[];
} { } {
@ -67,7 +68,7 @@ export function organizePostsByCategory(posts: PostWithDates[]): {
}); });
for (const category of categories) { for (const category of categories) {
grouped[category] = sortPosts(grouped[category]); grouped[category] = sortPosts(grouped[category], { alphabetically: sortAlphabetically });
} }
return { grouped, categories }; return { grouped, categories };

View file

@ -34,7 +34,7 @@ const related = post.data.related ? resolveRelatedPosts(post.data.related, allPo
{related.length > 0 && ( {related.length > 0 && (
<details open> <details open>
<summary>related</summary> <summary>related</summary>
<pre set:html={related.map(p => formatListItem(p.dates.created, `/draft/${getSlug(p.id)}`, p.data.title)).join('\n')} /> <pre set:html={related.map(p => formatListItem(p.dates.created, `/private/${getSlug(p.id)}`, p.data.title)).join('\n')} />
</details> </details>
)} )}
</Layout> </Layout>

View file

@ -13,19 +13,19 @@ if (!session) return Astro.redirect('/api/auth/signin');
const rawPosts = await getCollection('md', ({ data }) => data.draft === true); const rawPosts = await getCollection('md', ({ data }) => data.draft === true);
const posts = enrichPostsWithDates(rawPosts); const posts = enrichPostsWithDates(rawPosts);
const { grouped, categories: sortedCategories } = organizePostsByCategory(posts); const { grouped, categories: sortedCategories } = organizePostsByCategory(posts, { sortAlphabetically: true });
--- ---
<Layout title="drafts - lewis m.w."> <Layout title="private - lewis m.w.">
<p class="muted">logged in as {session.user?.name} <a href="/api/auth/signout">sign out</a></p> <p class="muted">logged in as {session.user?.name} <a href="/api/auth/signout">sign out</a></p>
{sortedCategories.length === 0 ? ( {sortedCategories.length === 0 ? (
<p class="muted">no drafts</p> <p class="muted">nothing here</p>
) : ( ) : (
sortedCategories.map(category => ( sortedCategories.map(category => (
<details open> <details open>
<summary>{category}</summary> <summary>{category}</summary>
<pre set:html={grouped[category].map(post => formatListItem(post.dates.created, `/draft/${getSlug(post.id)}`, post.data.title, { pinned: post.data.pinned })).join('\n')} /> <pre set:html={grouped[category].map(post => formatListItem(post.dates.created, `/private/${getSlug(post.id)}`, post.data.title, { pinned: post.data.pinned })).join('\n')} />
</details> </details>
)) ))
)} )}