1- import { useState } from 'react' ;
1+ import { useState , useMemo } from 'react' ;
22import {
33 useReactTable ,
44 getCoreRowModel ,
55 getPaginationRowModel ,
66 getSortedRowModel ,
7+ getFilteredRowModel ,
78} from '@tanstack/react-table' ;
89import type {
910 PaginationState ,
@@ -14,6 +15,7 @@ import { Plus, Trash2 } from 'lucide-react';
1415
1516import { DataTable , DataTablePagination } from '@/shared/table' ;
1617import { memberColumns } from '../components/memberTable.config' ;
18+ import MemberFilters from '../components/MemberFilters' ;
1719import AddMemberModal from '../components/AddMemberModal' ;
1820import EditMemberModal from '../components/EditMemberModal' ;
1921import DeleteMemberModal from '../components/DeleteMemberModal' ;
@@ -33,6 +35,7 @@ export default function HumanResource() {
3335 } ) ;
3436 const [ rowSelection , setRowSelection ] = useState < RowSelectionState > ( { } ) ;
3537 const [ sorting , setSorting ] = useState < SortingState > ( [ ] ) ;
38+ const [ searchTerm , setSearchTerm ] = useState ( '' ) ;
3639 const [ isAddModalOpen , setIsAddModalOpen ] = useState ( false ) ;
3740 const [ isEditModalOpen , setIsEditModalOpen ] = useState ( false ) ;
3841 const [ selectedMember , setSelectedMember ] = useState < Member | null > ( null ) ;
@@ -45,6 +48,20 @@ export default function HumanResource() {
4548 const deleteMemberMutation = useDeleteMember ( ) ;
4649 const deleteMultipleMembersMutation = useDeleteMultipleMembers ( ) ;
4750
51+ // 검색 필터링된 데이터
52+ const filteredData = useMemo ( ( ) => {
53+ if ( ! searchTerm ) return memberData ;
54+
55+ const lowerSearch = searchTerm . toLowerCase ( ) ;
56+ return memberData . filter ( ( member ) => {
57+ return (
58+ member . name . toLowerCase ( ) . includes ( lowerSearch ) ||
59+ member . userName . toLowerCase ( ) . includes ( lowerSearch ) ||
60+ member . email . toLowerCase ( ) . includes ( lowerSearch )
61+ ) ;
62+ } ) ;
63+ } , [ memberData , searchTerm ] ) ;
64+
4865 // --- 이벤트 핸들러 ---
4966 const handleAddMember = ( ) => {
5067 setIsAddModalOpen ( true ) ;
@@ -100,7 +117,7 @@ export default function HumanResource() {
100117
101118 // --- 테이블 인스턴스 ---
102119 const table = useReactTable ( {
103- data : memberData ,
120+ data : filteredData ,
104121 columns : memberColumns ,
105122 state : { pagination, rowSelection, sorting } ,
106123 onPaginationChange : setPagination ,
@@ -109,6 +126,7 @@ export default function HumanResource() {
109126 getCoreRowModel : getCoreRowModel ( ) ,
110127 getPaginationRowModel : getPaginationRowModel ( ) ,
111128 getSortedRowModel : getSortedRowModel ( ) ,
129+ getFilteredRowModel : getFilteredRowModel ( ) ,
112130 enableRowSelection : true ,
113131 meta : {
114132 onEdit : handleEditMember ,
@@ -138,6 +156,12 @@ export default function HumanResource() {
138156
139157 { /* 메인 컨텐츠 */ }
140158 < main className = "flex-1 overflow-y-auto p-8" >
159+ { /* 검색 필터 */ }
160+ < MemberFilters
161+ searchTerm = { searchTerm }
162+ onSearchChange = { setSearchTerm }
163+ />
164+
141165 { /* 대량 작업 버튼 */ }
142166 { selectedCount > 0 && (
143167 < div className = "mb-4 flex items-center gap-2" >
0 commit comments