Pular para o conteúdo principal

Table

O componente apresenta dados distribuídos em linhas e colunas, apresentando-os de uma forma que permite uma fácil leitura, comparação e escaneamento das informações.

Boas práticas

  • Colunas onde é possível fazer a ordenação devem apresentar o ícone de ordenação ao lado direito da label.
  • O Paginator só deve ser apresentado quando há paginação (mais de 10 itens).

Tabela de dados

Uma tabela que gera automaticamente linhas com base na propriedade de columns e dá suporte ao estado de ordenação e estados de carregamento.

IDNameAge
1MARIA MACHADO DE JESUS42
2JOSÉ DA SILVA MOREIRA34
3ALICE BARBOSA27
4MARIA MACHADO DE JESUS42
5JOSÉ DA SILVA MOREIRA34
6ALICE BARBOSA27
7MARIA MACHADO DE JESUS42
8JOSÉ DA SILVA MOREIRA34
9ALICE BARBOSA27
import { Button, DataTable, Icon } from '@lemonade/ui'
import React, { useState } from 'react'

interface RowType {
  id: number
  name: string
  age: number
}

function DataTableExample() {
  const [sort, setSort] = useState(['id'])

  const rows = allRows
    // Naive sorting for example purposes:
    .sort((a, b) => {
      if (sort[0] === 'id') {
        return a.id - b.id
      }
      if (sort[0] === '-id') {
        return b.id - a.id
      }
      return 0
    })

  return (
    <DataTable<RowType>
      rows={rows}
      sort={sort}
      onSortChange={setSort}
      loading={false}
      columns={[
        {
          name: 'id',
          header: 'ID',
          sortable: true,
          render: item => item.id,
        },
        {
          name: 'name',
          header: 'Name',
          render: item => item.name,
        },
        {
          name: 'age',
          header: 'Age',
          render: item => item.age,
        },
        {
          name: 'actions',
          align: 'right',
          render: item => (
            <Button size='small' skin='ghost'>
              <Icon icon='penOutline' />
            </Button>
          ),
        },
      ]}
    />
  )
}

export default DataTableExample

// Fake data to populate table
let id = 1
const allRows: RowType[] = Array(3)
  .fill(true)
  .reduce(
    curr => [
      ...curr,
      { id: id++, name: 'MARIA MACHADO DE JESUS', age: 42 },
      { id: id++, name: 'JOSÉ DA SILVA MOREIRA', age: 34 },
      { id: id++, name: 'ALICE BARBOSA', age: 27 },
    ],
    [] as RowType[]
  )

Tabela paginada

Uma Tabela de dados que inclui um componente de paginação no rodapé.

IDNameAge
1MARIA MACHADO DE JESUS42
2JOSÉ DA SILVA MOREIRA34
3ALICE BARBOSA27
4MARIA MACHADO DE JESUS42
5JOSÉ DA SILVA MOREIRA34
6ALICE BARBOSA27
7MARIA MACHADO DE JESUS42
8JOSÉ DA SILVA MOREIRA34
9ALICE BARBOSA27
10MARIA MACHADO DE JESUS42
90 results
Mostrar:
of 9
import { Button, Icon, PagedTable } from '@lemonade/ui'
import React, { useState } from 'react'

interface RowType {
  id: number
  name: string
  age: number
}

function PagedTableExample() {
  const [params, setParams] = useState({
    page: 0,
    size: 10,
    totalElements: allRows.length,
    totalPages: allRows.length / 10,
    sort: ['id'],
  })

  const handleSortChange = (sort: string[]) => setParams(state => ({ ...state, sort }))
  const handlePageChange = (page: number) => setParams(state => ({ ...state, page }))
  const handleSizeChange = (size: number) =>
    setParams(state => ({ ...state, size, totalPages: Math.max(1, Math.ceil(state.totalElements / size)) }))

  const rows = allRows
    // Naive sorting for example purposes:
    .sort((a, b) => {
      if (params.sort[0] === 'id') {
        return a.id - b.id
      }
      if (params.sort[0] === '-id') {
        return b.id - a.id
      }
      return 0
    })
    // Naive pagination for example purposes:
    .slice(params.page * params.size, params.page * params.size + params.size)

  return (
    <PagedTable<RowType>
      rows={rows}
      page={params.page}
      size={params.size}
      totalElements={params.totalElements}
      totalPages={params.totalPages}
      sort={params.sort}
      onSortChange={handleSortChange}
      onPageChange={handlePageChange}
      onSizeChange={handleSizeChange}
      loading={false}
      columns={[
        {
          name: 'id',
          header: 'ID',
          sortable: true,
          render: item => item.id,
        },
        {
          name: 'name',
          header: 'Name',
          render: item => item.name,
        },
        {
          name: 'age',
          header: 'Age',
          render: item => item.age,
        },
        {
          name: 'actions',
          align: 'right',
          render: item => (
            <Button size='small' skin='ghost'>
              <Icon icon='penOutline' />
            </Button>
          ),
        },
      ]}
    />
  )
}

export default PagedTableExample

// Fake data to populate table
let id = 1
const allRows: RowType[] = Array(30)
  .fill(true)
  .reduce(
    curr => [
      ...curr,
      { id: id++, name: 'MARIA MACHADO DE JESUS', age: 42 },
      { id: id++, name: 'JOSÉ DA SILVA MOREIRA', age: 34 },
      { id: id++, name: 'ALICE BARBOSA', age: 27 },
    ],
    [] as RowType[]
  )