generated from acdh-oeaw/template-app-next
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
57b7574
commit 20a387d
Showing
14 changed files
with
509 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
import type { | ||
BernhardWork, | ||
Publication, | ||
publicationTypes, | ||
Translation, | ||
Translator, | ||
} from "@/types/model"; | ||
|
||
import data from "./data.json"; | ||
|
||
const publications = data.publications as unknown as Record<string, Publication>; | ||
const bernhardworks = data.bernhardworks as unknown as Array<BernhardWork>; | ||
const translators = data.translators as unknown as Array<Translator>; | ||
const translations = data.translations as unknown as Array<Translation>; | ||
|
||
const languages = Array.from( | ||
new Set( | ||
Object.values(publications).map((e) => { | ||
return e.language; | ||
}), | ||
), | ||
).sort(); | ||
|
||
export function getChildren(pub: Publication): Array<Publication> | undefined { | ||
return pub.parents | ||
?.flatMap((ps) => { | ||
return getPublication(ps.signatur); | ||
}) | ||
.filter((p) => { | ||
return p !== undefined; | ||
}); | ||
} | ||
export function getLanguages(): Array<string> { | ||
return languages; | ||
} | ||
|
||
export function getPublication(signatur: string): Publication | undefined { | ||
return publications[signatur]; | ||
} | ||
|
||
export function getPublications( | ||
filter?: { [key in keyof Publication]?: Publication[key] }, | ||
category?: typeof publicationTypes, | ||
sort?: string, | ||
offset = 0, | ||
limit = 10, | ||
): Array<Publication> { | ||
let pubs = Object.values(publications); | ||
|
||
if (category) { | ||
pubs = pubs.filter((p) => { | ||
return p.categories.includes(category); | ||
}); | ||
} | ||
if (filter) { | ||
for (const key in filter) { | ||
pubs = pubs.filter((p) => { | ||
return p[key as keyof Publication] === filter[key as keyof Publication]; | ||
}); | ||
} | ||
} | ||
|
||
if (sort) { | ||
// TODO sort by actual key if given | ||
pubs.sort(() => { | ||
return Math.random() - 0.5; | ||
}); | ||
} | ||
|
||
return limit ? pubs.slice(offset, offset + limit) : pubs.slice(offset); | ||
} | ||
|
||
// get 4 publications, ideally in the same language but excluding the publication | ||
export function getSameLanguagePublications(pub: Publication) { | ||
return Object.values(publications) | ||
.filter((p) => { | ||
return p.language === pub.language && p.signatur !== pub.signatur; | ||
}) | ||
.sort(() => { | ||
return Math.random() - 0.5; | ||
}) | ||
.slice(0, 3); | ||
} | ||
|
||
export function getTranslation(id: number): Translation | undefined { | ||
return translations[id - 1]; | ||
} | ||
|
||
export function getTranslator(id: number): Translator | undefined { | ||
return translators[id - 1]; | ||
} | ||
|
||
export function getTranslators(): Array<Translator> | undefined { | ||
return translators; | ||
} | ||
|
||
export function getWork(gndOrId: string): BernhardWork | undefined { | ||
return bernhardworks.find((w) => { | ||
return w.gnd === gndOrId || w.id === gndOrId; | ||
}); | ||
} | ||
|
||
// get list of works but actually by way of publications of that category... | ||
export function getWorks(category?: typeof publicationTypes): Array<BernhardWork> { | ||
const pubs: Array<Publication> = getPublications({}, category, undefined, 0, 0); | ||
const translations = pubs.flatMap((p) => { | ||
return p.contains; | ||
}); | ||
const works = [ | ||
...new Set( | ||
translations.map((t) => { | ||
return t.work; | ||
}), | ||
), | ||
]; | ||
return works | ||
.map((i) => { | ||
return bernhardworks[(i as unknown as number) - 1]; | ||
}) | ||
.filter((w) => { | ||
return w !== undefined; | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import LanguagesPage from "../page"; | ||
|
||
interface LanguagePageProps { | ||
params: { | ||
language?: string; | ||
}; | ||
} | ||
export default function LanguagePage(props: LanguagePageProps) { | ||
return <LanguagesPage language={props.params.language} />; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// eslint-disable-next-line no-restricted-imports | ||
import Link from "next/link"; | ||
import { useTranslations } from "next-intl"; | ||
|
||
import { getLanguages, getPublications } from "@/app/data"; | ||
import { ClickablePublicationThumbnail } from "@/components/publication-cover"; | ||
|
||
interface LanguagesPageProps { | ||
language?: string; | ||
} | ||
export default function LanguagesPage(props: LanguagesPageProps) { | ||
const t = useTranslations("LanguagesPage"); | ||
|
||
const ls = getLanguages(); | ||
const filter = props.language ? { language: props.language } : undefined; | ||
|
||
const pubs = getPublications(filter); | ||
// TODO throw error if empty | ||
|
||
return ( | ||
<div className="flex"> | ||
<div className="w-44"> | ||
<span className="font-bold">{t("languages")}</span> | ||
<ul> | ||
{ls.map((l) => { | ||
return ( | ||
<li key={l}> | ||
<Link href={`/language/${l}`}>{l}</Link> | ||
</li> | ||
); | ||
})} | ||
</ul> | ||
</div> | ||
<div> | ||
<select> | ||
<option>all works</option> | ||
<option>what's this dropdown??</option> | ||
</select> | ||
<div className="grid grid-cols-3"> | ||
{pubs.map((p) => { | ||
return <ClickablePublicationThumbnail key={p.signatur} publication={p} />; | ||
})} | ||
</div> | ||
</div> | ||
</div> | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
import { notFound } from "next/navigation"; | ||
import { useTranslations } from "next-intl"; | ||
|
||
import { getChildren, getPublication, getSameLanguagePublications, getWork } from "@/app/data"; | ||
import { ClickablePublicationThumbnail, PublicationCover } from "@/components/publication-cover"; | ||
|
||
interface PublicationPageProps { | ||
params: { | ||
id: string; | ||
}; | ||
} | ||
|
||
export default function PublicationPage(props: PublicationPageProps) { | ||
const t = useTranslations("PublicationPage"); | ||
const pub = getPublication(props.params.id); | ||
if (!pub) { | ||
return notFound(); | ||
} | ||
const later = getChildren(pub); | ||
return ( | ||
<> | ||
<h1 className="font-bold">{pub.title}</h1> | ||
<h2 className="italic">{pub.categories.join(", ")}</h2> | ||
<div className="flex flex-initial"> | ||
<div className="relative w-40 flex-auto"> | ||
<PublicationCover publication={pub} /> | ||
</div> | ||
<div className="flex-auto"> | ||
<p className="italic">{pub.language}</p> | ||
<p>{t("translated_by")} ...</p> | ||
{/* TODO map over all works, find unique translators? */} | ||
<p>{pub.year}</p> | ||
<p className="italic">{t("contains")}</p> | ||
<p> | ||
{pub.contains | ||
.map((t) => { | ||
return t.title; // title of the translation | ||
}) | ||
.join(" / ")} | ||
</p> | ||
<p> | ||
{pub.contains | ||
.map((t) => { | ||
return getWork(String(t.work))?.title; | ||
}) | ||
.join(" / ")} | ||
</p> | ||
|
||
{later ? ( | ||
<> | ||
<p className="font-bold">{t("later_editions")}</p> | ||
<div className="flex">...</div> | ||
</> | ||
) : null} | ||
|
||
<p className="font-bold"> | ||
{t("more_in")} {pub.language} | ||
</p> | ||
<div className="flex"> | ||
{getSameLanguagePublications(pub).map((p) => { | ||
return <ClickablePublicationThumbnail key={p.signatur} publication={p} />; | ||
})} | ||
</div> | ||
</div> | ||
</div> | ||
</> | ||
); | ||
} |
Oops, something went wrong.