Skip to content

Commit a20f167

Browse files
committed
feat(submissions): implement submission status filtering
1 parent 703f6bf commit a20f167

File tree

2 files changed

+34
-12
lines changed

2 files changed

+34
-12
lines changed

app/(admin)/(activity-management)/submissions/_components/data-table.tsx

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,22 @@
22

33
import { CursorDataTable } from "@/components/data-table/cursor";
44
import type { Direction } from "@/components/data-table/pagination";
5+
import type { SubmissionStatus } from "@/gql/graphql";
56
import { useSuspenseQuery } from "@apollo/client/react";
67
import type { VariablesOf } from "@graphql-typed-document-node/core";
78
import { useState } from "react";
89
import { columns, type Submission } from "./data-table-columns";
910
import { SUBMISSIONS_TABLE_QUERY } from "./query";
1011

11-
export function SubmissionsDataTable({ query }: { query?: string }) {
12+
export type SubmissionStatusFilter = SubmissionStatus | "all";
13+
14+
export function SubmissionsDataTable({
15+
query,
16+
status,
17+
}: {
18+
query?: string;
19+
status?: SubmissionStatusFilter;
20+
}) {
1221
const PAGE_SIZE = 20;
1322
const [cursors, setCursors] = useState<(string | null)[]>([null]);
1423
const [currentIndex, setCurrentIndex] = useState(0);
@@ -17,14 +26,13 @@ export function SubmissionsDataTable({ query }: { query?: string }) {
1726
const variables = {
1827
first: PAGE_SIZE,
1928
after,
20-
where: query
21-
? {
22-
or: [
23-
{ hasUserWith: [{ nameContains: query }] },
24-
{ hasUserWith: [{ emailContains: query }] },
25-
],
26-
}
27-
: undefined,
29+
where: {
30+
or: [
31+
{ hasUserWith: [{ nameContains: query }] },
32+
{ hasUserWith: [{ emailContains: query }] },
33+
],
34+
status: status === "all" ? undefined : status,
35+
},
2836
} satisfies VariablesOf<typeof SUBMISSIONS_TABLE_QUERY>;
2937

3038
const { data } = useSuspenseQuery(SUBMISSIONS_TABLE_QUERY, {
@@ -57,7 +65,7 @@ export function SubmissionsDataTable({ query }: { query?: string }) {
5765
if (!pageInfo) return;
5866
if (direction === "forward" && pageInfo.hasNextPage) {
5967
const nextCursor = pageInfo.endCursor ?? null;
60-
setCursors(prev => {
68+
setCursors((prev) => {
6169
const newCursors = prev.slice(0, currentIndex + 1);
6270
newCursors.push(nextCursor);
6371
return newCursors;

app/(admin)/(activity-management)/submissions/_components/filterable-data-table.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import { Input } from "@/components/ui/input";
44

55
import { DataTableSkeleton } from "@/components/data-table/skeleton";
6+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
7+
import { SubmissionStatus } from "@/gql/graphql";
68
import { useDebouncedValue } from "foxact/use-debounced-value";
79
import { Suspense, useState } from "react";
8-
import { SubmissionsDataTable } from "./data-table";
10+
import { SubmissionsDataTable, type SubmissionStatusFilter } from "./data-table";
911

1012
export default function FilterableDataTable() {
1113
const [query, setQuery] = useState("");
14+
const [status, setStatus] = useState<SubmissionStatusFilter>("all");
1215
const debouncedQuery = useDebouncedValue(query, 200);
1316

1417
return (
@@ -19,10 +22,21 @@ export default function FilterableDataTable() {
1922
value={query}
2023
onChange={(e) => setQuery(e.target.value)}
2124
/>
25+
<Select value={status} onValueChange={(value) => setStatus(value as SubmissionStatusFilter)}>
26+
<SelectTrigger>
27+
<SelectValue placeholder="選擇解題狀態" />
28+
</SelectTrigger>
29+
<SelectContent>
30+
<SelectItem value="all">全部</SelectItem>
31+
<SelectItem value={SubmissionStatus.Failed}>錯誤</SelectItem>
32+
<SelectItem value={SubmissionStatus.Success}>成功</SelectItem>
33+
<SelectItem value={SubmissionStatus.Pending}>執行中</SelectItem>
34+
</SelectContent>
35+
</Select>
2236
</div>
2337

2438
<Suspense fallback={<DataTableSkeleton />}>
25-
<SubmissionsDataTable query={debouncedQuery} />
39+
<SubmissionsDataTable query={debouncedQuery} status={status} />
2640
</Suspense>
2741
</div>
2842
);

0 commit comments

Comments
 (0)