summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-07-17 10:50:52 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-07-17 10:50:52 +0000
commit2ef02e27dbe639876fa3b90c30307dda183545ec (patch)
treee132ae7f3dd774e1ce767291c2849be4a63ae762 /app
parentfb276ed3db86fe4fc0c0fcd870fd3d085b034be0 (diff)
(최겸) 기술영업 변경사항 적용
Diffstat (limited to 'app')
-rw-r--r--app/[lng]/auth/tech-signup/page.tsx17
-rw-r--r--app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/layout.tsx8
-rw-r--r--app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/rfq-history/page.tsx120
-rw-r--r--app/[lng]/partners/(partners)/techsales/rfq-offshore-hull/page.tsx12
-rw-r--r--app/[lng]/partners/(partners)/techsales/rfq-offshore-top/page.tsx10
-rw-r--r--app/[lng]/partners/(partners)/techsales/rfq-ship/page.tsx12
-rw-r--r--app/[lng]/sales/(sales)/tech-vendors/[id]/info/items/page.tsx48
-rw-r--r--app/[lng]/sales/(sales)/tech-vendors/[id]/info/layout.tsx10
-rw-r--r--app/[lng]/sales/(sales)/tech-vendors/[id]/info/rfq-history/page.tsx120
9 files changed, 173 insertions, 184 deletions
diff --git a/app/[lng]/auth/tech-signup/page.tsx b/app/[lng]/auth/tech-signup/page.tsx
new file mode 100644
index 00000000..d5b019ed
--- /dev/null
+++ b/app/[lng]/auth/tech-signup/page.tsx
@@ -0,0 +1,17 @@
+import { Suspense } from "react"
+import { Metadata } from "next"
+import { TechVendorJoinForm } from "@/components/signup/tech-vendor-join-form"
+import { JoinFormSkeleton } from "@/components/signup/join-form-skeleton"
+
+export const metadata: Metadata = {
+ title: "기술영업 협력업체 등록",
+ description: "기술영업 협력업체 등록 페이지입니다.",
+}
+
+export default function TechVendorSignUpPage() {
+ return (
+ <Suspense fallback={<JoinFormSkeleton/>}>
+ <TechVendorJoinForm />
+ </Suspense>
+ )
+} \ No newline at end of file
diff --git a/app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/layout.tsx b/app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/layout.tsx
index 7c389720..adeb915c 100644
--- a/app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/layout.tsx
+++ b/app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/layout.tsx
@@ -34,14 +34,14 @@ export default async function SettingsLayout({
title: "연락처",
href: `/${lng}/evcp/tech-vendors/${id}/info`,
},
+ {
+ title: "RFQ 히스토리",
+ href: `/${lng}/evcp/tech-vendors/${id}/info/rfq-history`,
+ },
// {
// title: "자재 리스트",
// href: `/${lng}/evcp/tech-vendors/${id}/info/items`,
// },
- // {
- // title: "견적 히스토리",
- // href: `/${lng}/evcp/tech-vendors/${id}/info/rfq-history`,
- // },
]
return (
diff --git a/app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/rfq-history/page.tsx b/app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/rfq-history/page.tsx
index 4ed2b39f..a23a988e 100644
--- a/app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/rfq-history/page.tsx
+++ b/app/[lng]/evcp/(evcp)/tech-vendors/[id]/info/rfq-history/page.tsx
@@ -1,55 +1,65 @@
-// import { Separator } from "@/components/ui/separator"
-// import { getRfqHistory } from "@/lib/vendors/service"
-// import { type SearchParams } from "@/types/table"
-// import { getValidFilters } from "@/lib/data-table"
-// import { searchParamsRfqHistoryCache } from "@/lib/vendors/validations"
-// import { TechVendorRfqHistoryTable } from "@/lib/tech-vendors/rfq-history-table/rfq-history-table"
-
-// interface IndexPageProps {
-// // Next.js 13 App Router에서 기본으로 주어지는 객체들
-// params: {
-// lng: string
-// id: string
-// }
-// searchParams: Promise<SearchParams>
-// }
-
-// export default async function RfqHistoryPage(props: IndexPageProps) {
-// const resolvedParams = await props.params
-// const lng = resolvedParams.lng
-// const id = resolvedParams.id
-
-// const idAsNumber = Number(id)
-
-// // 2) SearchParams 파싱 (Zod)
-// // - "filters", "page", "perPage", "sort" 등 contact 전용 컬럼
-// const searchParams = await props.searchParams
-// const search = searchParamsRfqHistoryCache.parse(searchParams)
-// const validFilters = getValidFilters(search.filters)
-
-// const promises = Promise.all([
-// getRfqHistory({
-// ...search,
-// filters: validFilters,
-// },
-// idAsNumber)
-// ])
-
-// // 4) 렌더링
-// return (
-// <div className="space-y-6">
-// <div>
-// <h3 className="text-lg font-medium">
-// RFQ History
-// </h3>
-// <p className="text-sm text-muted-foreground">
-// 협력업체의 RFQ 참여 이력을 확인할 수 있습니다.
-// </p>
-// </div>
-// <Separator />
-// <div>
-// <TechVendorRfqHistoryTable promises={promises} vendorId={idAsNumber} />
-// </div>
-// </div>
-// )
-// } \ No newline at end of file
+import { Suspense } from "react"
+import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
+import { Shell } from "@/components/shell"
+import { type SearchParams } from "@/types/table"
+import { getValidFilters } from "@/lib/data-table"
+import { TechVendorRfqHistoryTable } from "@/lib/tech-vendors/rfq-history-table/tech-vendor-rfq-history-table"
+import { getTechVendorRfqHistory } from "@/lib/tech-vendors/service"
+import { searchParamsRfqHistoryCache } from "@/lib/tech-vendors/validations"
+
+interface IndexPageProps {
+ // Next.js 13 App Router에서 기본으로 주어지는 객체들
+ params: {
+ lng: string
+ id: string
+ }
+ searchParams: Promise<SearchParams>
+}
+
+export default async function SettingsAccountPage(props: IndexPageProps) {
+ const resolvedParams = await props.params
+ const id = resolvedParams.id
+
+ const idAsNumber = Number(id)
+
+ // 2) SearchParams 파싱 (Zod)
+ // - "filters", "page", "perPage", "sort" 등 contact 전용 컬럼
+ const searchParams = await props.searchParams
+ const search = searchParamsRfqHistoryCache.parse(searchParams)
+ const validFilters = getValidFilters(search.filters)
+
+
+
+ const promises = Promise.all([
+ getTechVendorRfqHistory({
+ ...search,
+ filters: validFilters,
+ },
+ idAsNumber)
+ ])
+
+ return (
+ <Shell className="gap-2">
+ <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
+ <div>
+ <h1 className="text-2xl font-bold tracking-tight">RFQ 히스토리</h1>
+ <p className="text-muted-foreground">벤더가 참여한 기술영업 RFQ 목록입니다.</p>
+ </div>
+ </div>
+
+ <Suspense
+ fallback={
+ <DataTableSkeleton
+ columnCount={8}
+ searchableColumnCount={1}
+ filterableColumnCount={2}
+ cellWidths={["10rem", "20rem", "10rem", "15rem", "10rem", "10rem", "10rem", "8rem"]}
+ shrinkZero
+ />
+ }
+ >
+ <TechVendorRfqHistoryTable promises={promises} />
+ </Suspense>
+ </Shell>
+ )
+} \ No newline at end of file
diff --git a/app/[lng]/partners/(partners)/techsales/rfq-offshore-hull/page.tsx b/app/[lng]/partners/(partners)/techsales/rfq-offshore-hull/page.tsx
index b6ee8321..ee31c95b 100644
--- a/app/[lng]/partners/(partners)/techsales/rfq-offshore-hull/page.tsx
+++ b/app/[lng]/partners/(partners)/techsales/rfq-offshore-hull/page.tsx
@@ -9,8 +9,8 @@ import { Shell } from "@/components/shell";
import { VendorQuotationsTable } from "@/lib/techsales-rfq/vendor-response/table/vendor-quotations-table";
import { InformationButton } from "@/components/information/information-button"
export const metadata: Metadata = {
- title: "기술영업 해양HULL 견적서 관리",
- description: "기술영업 해양HULL RFQ 견적서를 관리합니다.",
+ title: "기술영업 해양HULL RFQ 관리",
+ description: "기술영업 해양HULL RFQ를 관리합니다.",
};
export default async function VendorQuotationsHullPage() {
@@ -24,7 +24,7 @@ export default async function VendorQuotationsHullPage() {
<div className="text-center">
<h2 className="text-2xl font-bold tracking-tight">로그인이 필요합니다</h2>
<p className="text-muted-foreground">
- 견적서를 확인하려면 로그인해주세요.
+ RFQ를 확인하려면 로그인해주세요.
</p>
</div>
<Button asChild>
@@ -62,12 +62,12 @@ export default async function VendorQuotationsHullPage() {
<div className="flex-shrink-0 flex flex-col gap-4 md:flex-row md:items-center md:justify-between">
<div>
<div className="flex items-center gap-2">
- <h1 className="text-3xl font-bold tracking-tight">기술영업 해양HULL 견적서</h1>
+ <h1 className="text-2xl font-bold tracking-tight">기술영업 해양HULL RFQ</h1>
<InformationButton pagePath="partners/techsales/rfq-offshore-hull" />
</div>
- {/* <p className="text-muted-foreground">
+ <p className="text-muted-foreground">
할당받은 해양HULL RFQ에 대한 견적서를 작성하고 관리합니다.
- </p> */}
+ </p>
</div>
</div>
diff --git a/app/[lng]/partners/(partners)/techsales/rfq-offshore-top/page.tsx b/app/[lng]/partners/(partners)/techsales/rfq-offshore-top/page.tsx
index 015c04fc..36697a3f 100644
--- a/app/[lng]/partners/(partners)/techsales/rfq-offshore-top/page.tsx
+++ b/app/[lng]/partners/(partners)/techsales/rfq-offshore-top/page.tsx
@@ -10,8 +10,8 @@ import { InformationButton } from "@/components/information/information-button"
import { VendorQuotationsTable } from "@/lib/techsales-rfq/vendor-response/table/vendor-quotations-table";
export const metadata: Metadata = {
- title: "기술영업 해양TOP 견적서 관리",
- description: "기술영업 해양TOP RFQ 견적서를 관리합니다.",
+ title: "기술영업 해양TOP RFQ 관리",
+ description: "기술영업 해양TOP RFQ를 관리합니다.",
};
export default async function VendorQuotationsTopPage() {
@@ -64,12 +64,12 @@ export default async function VendorQuotationsTopPage() {
<div className="flex-shrink-0 flex flex-col gap-4 md:flex-row md:items-center md:justify-between">
<div>
<div className="flex items-center gap-2">
- <h1 className="text-3xl font-bold tracking-tight">기술영업 해양TOP 견적서</h1>
+ <h1 className="text-2xl font-bold tracking-tight">기술영업 해양TOP RFQ</h1>
<InformationButton pagePath="partners/techsales/rfq-offshore-top" />
</div>
- {/* <p className="text-muted-foreground">
+ <p className="text-muted-foreground">
할당받은 해양TOP RFQ에 대한 견적서를 작성하고 관리합니다.
- </p> */}
+ </p>
</div>
</div>
diff --git a/app/[lng]/partners/(partners)/techsales/rfq-ship/page.tsx b/app/[lng]/partners/(partners)/techsales/rfq-ship/page.tsx
index ecf2151d..bd3291f4 100644
--- a/app/[lng]/partners/(partners)/techsales/rfq-ship/page.tsx
+++ b/app/[lng]/partners/(partners)/techsales/rfq-ship/page.tsx
@@ -10,8 +10,8 @@ import { Shell } from "@/components/shell";
import { VendorQuotationsTable } from "@/lib/techsales-rfq/vendor-response/table/vendor-quotations-table";
import { InformationButton } from "@/components/information/information-button"
export const metadata: Metadata = {
- title: "기술영업 견적서 관리",
- description: "기술영업 RFQ 견적서를 관리합니다.",
+ title: "기술영업 조선 RFQ 관리",
+ description: "기술영업 조선 RFQ를 관리합니다.",
};
export default async function VendorQuotationsPage() {
@@ -28,7 +28,7 @@ export default async function VendorQuotationsPage() {
<div className="text-center">
<h2 className="text-2xl font-bold tracking-tight">로그인이 필요합니다</h2>
<p className="text-muted-foreground">
- 견적서를 확인하려면 로그인해주세요.
+ RFQ를 확인하려면 로그인해주세요.
</p>
</div>
<Button asChild>
@@ -67,12 +67,12 @@ export default async function VendorQuotationsPage() {
<div className="flex-shrink-0 flex flex-col gap-4 md:flex-row md:items-center md:justify-between">
<div>
<div className="flex items-center gap-2">
- <h1 className="text-3xl font-bold tracking-tight">기술영업 조선 견적서</h1>
+ <h1 className="text-2xl font-bold tracking-tight">기술영업 조선 RFQ</h1>
<InformationButton pagePath="partners/techsales/rfq-ship" />
</div>
- {/* <p className="text-muted-foreground">
+ <p className="text-muted-foreground">
할당받은 조선 RFQ에 대한 견적서를 작성하고 관리합니다.
- </p> */}
+ </p>
</div>
</div>
diff --git a/app/[lng]/sales/(sales)/tech-vendors/[id]/info/items/page.tsx b/app/[lng]/sales/(sales)/tech-vendors/[id]/info/items/page.tsx
deleted file mode 100644
index 69c36576..00000000
--- a/app/[lng]/sales/(sales)/tech-vendors/[id]/info/items/page.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-// import { Separator } from "@/components/ui/separator"
-// import { getTechVendorById, getVendorItemsByType } from "@/lib/tech-vendors/service"
-// import { type SearchParams } from "@/types/table"
-// import { TechVendorItemsTable } from "@/lib/tech-vendors/items-table/item-table"
-
-// interface IndexPageProps {
-// // Next.js 13 App Router에서 기본으로 주어지는 객체들
-// params: {
-// lng: string
-// id: string
-// }
-// searchParams: Promise<SearchParams>
-// }
-
-// export default async function TechVendorItemsPage(props: IndexPageProps) {
-// const resolvedParams = await props.params
-// const id = resolvedParams.id
-
-// const idAsNumber = Number(id)
-
-// // 벤더 정보 가져오기 (벤더 타입 필요)
-// const vendorInfo = await getTechVendorById(idAsNumber)
-// const vendorType = vendorInfo.data?.techVendorType || "조선"
-
-// const promises = getVendorItemsByType(idAsNumber, vendorType)
-
-// // 4) 렌더링
-// return (
-// <div className="space-y-6">
-// <div>
-// <h3 className="text-lg font-medium">
-// 공급품목
-// </h3>
-// <p className="text-sm text-muted-foreground">
-// 기술영업 벤더의 공급 가능한 품목을 확인하세요.
-// </p>
-// </div>
-// <Separator />
-// <div>
-// <TechVendorItemsTable
-// promises={promises}
-// vendorId={idAsNumber}
-// vendorType={vendorType}
-// />
-// </div>
-// </div>
-// )
-// } \ No newline at end of file
diff --git a/app/[lng]/sales/(sales)/tech-vendors/[id]/info/layout.tsx b/app/[lng]/sales/(sales)/tech-vendors/[id]/info/layout.tsx
index 7c389720..b8df24d1 100644
--- a/app/[lng]/sales/(sales)/tech-vendors/[id]/info/layout.tsx
+++ b/app/[lng]/sales/(sales)/tech-vendors/[id]/info/layout.tsx
@@ -32,16 +32,16 @@ export default async function SettingsLayout({
const sidebarNavItems = [
{
title: "연락처",
- href: `/${lng}/evcp/tech-vendors/${id}/info`,
+ href: `/${lng}/sales/tech-vendors/${id}/info`,
+ },
+ {
+ title: "RFQ 히스토리",
+ href: `/${lng}/sales/tech-vendors/${id}/info/rfq-history`,
},
// {
// title: "자재 리스트",
// href: `/${lng}/evcp/tech-vendors/${id}/info/items`,
// },
- // {
- // title: "견적 히스토리",
- // href: `/${lng}/evcp/tech-vendors/${id}/info/rfq-history`,
- // },
]
return (
diff --git a/app/[lng]/sales/(sales)/tech-vendors/[id]/info/rfq-history/page.tsx b/app/[lng]/sales/(sales)/tech-vendors/[id]/info/rfq-history/page.tsx
index 4ed2b39f..a23a988e 100644
--- a/app/[lng]/sales/(sales)/tech-vendors/[id]/info/rfq-history/page.tsx
+++ b/app/[lng]/sales/(sales)/tech-vendors/[id]/info/rfq-history/page.tsx
@@ -1,55 +1,65 @@
-// import { Separator } from "@/components/ui/separator"
-// import { getRfqHistory } from "@/lib/vendors/service"
-// import { type SearchParams } from "@/types/table"
-// import { getValidFilters } from "@/lib/data-table"
-// import { searchParamsRfqHistoryCache } from "@/lib/vendors/validations"
-// import { TechVendorRfqHistoryTable } from "@/lib/tech-vendors/rfq-history-table/rfq-history-table"
-
-// interface IndexPageProps {
-// // Next.js 13 App Router에서 기본으로 주어지는 객체들
-// params: {
-// lng: string
-// id: string
-// }
-// searchParams: Promise<SearchParams>
-// }
-
-// export default async function RfqHistoryPage(props: IndexPageProps) {
-// const resolvedParams = await props.params
-// const lng = resolvedParams.lng
-// const id = resolvedParams.id
-
-// const idAsNumber = Number(id)
-
-// // 2) SearchParams 파싱 (Zod)
-// // - "filters", "page", "perPage", "sort" 등 contact 전용 컬럼
-// const searchParams = await props.searchParams
-// const search = searchParamsRfqHistoryCache.parse(searchParams)
-// const validFilters = getValidFilters(search.filters)
-
-// const promises = Promise.all([
-// getRfqHistory({
-// ...search,
-// filters: validFilters,
-// },
-// idAsNumber)
-// ])
-
-// // 4) 렌더링
-// return (
-// <div className="space-y-6">
-// <div>
-// <h3 className="text-lg font-medium">
-// RFQ History
-// </h3>
-// <p className="text-sm text-muted-foreground">
-// 협력업체의 RFQ 참여 이력을 확인할 수 있습니다.
-// </p>
-// </div>
-// <Separator />
-// <div>
-// <TechVendorRfqHistoryTable promises={promises} vendorId={idAsNumber} />
-// </div>
-// </div>
-// )
-// } \ No newline at end of file
+import { Suspense } from "react"
+import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
+import { Shell } from "@/components/shell"
+import { type SearchParams } from "@/types/table"
+import { getValidFilters } from "@/lib/data-table"
+import { TechVendorRfqHistoryTable } from "@/lib/tech-vendors/rfq-history-table/tech-vendor-rfq-history-table"
+import { getTechVendorRfqHistory } from "@/lib/tech-vendors/service"
+import { searchParamsRfqHistoryCache } from "@/lib/tech-vendors/validations"
+
+interface IndexPageProps {
+ // Next.js 13 App Router에서 기본으로 주어지는 객체들
+ params: {
+ lng: string
+ id: string
+ }
+ searchParams: Promise<SearchParams>
+}
+
+export default async function SettingsAccountPage(props: IndexPageProps) {
+ const resolvedParams = await props.params
+ const id = resolvedParams.id
+
+ const idAsNumber = Number(id)
+
+ // 2) SearchParams 파싱 (Zod)
+ // - "filters", "page", "perPage", "sort" 등 contact 전용 컬럼
+ const searchParams = await props.searchParams
+ const search = searchParamsRfqHistoryCache.parse(searchParams)
+ const validFilters = getValidFilters(search.filters)
+
+
+
+ const promises = Promise.all([
+ getTechVendorRfqHistory({
+ ...search,
+ filters: validFilters,
+ },
+ idAsNumber)
+ ])
+
+ return (
+ <Shell className="gap-2">
+ <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
+ <div>
+ <h1 className="text-2xl font-bold tracking-tight">RFQ 히스토리</h1>
+ <p className="text-muted-foreground">벤더가 참여한 기술영업 RFQ 목록입니다.</p>
+ </div>
+ </div>
+
+ <Suspense
+ fallback={
+ <DataTableSkeleton
+ columnCount={8}
+ searchableColumnCount={1}
+ filterableColumnCount={2}
+ cellWidths={["10rem", "20rem", "10rem", "15rem", "10rem", "10rem", "10rem", "8rem"]}
+ shrinkZero
+ />
+ }
+ >
+ <TechVendorRfqHistoryTable promises={promises} />
+ </Suspense>
+ </Shell>
+ )
+} \ No newline at end of file