diff --git a/api/AnswerApi.ts b/api/AnswerApi.ts index 87ac9b9..5a68691 100644 --- a/api/AnswerApi.ts +++ b/api/AnswerApi.ts @@ -53,6 +53,48 @@ export default class AnswerApi { return (await res.json()) as AnswerInfo; } + + public static async searchAnswerList(page: number, + size: number | null, + survey: number | null, + user: number | null, + unfinishedOnly: boolean) + : Promise> { + const myHeaders = new Headers(); + myHeaders.append('token', Cookie.getCookie('token')); + + const requestOptions: RequestInit = { + method: 'GET', + headers: myHeaders, + redirect: 'follow', + }; + + let queryString = `?page=${page}&only_unfinished=${unfinishedOnly}`; + + if (size !== null) { + queryString += `&size=${size}`; + } + if (survey !== null) { + queryString += `&survey=${survey}`; + } + if (user !== null) { + queryString += `&user=${user}`; + } + + const res = await fetch(`${SERVER_URL}/api/answer/search${queryString}`, requestOptions); + + if (!res.ok) { + notifications.show({ + title: '获取问卷答案失败, 请将以下信息反馈给管理员', + message: `${res.statusText}: ${await res.text()}`, + color: 'red', + }); + + throw new Error('Failed to get answer'); + } + + return res.json(); + } } export interface SaveRequest { @@ -71,3 +113,8 @@ export interface AnswerInfo { create_time: string; completed: boolean; } + +export interface PagedResponse { + records: T[]; + total: number; +} diff --git a/app/(root)/backstage/editor/[id]/page.tsx b/app/(root)/backstage/editor/[id]/page.tsx index fe0eb8b..935abd5 100644 --- a/app/(root)/backstage/editor/[id]/page.tsx +++ b/app/(root)/backstage/editor/[id]/page.tsx @@ -264,7 +264,7 @@ export default function SurveyPage({ params }: { params: { id: number } }) { 下一页 - + diff --git a/app/(root)/backstage/judge/page.tsx b/app/(root)/backstage/judge/page.tsx index ead04b3..8cfbbdb 100644 --- a/app/(root)/backstage/judge/page.tsx +++ b/app/(root)/backstage/judge/page.tsx @@ -1,13 +1,46 @@ 'use client'; -import { Button, Center, Input, Stack, Title } from '@mantine/core'; -import { useState } from 'react'; +import { + Box, + Center, + Checkbox, + Group, + Input, + LoadingOverlay, + Pagination, + Space, + Stack, + Table, + Text, + Title, +} from '@mantine/core'; +import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; +import AnswerApi, { AnswerInfo } from '@/api/AnswerApi'; export default function SurveyPage() { - const [answerId, setAnswerId] = useState(undefined); + const [surveySearch, setSurveySearch] = useState(null); + const [unconfirmedOnly, setUnconfirmedOnly] = useState(true); + const [surveysLoading, setSurveysLoading] = useState(true); + const [page, setPage] = useState(0); + const [maxPage, setMaxPage] = useState(1); + const [answers, setAnswers] = useState([]); const router = useRouter(); + useEffect(() => { + setSurveysLoading(true); + AnswerApi.searchAnswerList(page, + 10, + surveySearch ? Number(surveySearch) : null, + null, + unconfirmedOnly) + .then((res) => { + setSurveysLoading(false); + setMaxPage(res.total); + setAnswers(res.records); + }); + }, [surveySearch, unconfirmedOnly, page]); + return (
@@ -18,20 +51,91 @@ export default function SurveyPage() {
- - setAnswerId(parseInt(e.currentTarget.value, 10))} - /> - -
- -
+ + + + + 筛选问卷 + + {/* data.title)}*/} + {/* clearable*/} + {/*/>*/} + {/* TODO: Surveys selection */} + setSurveySearch(e.target.value)} /> + + setUnconfirmedOnly(e.currentTarget.checked)} + label="仅显示未确认的问卷" + /> + + +
+ + + + + + + 提交ID + 问卷ID + 用户ID + 提交时间 + 问卷状态 + + + + {answers === undefined ? <> : + answers.map((element) => ( + router.push(`/backstage/judge/${element.id}`)} + style={{ cursor: 'pointer' }}> + {element.id} + {element.survey} + {element.user} + {element.create_time} + {element.completed ? '已确认' : '待确认'} + + ))} + +
+
+ setPage(e - 1)} /> +
+ +
+ +
+
+
+ {/**/} + {/* setAnswerId(parseInt(e.currentTarget.value, 10))}*/} + {/* />*/} + {/**/} + {/*
*/} + {/* {*/} + {/* router.push(`/backstage/judge/${answerId}`);*/} + {/* }}*/} + {/* >*/} + {/* 确认跳转至 {answerId}*/} + {/* */} + {/*
*/}