Fixed content collections
All checks were successful
/ build-site (push) Successful in 1m20s
/ checking (push) Successful in 11s
/ publish (push) Successful in 7s

This commit is contained in:
Firq-ow 2024-01-09 14:30:28 +01:00
parent c94fb25aba
commit 65d4339b9f
Signed by: Firq
GPG key ID: BC5CE35A72BDB4AB
12 changed files with 67 additions and 111 deletions

View file

@ -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>&rarr;</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>

View file

@ -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
View 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,
}

View file

@ -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">&lt&lt Back to database</a> <a href="/database">&lt&lt 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>

View file

@ -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

View file

@ -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>

View file

@ -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
} }