Componentes do Design System para mostrar dados — IGRPDataTable com células, filtros e ações, gráficos, cards e indicadores.
Componentes para listar, resumir e visualizar dados. Esta página é a vista de código: imports, props e exemplos.
Secção em construção
Esta página cobre os componentes principais; o resto do catálogo será completado. Para configurar estes componentes no Studio (sem código), vê Widgets do Page Builder.
Componentes principais
IGRPDataTable
Tabela de dados com ordenação, filtros, paginação, linhas expansíveis e ações por linha, construída sobre o TanStack Table.
Gerado pelo Studio| Prop | Tipo | Por defeito | Descrição |
|---|---|---|---|
columns | ColumnDef<TData, TValue>[] | — | Definição das colunas (TanStack Table). Tem de ser estável: define fora do componente ou com useMemo. |
data | TData[] | — | Linhas. Também tem de ser estável entre renders. |
showFilter / clientFilters | boolean / IGRPDataTableClientFilterListProps<TData>[] | false / — | Mostra a barra de filtros e define um componente de filtro por coluna. |
showPagination / isNumericPagination | boolean | false | Paginação simples (anterior/seguinte) ou numérica. |
pageSizePagination | number[] | [50, 100, 150, 200] | Tamanhos de página disponíveis; o primeiro é o inicial. |
actions | IGRPDataTableAction<TData>[] | — | Ações por linha (link, alert, modal, custom). Até 2 aparecem como botões; mais de 2 vão para um menu. |
getRowCanExpand / renderSubComponent | (row) => boolean / (row) => ReactElement | () => false | Linhas expansíveis e o conteúdo mostrado ao expandir. |
onQueryChange / rowCount | (query: IGRPDataTableQuery) => void / number | — | Modo servidor: recebe página, tamanho, ordenação e filtros sempre que mudam. |
'use client';
import { useMemo } from 'react';
import type { ColumnDef } from '@tanstack/react-table';
import {
IGRPDataTable,
IGRPDataTableHeaderSortToggle,
IGRPDataTableCellBadge,
IGRPDataTableCellAmount,
IGRPDataTableCellDate,
IGRPDataTableFilterInput,
IGRPDataTableFilterFaceted,
IGRPDataTableFacetedFilterFn,
type IGRPDataTableAction,
} from '@igrp/igrp-framework-react-design-system';
type Pedido = { id: string; cliente: string; estado: string; valor: number; data: string };
export function PedidosTable({ pedidos }: { pedidos: Pedido[] }) {
const columns = useMemo<ColumnDef<Pedido>[]>(() => [
{
accessorKey: 'cliente',
header: ({ column }) => <IGRPDataTableHeaderSortToggle column={column} title="Cliente" />,
},
{
accessorKey: 'estado',
header: 'Estado',
filterFn: IGRPDataTableFacetedFilterFn,
cell: ({ row }) => (
<IGRPDataTableCellBadge
label={row.getValue('estado')}
color={row.getValue('estado') === 'Pago' ? 'success' : 'warning'}
variant="soft"
/>
),
},
{
accessorKey: 'valor',
header: 'Valor',
cell: ({ row }) => <IGRPDataTableCellAmount field={String(row.getValue('valor'))} currency="EUR" />,
},
{
accessorKey: 'data',
header: 'Data',
cell: ({ row }) => <IGRPDataTableCellDate date={row.getValue('data')} />,
},
], []);
const actions: IGRPDataTableAction<Pedido>[] = [
{ type: 'link', label: 'Ver', icon: 'Eye', href: (row) => `/pedidos/${row.original.id}` },
{
type: 'alert',
label: 'Anular',
icon: 'Trash2',
title: 'Anular pedido?',
description: 'Esta ação não pode ser desfeita.',
onConfirm: async (row) => { /* chamar a API */ },
},
];
return (
<IGRPDataTable
columns={columns}
data={pedidos}
actions={actions}
showFilter
clientFilters={[
{ columnId: 'cliente', component: ({ column }) => <IGRPDataTableFilterInput column={column} placeholder="Procurar cliente" /> },
{
columnId: 'estado',
component: ({ column }) => (
<IGRPDataTableFilterFaceted
column={column}
placeholder="Estado"
options={[{ label: 'Pago', value: 'Pago' }, { label: 'Pendente', value: 'Pendente' }]}
/>
),
},
]}
showPagination
/>
);
}Os componentes auxiliares abaixo são usados dentro de columns (cabeçalhos e células), de clientFilters (filtros) ou numa coluna de ações. O widget Tabela do Studio gera-os a partir da configuração das colunas — ver Widget Tabela e Coluna de Ações.
Cabeçalhos
| Componente | Para quê | Props principais |
|---|---|---|
IGRPDataTableHeaderSortToggle | Título clicável que alterna a ordenação asc/desc | column, title |
IGRPDataTableHeaderSortDropdown | Título com menu Asc/Desc | column, title |
IGRPDataTableHeaderRowsSelect | Checkbox "selecionar todas" da página | table |
IGRPDataTableHeaderDefault | Título simples, sem ordenação | title |
Células
| Componente | Para quê | Props principais |
|---|---|---|
IGRPDataTableCellBadge | Estado como badge | label, color, variant, size |
IGRPDataTableCellAmount | Número/moeda formatado com Intl.NumberFormat | field (texto numérico), currency ("USD"), formatStyle ("currency"), language |
IGRPDataTableCellDate | Data formatada com Intl.DateTimeFormat | date, dateOptions, language (dateFormat está descontinuado) |
IGRPDataTableCellLink | Ligação | href, target, showIcon, iconName |
IGRPDataTableCellTooltip | Texto truncado com tooltip | text, side, align |
IGRPDataTableCellCheckbox / IGRPDataTableCellSwitch | Seleção da linha | row |
IGRPDataTableCellExpander | Botão para expandir a linha (com renderSubComponent) | row, label |
Filtros
| Componente | Para quê | Props principais |
|---|---|---|
IGRPDataTableFilterInput | Texto livre | column, placeholder, iconName |
IGRPDataTableFilterSelect | Seleção única | column, options, placeholder |
IGRPDataTableFilterDropdown | Seleção única com pesquisa | column, options, showFilter, notFoundText |
IGRPDataTableFilterFaceted | Seleção múltipla com contagens | column, options, labelFilter, labelSearchField |
IGRPDataTableFilterMinMax | Intervalo numérico | column, placeholder, placeholderMax |
IGRPDataTableFilterDate | Intervalo de datas | column, placeholder, clearDates |
IGRPDataTableFacetedFilterFn | filterFn da coluna para o filtro facetado (o valor está numa lista) | — |
IGRPDataTableDateRangeFilterFn | filterFn da coluna para o filtro de datas (from/to) | — |
Ações por linha
A forma recomendada é a prop actions (exemplo acima). Para montar a coluna de ações à mão:
| Componente | Para quê | Props principais |
|---|---|---|
IGRPDataTableRowAction | Contentor dos botões de ação (com tooltips) | children |
IGRPDataTableButtonLink | Botão-ícone que navega ou executa uma ação | labelTrigger, icon, href, action |
IGRPDataTableButtonAlert | Botão-ícone que pede confirmação | labelTrigger, icon, modalTitle, onClickConfirm, children |
IGRPDataTableButtonModal | Botão-ícone que abre um modal | labelTrigger, icon, modalTitle, render |
IGRPDataTableDropdownMenu | Menu "⋯" com várias ações | items ({ component, props }), iconName |
IGRPDataTableDropdownMenuLink / …Alert / …Custom | Itens do menu | labelTrigger, icon, href ou modalTitle |
IGRPVerticalBarChart
Gráfico de barras verticais. Todos os gráficos partilham as mesmas props base (IGRPChartProps) e diferem na configuração das séries.
| Prop | Tipo | Por defeito | Descrição |
|---|---|---|---|
data | IGRPChartDataItem[] | — | Linhas (Record<string, string | number>). |
categoryKey | string | — | Campo usado no eixo das categorias. |
bars | IGRPBarConfig[] | — | Uma série por barra: dataKey, name, color, stackId, radius. |
title / description | string | — | Cabeçalho do card do gráfico. |
size / height | "sm" | "md" | "lg" | "xl" | "auto" / number | string | "md" / — | Tamanho do gráfico. |
legendPosition | "top" | "right" | "bottom" | "left" | "none" | "none" | Posição da legenda. |
showGrid / stacked | boolean | false | Grelha de fundo; barras empilhadas. |
valueFormatter | (value: number) => string | — | Formata os valores no eixo e no tooltip. |
<IGRPVerticalBarChart
title="Pedidos por mês"
data={[
{ mes: 'Jan', pagos: 120, pendentes: 30 },
{ mes: 'Fev', pagos: 98, pendentes: 41 },
]}
categoryKey="mes"
bars={[
{ dataKey: 'pagos', name: 'Pagos' },
{ dataKey: 'pendentes', name: 'Pendentes' },
]}
legendPosition="bottom"
showGrid
/>As outras variantes usam as mesmas props base:
| Componente | Configuração das séries | Props próprias |
|---|---|---|
IGRPHorizontalBarChart | bars: IGRPBarConfig[] | barRadius, barGap |
IGRPAreaChart | areas: IGRPAreaConfig[] (type, fillOpacity, gradient) | expanded |
IGRPLineChart | lines: LineConfig[] | — |
IGRPPieChart | pies: PieConfig[] (innerRadius, outerRadius, showLabels, labelType…) | nameKey, centerLabel |
IGRPRadarChart | radars: IGRPRadarConfig[] (fill, fillOpacity, dot) | angleAxisKey, polarGridType |
IGRPRadialBarChart | bars: RadialBarConfig[] (cornerRadius, background, showLabels) | nameKey, startAngle |
As cores das séries vêm dos tokens --chart-1 … --chart-8 — ver Instalação e tema.
IGRPCard
Superfície de conteúdo com cabeçalho, corpo e rodapé.
Gerado pelo Studio| Prop | Tipo | Por defeito | Descrição |
|---|---|---|---|
name / id | string | id gerado | Identificador do card no DOM. |
className | string | — | Classes adicionais. |
children | ReactNode | — | Use IGRPCardHeader, IGRPCardTitle, IGRPCardDescription, IGRPCardAction, IGRPCardContent, IGRPCardFooter. |
<IGRPCard>
<IGRPCardHeader>
<IGRPCardTitle>Resumo</IGRPCardTitle>
<IGRPCardDescription>Últimos 30 dias</IGRPCardDescription>
</IGRPCardHeader>
<IGRPCardContent>…</IGRPCardContent>
<IGRPCardFooter>
<IGRPButton variant="outline">Ver tudo</IGRPButton>
</IGRPCardFooter>
</IGRPCard>IGRPStatsCard
Card de indicador: um título, um valor e um ícone ou imagem.
Gerado pelo Studio| Prop | Tipo | Por defeito | Descrição |
|---|---|---|---|
title | string | — | Nome do indicador. |
value | string | number | — | Valor mostrado. |
iconName / showIcon | IGRPIconName | string / boolean | "Box" / true | Ícone Lucide. |
iconVariant / showIconBackground | IGRPColorVariants / boolean | "primary" / false | Cor do ícone e fundo colorido. |
cardVariant / cardBorderPosition | IGRPColorVariants / "none" | "top" | "bottom" | "left" | "right" | "primary" / "none" | Cor e posição da borda de destaque. |
valueSize | "sm" | "base" | "lg" | "xl" | "2xl"… | "2xl" | Tamanho do valor. |
onClick | () => void | — | Torna o card clicável. |
<IGRPStatsCard
title="Pedidos pendentes"
value={42}
iconName="Clock"
iconVariant="warning"
showIconBackground
iconBackground="rounded"
cardVariant="warning"
cardBorderPosition="left"
/>IGRPInfoCard
Card de leitura com pares rótulo/valor organizados em secções — típico de páginas de detalhe.
Gerado pelo Studio| Prop | Tipo | Por defeito | Descrição |
|---|---|---|---|
title | string | — | Título do card. |
sections | IGRPInfoSection[] | — | Secções; cada uma com items: IGRPInfoItem[] (label, text, icon, showIcon, colorItem). |
orientation | "horizontal" | "vertical" | "vertical" | Rótulo por cima ou ao lado do valor. |
columns | 1 | 2 | 3 | 1 | Colunas da grelha (adaptam-se à largura do card). |
variantSection / colorSection | IGRPColorRole / IGRPColorVariants | — | Cor das secções. |
<IGRPInfoCard
title="Dados do pedido"
columns={2}
sections={[
{
items: [
{ label: 'Cliente', text: 'Ana Silva', icon: 'User', showIcon: true },
{ label: 'Estado', text: 'Pendente' },
{ label: 'Data', text: '12/03/2026' },
],
},
]}
/>IGRPBadge
Etiqueta para estados, categorias e contagens.
Gerado pelo Studio| Prop | Tipo | Por defeito | Descrição |
|---|---|---|---|
variant | "solid" | "soft" | "outline" | "solid" | Estilo. |
color | "primary" | "secondary" | "success" | "destructive" | "warning" | "info" | "indigo" | "primary" | Cor semântica. |
size | "sm" | "md" | "lg" | "sm" | Tamanho. |
dot | boolean | false | Ponto colorido antes do texto. |
showIcon / iconName | boolean / string | false / "Info" | Ícone Lucide. |
<IGRPBadge color="success" variant="soft" dot>Ativo</IGRPBadge>Outros componentes
| Componente | Para quê | Widget no Studio |
|---|---|---|
IGRPCardDetails | Card com uma lista de pares label/content, com botão de copiar opcional (showCopyTo) | Card Details |
IGRPAvatar | Imagem de perfil com fallback, estado e badge (src, fallback, size, hasStatus, status) | Avatar |
IGRPStatusBanner (Custom) | Faixa de estado no topo de uma página ou secção | Status Banner |
IGRPStatsCardMini (Custom) | Indicador compacto | — |
IGRPStatsCardTopBorderColored (Custom) | Indicador com borda superior colorida | — |
IGRPUserAvatar (Custom) | Avatar com nome do utilizador | — |
Última atualização:
