Fixed content collections
This commit is contained in:
parent
c94fb25aba
commit
65d4339b9f
12 changed files with 67 additions and 111 deletions
|
@ -1,65 +0,0 @@
|
||||||
---
|
|
||||||
interface Props {
|
|
||||||
title: string
|
|
||||||
body: string
|
|
||||||
href: string
|
|
||||||
}
|
|
||||||
|
|
||||||
const { href, title, body } = Astro.props
|
|
||||||
---
|
|
||||||
|
|
||||||
<li class="link-card">
|
|
||||||
<a href={href}>
|
|
||||||
<h2>
|
|
||||||
{title}
|
|
||||||
<span>→</span>
|
|
||||||
</h2>
|
|
||||||
<p>
|
|
||||||
{body}
|
|
||||||
</p>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<style>
|
|
||||||
.link-card {
|
|
||||||
list-style: none;
|
|
||||||
display: flex;
|
|
||||||
padding: 0.25rem;
|
|
||||||
background-color: white;
|
|
||||||
background-image: none;
|
|
||||||
background-size: 400%;
|
|
||||||
border-radius: 0.6rem;
|
|
||||||
background-position: 100%;
|
|
||||||
transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
|
||||||
box-shadow:
|
|
||||||
0 4px 6px -1px rgba(0, 0, 0, 0.1),
|
|
||||||
0 2px 4px -2px rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-card > a {
|
|
||||||
width: 100%;
|
|
||||||
text-decoration: none;
|
|
||||||
line-height: 1.4;
|
|
||||||
padding: 1rem 1.3rem;
|
|
||||||
border-radius: 0.35rem;
|
|
||||||
color: #111;
|
|
||||||
background-color: white;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 1.25rem;
|
|
||||||
transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin-top: 0.5rem;
|
|
||||||
margin-bottom: 0;
|
|
||||||
color: #444;
|
|
||||||
}
|
|
||||||
.link-card:is(:hover, :focus-within) {
|
|
||||||
background-position: 0;
|
|
||||||
background-image: var(--accent-gradient);
|
|
||||||
}
|
|
||||||
.link-card:is(:hover, :focus-within) h2 {
|
|
||||||
color: rgb(var(--accent));
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
export interface Props {
|
export interface Props {
|
||||||
url: string
|
slug: string
|
||||||
title: string
|
title: string
|
||||||
questReleaseDate: string
|
questReleaseDate: string
|
||||||
shortdescription: string
|
shortdescription: string
|
||||||
|
@ -11,7 +11,8 @@ const options_date: Intl.DateTimeFormatOptions = {
|
||||||
month: 'long',
|
month: 'long',
|
||||||
day: '2-digit',
|
day: '2-digit',
|
||||||
}
|
}
|
||||||
const { shortdescription, questReleaseDate, url, title } = Astro.props
|
const { shortdescription, questReleaseDate, slug, title } = Astro.props
|
||||||
|
const url = `/database/${slug}`
|
||||||
const render_date = new Date(questReleaseDate).toLocaleDateString(
|
const render_date = new Date(questReleaseDate).toLocaleDateString(
|
||||||
'en-GB',
|
'en-GB',
|
||||||
options_date
|
options_date
|
||||||
|
|
28
src/content/config.ts
Normal file
28
src/content/config.ts
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import { z, defineCollection } from 'astro:content'
|
||||||
|
|
||||||
|
const taInfo = defineCollection({
|
||||||
|
type: 'data',
|
||||||
|
schema: z.object({
|
||||||
|
info: z.object({
|
||||||
|
title: z.string(),
|
||||||
|
questReleaseDate: z.string(),
|
||||||
|
shortdescription: z.string(),
|
||||||
|
description: z.string(),
|
||||||
|
fightNumber: z.number().default(1),
|
||||||
|
}),
|
||||||
|
data: z.array(
|
||||||
|
z.object({
|
||||||
|
title: z.string(),
|
||||||
|
link: z.string().url(),
|
||||||
|
date: z.string(),
|
||||||
|
servant: z.string(),
|
||||||
|
turns: z.string(),
|
||||||
|
runner: z.string(),
|
||||||
|
})
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
export const collections = {
|
||||||
|
taInfoData: taInfo,
|
||||||
|
}
|
|
@ -2,31 +2,29 @@
|
||||||
import Layout from '../layouts/Layout.astro'
|
import Layout from '../layouts/Layout.astro'
|
||||||
import BaseSection from '../layouts/baseSection.astro'
|
import BaseSection from '../layouts/baseSection.astro'
|
||||||
import TACard from '../components/taCard.astro'
|
import TACard from '../components/taCard.astro'
|
||||||
import type { FileData } from '../types/ta'
|
import { plsLoadTAEntry } from '../utils/tools'
|
||||||
import type { GlobAny } from '../types/generic'
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
datafile: string
|
datafile: string
|
||||||
}
|
}
|
||||||
|
|
||||||
const { datafile } = Astro.props
|
const { datafile } = Astro.props
|
||||||
const fulldata = import.meta.glob<GlobAny>(`/src/content/data/*.json`)
|
const taEntry = await plsLoadTAEntry(datafile)
|
||||||
const filecontent: FileData = (
|
const pagetitle = `${taEntry.info.title} - FGO TA`
|
||||||
await fulldata[`/src/content/data/${datafile}.json`]()
|
taEntry.data.sort((a, b) => Date.parse(b.date) - Date.parse(a.date))
|
||||||
)['default']
|
|
||||||
|
|
||||||
const pagetitle = `${filecontent.info.title} - FGO TA`
|
|
||||||
filecontent.data.sort((a, b) => Date.parse(b.date) - Date.parse(a.date))
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout
|
<Layout
|
||||||
title={pagetitle}
|
title={pagetitle}
|
||||||
currentpage="database-entry"
|
currentpage="database-entry"
|
||||||
descriptionOverride={filecontent.info.shortdescription}
|
descriptionOverride={taEntry.info.shortdescription}
|
||||||
>
|
>
|
||||||
<a href="/database"><< Back to database</a>
|
<a href="/database"><< Back to database</a>
|
||||||
<BaseSection title={filecontent.info.title} description={filecontent.info.description}>
|
<BaseSection
|
||||||
{filecontent.data.map((item) => <TACard {...item} />)}
|
title={taEntry.info.title}
|
||||||
|
description={taEntry.info.description}
|
||||||
|
>
|
||||||
|
{taEntry.data.map((item) => <TACard {...item} />)}
|
||||||
</BaseSection>
|
</BaseSection>
|
||||||
<div class="placeholder"></div>
|
<div class="placeholder"></div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
|
@ -1,15 +1,10 @@
|
||||||
---
|
---
|
||||||
|
import { getCollection } from 'astro:content';
|
||||||
import TaShowcaseLayout from '../../layouts/taShowcaseLayout.astro'
|
import TaShowcaseLayout from '../../layouts/taShowcaseLayout.astro'
|
||||||
import type { GlobAny } from '../../types/generic'
|
|
||||||
import { findSlug } from '../../utils/tools'
|
|
||||||
|
|
||||||
export function getStaticPaths() {
|
export async function getStaticPaths() {
|
||||||
const fulldata = import.meta.glob<GlobAny>(
|
const fulldata = (await getCollection('taInfoData')).map((data) => data.id)
|
||||||
`/src/content/data/*.json`
|
return fulldata.map((slug) => ({ params: { slug } }))
|
||||||
)
|
|
||||||
const keylist = Object.keys(fulldata).map((item) => findSlug(item)!)
|
|
||||||
|
|
||||||
return keylist.map((slug) => ({ params: { slug } }))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const { slug } = Astro.params
|
const { slug } = Astro.params
|
||||||
|
|
|
@ -1,28 +1,20 @@
|
||||||
---
|
---
|
||||||
|
import { getCollection } from 'astro:content';
|
||||||
import Layout from '../../layouts/Layout.astro'
|
import Layout from '../../layouts/Layout.astro'
|
||||||
import QuestListing from '../../components/questListing.astro'
|
import QuestListing from '../../components/questListing.astro'
|
||||||
import DatabaseSection from '../../layouts/databaseSection.astro'
|
import DatabaseSection from '../../layouts/databaseSection.astro'
|
||||||
import { findSlug } from '../../utils/tools'
|
|
||||||
import type { GlobFiledata } from '../../types/generic'
|
|
||||||
|
|
||||||
const description = 'FGO NA TA Database'
|
const description = 'FGO NA TA Database'
|
||||||
|
const fulldata = await getCollection('taInfoData')
|
||||||
|
|
||||||
const questInfo = []
|
fulldata.sort(
|
||||||
const fulldata = import.meta.glob<GlobFiledata>(
|
(a, b) => Date.parse(b.data.info.questReleaseDate) - Date.parse(a.data.info.questReleaseDate) || b.data.info.fightNumber - a.data.info.fightNumber
|
||||||
`/src/content/data/*.json`
|
|
||||||
)
|
)
|
||||||
|
const infodata = fulldata.map((quest) => ({
|
||||||
|
...quest.data.info,
|
||||||
|
slug: quest.id
|
||||||
|
}))
|
||||||
|
|
||||||
for (const [key, value] of Object.entries(fulldata)) {
|
|
||||||
const url = `/database/${findSlug(key)}`
|
|
||||||
questInfo.push({
|
|
||||||
...(await value())['default'].info,
|
|
||||||
url: url,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
questInfo.sort(
|
|
||||||
(a, b) => Date.parse(b.questReleaseDate) - Date.parse(a.questReleaseDate) || b.fightNumber - a.fightNumber
|
|
||||||
)
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout
|
<Layout
|
||||||
|
@ -31,7 +23,7 @@ questInfo.sort(
|
||||||
descriptionOverride={description}
|
descriptionOverride={description}
|
||||||
>
|
>
|
||||||
<DatabaseSection title="FGO NA TA Database">
|
<DatabaseSection title="FGO NA TA Database">
|
||||||
{questInfo.map((quest) => <QuestListing {...quest} />)}
|
{infodata.map((quest) => <QuestListing { ...quest } />)}
|
||||||
</DatabaseSection>
|
</DatabaseSection>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,16 @@
|
||||||
export function findSlug(filepath: string) {
|
import { getEntry } from 'astro:content'
|
||||||
return filepath.match(/(?:.*[\\/])(.+)(?:\.json)/)?.[1]
|
|
||||||
|
export function plsLoadImage(
|
||||||
|
record: Record<string, () => Promise<{ default: ImageMetadata }>>,
|
||||||
|
path: string
|
||||||
|
) {
|
||||||
|
const loadedImage = record[path]?.()
|
||||||
|
if (!loadedImage) throw new Error('Asset was not found:' + path)
|
||||||
|
return loadedImage
|
||||||
}
|
}
|
||||||
|
|
||||||
export function plsLoadImage(record: Record<string, () => Promise<{default: ImageMetadata}>>, path: string) {
|
export async function plsLoadTAEntry(key: string) {
|
||||||
const loadedImage = record[path]?.();
|
const filecontent = (await getEntry('taInfoData', key))?.data
|
||||||
if (!loadedImage) throw new Error("Asset was not found:" + path);
|
if (!filecontent) throw new Error(`Datafile ${key} is missing!`)
|
||||||
return loadedImage;
|
return filecontent
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue