diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-17 10:50:52 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-17 10:50:52 +0000 |
| commit | 2ef02e27dbe639876fa3b90c30307dda183545ec (patch) | |
| tree | e132ae7f3dd774e1ce767291c2849be4a63ae762 /app | |
| parent | fb276ed3db86fe4fc0c0fcd870fd3d085b034be0 (diff) | |
(최겸) 기술영업 변경사항 적용
Diffstat (limited to 'app')
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 |
