Implement magazine reviews, label details, and year filtering

- Aggregate magazine references from all releases on the Entry detail page.
- Display country names and external links (Wikipedia/Website) on the Label detail page.
- Add a year filter to the ZXDB Explorer to search entries by release year.

Signed-off: junie@lucy.xalior.com
This commit is contained in:
2026-02-17 12:03:36 +00:00
parent 9807005305
commit 53eb9a1501
5 changed files with 274 additions and 7 deletions

View File

@@ -41,6 +41,7 @@ export default function ZxdbExplorer({
const [genreId, setGenreId] = useState<number | "">("");
const [languageId, setLanguageId] = useState<string | "">("");
const [machinetypeId, setMachinetypeId] = useState<number | "">("");
const [year, setYear] = useState<string>("");
const [sort, setSort] = useState<"title" | "id_desc">("id_desc");
const pageSize = 20;
@@ -56,6 +57,7 @@ export default function ZxdbExplorer({
if (genreId !== "") params.set("genreId", String(genreId));
if (languageId !== "") params.set("languageId", String(languageId));
if (machinetypeId !== "") params.set("machinetypeId", String(machinetypeId));
if (year !== "") params.set("year", year);
if (sort) params.set("sort", sort);
const res = await fetch(`/api/zxdb/search?${params.toString()}`);
if (!res.ok) throw new Error(`Failed: ${res.status}`);
@@ -89,13 +91,14 @@ export default function ZxdbExplorer({
genreId === "" &&
languageId === "" &&
machinetypeId === "" &&
year === "" &&
sort === "id_desc"
) {
return;
}
fetchData(q, page);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [page, genreId, languageId, machinetypeId, sort]);
}, [page, genreId, languageId, machinetypeId, year, sort]);
// Load filter lists on mount only if not provided by server
useEffect(() => {
@@ -161,6 +164,16 @@ export default function ZxdbExplorer({
))}
</select>
</div>
<div className="col-auto">
<input
type="number"
className="form-control"
style={{ width: 100 }}
placeholder="Year"
value={year}
onChange={(e) => setYear(e.target.value)}
/>
</div>
<div className="col-auto">
<select className="form-select" value={sort} onChange={(e) => setSort(e.target.value as "title" | "id_desc")}>
<option value="title">Sort: Title</option>