summaryrefslogtreecommitdiff
path: root/lib/techsales-rfq/table/rfq-table.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/techsales-rfq/table/rfq-table.tsx')
-rw-r--r--lib/techsales-rfq/table/rfq-table.tsx117
1 files changed, 89 insertions, 28 deletions
diff --git a/lib/techsales-rfq/table/rfq-table.tsx b/lib/techsales-rfq/table/rfq-table.tsx
index 3139b1a3..496d7901 100644
--- a/lib/techsales-rfq/table/rfq-table.tsx
+++ b/lib/techsales-rfq/table/rfq-table.tsx
@@ -16,11 +16,11 @@ import {
import { useDataTable } from "@/hooks/use-data-table"
import { DataTable } from "@/components/data-table/data-table"
-import { getColumns, EditingCellState } from "./rfq-table-column"
-import { useEffect, useCallback, useMemo } from "react"
+import { getColumns } from "./rfq-table-column"
+import { useEffect, useMemo } from "react"
import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar"
import { RFQTableToolbarActions } from "./rfq-table-toolbar-actions"
-import { getTechSalesRfqsWithJoin } from "@/lib/techsales-rfq/service"
+import { getTechSalesRfqsWithJoin, getTechSalesRfqAttachments } from "@/lib/techsales-rfq/service"
import { toast } from "sonner"
import { useTablePresets } from "@/components/data-table/use-table-presets"
import { TablePresetManager } from "@/components/data-table/data-table-preset"
@@ -28,6 +28,7 @@ import { RfqDetailTables } from "./detail-table/rfq-detail-table"
import { cn } from "@/lib/utils"
import { ProjectDetailDialog } from "./project-detail-dialog"
import { RFQFilterSheet } from "./rfq-filter-sheet"
+import { TechSalesRfqAttachmentsSheet, ExistingTechSalesAttachment } from "./tech-sales-rfq-attachments-sheet"
// 기본적인 RFQ 타입 정의 (repository selectTechSalesRfqsWithJoin 반환 타입에 맞춤)
interface TechSalesRfq {
@@ -50,8 +51,8 @@ interface TechSalesRfq {
updatedByName: string
sentBy: number | null
sentByName: string | null
- projectSnapshot: any
- seriesSnapshot: any
+ projectSnapshot: Record<string, unknown>
+ seriesSnapshot: Record<string, unknown>
pspid: string
projNm: string
sector: string
@@ -61,7 +62,7 @@ interface TechSalesRfq {
quotationCount: number
// 필요에 따라 다른 필드들 추가
// eslint-disable-next-line @typescript-eslint/no-explicit-any
- [key: string]: any
+ [key: string]: unknown
}
interface RFQListTableProps {
@@ -87,6 +88,11 @@ export function RFQListTable({
const [isProjectDetailOpen, setIsProjectDetailOpen] = React.useState(false)
const [projectDetailRfq, setProjectDetailRfq] = React.useState<TechSalesRfq | null>(null)
+ // 첨부파일 시트 상태
+ const [attachmentsOpen, setAttachmentsOpen] = React.useState(false)
+ const [selectedRfqForAttachments, setSelectedRfqForAttachments] = React.useState<TechSalesRfq | null>(null)
+ const [attachmentsDefault, setAttachmentsDefault] = React.useState<ExistingTechSalesAttachment[]>([])
+
// 패널 collapse 상태
const [panelHeight, setPanelHeight] = React.useState<number>(55)
@@ -112,7 +118,6 @@ export function RFQListTable({
const tableData = promiseData
const [rowAction, setRowAction] = React.useState<DataTableRowAction<TechSalesRfq> | null>(null)
- const [editingCell, setEditingCell] = React.useState<EditingCellState | null>(null)
// 초기 설정 정의
const initialSettings = React.useMemo(() => ({
@@ -148,20 +153,6 @@ export function RFQListTable({
getCurrentSettings,
} = useTablePresets<TechSalesRfq>('rfq-list-table', initialSettings)
- // 비고 업데이트 함수
- const updateRemark = useCallback(async (rfqId: number, remark: string) => {
- try {
- // 기술영업 RFQ 비고 업데이트 함수 구현 필요
- // const result = await updateTechSalesRfqRemark(rfqId, remark);
- console.log("Update remark for RFQ:", rfqId, "with:", remark);
-
- toast.success("비고가 업데이트되었습니다");
- } catch (error) {
- console.error("비고 업데이트 오류:", error);
- toast.error("업데이트 중 오류가 발생했습니다");
- }
- }, [])
-
// 조회 버튼 클릭 핸들러
const handleSearch = () => {
setIsFilterPanelOpen(false)
@@ -205,7 +196,7 @@ export function RFQListTable({
quotationCount: rfqData.quotationCount,
});
break;
- case "project-detail":
+ case "view":
// 프로젝트 상세정보 다이얼로그 열기
const projectRfqData = rowAction.row.original;
setProjectDetailRfq({
@@ -228,8 +219,8 @@ export function RFQListTable({
updatedByName: projectRfqData.updatedByName,
sentBy: projectRfqData.sentBy,
sentByName: projectRfqData.sentByName,
- projectSnapshot: projectRfqData.projectSnapshot,
- seriesSnapshot: projectRfqData.seriesSnapshot,
+ projectSnapshot: projectRfqData.projectSnapshot || {},
+ seriesSnapshot: projectRfqData.seriesSnapshot || {},
pspid: projectRfqData.pspid,
projNm: projectRfqData.projNm,
sector: projectRfqData.sector,
@@ -251,14 +242,75 @@ export function RFQListTable({
}
}, [rowAction])
+ // 첨부파일 시트 열기 함수
+ const openAttachmentsSheet = React.useCallback(async (rfqId: number) => {
+ try {
+ // 선택된 RFQ 찾기
+ const rfq = tableData?.data?.find(r => r.id === rfqId)
+ if (!rfq) {
+ toast.error("RFQ를 찾을 수 없습니다.")
+ return
+ }
+
+ // 실제 첨부파일 목록 조회 API 호출
+ const result = await getTechSalesRfqAttachments(rfqId)
+
+ if (result.error) {
+ toast.error(result.error)
+ return
+ }
+
+ // API 응답을 ExistingTechSalesAttachment 형식으로 변환
+ const attachments: ExistingTechSalesAttachment[] = result.data.map(att => ({
+ id: att.id,
+ techSalesRfqId: att.techSalesRfqId || rfqId, // null인 경우 rfqId 사용
+ fileName: att.fileName,
+ originalFileName: att.originalFileName,
+ filePath: att.filePath,
+ fileSize: att.fileSize || undefined,
+ fileType: att.fileType || undefined,
+ attachmentType: att.attachmentType as "RFQ_COMMON" | "VENDOR_SPECIFIC",
+ description: att.description || undefined,
+ createdBy: att.createdBy,
+ createdAt: att.createdAt,
+ }))
+
+ setAttachmentsDefault(attachments)
+ setSelectedRfqForAttachments({
+ ...rfq,
+ projectSnapshot: rfq.projectSnapshot || {},
+ seriesSnapshot: rfq.seriesSnapshot || {},
+ })
+ setAttachmentsOpen(true)
+ } catch (error) {
+ console.error("첨부파일 조회 오류:", error)
+ toast.error("첨부파일 조회 중 오류가 발생했습니다.")
+ }
+ }, [tableData?.data])
+
+ // 첨부파일 업데이트 콜백
+ const handleAttachmentsUpdated = React.useCallback((rfqId: number, newAttachmentCount: number) => {
+ // TODO: 실제로는 테이블 데이터를 다시 조회하거나 상태를 업데이트해야 함
+ // 현재는 로그만 출력하고 토스트 메시지로 피드백 제공
+ console.log(`RFQ ${rfqId}의 첨부파일 개수가 ${newAttachmentCount}개로 업데이트됨`)
+
+ // 성공 피드백 (중복되지 않도록 짧은 지연 후 표시)
+ setTimeout(() => {
+ toast.success(`첨부파일 개수가 업데이트되었습니다. (${newAttachmentCount}개)`, {
+ duration: 3000
+ })
+ }, 500)
+
+ // TODO: 나중에 실제 테이블 데이터 업데이트 로직 구현
+ // 예: setTableData() 또는 데이터 재조회
+ }, [])
+
const columns = React.useMemo(
() => getColumns({
setRowAction,
- editingCell,
- setEditingCell,
- updateRemark
+ openAttachmentsSheet
}),
- [editingCell, setEditingCell, updateRemark]
+ [openAttachmentsSheet]
)
// 고급 필터 필드 정의
@@ -519,6 +571,15 @@ export function RFQListTable({
// eslint-disable-next-line @typescript-eslint/no-explicit-any
selectedRfq={projectDetailRfq as any}
/>
+
+ {/* 첨부파일 관리 시트 */}
+ <TechSalesRfqAttachmentsSheet
+ open={attachmentsOpen}
+ onOpenChange={setAttachmentsOpen}
+ defaultAttachments={attachmentsDefault}
+ rfq={selectedRfqForAttachments}
+ onAttachmentsUpdated={handleAttachmentsUpdated}
+ />
</div>
)
} \ No newline at end of file