Hoppa till huvudinnehåll

Tanstack Table

När du behöver mer avancerade funktioner för tabeller rekommenderar vi att du använder Tanstack Table. Det är ett kraftfullt "headless"-verktyg, vilket innebär att det inte renderar någon markup eller stilar åt dig. Detta ger dig full kontroll över tabellens utseende, och vi har tillhandahållit stilar för att säkerställa att den matchar Midas utseende och känsla.

Stilarna för Tanstack Table är just nu i en tidig version och är ett arbete som pågår. Tanstack Table är inte en del av kärnbiblioteket i Midas, vilket innebär att supporten är begränsad. Vi är öppna för kodbidrag till vårt repo och tar gärna emot förslag på stilar som saknas när du implementerar Tanstack Table.

När du ska använda Tanstack Table

Använd Tanstack Table när du behöver funktioner som:

  • Paginering
  • Sortering
  • Filtrering
  • Radmarkering
  • Kolumnordning
  • Och mycket mer!

För enklare tabeller som inte kräver denna funktionalitet kan du använda den grundläggande Midas-tabellkomponenten.

Komma igång

För att använda Tanstack Table med Midas-stilar måste du först installera de nödvändiga beroendena:

npm install @tanstack/react-table @midas-ds/table-styles

Importera sedan Midas-stilarna för tabellen:

@import '@midas-ds/table-styles/tanstack-table.css';

Använd class midas-tanstack-table:

<table className={'midas-tanstack-table'}>...</table>

Här är ett minimalt exempel för att komma igång:

import { useReactTable, getCoreRowModel, flexRender, ColumnDef } from '@tanstack/react-table'
import '@midas-ds/table-styles/tanstack-table.css'

type Person = {
name: string
age: number
}

const columns: ColumnDef<Person>[] = [
{ accessorKey: 'name', header: 'Namn' },
{ accessorKey: 'age', header: 'Ålder' },
]

const data: Person[] = [
{ name: 'Anna', age: 28 },
{ name: 'Erik', age: 35 },
]

function MyTable() {
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
})

return (
<table className='midas-tanstack-table'>
<thead>
{table.getHeaderGroups().map(headerGroup => (
<tr key={headerGroup.id}>
{headerGroup.headers.map(header => (
<th key={header.id}>{flexRender(header.column.columnDef.header, header.getContext())}</th>
))}
</tr>
))}
</thead>
<tbody>
{table.getRowModel().rows.map(row => (
<tr key={row.id}>
{row.getVisibleCells().map(cell => (
<td key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</td>
))}
</tr>
))}
</tbody>
</table>
)
}

Användbara länkar

Här är några resurser som hjälper dig att komma igång med TanStack Table:

  • TanStack Table v8 Docs: Den officiella dokumentationen är den bästa platsen att lära sig om alla funktioner och hur man använder dem.
  • Exempel: En stor samling exempel som visar hur man implementerar olika funktioner.

Exempel

Paginering

Midas erbjuder en färdig komponent som jackar in i Tanstack tables API för paginering.

import { Pagination } from '@midas-ds/table-styles'
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
getPaginationRowModel: getPaginationRowModel(),
initialState: {
pagination: {
pageIndex: 0,
pageSize: 10,
},
},
})

const {
pagination: { pageIndex, pageSize },
} = table.getState()


return (
<table>
...
</table>
<Pagination
getCanNextPage={table.getCanNextPage}
getCanPreviousPage={table.getCanPreviousPage}
getPageCount={table.getPageCount}
getRowCount={table.getRowCount}
nextPage={table.nextPage}
pageIndex={pageIndex}
pageSize={pageSize}
previousPage={table.previousPage}
setPageIndex={table.setPageIndex}
setPageSize={table.setPageSize}
/>
)
ID
Name
Email
Age
1Person 1person1@example.com20
2Person 2person2@example.com21
3Person 3person3@example.com22
4Person 4person4@example.com23
5Person 5person5@example.com24
6Person 6person6@example.com25
7Person 7person7@example.com26
8Person 8person8@example.com27
9Person 9person9@example.com28
10Person 10person10@example.com29
1 - 10 of 100 rows
of 10 pages

Läs mer om paginering i Tanstack Table's dokumentation.

Sortering

Tanstack Table har inbyggt stöd för sortering med getSortedRowModel. Klicka på kolumnrubrikerna för att sortera tabellen.

ID
Förnamn
Efternamn
E-post
Avdelning
Status
0DockBergeOrie88@gmail.comMarketingInactive
1AddieBotsfordJosefina.Upton66@gmail.comHRActive
2MauricioGrantBrenda_Roob72@yahoo.comMarketingInactive
3RowanGreenfelderHarold_Boyer53@hotmail.comHRInactive
4KassandraCasperMargarett_Kub@gmail.comMarketingPending
5HeidiWolffEna_Rempel45@hotmail.comEngineeringPending
6MarcellusSchambergerBrielle_Kunze@yahoo.comMarketingActive
7CathrineTowneKatherine_Ondricka@hotmail.comEngineeringActive
8ChaimReingerNella59@hotmail.comEngineeringPending
9EveKingBud.Luettgen@yahoo.comHRInactive
10MeredithCarrollRegan.VonRueden18@hotmail.comEngineeringPending
11LonieFriesenErvin_Stracke@gmail.comFinancePending
12ElvaMcKenzieEmelie.King97@yahoo.comHRInactive
13JairoMcGlynnJosie.Bins-Weber@hotmail.comHRActive
14TobySchroeder-GleichnerDavin_Hettinger@hotmail.comFinanceActive
15JamarSengerGisselle_Stark36@yahoo.comHRInactive
16NikitaHermistonChasity_Ebert@hotmail.comHRPending
17QuintenDareElinore34@yahoo.comSalesPending
18ToreyJacobsonFatima73@yahoo.comSalesInactive
19EmilBarrowsDayton.Wuckert96@gmail.comEngineeringPending
20ArdenBahringerPasquale.Grady@yahoo.comMarketingPending
21HoracioCassinFederico20@hotmail.comHRPending
22ChandlerRussel-MurazikEdmund.McGlynn@gmail.comMarketingInactive
23HassieKrisOctavia_Krajcik@yahoo.comFinanceActive
24GayleTowneNyah_Borer56@gmail.comSalesInactive
25MargaritaMcGlynnKyler16@yahoo.comMarketingInactive
26FletcherBartolettiJudson.Bednar-Emmerich@yahoo.comEngineeringPending
27DorotheaGrimesKenna22@hotmail.comMarketingInactive
28JonKeelingOdell15@hotmail.comHRActive
29BrooklynStromanJaclyn20@yahoo.comMarketingPending
30ToyBoscoSofia67@yahoo.comSalesActive
31JaclynSpinkaNoe.Volkman@gmail.comSalesInactive

I detta exempel används:

  • sorting state för att hålla reda på vilka kolumner som är sorterade och i vilken riktning
  • getSortedRowModel() för att hantera sorteringen
  • column.getToggleSortingHandler() för att växla sorteringsriktning vid klick
  • column.getIsSorted() för att visa rätt sorteringsikon
  • ArrowUp, ArrowDown, och ArrowUpDown från lucide-react som sorteringsindikatorer
  • Klasserna sortable-header och sort-icon-neutral för att få rätt hover-beteende

Viktigt att notera: Sorteringsikonen (ArrowUpDown) är dold som standard och visas automatiskt vid hover tack vare stilarna i tanstack-table.css. När en kolumn är sorterad visas ArrowUp eller ArrowDown istället.

Läs mer om sortering i Tanstack Table's dokumentation.

Filtrering

Tanstack Table har inbyggt stöd för filtrering med getFilteredRowModel. Du kan använda alla standardformulärkomponenter från Midas för att skapa filterkontrollen.

IDFörnamnEfternamnE-postAvdelningStatus
0DockBergeOrie88@gmail.comMarketingInactive
1AddieBotsfordJosefina.Upton66@gmail.comHRActive
2MauricioGrantBrenda_Roob72@yahoo.comMarketingInactive
3RowanGreenfelderHarold_Boyer53@hotmail.comHRInactive
4KassandraCasperMargarett_Kub@gmail.comMarketingPending
5HeidiWolffEna_Rempel45@hotmail.comEngineeringPending
6MarcellusSchambergerBrielle_Kunze@yahoo.comMarketingActive
7CathrineTowneKatherine_Ondricka@hotmail.comEngineeringActive
8ChaimReingerNella59@hotmail.comEngineeringPending
9EveKingBud.Luettgen@yahoo.comHRInactive
10MeredithCarrollRegan.VonRueden18@hotmail.comEngineeringPending
11LonieFriesenErvin_Stracke@gmail.comFinancePending
12ElvaMcKenzieEmelie.King97@yahoo.comHRInactive
13JairoMcGlynnJosie.Bins-Weber@hotmail.comHRActive
14TobySchroeder-GleichnerDavin_Hettinger@hotmail.comFinanceActive
15JamarSengerGisselle_Stark36@yahoo.comHRInactive
16NikitaHermistonChasity_Ebert@hotmail.comHRPending
17QuintenDareElinore34@yahoo.comSalesPending
18ToreyJacobsonFatima73@yahoo.comSalesInactive
19EmilBarrowsDayton.Wuckert96@gmail.comEngineeringPending
20ArdenBahringerPasquale.Grady@yahoo.comMarketingPending
21HoracioCassinFederico20@hotmail.comHRPending
22ChandlerRussel-MurazikEdmund.McGlynn@gmail.comMarketingInactive
23HassieKrisOctavia_Krajcik@yahoo.comFinanceActive
24GayleTowneNyah_Borer56@gmail.comSalesInactive
25MargaritaMcGlynnKyler16@yahoo.comMarketingInactive
26FletcherBartolettiJudson.Bednar-Emmerich@yahoo.comEngineeringPending
27DorotheaGrimesKenna22@hotmail.comMarketingInactive
28JonKeelingOdell15@hotmail.comHRActive
29BrooklynStromanJaclyn20@yahoo.comMarketingPending
30ToyBoscoSofia67@yahoo.comSalesActive
31JaclynSpinkaNoe.Volkman@gmail.comSalesInactive

I detta exempel används:

  • globalFilter för textsökning över flera kolumner
  • columnFilters för att filtrera på specifika kolumner
  • getFilteredRowModel() för att hantera filtreringen

Läs mer om filtrering i Tanstack Table's dokumentation.

Kolumnsynlighet

Tanstack Table gör det enkelt att låta användare välja vilka kolumner som ska visas med columnVisibility state.

{
table.getAllLeafColumns().map(column => (
<Checkbox
key={column.id}
isSelected={column.getIsVisible()}
onChange={isSelected => column.toggleVisibility(isSelected)}
>
{typeof column.columnDef.header === 'string' ? column.columnDef.header : column.id}
</Checkbox>
))
}
IDFörnamnEfternamnE-postAvdelningStatus
0DockBergeOrie88@gmail.comMarketingInactive
1AddieBotsfordJosefina.Upton66@gmail.comHRActive
2MauricioGrantBrenda_Roob72@yahoo.comMarketingInactive
3RowanGreenfelderHarold_Boyer53@hotmail.comHRInactive
4KassandraCasperMargarett_Kub@gmail.comMarketingPending
5HeidiWolffEna_Rempel45@hotmail.comEngineeringPending
6MarcellusSchambergerBrielle_Kunze@yahoo.comMarketingActive
7CathrineTowneKatherine_Ondricka@hotmail.comEngineeringActive
8ChaimReingerNella59@hotmail.comEngineeringPending
9EveKingBud.Luettgen@yahoo.comHRInactive
10MeredithCarrollRegan.VonRueden18@hotmail.comEngineeringPending
11LonieFriesenErvin_Stracke@gmail.comFinancePending
12ElvaMcKenzieEmelie.King97@yahoo.comHRInactive
13JairoMcGlynnJosie.Bins-Weber@hotmail.comHRActive
14TobySchroeder-GleichnerDavin_Hettinger@hotmail.comFinanceActive
15JamarSengerGisselle_Stark36@yahoo.comHRInactive
16NikitaHermistonChasity_Ebert@hotmail.comHRPending
17QuintenDareElinore34@yahoo.comSalesPending
18ToreyJacobsonFatima73@yahoo.comSalesInactive
19EmilBarrowsDayton.Wuckert96@gmail.comEngineeringPending
20ArdenBahringerPasquale.Grady@yahoo.comMarketingPending
21HoracioCassinFederico20@hotmail.comHRPending
22ChandlerRussel-MurazikEdmund.McGlynn@gmail.comMarketingInactive
23HassieKrisOctavia_Krajcik@yahoo.comFinanceActive
24GayleTowneNyah_Borer56@gmail.comSalesInactive
25MargaritaMcGlynnKyler16@yahoo.comMarketingInactive
26FletcherBartolettiJudson.Bednar-Emmerich@yahoo.comEngineeringPending
27DorotheaGrimesKenna22@hotmail.comMarketingInactive
28JonKeelingOdell15@hotmail.comHRActive
29BrooklynStromanJaclyn20@yahoo.comMarketingPending
30ToyBoscoSofia67@yahoo.comSalesActive
31JaclynSpinkaNoe.Volkman@gmail.comSalesInactive
Kolumnsynlighet kan också läggas i en popover:

I detta exempel används:

  • columnVisibility state för att hålla reda på vilka kolumner som är synliga
  • column.getIsVisible() för att kontrollera om en kolumn är synlig
  • column.getToggleVisibilityHandler() för att växla synlighet

Läs mer om kolumnsynlighet i Tanstack Table's dokumentation.

Drag and Drop-kolumner

Med hjälp av @dnd-kit kan du låta användare ordna om kolumner genom att dra och släppa dem. Detta ger en intuitiv och användarvänlig upplevelse för att anpassa tabellens layout.

Först, installera de nödvändiga beroendena:

npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities @dnd-kit/modifiers
ID
Förnamn
Efternamn
E-post
Avdelning
Status
0DockBergeOrie88@gmail.comMarketingInactive
1AddieBotsfordJosefina.Upton66@gmail.comHRActive
2MauricioGrantBrenda_Roob72@yahoo.comMarketingInactive
3RowanGreenfelderHarold_Boyer53@hotmail.comHRInactive
4KassandraCasperMargarett_Kub@gmail.comMarketingPending
5HeidiWolffEna_Rempel45@hotmail.comEngineeringPending
6MarcellusSchambergerBrielle_Kunze@yahoo.comMarketingActive
7CathrineTowneKatherine_Ondricka@hotmail.comEngineeringActive
8ChaimReingerNella59@hotmail.comEngineeringPending
9EveKingBud.Luettgen@yahoo.comHRInactive
10MeredithCarrollRegan.VonRueden18@hotmail.comEngineeringPending
11LonieFriesenErvin_Stracke@gmail.comFinancePending
12ElvaMcKenzieEmelie.King97@yahoo.comHRInactive
13JairoMcGlynnJosie.Bins-Weber@hotmail.comHRActive
14TobySchroeder-GleichnerDavin_Hettinger@hotmail.comFinanceActive
15JamarSengerGisselle_Stark36@yahoo.comHRInactive
16NikitaHermistonChasity_Ebert@hotmail.comHRPending
17QuintenDareElinore34@yahoo.comSalesPending
18ToreyJacobsonFatima73@yahoo.comSalesInactive
19EmilBarrowsDayton.Wuckert96@gmail.comEngineeringPending
20ArdenBahringerPasquale.Grady@yahoo.comMarketingPending
21HoracioCassinFederico20@hotmail.comHRPending
22ChandlerRussel-MurazikEdmund.McGlynn@gmail.comMarketingInactive
23HassieKrisOctavia_Krajcik@yahoo.comFinanceActive
24GayleTowneNyah_Borer56@gmail.comSalesInactive
25MargaritaMcGlynnKyler16@yahoo.comMarketingInactive
26FletcherBartolettiJudson.Bednar-Emmerich@yahoo.comEngineeringPending
27DorotheaGrimesKenna22@hotmail.comMarketingInactive
28JonKeelingOdell15@hotmail.comHRActive
29BrooklynStromanJaclyn20@yahoo.comMarketingPending
30ToyBoscoSofia67@yahoo.comSalesActive
31JaclynSpinkaNoe.Volkman@gmail.comSalesInactive

I detta exempel används:

  • columnOrder state för att hålla reda på ordningen av kolumnerna
  • DndContext för att hantera drag and drop-funktionalitet
  • SortableContext för att göra kolumner sorterbara
  • useSortable hook för att göra individuella kolumner draggbara
  • arrayMove från @dnd-kit/sortable för att ordna om kolumnerna
  • GripVertical från lucide-react som drag-ikon som visas vid hover
  • Klassen drag-handle för att få rätt hover-beteende

Viktigt att notera: Drag-ikonen är dold som standard och visas automatiskt vid hover över kolumnrubriken tack vare stilarna i tanstack-table.css.

Läs mer om column ordering i Tanstack Table's dokumentation.