Skip to content

Commit

Permalink
qa 배포를 위해 머지합니다. (#160)
Browse files Browse the repository at this point in the history
* fix(pages): QA 오류 수정

* feat(pages): 관리자가 수정지시사항 확인 여부를 수정할 수 있도록 변경

* fix: 무한 요청 오류 수정

* fix: showNotificationSuccess 위치 변경

* fix: (chore) issn 옵셔널로 변경후 undefined여서 생기는 오류 수정

* fix: 학생등록 폼 논문제목/연락처/이메일 옵셔널 변경 및 학과로 필터링 제거

* fix: 교수 등록 폼 수정 및 학생/교수 로그인하기 기능 오류 수정
디벨롭 브랜치와 머지, #118 브랜치에서 이어서 작업 (메인에서 작업해서..ㅠㅠ)

* fix: 본심 전환 모달 오류 수정

* chore: 포맷팅

* fix: 심사결과페이지 심사 중에도 확인 가능하도록 수정

* fix: 논문투고 페이지 예심/본심 뱃지 추가

* fix: 논문투고 페이지 일정 예심/본심에 따라 불러오도록 수정

* fix: 학생 심사 결과 페이지 본심 정보도 불러오도록 수정

* fix: AchievementForm isAdmin 수정

* fix: 논문정보 수정 api 스펠링 변경
저희쪽에서 변경하는게 빠를 것 같아서 수정하였습니다.

* fix: 심사 정보 수정 심사의견 및 파일 업로드가능하도록 수정

* fix: 심사의견/심사의견파일 둘중 하나만 선택하도록 수정

* feat: 교수/학생 일괄 삭제 기능 추가

* feat: main workflow 추가

* chore: 주석달기

* chore: 코드 중복 제거

* fix: 테이블 헤더 수정

* fix: 로그인 안내문구 수정

* chore: 서명 미업로드 설명 추가

* 프로덕션 배포를 위해 머지합니다. (#135)

* fix: 로그인 안내문구 수정

* chore: 서명 미업로드 설명 추가

* 프로덕션 배포를 위해 머지합니다. (#136)

* fix: 로그인 안내문구 수정

* chore: 서명 미업로드 설명 추가

* fix: 로그인 안내문구 수정 (#146)

* fix: department null인 경우 예외처리 (#148)

* [FIX] 심사 내용 없을때 등록 안되도록 수정  (#158)

* fix: 심사시 심사의견파일 혹은 심사의견 필수 수정

* fix: 일괄등록 안내문구 추가

* fix: 최종심사 모달창 문구 수정

* fix: 관리자 심사 수정시 심사 내용 필수로 수정

* fix: 학생 심사 결과 페이지 심사의견 볼수있도록 수정 (#156)

* feat: 학생 개별삭제, 교수 개별삭제 기능 추가 (#150)

* fix: department null인 경우 예외처리 (#151)

* fix: 교수/학생 로그인하기 router.refresh 추가 (#152)

* fix: PhaseReady 시스템 단계 기간 주석처리 (#153)

* fix: PhaseEditFormatRow Date 오류수정 (#154)

* fix: 수정지시사항 단계 제외 오류 해결 및 학과관리 페이지로 이동 (#155)

---------

Co-authored-by: lhwdev <[email protected]>
  • Loading branch information
hynseok and lhwdev authored May 3, 2024
1 parent 8ba0384 commit a5f26fc
Show file tree
Hide file tree
Showing 26 changed files with 329 additions and 170 deletions.
2 changes: 1 addition & 1 deletion src/api/apiRoute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export const API_ROUTES = {
`/students/${studentId}/headReviewer/${reviewerId}`, // PUT: 학생 심사위원장 배정
deleteReviewer: (studentId: ApiId, reviewerId: ApiId) =>
`/students/${studentId}/reviewers/${reviewerId}`, // PUT: 학생 심사위원 배정 취소
delete: () => "/students", // DELETE: 학생 삭제
delete: (studentId?: ApiId) => `/students/${studentId ?? ""}`, // DELETE: 학생 삭제
},
review: {
// 학생 본인의 논문 조회
Expand Down
18 changes: 16 additions & 2 deletions src/app/admin/results/[thesisId]/AdminReviewContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { AdminReviewResponse, ThesisReview, UpdateReviewRequestBody } from "@/ap
import { transactionTask } from "@/api/_utils/task";
import { API_ROUTES } from "@/api/apiRoute";
import { ApiDownloadButton } from "@/components/common/Buttons";
import { showNotificationSuccess } from "@/components/common/Notifications";
import { showNotificationError, showNotificationSuccess } from "@/components/common/Notifications";
import SectionTitle from "@/components/common/SectionTitle";
import {
BasicRow,
Expand Down Expand Up @@ -159,12 +159,26 @@ function ModalContent({ open, setOpen, data, current }: ModalProps) {
task.onComplete(() => setLoading(false));

let fileUUID;
if (reviewFile) {
if (reviewFile && commentType === "심사 의견 파일") {
fileUUID = (await uploadFile(reviewFile)).uuid;
} else if (current.file) {
fileUUID = current.file.uuid ?? undefined;
}

if (thesis === "UNEXAMINED" || presentation === "UNEXAMINED") {
showNotificationError({ message: "합격 여부를 선택해주세요." });
return;
}

if (
commentType === undefined ||
(commentType === "심사 의견" && (comment === undefined || !comment)) ||
(commentType === "심사 의견 파일" && fileUUID === undefined)
) {
showNotificationError({ message: "심사 의견이나 심사 의견 파일을 첨부해주세요." });
return;
}

await ClientAxios.put(
current.isFinal
? API_ROUTES.review.final.put(current.id)
Expand Down
19 changes: 17 additions & 2 deletions src/app/admin/reviews/[thesisId]/AdminReviewListContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { ClientAxios } from "@/api/ClientAxios";
import { AdminReviewResponse, ThesisReview, UpdateReviewRequestBody } from "@/api/_types/reviews";
import { transactionTask } from "@/api/_utils/task";
import { API_ROUTES } from "@/api/apiRoute";
import { showNotificationSuccess } from "@/components/common/Notifications";
import { showNotificationError, showNotificationSuccess } from "@/components/common/Notifications";
import SectionTitle from "@/components/common/SectionTitle";
import {
BasicRow,
Expand Down Expand Up @@ -91,12 +91,27 @@ function ModalContent({ open, setOpen, data, current }: ModalProps) {
task.onComplete(() => setLoading(false));

let fileUUID;
if (reviewFile) {

if (reviewFile && commentType === "심사 의견 파일") {
fileUUID = (await uploadFile(reviewFile)).uuid;
} else if (current.file) {
fileUUID = current.file.uuid ?? undefined;
}

if (thesis === "UNEXAMINED" || presentation === "UNEXAMINED") {
showNotificationError({ message: "합격 여부를 선택해주세요." });
return;
}

if (
commentType === undefined ||
(commentType === "심사 의견" && (comment === undefined || !comment)) ||
(commentType === "심사 의견 파일" && fileUUID === undefined)
) {
showNotificationError({ message: "심사 의견이나 심사 의견 파일을 첨부해주세요." });
return;
}

await ClientAxios.put(
data.stage === "REVISION"
? API_ROUTES.review.revision.put(current.id)
Expand Down
9 changes: 5 additions & 4 deletions src/app/prof/final/[id]/ProfessorFinalForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ export function ProfessorFinalForm({
}했습니다.`,
});

router.push("/prof/final");
router.refresh();
router.push("../final");
});

return (
Expand All @@ -100,10 +100,10 @@ export function ProfessorFinalForm({
handleSubmit(input);
} else {
const hasCommentFile = previous.reviewFile
? values.commentFile === null
? values.commentFile !== null
: !!values.commentFile;
if (values.comment === "" && hasCommentFile) {
showNotificationError({ message: <>심사 의견이나 심사 의견 파일을 첨부해주세요.</> });
if (!values.comment && !hasCommentFile) {
showNotificationError({ message: "심사 의견이나 심사 의견 파일을 첨부해주세요." });
return;
}
setShowConfirmDialog(true);
Expand All @@ -130,6 +130,7 @@ export function ProfessorFinalForm({
onClose={() => {
setShowConfirmDialog(false);
}}
isFinal
/>
</form>
);
Expand Down
22 changes: 15 additions & 7 deletions src/app/prof/review/[id]/ProfessorReviewForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,20 @@ export function ProfessorReviewForm({

const isPending = input.thesis === "PENDING" || input.presentation === "PENDING";
let fileUUID;
if (input.commentFile) {
if (input.commentFile && commentType === "심사 의견 파일") {
fileUUID = (await uploadFile(input.commentFile)).uuid;
} else if (input.commentFile !== null) {
fileUUID = previous.reviewFile?.uuid ?? undefined;
}

if (
(commentType === "심사 의견" && !input.comment) ||
(commentType === "심사 의견 파일" && fileUUID === undefined)
) {
showNotificationError({ message: "심사 의견이나 심사 의견 파일을 첨부해주세요." });
return;
}

await ClientAxios.put(
API_ROUTES.review.put(reviewId),
{
Expand All @@ -98,8 +106,8 @@ export function ProfessorReviewForm({

// TODO: 불필요한 fetch를 추가하긴 하지만, 이것 말고 적당한 방법이 있는지 모르겠음...
// https://github.com/vercel/next.js/discussions/54075 참고: 현재는 클라이언트측 Router Cache를 완전히 비활성화할 방법이 없음
router.push("/prof/review");
router.refresh();
router.push("../review");
});

return (
Expand All @@ -111,10 +119,10 @@ export function ProfessorReviewForm({
handleSubmit(input);
} else {
const hasCommentFile = previous.reviewFile
? values.commentFile === null
? values.commentFile !== null
: !!values.commentFile;
if (values.comment === "" && hasCommentFile) {
showNotificationError({ message: <>심사 의견이나 심사 의견 파일을 첨부해주세요.</> });
if (!values.comment && !hasCommentFile) {
showNotificationError({ message: "심사 의견이나 심사 의견 파일을 첨부해주세요." });
return;
}
setShowConfirmDialog(true);
Expand All @@ -134,8 +142,8 @@ export function ProfessorReviewForm({
review={{
thesis: values.thesis,
presentation: values.presentation,
comment: values.comment,
commentFile: values.commentFile?.name ?? null,
comment: commentType === "심사 의견" ? values.comment : "",
commentFile: commentType === "심사 의견 파일" ? values.commentFile?.name ?? null : null,
}}
opened={showConfirmDialog}
onConfirm={() => handleSubmit(values)}
Expand Down
20 changes: 16 additions & 4 deletions src/app/student/result/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,24 @@ import { UserResponse } from "@/api/_types/user";
export default async function StudentResultPage() {
const { token } = await AuthSSR({ userType: "STUDENT" });
const user = (await fetcher({ url: API_ROUTES.user.get(), token })) as UserResponse;
const { "0": pre, "1": main } = (await fetcher({ url: API_ROUTES.review.getMe(), token })) as {
"0": MyReviewResponse;
"1": MyReviewResponse;

const response = (await fetcher({ url: API_ROUTES.review.getMe(), token })) as {
[key: string]: MyReviewResponse;
};

const thesisRes: MyReviewResponse = user.currentPhase === "PRELIMINARY" ? pre : main;
let main: MyReviewResponse;
let pre: MyReviewResponse;

for (let i = 0; i < 3; i += 1) {
if (response[i.toString()]?.stage === "MAIN") {
main = response[i.toString()];
} else if (response[i.toString()]?.stage === "PRELIMINARY") {
pre = response[i.toString()];
}
}

const thesisRes: MyReviewResponse = user.currentPhase === "PRELIMINARY" ? pre! : main!;

const thesisInfo: ThesisInfoData = {
title: thesisRes.title,
stage: thesisRes.stage,
Expand Down
10 changes: 5 additions & 5 deletions src/components/common/AppShell/AppShell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,18 @@ function AppShell({ children }: Props) {
const { user } = useAuth();
const pathname = usePathname();
const disabledAppShell = user?.type === null || pathname === "/login";

const modificationFlag =
user?.type === "STUDENT"
? user?.department.modificationFlag && user.currentPhase !== "PRELIMINARY"
: false;
return (
<MantineAppShell
padding={40}
navbar={{ width: 300, breakpoint: "sm" }}
styles={{ main: { background: "var(--mantine-color-main-background)" } }}
disabled={disabledAppShell}
>
<Navbar
userType={user?.type}
modificationFlag={user?.department.modificationFlag && user.currentPhase !== "PRELIMINARY"}
/>
<Navbar userType={user?.type} modificationFlag={modificationFlag} />
<MantineAppShell.Main>{children}</MantineAppShell.Main>
</MantineAppShell>
);
Expand Down
4 changes: 1 addition & 3 deletions src/components/common/AppShell/_elements/Navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,7 @@ function Navbar({ userType, modificationFlag }: Props) {
<AppShell.Section>
<Profile />
</AppShell.Section>
{userType && modificationFlag !== undefined && (
<NavbarList userType={userType} modificationFlag={modificationFlag} />
)}
{userType && <NavbarList userType={userType} modificationFlag={modificationFlag} />}
</AppShell.Navbar>
);
}
Expand Down
4 changes: 2 additions & 2 deletions src/components/common/AppShell/_elements/NavbarList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ import {

interface Props {
userType: Role;
modificationFlag: boolean;
modificationFlag?: boolean;
}

const USER_TYPE_NAVBAR_LIST = {
ADMIN: ADMIN_NAVBAR_LIST,
PROFESSOR: PROF_NAVBAR_LIST,
STUDENT: (modificationFlag: boolean) => STUDENT_NAVBAR_LIST(modificationFlag),
STUDENT: (modificationFlag?: boolean) => STUDENT_NAVBAR_LIST(modificationFlag),
};

function NavbarList({ userType, modificationFlag }: Props) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ export const ADMIN_NAVBAR_LIST: Props[] = [
icon: <IconSettings size="24" stroke={1} />,
},
];
export const STUDENT_NAVBAR_LIST = (modificationFlag: boolean) => {
export const STUDENT_NAVBAR_LIST = (modificationFlag?: boolean) => {
const navbarList: Props[] = [
{ label: "메인", href: "/", icon: <IconHome size="24" stroke={1} /> },
{ label: "논문 투고", href: "/student/write", icon: <IconFileText size="24" stroke={1} /> },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,13 @@ function AdminExcelRegister({ isProf = false }: Props) {
<Stack gap={0}>
<TitleRow
title={isProf ? "교수 기본 정보" : "학생 기본 정보"}
subString="* 이미 등록된 중복 아이디의 경우 데이터가 수정됩니다."
subString={
<>
<>* 이미 등록된 중복 아이디의 경우 데이터가 수정됩니다.</>
<br />
<>* 한 번에 많은 사용자를 업로드할 시 로딩 시간이 길어질 수 있습니다.</>
</>
}
/>
<RowGroup>
<NoticeRow text="첨부파일 우측 상단의 안내사항을 참고하시기 바랍니다." />
Expand Down
Loading

0 comments on commit a5f26fc

Please sign in to comment.