fix: Cataloging problem on /post #23
|
@ -1,7 +1,6 @@
|
||||||
import type { Reroute } from '@sveltejs/kit';
|
import type { Reroute } from '@sveltejs/kit';
|
||||||
|
|
||||||
const translated: Record<string, string> = {
|
const translated: Record<string, string> = {
|
||||||
'/post': '/page/1',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const reroute: Reroute = ({ url }) => {
|
export const reroute: Reroute = ({ url }) => {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { Post } from '$lib/types'
|
import type { Post } from '$lib/types'
|
||||||
import DividerVertical from "svelte-radix/DividerVertical.svelte";
|
import DividerVertical from "svelte-radix/DividerVertical.svelte"
|
||||||
export let post: Post;
|
export let post: Post;
|
||||||
|
|
||||||
export let inactive: bool = false;
|
export let inactive: bool = false;
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { DoubleArrowLeft, DoubleArrowRight, ChevronLeft, ChevronRight } from 'svelte-radix';
|
||||||
|
import type { Post } from '$lib/types'
|
||||||
|
import PostHeader from './PostHeader.svelte';
|
||||||
|
|
||||||
|
export let posts: Post[];
|
||||||
|
// The page navigation bar will not show if these numbers are not provided.
|
||||||
|
export let maxPageN: number = 0;
|
||||||
|
export let pageN: number = 0;
|
||||||
|
|
||||||
|
const disableLinkPrev = pageN == 1;
|
||||||
|
const disableLinkNext = pageN == maxPageN;
|
||||||
|
const firstPageLink = "/post";
|
||||||
|
const prevLink = pageN <= 2 ? firstPageLink : `/page/${pageN - 1}`;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<ul id="catalog" class="content">
|
||||||
|
{#each posts as post}
|
||||||
|
<li>
|
||||||
|
<PostHeader {post}/>
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
<!-- Navigation bar -->
|
||||||
|
{#if maxPageN}
|
||||||
|
<hr class="separator" />
|
||||||
|
<div id="page-navigator">
|
||||||
|
<a
|
||||||
|
aria-label="First Page"
|
||||||
|
class="nav-link icon"
|
||||||
|
class:disabled-link={disableLinkPrev}
|
||||||
|
href={firstPageLink}><DoubleArrowLeft /></a>
|
||||||
|
<a
|
||||||
|
aria-label="Prev Page"
|
||||||
|
class="nav-link icon"
|
||||||
|
class:disabled-link={disableLinkPrev}
|
||||||
|
href={prevLink}><ChevronLeft /></a>
|
||||||
|
<div id="page-map">
|
||||||
|
<p id="page-num">{pageN}/{maxPageN}</p>
|
||||||
|
</div>
|
||||||
|
<a
|
||||||
|
aria-label="Next Page"
|
||||||
|
class="nav-link icon"
|
||||||
|
class:disabled-link={disableLinkNext}
|
||||||
|
href="/page/{Math.min(maxPageN, pageN+1)}"><ChevronRight /></a>
|
||||||
|
<a
|
||||||
|
aria-label="Last Page"
|
||||||
|
class="nav-link icon"
|
||||||
|
class:disabled-link={disableLinkNext}
|
||||||
|
href="/page/{maxPageN}"><DoubleArrowRight /></a>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#page-navigator {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: horizontal;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin: 1em auto 1em auto;
|
||||||
|
width: 80%;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
#page-map {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
#page-num {
|
||||||
|
color: rgb(128,128,128);
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,14 +1,10 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { PageData } from './$types';
|
import siteMetadata from '$content/metadata.json'
|
||||||
export let data: PageData;
|
import PostList from '$lib/components/PostList.svelte'
|
||||||
const { posts, pageN, maxPageN } = data;
|
|
||||||
import siteMetadata from '$content/metadata.json';
|
|
||||||
|
|
||||||
import { DoubleArrowLeft, DoubleArrowRight, ChevronLeft, ChevronRight } from 'svelte-radix';
|
import type { PageData } from './$types'
|
||||||
import PostHeader from '$lib/components/PostHeader.svelte';
|
export let data: PageData
|
||||||
|
const { posts, pageN, maxPageN } = data
|
||||||
const disableLinkPrev = pageN == 1;
|
|
||||||
const disableLinkNext = pageN == maxPageN;
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
@ -16,49 +12,7 @@
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
<hr class="separator" />
|
<hr class="separator" />
|
||||||
<ul id="catalog" class="content">
|
<PostList {posts} {pageN} {maxPageN}/>
|
||||||
{#each posts as post}
|
|
||||||
<li>
|
|
||||||
<PostHeader post={post}/>
|
|
||||||
</li>
|
|
||||||
{/each}
|
|
||||||
</ul>
|
|
||||||
<hr class="separator" />
|
|
||||||
<div id="page-navigator">
|
|
||||||
<a
|
|
||||||
class="nav-link icon"
|
|
||||||
class:disabled-link={disableLinkPrev}
|
|
||||||
href="/page/1"><DoubleArrowLeft /></a>
|
|
||||||
<a
|
|
||||||
class="nav-link icon"
|
|
||||||
class:disabled-link={disableLinkPrev}
|
|
||||||
href="/page/{Math.max(1, pageN-1)}"><ChevronLeft /></a>
|
|
||||||
<div id="page-map">
|
|
||||||
<p id="page-num">{pageN}/{maxPageN}</p>
|
|
||||||
</div>
|
|
||||||
<a
|
|
||||||
class="nav-link icon"
|
|
||||||
class:disabled-link={disableLinkNext}
|
|
||||||
href="/page/{Math.min(maxPageN, pageN+1)}"><ChevronRight /></a>
|
|
||||||
<a
|
|
||||||
class="nav-link icon"
|
|
||||||
class:disabled-link={disableLinkNext}
|
|
||||||
href="/page/{maxPageN}"><DoubleArrowRight /></a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
#page-navigator {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: horizontal;
|
|
||||||
justify-content: space-between;
|
|
||||||
margin: 1em auto 1em auto;
|
|
||||||
width: 80%;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
#page-map {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
#page-num {
|
|
||||||
color: rgb(128,128,128);
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { error } from '@sveltejs/kit';
|
import { error } from '@sveltejs/kit'
|
||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types'
|
||||||
import { getPosts } from '$lib/posts';
|
import { getPosts } from '$lib/posts'
|
||||||
import siteMetadata from '$content/metadata.json';
|
import siteMetadata from '$content/metadata.json'
|
||||||
|
|
||||||
export const load: PageLoad = async ({ params }) => {
|
export const load: PageLoad = async ({ params }) => {
|
||||||
const pageN: number = +params.slug;
|
const pageN: number = +params.slug;
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types'
|
||||||
import { getPosts } from '$lib/posts';
|
import { getPosts } from '$lib/posts'
|
||||||
|
import siteMetadata from '$content/metadata.json'
|
||||||
|
|
||||||
export const load: PageLoad = async (_) => {
|
export const load: PageLoad = async () => {
|
||||||
const allPosts = await getPosts();
|
const posts = await getPosts();
|
||||||
return { allPosts };
|
const pageSize = siteMetadata?.pageSize || 3;
|
||||||
};
|
const maxPageN = Math.ceil(posts.length / pageSize);
|
||||||
|
|
||||||
|
return {
|
||||||
|
maxPageN,
|
||||||
|
posts: posts.slice(0, pageSize),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import siteMetadata from '$content/metadata.json';
|
||||||
|
import PostList from '$lib/components/PostList.svelte'
|
||||||
|
|
||||||
import type { PageData } from './$types';
|
import type { PageData } from './$types';
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
const { allPosts } = data;
|
const { posts, maxPageN } = data;
|
||||||
import siteMetadata from '$content/metadata.json';
|
|
||||||
import PostHeader from '$lib/components/PostHeader.svelte';
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
@ -11,17 +12,4 @@
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
<hr class="separator" />
|
<hr class="separator" />
|
||||||
<ul id="catalog" class="content">
|
<PostList {posts} pageN=1 {maxPageN}/>
|
||||||
{#each allPosts as post}
|
|
||||||
<li>
|
|
||||||
<PostHeader post={post}/>
|
|
||||||
</li>
|
|
||||||
{/each}
|
|
||||||
</ul>
|
|
||||||
<hr class="separator" />
|
|
||||||
|
|
||||||
<style>
|
|
||||||
#catalog li {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { PageData } from './$types';
|
import type { PageData } from './$types';
|
||||||
|
import PostList from '$lib/components/PostList.svelte'
|
||||||
|
import siteMetadata from '$content/metadata.json';
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
const { name, posts } = data;
|
const { name, posts } = data;
|
||||||
import siteMetadata from '$content/metadata.json';
|
|
||||||
import PostHeader from '$lib/components/PostHeader.svelte';
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
@ -11,19 +11,9 @@
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
<h1>{name} ({posts.length})</h1>
|
<h1>{name} ({posts.length})</h1>
|
||||||
|
|
||||||
<hr class="separator" />
|
<hr class="separator" />
|
||||||
<ul id="catalog" class="content">
|
<PostList {posts}/>
|
||||||
{#each posts as post}
|
|
||||||
<li>
|
|
||||||
<PostHeader post={post}/>
|
|
||||||
</li>
|
|
||||||
{/each}
|
|
||||||
</ul>
|
|
||||||
<hr class="separator" />
|
<hr class="separator" />
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
#catalog li {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -91,9 +91,7 @@ const config = {
|
||||||
}),
|
}),
|
||||||
prerender: {
|
prerender: {
|
||||||
crawl: true,
|
crawl: true,
|
||||||
entries: [
|
entries: ['*'],
|
||||||
"/page/1/",
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
alias: {
|
alias: {
|
||||||
$content: contentDir,
|
$content: contentDir,
|
||||||
|
|
|
@ -5,3 +5,15 @@ test('Navigate to blog post', async ({ page }) => {
|
||||||
await page.getByText('The Perfect Math Class').click();
|
await page.getByText('The Perfect Math Class').click();
|
||||||
await expect(page).toHaveURL("/post/the-perfect-math-class/");
|
await expect(page).toHaveURL("/post/the-perfect-math-class/");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Navigate to page 2', async ({ page }) => {
|
||||||
|
await page.goto('/post');
|
||||||
|
await page.getByRole('link', { name: 'Next Page' }).click();
|
||||||
|
await expect(page).toHaveURL("/page/2/");
|
||||||
|
await page.getByRole('link', { name: 'Prev Page' }).click();
|
||||||
|
await expect(page).toHaveURL("/post/");
|
||||||
|
await page.getByRole('link', { name: 'Last Page' }).click();
|
||||||
|
await expect(page).toHaveURL("/page/2/");
|
||||||
|
await page.getByRole('link', { name: 'First Page' }).click();
|
||||||
|
await expect(page).toHaveURL("/post/");
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in New Issue