diff --git a/jobdri/app/mock-application/jd-review/JdReviewPageClient.tsx b/jobdri/app/mock-application/jd-review/JdReviewPageClient.tsx new file mode 100644 index 0000000..8e9f089 --- /dev/null +++ b/jobdri/app/mock-application/jd-review/JdReviewPageClient.tsx @@ -0,0 +1,61 @@ +"use client"; + +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import Header from "@/components/common/header/Header"; +import { Footer } from "@/components/common/footer"; +import { ModalNotice } from "@/components/common/modal"; +import JdReviewMain from "@/components/mock-application/JdReviewMain"; + +const JD_INPUT_PATH = "/mock-application/jd-input"; + +export default function JdReviewPageClient() { + const router = useRouter(); + const [showBackConfirm, setShowBackConfirm] = useState(false); + + const openBackConfirm = () => setShowBackConfirm(true); + const closeBackConfirm = () => setShowBackConfirm(false); + const goToJdInput = () => router.replace(JD_INPUT_PATH); + + return ( +
+
+
+ +
+
+
+

+ 공고 내용을 확인하고 수정해주세요 +

+
+ +
+
+ +
+
+ + {showBackConfirm && ( +
+ +
+ )} +
+ ); +} diff --git a/jobdri/app/mock-application/jd-review/page.tsx b/jobdri/app/mock-application/jd-review/page.tsx new file mode 100644 index 0000000..fe0b92e --- /dev/null +++ b/jobdri/app/mock-application/jd-review/page.tsx @@ -0,0 +1,5 @@ +import JdReviewPageClient from "./JdReviewPageClient"; + +export default function MockApplicationJdReviewPage() { + return ; +} diff --git a/jobdri/components/common/AppShell.tsx b/jobdri/components/common/AppShell.tsx index f5a4c07..3f46101 100644 --- a/jobdri/components/common/AppShell.tsx +++ b/jobdri/components/common/AppShell.tsx @@ -5,7 +5,11 @@ import { usePathname } from "next/navigation"; import Lnb from "@/components/common/lnb/Lnb"; import PageHeader from "@/components/common/PageHeader"; -const standaloneRoutes = new Set(["/login"]); +const standaloneRoutes = new Set([ + "/login", + "/mock-application/jd-review", + "/mock-application/jd-input", +]); export default function AppShell({ children }: { children: ReactNode }) { const pathname = usePathname(); diff --git a/jobdri/components/common/badges/RequiredDot.tsx b/jobdri/components/common/badges/RequiredDot.tsx new file mode 100644 index 0000000..dd1a4a0 --- /dev/null +++ b/jobdri/components/common/badges/RequiredDot.tsx @@ -0,0 +1,13 @@ +interface RequiredDotProps { + label?: string; +} + +export function RequiredDot({ label = "필수 항목" }: RequiredDotProps) { + return ( + + ); +} diff --git a/jobdri/components/common/badges/index.ts b/jobdri/components/common/badges/index.ts index ad79c02..6c8c892 100644 --- a/jobdri/components/common/badges/index.ts +++ b/jobdri/components/common/badges/index.ts @@ -1 +1,2 @@ export { CompleteBadge } from "./CompleteBadge"; +export { RequiredDot } from "./RequiredDot"; diff --git a/jobdri/components/common/header/Header.tsx b/jobdri/components/common/header/Header.tsx index 5972e31..bc95c0c 100644 --- a/jobdri/components/common/header/Header.tsx +++ b/jobdri/components/common/header/Header.tsx @@ -76,7 +76,7 @@ export default function Header({
    {steps.map((step, index) => { const stepNumber = index + 1; - const reached = stepNumber <= currentStep; + const isCurrent = stepNumber === currentStep; return (
  1. { if (textareaRef.current) { textareaRef.current.style.height = "1px"; - textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`; + + const nextHeight = maxHeight + ? Math.min(textareaRef.current.scrollHeight, maxHeight) + : textareaRef.current.scrollHeight; + + textareaRef.current.style.height = `${nextHeight}px`; + textareaRef.current.style.overflowY = + maxHeight && textareaRef.current.scrollHeight > maxHeight + ? "auto" + : "hidden"; } - }, [value]); + }, [maxHeight, value]); return (
    diff --git a/jobdri/components/common/modal/ModalNotice.tsx b/jobdri/components/common/modal/ModalNotice.tsx index b855660..fc3e07e 100644 --- a/jobdri/components/common/modal/ModalNotice.tsx +++ b/jobdri/components/common/modal/ModalNotice.tsx @@ -3,6 +3,7 @@ import clsx from "clsx"; import { Button } from "@/components/common/buttons"; type ModalNoticeVariant = "single" | "double"; +type ModalNoticeType = "notice" | "confirmationModal"; interface ModalNoticeActionProps extends Omit, "children"> { @@ -10,6 +11,7 @@ interface ModalNoticeActionProps } interface ModalNoticeProps { + type?: ModalNoticeType; variant?: ModalNoticeVariant; title?: string; description?: string; @@ -19,6 +21,7 @@ interface ModalNoticeProps { } export default function ModalNotice({ + type = "notice", variant = "single", title = "공고 링크를 입력해주세요.", description = "링크 내용이 부적절한 경우 제대로 추출되지 않을 수 있습니다.", @@ -26,8 +29,9 @@ export default function ModalNotice({ secondaryAction = {}, className, }: ModalNoticeProps) { + const resolvedVariant = type === "confirmationModal" ? "double" : variant; const { - label: primaryLabel = variant === "single" ? "닫기" : "입력하기", + label: primaryLabel = resolvedVariant === "single" ? "닫기" : "입력하기", className: primaryClassName, ...primaryButtonProps } = primaryAction; @@ -63,7 +67,7 @@ export default function ModalNotice({
    - {variant === "single" ? ( + {resolvedVariant === "single" ? (