export type ScoreListQuery = {
|
name?: string;
|
id_card?: string;
|
subject?: string;
|
page?: number;
|
page_size?: number;
|
};
|
|
export function readScoreListQuery(search: string | URLSearchParams): ScoreListQuery {
|
const sp = typeof search === "string" ? new URLSearchParams(search) : search;
|
const page = parseInt(sp.get("page") || "1", 10);
|
const page_size = parseInt(sp.get("page_size") || "20", 10);
|
return {
|
name: sp.get("name") || undefined,
|
id_card: sp.get("id_card") || undefined,
|
subject: sp.get("subject") || undefined,
|
page: Number.isFinite(page) && page > 0 ? page : 1,
|
page_size: Number.isFinite(page_size) && page_size > 0 ? page_size : 20,
|
};
|
}
|
|
export function writeScoreListQuery(q: ScoreListQuery): URLSearchParams {
|
const sp = new URLSearchParams();
|
if (q.name) sp.set("name", q.name);
|
if (q.id_card) sp.set("id_card", q.id_card);
|
if (q.subject) sp.set("subject", q.subject);
|
if (q.page && q.page > 1) sp.set("page", String(q.page));
|
if (q.page_size && q.page_size !== 20) sp.set("page_size", String(q.page_size));
|
return sp;
|
}
|
|
export function scoresListPath(q: ScoreListQuery = {}): string {
|
const s = writeScoreListQuery(q).toString();
|
return s ? `/scores?${s}` : "/scores";
|
}
|
|
export function attemptDetailPath(attemptId: string, q: ScoreListQuery = {}): string {
|
const s = writeScoreListQuery(q).toString();
|
return s ? `/attempts/${attemptId}?${s}` : `/attempts/${attemptId}`;
|
}
|