diff options
Diffstat (limited to 'lib/techsales-rfq/table/rfq-table.tsx')
| -rw-r--r-- | lib/techsales-rfq/table/rfq-table.tsx | 117 |
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 |
