"use client" import * as React from "react" import { userRoles, type UserView } from "@/db/schema/users" import type { DataTableAdvancedFilterField, DataTableFilterField, DataTableRowAction, } from "@/types/table" import { toSentenceCase } from "@/lib/utils" 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 { DataTableToolbar } from "@/components/data-table/data-table-toolbar" import type { getAllRoles, getUsersAll, getUsersEVCP } from "@/lib//users/service" import { getColumns } from "./assginedUsers-table-columns" type TableMode = "assign" | "remove" interface UsersTableProps { promises: Promise< [ Awaited> ] > onSelectedChange: any mode?: TableMode // 새로 추가: assign | remove currentRoleName?: string // 새로 추가: 현재 선택된 롤 ID (필터링용) showAllUsers?: boolean // 디버깅용: 모든 사용자 표시 } export function AssginedUserTable({ promises, onSelectedChange, mode = "assign", currentRoleName, showAllUsers = false }: UsersTableProps) { const [{ data: rawData, pageCount }] = React.use(promises) // 모드에 따라 데이터 필터링 const filteredData = React.useMemo(() => { console.log('🔍 Filtering Debug Info:', { mode, currentRoleName, rawDataLength: rawData?.length, sampleUser: rawData?.[0], showAllUsers }) // 디버깅용: 모든 사용자 표시 if (showAllUsers) { console.log('🔧 Debug mode: showing all users') return rawData } if (!currentRoleName || !rawData) { console.log('❌ No currentRoleId or rawData, returning rawData') return rawData } if (mode === "assign") { // assign 모드: 현재 롤에 할당되지 않은 사용자들만 표시 const filtered = rawData.filter(user => { if (!user.roles || !Array.isArray(user.roles)) { console.log('✅ User has no roles, including in assign:', user.user_name) return true } // 다양한 roles 구조 지원 const hasRole = user.roles.some(role => { if (typeof role === 'string') return role === currentRoleName.toString() return false }) if (!hasRole) { console.log('✅ User does not have role, including in assign:', user.user_name) } return !hasRole }) console.log(`📊 Assign mode: ${filtered.length} users available`) return filtered } else { // remove 모드: 현재 롤에 할당된 사용자들만 표시 const filtered = rawData.filter(user => { if (!user.roles || !Array.isArray(user.roles)) { console.log('❌ User has no roles, excluding from remove:', user.user_name) return false } // 다양한 roles 구조 지원 const hasRole = user.roles.some(role => { if (typeof role === 'string') return role === currentRoleName.toString() return false }) if (hasRole) { console.log('✅ User has role, including in remove:', user.user_name, 'roles:', user.roles) } return hasRole }) console.log(`📊 Remove mode: ${filtered.length} users with role`) return filtered } }, [rawData, mode, currentRoleName, showAllUsers]) const [rowAction, setRowAction] = React.useState | null>(null) const columns = React.useMemo( () => getColumns({ setRowAction }), [setRowAction] ) /** * This component can render either a faceted filter or a search filter based on the `options` prop. * * @prop options - An array of objects, each representing a filter option. If provided, a faceted filter is rendered. If not, a search filter is rendered. * * Each `option` object has the following properties: * @prop {string} label - The label for the filter option. * @prop {string} value - The value for the filter option. * @prop {React.ReactNode} [icon] - An optional icon to display next to the label. * @prop {boolean} [withCount] - An optional boolean to display the count of the filter option. */ const filterFields: DataTableFilterField[] = [ { id: "user_email", label: "Email", placeholder: "Filter email...", }, ] /** * Advanced filter fields for the data table. * These fields provide more complex filtering options compared to the regular filterFields. * * Key differences from regular filterFields: * 1. More field types: Includes 'text', 'multi-select', 'date', and 'boolean'. * 2. Enhanced flexibility: Allows for more precise and varied filtering options. * 3. Used with DataTableAdvancedToolbar: Enables a more sophisticated filtering UI. * 4. Date and boolean types: Adds support for filtering by date ranges and boolean values. */ const advancedFilterFields: DataTableAdvancedFilterField[] = [ { id: "user_name", label: "User Name", type: "text", }, { id: "user_email", label: "Email", type: "text", }, { id: "created_at", label: "Created at", type: "date", }, ] const { table } = useDataTable({ data: filteredData, // 필터링된 데이터 사용 columns, pageCount, filterFields, enablePinning: true, enableAdvancedFilter: true, initialState: { sorting: [{ id: "created_at", desc: true }], columnPinning: { right: ["actions"] }, }, getRowId: (originalRow) => `${originalRow.user_id}`, shallow: false, clearOnDefault: true, }) const rowSelection = table.getState().rowSelection function shallowEqual(arrA: number[], arrB: number[]): boolean { if (arrA.length !== arrB.length) return false for (let i = 0; i < arrA.length; i++) { if (arrA[i] !== arrB[i]) return false } return true } const previousUserIdsRef = React.useRef([]) React.useEffect(() => { // 선택 상태가 바뀌었을 때만 실행 if (!onSelectedChange) return const rows = table.getSelectedRowModel().rows const newUserIds = rows.map((r) => r.original.user_id) // 이전/새 userIds 비교 if (!shallowEqual(previousUserIdsRef.current, newUserIds)) { previousUserIdsRef.current = newUserIds onSelectedChange(newUserIds) } }, [rowSelection, onSelectedChange]) // 모드 변경시 선택 초기화 React.useEffect(() => { table.toggleAllPageRowsSelected(false) setRowAction(null) }, [mode, table]) return ( <> {/* 빈 데이터 상태 메시지 */} {filteredData && filteredData.length === 0 && (
{mode === "assign" ? "🎯 모든 사용자가 이미 이 롤에 할당되어 있습니다" : "👥 이 롤에 할당된 사용자가 없습니다" }
{mode === "assign" ? "할당 가능한 사용자가 없습니다" : "제거할 사용자가 없습니다" }
)} ) }