-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: current generation 업데이트 #157
Changes from 8 commits
aa8e604
92039da
e61bbc3
0301d45
425ca8c
cf534d4
52f4ff1
72d58e6
e9c5ec5
a702b1e
df9f627
b2a22ef
f9343d9
3170bf6
fa560d4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,12 @@ | ||
import CommonNavbar from "@/components/common/navbar/Navbar"; | ||
import { PropsWithChildren } from "react"; | ||
import { headers } from "next/headers"; | ||
|
||
interface WithNavbarLayout extends PropsWithChildren {} | ||
|
||
const ApplicantPage = ({ children }: WithNavbarLayout) => { | ||
const headersList = headers(); | ||
const header_url = headersList.get("x-url") || ""; | ||
const [_, __, currentPath, generation, ___] = header_url.split(/[/?]+/); | ||
const isShort = currentPath === "kanban"; | ||
|
||
return ( | ||
<div className="px-24 min-w-[1280px] flex p-12"> | ||
<CommonNavbar | ||
generation={generation} | ||
currentPath={currentPath} | ||
isShort={isShort} | ||
/> | ||
Comment on lines
-8
to
-19
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 여기서 데이터를 받아와 뿌려주어 생기는 리렌더링이었군요!! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이제 안깜빡 거리나요 ㅎ 원래 네브바 나올때마다 깜빡였던거같던데 |
||
<CommonNavbar /> | ||
{children} | ||
</div> | ||
); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -52,7 +52,7 @@ const KanbanBoardDetailPage = ({ | |
return ( | ||
<main className="flex mt-8 overflow-auto pt-12 pl-12"> | ||
<KanbanColumnDetailCard | ||
columnIndex={+columnIndex ?? 0} | ||
columnIndex={+(columnIndex ?? 0)} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 아이고 맞네요.. 수정하도록 하겠습니다! 제가 이전에 몇번의 삽질을 했었는데요, |
||
generation={generation} | ||
cardId={cardId} | ||
applicantId={applicantId} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,17 @@ | ||
"use client"; | ||
import { MainNavbar } from "@/src/constants"; | ||
import CommonNavbarCell from "./NavbarCell"; | ||
import NavbarUserInfo from "./UserInfo"; | ||
import { NavbarOperation } from "./NavbarOperation"; | ||
import Link from "next/link"; | ||
import { usePathname } from "next/navigation"; | ||
import { NavbarToggle } from "./NavbarToggle"; | ||
|
||
interface CommonNavbarProps { | ||
generation: string; | ||
isShort?: boolean; | ||
currentPath: string; | ||
} | ||
const CommonNavbar = () => { | ||
const currentPath = usePathname(); | ||
const isShort = currentPath.split("/")[1] === "kanban"; | ||
const generation = currentPath.split("/")[2]; | ||
|
||
const CommonNavbar = ({ | ||
generation, | ||
isShort = false, | ||
currentPath, | ||
}: CommonNavbarProps) => { | ||
return ( | ||
<nav className="flex flex-col transition-all"> | ||
<Link | ||
|
@@ -26,19 +23,11 @@ const CommonNavbar = ({ | |
<div>{generation}th</div> | ||
</Link> | ||
<div className="flex flex-col gap-8 mt-8 text-xl"> | ||
{MainNavbar.map((item) => ( | ||
<CommonNavbarCell | ||
key={item.type} | ||
currentPath={currentPath} | ||
isShort={isShort} | ||
item={item} | ||
/> | ||
{MainNavbar(+generation).map((item) => ( | ||
<CommonNavbarCell key={item.type} item={item} /> | ||
))} | ||
<NavbarOperation | ||
currentPath={currentPath} | ||
generation={generation} | ||
isShort={isShort} | ||
/> | ||
<NavbarToggle /> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Toggle이라.. 맞는거 같지만 더 좋은 이름이 없을까유?? 항상 이런 부분이 어려운거 같네요 ㅠㅠ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 맞아요.. 사실 토글이긴 한데 보여질 기수를 변경해주는 토글이니 |
||
<NavbarOperation /> | ||
</div> | ||
<NavbarUserInfo /> | ||
</nav> | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,43 +1,48 @@ | ||||||||||||||||||||||||||||||||
"use client"; | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
import Image from "next/image"; | ||||||||||||||||||||||||||||||||
import LtIcon from "@/public/icons/lt.icon.svg"; | ||||||||||||||||||||||||||||||||
import LtIconWhite from "@/public/icons/lt.icon.white.svg"; | ||||||||||||||||||||||||||||||||
import Link from "next/link"; | ||||||||||||||||||||||||||||||||
import { cn } from "@/src/utils/cn"; | ||||||||||||||||||||||||||||||||
import { usePathname } from "next/navigation"; | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
type CommonNavbarCellProps = { | ||||||||||||||||||||||||||||||||
currentPath: string; | ||||||||||||||||||||||||||||||||
item: { | ||||||||||||||||||||||||||||||||
type: string; | ||||||||||||||||||||||||||||||||
type: string; //TODO: 타입 정의하기 | ||||||||||||||||||||||||||||||||
href: string; | ||||||||||||||||||||||||||||||||
target: string; | ||||||||||||||||||||||||||||||||
short_title: string; | ||||||||||||||||||||||||||||||||
title: string; | ||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||||||||||||||||||||||||||
isShort: boolean; | ||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
const CommonNavbarCell = ({ | ||||||||||||||||||||||||||||||||
currentPath, | ||||||||||||||||||||||||||||||||
item, | ||||||||||||||||||||||||||||||||
isShort, | ||||||||||||||||||||||||||||||||
}: CommonNavbarCellProps) => { | ||||||||||||||||||||||||||||||||
const CommonNavbarCell = ({ item }: CommonNavbarCellProps) => { | ||||||||||||||||||||||||||||||||
const [_, currentType] = usePathname().split("/"); | ||||||||||||||||||||||||||||||||
const isShort = currentType === "kanban"; | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 추가로 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 넵! 해당 부분이 불필요하게 반복되는 문제가 있네요.. 수정하겠습니다! |
||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
const linkButtonClassName = | ||||||||||||||||||||||||||||||||
"flex justify-between p-4 hover:bg-secondary-100 hover:text-white rounded-lg"; | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
const { href, short_title, target, title, type } = item; | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. item의 depth를 줄이는 걸 추천을 드리나 혹여나 구조 변경이 어려우시다면 destructure는 어떠신지 여쭤봅니당
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 넵 위 커맨트와 함께 수정해보도록 하겠습니다! |
||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||
<a | ||||||||||||||||||||||||||||||||
className={ | ||||||||||||||||||||||||||||||||
currentPath === item.type | ||||||||||||||||||||||||||||||||
<Link | ||||||||||||||||||||||||||||||||
className={cn( | ||||||||||||||||||||||||||||||||
currentType === type | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이렇게는 안될까용? className={cn(
linkButtonClassName,
currentType === type && "!bg-black !text-white"
)} There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 수정해보겠습니다! |
||||||||||||||||||||||||||||||||
? `${linkButtonClassName} !bg-black !text-white` | ||||||||||||||||||||||||||||||||
: linkButtonClassName | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
href={item.href} | ||||||||||||||||||||||||||||||||
target={item.target === "_blank" ? "_blank" : ""} | ||||||||||||||||||||||||||||||||
key={item.type} | ||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||
href={href} | ||||||||||||||||||||||||||||||||
target={target === "_blank" ? "_blank" : ""} | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 여기서 조건부로 연산하는 것 (target) 보다 props로 받아오는 타입을 강제하는 건 어떤가요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 좋습니다! props로 받을 수 있는 값의 타입을 정의해보도록 하겠습니다! |
||||||||||||||||||||||||||||||||
key={type} | ||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||
{isShort ? item.short_title : item.title} | ||||||||||||||||||||||||||||||||
{isShort ? short_title : title} | ||||||||||||||||||||||||||||||||
<Image | ||||||||||||||||||||||||||||||||
src={currentPath !== item.type ? LtIcon : LtIconWhite} | ||||||||||||||||||||||||||||||||
src={currentType !== type ? LtIcon : LtIconWhite} | ||||||||||||||||||||||||||||||||
alt="right arrow" | ||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||
</a> | ||||||||||||||||||||||||||||||||
</Link> | ||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import { usePathname } from "next/navigation"; | ||
import CommonNavbarCell from "./NavbarCell"; | ||
import { CURRENT_GENERATION } from "@/src/constants"; | ||
|
||
export const NavbarToggle = () => { | ||
const currentPath = usePathname(); | ||
const selectedGeneration = +currentPath.split("/")[2]; | ||
|
||
const isCurrentGeneration = selectedGeneration === CURRENT_GENERATION; | ||
const generation = isCurrentGeneration | ||
? CURRENT_GENERATION - 1 | ||
: CURRENT_GENERATION; | ||
|
||
const short_title = isCurrentGeneration ? "지난 모집" : "현재 모집"; | ||
const title = isCurrentGeneration | ||
? "지난 신입모집 보기" | ||
: "현재 신입모집 보기"; | ||
|
||
return ( | ||
<CommonNavbarCell | ||
item={{ | ||
href: `/kanban/${generation}`, | ||
short_title, | ||
title, | ||
target: "_self", | ||
type: "toggle", | ||
}} | ||
/> | ||
); | ||
}; |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 엇... 놓친거긴 한데... icon의 이미지 크기는 일정할 수록 좋아요!! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 아.. 해당 부분을 수정한 이유는 흰색 뭔가 둘을 동일하게 두는게 좋지 않을까 해서 수정을 하게 되었습니다..! 혹시 해당 부분을 어떤 방향성으로 수정하는 것이 좋을까요..? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 그렇다면 개인적으로는 여기에 나와 있는 기준대로 16px 또는 24px로 통일합시다... ㅠㅠㅠ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 답변이 늦어서 죄송합니다.. 해당 부분은 따로 pr을 날리거나 이슈를 파도록 하겠습니다! |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
const APPLICANT: ApplicantNode[] = [ | ||
{ | ||
id: 1, | ||
title: "프로젝트 희망 분야를 선택해주세요.*", | ||
type: "customField", | ||
value: { | ||
name: "field", | ||
}, | ||
subValue: [ | ||
{ title: "1순위", name: "field1" }, | ||
{ title: "2순위", name: "field2" }, | ||
], | ||
}, | ||
{ | ||
id: 2, | ||
title: "기본 인적 사항을 입력해주세요.", | ||
type: "customHuman", | ||
value: { | ||
hunamName: { name: "name" }, | ||
humanEmail: { name: "email" }, | ||
humanPhone: { name: "contacted" }, | ||
humanEtc: [ | ||
{ name: "classOf" }, | ||
{ name: "major" }, | ||
{ name: "doubleMajor" }, | ||
{ name: "minor" }, | ||
{ name: "grade" }, | ||
{ name: "semester" }, | ||
{ name: "registered" }, | ||
], | ||
}, | ||
}, | ||
{ | ||
id: 3, | ||
title: "기타 질문 사항에 답변해주세요.", | ||
type: "shortSplit", | ||
value: [ | ||
{ title: "향후 계획 활동", name: "activity" }, | ||
{ title: "지원 경로* (중복 선택 가능)", name: "channel" }, | ||
], | ||
}, | ||
]; | ||
|
||
export type ScoreKeyword = | ||
| "실천력" | ||
| "동아리 활동의지" | ||
| "협업" | ||
| "베풀려는 마음"; | ||
|
||
// type ScoreKeywordName = | ||
// | "passion" | ||
// | "clubInvolvement" | ||
// | "collaboration" | ||
// | "devotion"; | ||
|
||
export const ScoreSequence: { | ||
[key: number]: ScoreKeyword; | ||
} = { | ||
0: "실천력", | ||
1: "동아리 활동의지", | ||
2: "협업", | ||
3: "베풀려는 마음", | ||
}; | ||
|
||
export type Score = { | ||
fieldName: ScoreKeyword; | ||
score: number | ""; | ||
}; | ||
|
||
// type ScoreKeywordType = { | ||
// title: ScoreKeyword; | ||
// name: ScoreKeywordName; | ||
// }; | ||
|
||
// const INTERVIEW_SCORE_KEYWORD: ScoreKeywordType[] = [ | ||
// { title: "실천력", name: "passion" }, | ||
// { title: "동아리 활동의지", name: "clubInvolvement" }, | ||
// { title: "협업", name: "collaboration" }, | ||
// { title: "베풀려는 마음", name: "devotion" }, | ||
// ]; | ||
|
||
const FIELD_NAME: ScoreKeyword[] = Object.values(ScoreSequence); | ||
|
||
export { APPLICANT, FIELD_NAME }; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
export const APPLICANT_DESIGNER = [ | ||
{ | ||
id: 5, | ||
title: "자기소개 및 에코노베이션에 지원하게 된 계기를 서술해 주세요.", | ||
type: "textarea", | ||
value: { name: "reason" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 6, | ||
title: | ||
"본인이 계획하고 있는 진로가 무엇인가요?(IT 분야가 아니어도 괜찮습니다)", | ||
type: "textarea", | ||
value: { name: "future" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 7, | ||
title: | ||
"UI/UX 디자인 작업물들 중 가장 자신 있는 디자인 작업물을 설명하고, 이를 통해 배우게 된 점이 있다면 서술해 주세요.", | ||
type: "textarea", | ||
value: { name: "workDescript" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 8, | ||
title: | ||
"UI/UX 디자인을 할 때, 가장 중요한 것은 무엇이라고 생각하나요? 한가지 키워드를 중심으로 서술해주세요.", | ||
type: "textarea", | ||
value: { name: "keyword" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 9, | ||
title: | ||
"우리 주변의 IT 서비스 중에 UI/UX를 개선하고 싶은 서비스가 있다면, 어떤 점을 '왜' 그리고 '어떻게' 개선하고 싶은지 서술해 주세요.", | ||
type: "textarea", | ||
value: { name: "betterment" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 10, | ||
title: | ||
"어떤 일에 도전하고 실패해 본 경험이 있나요? 그 실패를 어떻게 극복했는지 서술해 주세요.(소프트웨어 분야 관련 경험이 아니어도 좋습니다.)", | ||
type: "textarea", | ||
value: { name: "failure" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 11, | ||
title: | ||
"무언가에 깊게 빠지거나 파고 들어본 적이 있나요? 좋아하는 것을 위해서 주변에서 인정할 정도로 깊게 빠져본 적이 있다면 서술해주세요.", | ||
type: "textarea", | ||
value: { name: "drain" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 12, | ||
title: | ||
"협업(프로젝트, 팀 활동)에 있어서 가장 중요하다고 생각되는 것은 무엇인지 그 이유와 함께 서술해주세요.", | ||
type: "textarea", | ||
value: { name: "collaboration" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 13, | ||
title: | ||
"에코노베이션에 최종 합격 시 신입 기수로 구성된 팀으로 개발 프로젝트에 참여하고, 목표를 달성하기 위해 스스로 끊임없이 배우고 노력합니다. 에코노베이션에 들어오게 된다면 어떤 목표와 학습 계획을 바탕으로 활동하고 싶나요?", | ||
type: "textarea", | ||
value: { name: "studyPlan" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 14, | ||
title: | ||
"에코노베이션은 3학기 이상의 활동을 권장하고 있으며 매주 금요일 17시에는 주간발표가 있습니다. 위 내용을 확인하셨으면 '확인했습니다'를 기입해주세요.", | ||
type: "textarea", | ||
value: { name: "check" }, | ||
} as ApplicantTextareaNode, | ||
{ | ||
id: 15, | ||
title: "면접 가능시간을 선택해주세요. (중복 선택 가능)", | ||
type: "timeline", | ||
} as ApplicantTimelineNode, | ||
]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
type import를 사용해봅시다 :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵 수정하겠습니다!