From a070f833d132e6370311c0bbdad03beb51d595df Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Wed, 15 Oct 2025 21:38:21 +0900 Subject: (김준회) 이메일 화이트리스트 (SMS 우회) 기능 추가 및 기존 로그인 과정 통합 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/email-whitelist/table/whitelist-table.tsx | 130 ++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 lib/email-whitelist/table/whitelist-table.tsx (limited to 'lib/email-whitelist/table/whitelist-table.tsx') diff --git a/lib/email-whitelist/table/whitelist-table.tsx b/lib/email-whitelist/table/whitelist-table.tsx new file mode 100644 index 00000000..5d623669 --- /dev/null +++ b/lib/email-whitelist/table/whitelist-table.tsx @@ -0,0 +1,130 @@ +"use client" + +import * as React from "react" +import type { + DataTableAdvancedFilterField, + DataTableFilterField, + 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 { getColumns } from "./whitelist-table-columns" +import { type EmailWhitelist } from "../service" +import { getEmailWhitelistList } from "../service" +import { UpdateWhitelistDialog } from "./update-whitelist-dialog" +import { CreateWhitelistDialog } from "./create-whitelist-dialog" +import { DeleteWhitelistDialog } from "./delete-whitelist-dialog" + +interface WhitelistTableProps { + promises: Promise< + [ + Awaited>, + ] + > +} + +export function WhitelistTable({ promises }: WhitelistTableProps) { + const [{ data, pageCount }] = React.use(promises) + + const [rowAction, setRowAction] = + React.useState | null>(null) + + const [showCreateDialog, setShowCreateDialog] = React.useState(false) + + const columns = React.useMemo( + () => getColumns({ setRowAction }), + [setRowAction] + ) + + /** + * 기본 필터 필드 (드롭다운 형태) + */ + const filterFields: DataTableFilterField[] = [] + + /** + * 고급 필터 필드 (검색, 날짜 등) + */ + const advancedFilterFields: DataTableAdvancedFilterField[] = [ + { + id: "displayValue", + label: "이메일/도메인", + type: "text", + }, + { + id: "description", + label: "설명", + type: "text", + }, + { + id: "createdAt", + label: "생성일", + type: "date", + }, + { + id: "updatedAt", + label: "수정일", + type: "date", + }, + ] + + const { table } = useDataTable({ + data, + columns, + pageCount, + filterFields, + enableAdvancedFilter: true, + initialState: { + sorting: [{ id: "createdAt", desc: true }], + columnPinning: { right: ["actions"] }, + }, + getRowId: (originalRow) => String(originalRow.id), + shallow: false, + clearOnDefault: true, + }) + + return ( + <> + + + + + + + + {/* 도메인 수정 Dialog */} + setRowAction(null)} + whitelist={rowAction?.type === "update" ? rowAction.row.original : null} + /> + + {/* 도메인 삭제 Dialog */} + setRowAction(null)} + whitelists={rowAction?.type === "delete" ? [rowAction.row.original] : []} + showTrigger={false} + onSuccess={() => { + setRowAction(null) + // 테이블 새로고침은 server action에서 자동으로 처리됨 + }} + /> + + ) +} -- cgit v1.2.3