Order Table
Tabela de ordens do terminal: horário, ativo, lado, preço, quantidade e status, com linha cancelada esmaecida e colunas configuráveis.
Instalação
Recebe correções por update de versão. O caminho recomendado.
npm i @trdr/ui
import { OrderTable } from "@trdr/ui/order-table"Uso
import { ORDER_TABLE_COLUMNS, OrderRow, OrderSide, OrderStatus, OrderTable, OrderTableColumnKey } from "@trdr/ui/order-table"
export function Exemplo() {
return <OrderTable />
}Variantes
| Grupo | Valores | Padrão |
|---|---|---|
| canceled | truefalse | false |
Props
OrderTablePropsestende Omit<React.TableHTMLAttributes<HTMLTableElement>, "children">| Prop | Tipo | Descrição |
|---|---|---|
| rows | OrderRow[] | Linhas a exibir. Sem dado de exemplo embutido: quem chama traz os dados reais. |
| columns? | OrderTableColumnKey[] | Quais colunas aparecem e em que ordem. Padrao: todas, na ordem do Figma. |
| selectedId? | string | null | Id da linha selecionada. Selecao e controlada: o componente nao guarda estado proprio. |
| onRowSelect? | (row: OrderRow) => void | Chamado com a linha inteira quando o consumidor clica ou confirma pelo teclado (Enter/Espaco). |
| caption | string | Legenda da tabela para leitor de tela. Obrigatoria: toda tabela de dados precisa de um nome acessivel. |
| emptyMessage? | React.ReactNode | Mensagem exibida quando `rows` esta vazio. |
| formatPrice? | (value: number) => string | |
| formatQuantity? | (value: number) => string |
Quando usar
Use a OrderTable para a grade de ordens de um terminal de operacoes: uma ordem por linha,
horario, ativo, lado (compra ou venda), preco, quantidade e situacao. E o componente certo para
o operador acompanhar o que foi enviado, o que esta executado e o que foi cancelado, tudo numa
lista densa.
Quando nao usar
Nao use OrderTable para o book de ofertas de um ativo (isso e mais proximo de QuoteTable)
nem para um historico de auditoria com muitos campos livres (uma tabela comum com Table serve
melhor quando as colunas nao tem semantica de trading fixa).
Anatomia
OrderTable e um componente fechado, como QuoteTable: recebe rows e desenha a tabela
inteira por dentro, compondo Table, TableHeader, TableBody, TableRow, TableHead,
TableCell e Badge do proprio TRDR UI.
- Coluna Horario: horario da ordem, em font-mono como qualquer outro numero da tabela.
- Coluna Ativo: codigo do papel.
- Coluna C/V: letra
C(compra) ouV(venda), em negrito e colorida comcontext-trading-long-text/context-trading-short-text. A cor e reforco: a propria letra ja diz o lado. - Coluna Preco e Medio: preco da ordem e preco medio de execucao.
- Coluna Qtde, Disp, Aberta, Exec: quantidades da ordem em cada estagio.
- Coluna Status:
Badgecom uma variante por situacao (veja abaixo). - Coluna Validade e Origem: metadado da ordem.
Todas as colunas numericas (incluindo horario) usam a variante numeric de TableCell
(font-mono, alinhado a direita).
Status e variante do Badge
| status (OrderStatus) | rotulo | variante do Badge |
|---|---|---|
| open | Aberta | brand |
| partial | Parcial | neutral |
| filled | Executada | success |
| canceled | Cancelada | archived |
canceled usa archived (nao warning, como no legado): uma ordem cancelada e um estado
final e inerte, nao algo que pede atencao do operador agora.
Linha cancelada
A linha inteira de uma ordem cancelada fica esmaecida (opacidade reduzida, o mesmo recurso que
o Button usa em disabled:opacity-50) e ganha uma faixa de acento a esquerda na cor
context-trading-short-default. Nao existe uma variante alpha do token de short no
@trdr/tokens (so up/down/stop tem), entao o esmaecimento vem de opacidade, nao de um
fundo tingido novo.
API
type OrderSide = "buy" | "sell"
type OrderStatus = "open" | "filled" | "canceled" | "partial"
interface OrderRow {
id: string
time: string
symbol: string
side: OrderSide
price: number
averagePrice?: number
quantity: number
availableQuantity?: number
openQuantity?: number
filledQuantity?: number
status: OrderStatus
validity?: string
origin?: string
}
interface OrderTableProps {
rows: OrderRow[]
columns?: OrderTableColumnKey[] // quais colunas aparecem, em que ordem. Padrao: todas.
selectedId?: string | null // selecao controlada
onRowSelect?: (row: OrderRow) => void
caption: string // nome acessivel da tabela, obrigatorio
emptyMessage?: React.ReactNode
formatPrice?: (value: number) => string
formatQuantity?: (value: number) => string
}- Colunas configuraveis:
columnse um array de chaves (OrderTableColumnKey) na ordem desejada. - Dado tipado, sem exemplo embutido:
rowseOrderRow[], sempre trazido por quem chama. - Selecao controlada: mesmo padrao da
QuoteTable,selectedId+onRowSelect. A linha selecionada usadata-state="selected", que aTableja estiliza. - Formatadores substituiveis:
formatPrice/formatQuantitytem padrao empt-BRe podem ser trocados por instrumento.
Migracao do componente legado
O TabelaOrdens do Hub antigo (src/components/ui/TabelaOrdens.tsx) recebia um array rows
com nomes de campo em portugues (ativo, tipo, preco, qtde, disp, exec...), tipo
'C' | 'V' literal para o lado, e vinha com dez linhas de exemplo embutidas como valor padrao
da prop. O OrderTable do TRDR UI:
- Usa nomes de campo em ingles (
symbol,side,quantity,availableQuantity,filledQuantity...), comside: "buy" | "sell"em vez do literal'C' | 'V': o rotulo visivel (C/V) continua identico, mas o dado que trafega pela API nao fica preso a uma letra de exibicao. - Nao tem dado de exemplo embutido:
rowse obrigatorio. - Ganha
columnspara escolher e ordenar colunas, algo que o legado nao tinha. - Troca a variante
warningdoBadgede status cancelada (legado) porarchived, e troca o fundo solidocontext-trading-short-defaultda linha cancelada inteira (legado, uma cor de preco usada em bloco como se fosse estado de erro) por opacidade reduzida mais uma faixa de acento fina na mesma cor, mais proximo de "esmaecido" do que de um alerta. - Formaliza a selecao de linha:
selectedId(controlado) maisonRowSelect, em vez de uma prop solta por linha.
Acessibilidade
captione obrigatorio e vira um<caption>visualmente oculto (sr-only).- Todo
<th>usascope="col". - O lado da ordem nunca depende so da cor: a letra
C/Vja informa o lado, a cor e reforco. - A situacao da ordem sempre tem um rotulo textual dentro do
Badge(Aberta,Executada...), nunca so a cor da variante. - Quando
onRowSelectesta presente, a linha vira alvo de teclado (tabIndex=0) e responde a Enter e Espaco, alem do clique.
Slots e tokens
Todo elemento renderizado carrega um data-slot para estilizar partes internas sem depender de classe da biblioteca. Os tokens listados são extraídos do código fonte.
[data-slot="order-table"][data-slot="order-table-empty"]7 tokens usados
border-context-trading-short-defaultborder-l-2text-centertext-content-tertiarytext-context-trading-long-texttext-context-trading-short-texttext-right