Table

데이터를 행과 열로 표시하는 테이블 컴포넌트입니다. 정렬, 선택, 페이지네이션 등 다양한 기능을 지원합니다.

설치

Terminal
npx @msub-core/ui-cli add table

사용법

TSX
import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@msub-core/ui/components/table"

function MyTable() {
  return (
    <Table>
      <TableHeader>
        <TableRow>
          <TableHead>이름</TableHead>
          <TableHead>이메일</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>김철수</TableCell>
          <TableCell>[email protected]</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  )
}

Table Props

PropTypeDefaultRequiredDescription
variant"default" | "striped" | "bordered""default"No테이블 스타일 변형
size"sm" | "default" | "lg""default"No셀 크기
hoverablebooleantrueNo행 호버 효과
stickyHeaderbooleanfalseNo헤더 고정
maxHeightstring | number-No컨테이너 최대 높이

기본 테이블

이름이메일역할상태
김철수[email protected]관리자활성
이영희[email protected]사용자활성
박민수[email protected]사용자비활성
정수진[email protected]게스트활성
최동혁[email protected]사용자활성

Striped 변형

이름이메일가입일
김철수[email protected]2024-01-15
이영희[email protected]2024-02-20
박민수[email protected]2024-03-10
정수진[email protected]2024-03-25
최동혁[email protected]2024-04-01

Bordered 변형

이름이메일가입일
김철수[email protected]2024-01-15
이영희[email protected]2024-02-20
박민수[email protected]2024-03-10
정수진[email protected]2024-03-25
최동혁[email protected]2024-04-01

크기

Small

이름이메일
김철수[email protected]
이영희[email protected]

Default

이름이메일
김철수[email protected]
이영희[email protected]

Large

이름이메일
김철수[email protected]
이영희[email protected]

정렬 가능한 헤더

TableHead에 sortable prop을 추가하여 정렬 기능을 활성화합니다.

이메일
김철수[email protected]2024-01-15
이영희[email protected]2024-02-20
박민수[email protected]2024-03-10
정수진[email protected]2024-03-25
최동혁[email protected]2024-04-01

선택 가능한 행

TableCheckbox를 사용하여 행 선택 기능을 구현합니다. useRangeSelection 훅을 사용하면 Shift+클릭으로 범위 선택이 가능합니다.

이름이메일역할
김철수[email protected]관리자
이영희[email protected]사용자
박민수[email protected]사용자
정수진[email protected]게스트
최동혁[email protected]사용자

💡 Tip: 첫 번째 행을 클릭한 후, Shift 키를 누른 채로 다른 행을 클릭하면 그 사이의 모든 행이 선택됩니다.

빈 상태

이름이메일역할

데이터가 없습니다

새로운 사용자를 추가해보세요.

로딩 상태

이름이메일역할

고정 헤더

stickyHeader와 maxHeight를 사용하여 스크롤 시 헤더를 고정합니다.

이름이메일가입일
사용자 1[email protected]2024-01-01
사용자 2[email protected]2024-02-02
사용자 3[email protected]2024-03-03
사용자 4[email protected]2024-04-04
사용자 5[email protected]2024-05-05
사용자 6[email protected]2024-06-06
사용자 7[email protected]2024-07-07
사용자 8[email protected]2024-08-08
사용자 9[email protected]2024-09-09
사용자 10[email protected]2024-10-10
사용자 11[email protected]2024-11-11
사용자 12[email protected]2024-12-12
사용자 13[email protected]2024-01-13
사용자 14[email protected]2024-02-14
사용자 15[email protected]2024-03-15
사용자 16[email protected]2024-04-16
사용자 17[email protected]2024-05-17
사용자 18[email protected]2024-06-18
사용자 19[email protected]2024-07-19
사용자 20[email protected]2024-08-20

DataTable

DataTable은 정렬, 선택, 페이지네이션이 통합된 고수준 테이블 컴포넌트입니다.

TSX
import { DataTable, type ColumnDef } from "@msub-core/ui/components/table"

const columns: ColumnDef<User>[] = [
  { id: "name", header: "이름", accessorKey: "name", sortable: true },
  { id: "email", header: "이메일", accessorKey: "email" },
  { id: "role", header: "역할", cell: (row) => <Badge>{row.role}</Badge> },
]

function MyDataTable() {
  const [selectedIds, setSelectedIds] = useState([])
  const [page, setPage] = useState(1)

  return (
    <DataTable
      columns={columns}
      data={users}
      selectable
      selectedIds={selectedIds}
      onSelectionChange={setSelectedIds}
      pagination
      page={page}
      pageSize={10}
      totalItems={users.length}
      onPageChange={setPage}
    />
  )
}

DataTable Props

PropTypeDefaultRequiredDescription
columnsColumnDef<T>[]-No컬럼 정의 배열
dataT[]-No데이터 배열 (각 항목에 id 필수)
loadingbooleanfalseNo로딩 상태
selectablebooleanfalseNo행 선택 기능
selectedIds(string | number)[]-No선택된 행 ID
onSelectionChange(ids) => void-No선택 변경 핸들러
sortColumnstring-No정렬 컬럼 ID
sortDirection"asc" | "desc" | null-No정렬 방향
onSortChange(column, direction) => void-No정렬 변경 핸들러
paginationbooleanfalseNo페이지네이션 표시
pagenumber1No현재 페이지
pageSizenumber10No페이지당 항목 수
totalItemsnumber-No전체 항목 수
onPageChange(page) => void-No페이지 변경 핸들러
onRowClick(row, index) => void-No행 클릭 핸들러

DataTable 전체 예제

이메일상태
사용자 1[email protected]관리자비활성2024-01-01
사용자 2[email protected]사용자활성2024-02-02
사용자 3[email protected]게스트활성2024-03-03
사용자 4[email protected]관리자활성2024-04-04
사용자 5[email protected]사용자비활성2024-05-05
사용자 6[email protected]게스트활성2024-06-06
사용자 7[email protected]관리자활성2024-07-07
사용자 8[email protected]사용자활성2024-08-08
사용자 9[email protected]게스트비활성2024-09-09
사용자 10[email protected]관리자활성2024-10-10
1-10 / 50개
표시:
1 / 5