Skip to content

Commit

Permalink
feat: answer search
Browse files Browse the repository at this point in the history
  • Loading branch information
zrll12 committed Aug 29, 2024
1 parent db4fe93 commit 44d7d17
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 18 deletions.
47 changes: 47 additions & 0 deletions api/AnswerApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<PagedResponse<AnswerInfo>> {
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 {
Expand All @@ -71,3 +113,8 @@ export interface AnswerInfo {
create_time: string;
completed: boolean;
}

export interface PagedResponse<T> {
records: T[];
total: number;
}
2 changes: 1 addition & 1 deletion app/(root)/backstage/editor/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ export default function SurveyPage({ params }: { params: { id: number } }) {
下一页
</Button>
</Button.Group>
<Group>
<Group grow>
<Button onClick={createPage}>
新建页面
</Button>
Expand Down
138 changes: 121 additions & 17 deletions app/(root)/backstage/judge/page.tsx
Original file line number Diff line number Diff line change
@@ -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<number | undefined>(undefined);
const [surveySearch, setSurveySearch] = useState<string | null>(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<AnswerInfo[]>([]);
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 (
<Center>
<Stack w="90%">
Expand All @@ -18,20 +51,91 @@ export default function SurveyPage() {
</Center>
<Center h="100%">
<Stack>
<Input.Wrapper label="请输入 Answer ID 以跳转">
<Input
onChange={(e) => setAnswerId(parseInt(e.currentTarget.value, 10))}
/>
</Input.Wrapper>
<Center>
<Button
onClick={() => {
router.push(`/backstage/judge/${answerId}`);
}}
>
确认跳转至 {answerId}
</Button>
</Center>
<Stack>
<Box pos="relative">
<Group>
<Text>
筛选问卷
</Text>
{/*<Select*/}
{/* limit={10}*/}
{/* data={surveys.map(data => data.title)}*/}
{/* clearable*/}
{/*/>*/}
{/* TODO: Surveys selection */}
<Input
value={surveySearch == null ? '' : surveySearch}
onChange={(e) => setSurveySearch(e.target.value)} />
<Checkbox
defaultChecked
onChange={(e) =>
setUnconfirmedOnly(e.currentTarget.checked)}
label="仅显示未确认的问卷"
/>
</Group>
</Box>
<Center>
<Box pos="relative">
<Stack>
<Space h={10} />
<Table highlightOnHover>
<Table.Thead>
<Table.Tr>
<Table.Th>提交ID</Table.Th>
<Table.Th>问卷ID</Table.Th>
<Table.Th>用户ID</Table.Th>
<Table.Th>提交时间</Table.Th>
<Table.Th>问卷状态</Table.Th>
</Table.Tr>
</Table.Thead>
<Table.Tbody>
{answers === undefined ? <></> :
answers.map((element) => (
<Table.Tr
key={element.id}
onClick={() => router.push(`/backstage/judge/${element.id}`)}
style={{ cursor: 'pointer' }}>
<Table.Td>{element.id}</Table.Td>
<Table.Td>{element.survey}</Table.Td>
<Table.Td>{element.user}</Table.Td>
<Table.Td>{element.create_time}</Table.Td>
<Table.Td>{element.completed ? '已确认' : '待确认'}</Table.Td>
</Table.Tr>
))}
</Table.Tbody>
</Table>
<Center>
<Pagination
total={maxPage}
value={page + 1}
onChange={(e) => setPage(e - 1)} />
</Center>
<Space h={10} />
</Stack>
<LoadingOverlay
visible={surveysLoading}
zIndex={10}
overlayProps={{
radius: 'sm',
blur: 2,
}} />
</Box>
</Center>
</Stack>
{/*<Input.Wrapper label="请输入 Answer ID 以跳转">*/}
{/* <Input*/}
{/* onChange={(e) => setAnswerId(parseInt(e.currentTarget.value, 10))}*/}
{/* />*/}
{/*</Input.Wrapper>*/}
{/*<Center>*/}
{/* <Button*/}
{/* onClick={() => {*/}
{/* router.push(`/backstage/judge/${answerId}`);*/}
{/* }}*/}
{/* >*/}
{/* 确认跳转至 {answerId}*/}
{/* </Button>*/}
{/*</Center>*/}
</Stack>
</Center>
</Stack>
Expand Down

0 comments on commit 44d7d17

Please sign in to comment.