From d0d2eaa2de58a0c33e9a21604b126961403cd69e Mon Sep 17 00:00:00 2001 From: dujinkim Date: Wed, 14 May 2025 06:12:13 +0000 Subject: (최겸) 기술영업 조선, 해양Top, 해양 Hull 아이템 리스트 개발(CRUD, excel import/export/template) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/items-tech/table/top/offshore-top-table.tsx | 153 ++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 lib/items-tech/table/top/offshore-top-table.tsx (limited to 'lib/items-tech/table/top/offshore-top-table.tsx') diff --git a/lib/items-tech/table/top/offshore-top-table.tsx b/lib/items-tech/table/top/offshore-top-table.tsx new file mode 100644 index 00000000..dedf766a --- /dev/null +++ b/lib/items-tech/table/top/offshore-top-table.tsx @@ -0,0 +1,153 @@ +"use client" + +import * as React from "react" +import type { + DataTableFilterField, + DataTableAdvancedFilterField, + DataTableRowAction, +} from "@/types/table" + +import { useDataTable } from "@/hooks/use-data-table" +import { DataTable } from "@/components/data-table/data-table" +import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar" +import { getOffshoreTopItems } from "../../service" +import { getOffshoreTopColumns } from "./offshore-top-table-columns" +import { OffshoreTopTableToolbarActions } from "./offshore-top-table-toolbar-actions" +import { DeleteItemsDialog } from "../delete-items-dialog" +import { UpdateItemSheet } from "../update-items-sheet" + +// 서비스에서 반환하는 데이터 타입 정의 +type OffshoreTopItem = { + id: number; + itemId: number; + workType: "TM" | "TS" | "TE" | "TP"; + itemList1: string | null; + itemList2: string | null; + itemList3: string | null; + itemList4: string | null; + itemCode: string; + itemName: string; + description: string | null; + createdAt: Date; + updatedAt: Date; +} + +interface OffshoreTopTableProps { + promises: Promise>> +} + +export function OffshoreTopTable({ promises }: OffshoreTopTableProps) { + const { data, pageCount } = React.use(promises) + + // 아이템 타입에 따른 행 액션 상태 관리 + const [rowAction, setRowAction] = React.useState | null>(null) + const columns = getOffshoreTopColumns({ setRowAction }) + const filterFields: DataTableFilterField[] = [ + { + id: "itemCode", + label: "Item Code", + }, + { + id: "itemName", + label: "Item Name", + }, + { + id: "workType", + label: "기능(공종)", + }, + { + id: "itemList1", + label: "아이템 리스트 1", + }, + ] + + const advancedFilterFields: DataTableAdvancedFilterField[] = [ + { + id: "itemCode", + label: "Item Code", + type: "text", + }, + { + id: "itemName", + label: "Item Name", + type: "text", + }, + { + id: "description", + label: "Description", + type: "text", + }, + { + id: "workType", + label: "기능(공종)", + type: "text", + }, + { + id: "itemList1", + label: "아이템 리스트 1", + type: "text", + }, + { + id: "itemList2", + label: "아이템 리스트 2", + type: "text", + }, + { + id: "itemList3", + label: "아이템 리스트 3", + type: "text", + }, + { + id: "itemList4", + label: "아이템 리스트 4", + type: "text", + }, + ] + + const { table } = useDataTable({ + data: data as OffshoreTopItem[], + columns, + pageCount, + filterFields, + enablePinning: true, + enableAdvancedFilter: true, + initialState: { + sorting: [{ id: "createdAt", desc: true }], + columnPinning: { right: ["actions"] }, + }, + getRowId: (originalRow) => String(originalRow.id), + shallow: false, + clearOnDefault: true, + }) + + return ( + <> + + + + + + setRowAction(null)} + items={rowAction?.row.original ? [rowAction?.row.original] : []} + showTrigger={false} + onSuccess={() => rowAction?.row.toggleSelected(false)} + itemType="offshoreTop" + /> + + {rowAction?.type === "update" && rowAction.row.original && ( + setRowAction(null)} + /> + )} + + ) +} \ No newline at end of file -- cgit v1.2.3