Add multi-select machine filters

Replace machine dropdowns with multi-select chips and pass machine lists in queries.

Signed-off-by: codex@lucy.xalior.com
This commit is contained in:
2026-01-11 13:04:41 +00:00
parent 2f93ed1774
commit 1e8925e631
7 changed files with 193 additions and 65 deletions

View File

@@ -12,12 +12,21 @@ const querySchema = z.object({
.trim()
.length(2, "languageId must be a 2-char code")
.optional(),
machinetypeId: z.coerce.number().int().positive().optional(),
machinetypeId: z.string().optional(),
sort: z.enum(["title", "id_desc"]).optional(),
scope: z.enum(["title", "title_aliases", "title_aliases_origins"]).optional(),
facets: z.coerce.boolean().optional(),
});
function parseIdList(value: string | undefined) {
if (!value) return undefined;
const ids = value
.split(",")
.map((id) => Number(id.trim()))
.filter((id) => Number.isFinite(id) && id > 0);
return ids.length ? ids : undefined;
}
export async function GET(req: NextRequest) {
const { searchParams } = new URL(req.url);
const parsed = querySchema.safeParse({
@@ -37,9 +46,11 @@ export async function GET(req: NextRequest) {
{ status: 400, headers: { "content-type": "application/json" } }
);
}
const data = await searchEntries(parsed.data);
const machinetypeId = parseIdList(parsed.data.machinetypeId);
const searchParamsParsed = { ...parsed.data, machinetypeId };
const data = await searchEntries(searchParamsParsed);
const body = parsed.data.facets
? { ...data, facets: await getEntryFacets(parsed.data) }
? { ...data, facets: await getEntryFacets(searchParamsParsed) }
: data;
return new Response(JSON.stringify(body), {
headers: { "content-type": "application/json" },