iGRPIGRP 3.0Documentation

Dados

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
PropTipoPor defeitoDescrição
columnsColumnDef<TData, TValue>[]—Definição das colunas (TanStack Table). Tem de ser estável: define fora do componente ou com useMemo.
dataTData[]—Linhas. Também tem de ser estável entre renders.
showFilter / clientFiltersboolean / IGRPDataTableClientFilterListProps<TData>[]false / —Mostra a barra de filtros e define um componente de filtro por coluna.
showPagination / isNumericPaginationbooleanfalsePaginação simples (anterior/seguinte) ou numérica.
pageSizePaginationnumber[][50, 100, 150, 200]Tamanhos de página disponíveis; o primeiro é o inicial.
actionsIGRPDataTableAction<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() => falseLinhas 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

ComponentePara quêProps principais
IGRPDataTableHeaderSortToggleTítulo clicável que alterna a ordenação asc/desccolumn, title
IGRPDataTableHeaderSortDropdownTítulo com menu Asc/Desccolumn, title
IGRPDataTableHeaderRowsSelectCheckbox "selecionar todas" da páginatable
IGRPDataTableHeaderDefaultTítulo simples, sem ordenaçãotitle

Células

ComponentePara quêProps principais
IGRPDataTableCellBadgeEstado como badgelabel, color, variant, size
IGRPDataTableCellAmountNúmero/moeda formatado com Intl.NumberFormatfield (texto numérico), currency ("USD"), formatStyle ("currency"), language
IGRPDataTableCellDateData formatada com Intl.DateTimeFormatdate, dateOptions, language (dateFormat está descontinuado)
IGRPDataTableCellLinkLigaçãohref, target, showIcon, iconName
IGRPDataTableCellTooltipTexto truncado com tooltiptext, side, align
IGRPDataTableCellCheckbox / IGRPDataTableCellSwitchSeleção da linharow
IGRPDataTableCellExpanderBotão para expandir a linha (com renderSubComponent)row, label

Filtros

ComponentePara quêProps principais
IGRPDataTableFilterInputTexto livrecolumn, placeholder, iconName
IGRPDataTableFilterSelectSeleção únicacolumn, options, placeholder
IGRPDataTableFilterDropdownSeleção única com pesquisacolumn, options, showFilter, notFoundText
IGRPDataTableFilterFacetedSeleção múltipla com contagenscolumn, options, labelFilter, labelSearchField
IGRPDataTableFilterMinMaxIntervalo numéricocolumn, placeholder, placeholderMax
IGRPDataTableFilterDateIntervalo de datascolumn, placeholder, clearDates
IGRPDataTableFacetedFilterFnfilterFn da coluna para o filtro facetado (o valor está numa lista)—
IGRPDataTableDateRangeFilterFnfilterFn 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:

ComponentePara quêProps principais
IGRPDataTableRowActionContentor dos botões de ação (com tooltips)children
IGRPDataTableButtonLinkBotão-ícone que navega ou executa uma açãolabelTrigger, icon, href, action
IGRPDataTableButtonAlertBotão-ícone que pede confirmaçãolabelTrigger, icon, modalTitle, onClickConfirm, children
IGRPDataTableButtonModalBotão-ícone que abre um modallabelTrigger, icon, modalTitle, render
IGRPDataTableDropdownMenuMenu "⋯" com várias açõesitems ({ component, props }), iconName
IGRPDataTableDropdownMenuLink / …Alert / …CustomItens do menulabelTrigger, 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.

Gerado pelo Studio
PropTipoPor defeitoDescrição
dataIGRPChartDataItem[]—Linhas (Record<string, string | number>).
categoryKeystring—Campo usado no eixo das categorias.
barsIGRPBarConfig[]—Uma série por barra: dataKey, name, color, stackId, radius.
title / descriptionstring—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 / stackedbooleanfalseGrelha 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:

ComponenteConfiguração das sériesProps próprias
IGRPHorizontalBarChartbars: IGRPBarConfig[]barRadius, barGap
IGRPAreaChartareas: IGRPAreaConfig[] (type, fillOpacity, gradient)expanded
IGRPLineChartlines: LineConfig[]—
IGRPPieChartpies: PieConfig[] (innerRadius, outerRadius, showLabels, labelType…)nameKey, centerLabel
IGRPRadarChartradars: IGRPRadarConfig[] (fill, fillOpacity, dot)angleAxisKey, polarGridType
IGRPRadialBarChartbars: 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
PropTipoPor defeitoDescrição
name / idstringid geradoIdentificador do card no DOM.
classNamestring—Classes adicionais.
childrenReactNode—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
PropTipoPor defeitoDescrição
titlestring—Nome do indicador.
valuestring | number—Valor mostrado.
iconName / showIconIGRPIconName | string / boolean"Box" / trueÍcone Lucide.
iconVariant / showIconBackgroundIGRPColorVariants / boolean"primary" / falseCor do ícone e fundo colorido.
cardVariant / cardBorderPositionIGRPColorVariants / "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
PropTipoPor defeitoDescrição
titlestring—Título do card.
sectionsIGRPInfoSection[]—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.
columns1 | 2 | 31Colunas da grelha (adaptam-se à largura do card).
variantSection / colorSectionIGRPColorRole / 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
PropTipoPor defeitoDescriçã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.
dotbooleanfalsePonto colorido antes do texto.
showIcon / iconNameboolean / stringfalse / "Info"Ícone Lucide.
<IGRPBadge color="success" variant="soft" dot>Ativo</IGRPBadge>

Outros componentes

ComponentePara quêWidget no Studio
IGRPCardDetailsCard com uma lista de pares label/content, com botão de copiar opcional (showCopyTo)Card Details
IGRPAvatarImagem 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çãoStatus Banner
IGRPStatsCardMini (Custom)Indicador compacto—
IGRPStatsCardTopBorderColored (Custom)Indicador com borda superior colorida—
IGRPUserAvatar (Custom)Avatar com nome do utilizador—
How is this guide?

Última atualização: