본문으로 건너뛰기
패턴

선택 · 일괄 처리

DataTable 의 줄을 체크박스로 골라 한 번에 처리한다. SelectionProvider 가 선택 상태를 갖고, 머리칸의 SelectAllCheckbox, 줄의 RowCheckbox 와 SelectableRow, 목록 아래의 BulkBar 가 그 상태를 읽는다. 표 칸은 서버에서 렌더하고 이 요소들만 클라이언트 컴포넌트로 들어간다. 일괄 처리 단추는 useSelection() 으로 고른 id 를 읽는다.

활용 방법

목록과 일괄 처리 바

줄을 하나라도 고르면 목록 아래에 개수, 처리 단추, 선택 해제 단추가 있는 바가 나타난다. 머리칸 체크박스는 일부만 골랐을 때 대시로 표시된다.

Preview

발주 요청5건

품목상태금액
볼트 M8대기₩96,000
너트 M8대기₩40,000
와셔 8mm승인₩30,000
볼트 M10대기₩128,000
앵커 볼트반려₩54,000
tsx
<SelectionProvider ids={rows.map((row) => row.id)}>
<Panel title="발주 요청" count={`${rows.length}건`} flush>
<DataTable minWidth={560}>
<thead>
<tr>
<th><SelectAllCheckbox /></th>
<th>품목</th>
</tr>
</thead>
<tbody>
{rows.map((row) => (
<SelectableRow key={row.id} id={row.id}>
<td><RowCheckbox id={row.id} label={row.name} /></td>
<td>{row.name}</td>
</SelectableRow>
))}
</tbody>
</DataTable>
</Panel>
<BulkBar noun="건">
<OrderBulkActions />
</BulkBar>
</SelectionProvider>
// 클라이언트 컴포넌트
function OrderBulkActions() {
const { selectedIds, clear } = useSelection();
return <BulkBarButton onClick={() => approve(selectedIds).then(clear)}>승인</BulkBarButton>;
}

검색으로 줄이 바뀔 때

ids 에서 빠진 줄의 선택은 버린다. 검색으로 숨긴 줄은 일괄 처리 대상이 아니고, 검색을 지워 다시 보여도 선택되지 않은 상태로 돌아온다.

Preview

발주 요청5건

품목상태금액
볼트 M8대기₩96,000
너트 M8대기₩40,000
와셔 8mm승인₩30,000
볼트 M10대기₩128,000
앵커 볼트반려₩54,000
tsx
const rows = allRows.filter((row) => row.name.includes(query));
<SelectionProvider ids={rows.map((row) => row.id)}>
<Panel toolbar={<SearchInput value={query} onChange={(e) => setQuery(e.target.value)} />} flush>
…
</Panel>
</SelectionProvider>

사용 지침

  • · 표는 서버 컴포넌트로 두고 체크박스, SelectableRow, BulkBar 만 클라이언트 경계 안에 둔다.
  • · 일괄 처리는 화면에 보이는 줄에만 적용된다. 모든 쪽을 한 번에 고르는 선택은 제공하지 않는다.
  • · 처리가 끝나면 useSelection() 의 clear 로 선택을 비워 바를 닫는다.
  • · 선택 상태는 SelectionProvider 가 가진다. 바깥에서 선택을 정해 넣는 controlled 사용은 지원하지 않는다.

속성

이름타입기본값설명
SelectionProvider idsreadonly string[]-지금 보이는 줄의 id. 전체 선택의 대상이고, 바뀌면 빠진 id 의 선택을 버린다
useSelection(){ selectedIds: string[]; count: number; clear: () => void }-고른 id(화면 순서), 개수, 선택 해제. SelectionProvider 밖에서 부르면 오류
SelectAllCheckbox labelstring-접근 가능한 이름. 보이는 글자는 그리지 않는다. 기본 「모두 선택」
RowCheckbox id · labelstring · string-선택 키와 줄 이름. 접근 가능한 이름은 「label 선택」
SelectableRow idstring-선택 키. DOM id 가 아니다. 선택되면 tr 에 data-selected 를 붙인다. 나머지 tr 속성과 ref 전달
BulkBar nounstring-개수 뒤 단위. 기본 「개」. 0개면 바를 그리지 않는다. className · native props · ref 는 바깥 div 에 적용
BulkBarButtonbutton 속성-바 안의 단추. type 기본값 button. ref 전달