@nextelco/common-ui 2.1.96 → 2.1.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,13 +19,16 @@ export interface DataTableColumn<T> {
19
19
  width?: number;
20
20
  /** Largura máxima em px (o conteúdo corta com "…" e mostra o valor completo no tooltip). Sobrepõe-se a `defaultMaxColumnWidth`. */
21
21
  maxWidth?: number;
22
- /** Mostra um filtro por coluna com o distinct dos valores (multi-seleção). */
22
+ /**
23
+ * Filtro por coluna (distinct dos valores, multi-seleção; intervalo nas colunas number/date).
24
+ * Por omissão LIGADO em todas as colunas com dados — `false` desliga. Colunas sem dados (ex.: ações) não o mostram.
25
+ */
23
26
  filterable?: boolean;
24
27
  /** Desliga a ordenação nesta coluna (default: ordenável). */
25
28
  sortable?: boolean;
26
29
  /**
27
- * Agrupar por esta coluna é opt-in. Evita oferecer agrupamento em colunas de valor
28
- * contínuo (datas, floats, €), onde cada linha daria o seu próprio grupo.
30
+ * Agrupar por esta coluna. Por omissão LIGADO nas colunas de texto com dados e DESLIGADO nas de valor contínuo
31
+ * (`sortType` number/date, ou com `groupAggregate`), onde cada linha daria o seu próprio grupo. `true`/`false` forçam.
29
32
  */
30
33
  groupable?: boolean;
31
34
  /** Chave usada só para ORDENAR os grupos (sobrepõe-se a `value` ao agrupar por esta coluna). */
@@ -43,6 +46,11 @@ export interface DataTableColumn<T> {
43
46
  cellClassName?: string;
44
47
  /** Conteúdo extra por baixo do título da coluna (ex: somatório). Recebe as linhas já filtradas. */
45
48
  headerExtra?: (rows: T[]) => React.ReactNode;
49
+ /**
50
+ * Valor desta coluna na linha de cada grupo (ex: soma em €), alinhado com a coluna. Recebe as linhas do grupo
51
+ * (já filtradas). Também é usado na linha de total (`totalRow`), com todas as linhas filtradas.
52
+ */
53
+ groupAggregate?: (rows: T[]) => React.ReactNode;
46
54
  /**
47
55
  * Cores por valor para os chips de filtro ativo (valor → classes tailwind). Com isto, cada
48
56
  * valor escolhido ganha o seu chip, removível à parte.
@@ -125,6 +133,8 @@ export interface DataTableLabels {
125
133
  selectAll: string;
126
134
  /** O mesmo, com pesquisa activa — aí só abrange os valores que correspondem. */
127
135
  selectAllResults: string;
136
+ /** Rótulo da linha de total (`totalRow`). */
137
+ total: string;
128
138
  }
129
139
  interface DataTableProps<T> {
130
140
  columns: DataTableColumn<T>[];
@@ -183,16 +193,16 @@ interface DataTableProps<T> {
183
193
  /** Colunas redimensionáveis arrastando o limite do cabeçalho; duplo clique repõe (default true). */
184
194
  resizableColumns?: boolean;
185
195
  /**
186
- * Acrescenta "Ordenar A→Z / Z→A" ao topo do popup de filtro. Opt-in: quem já usava a
187
- * tabela não passa `labels` para isto e via aparecer dois botões em inglês.
196
+ * "Ordenar A→Z / Z→A" no topo do popup de filtro. Ligado por omissão (o cabeçalho é o mesmo em todos os
197
+ * portais); `false` desliga. Os textos vêm de `labels.sortAsc`/`sortDesc` (por omissão em inglês).
188
198
  */
189
199
  sortFromFilter?: boolean;
190
200
  /**
191
201
  * Semântica do filtro por coluna.
192
202
  *
193
- * - `'simple'` (default): abre com tudo **desmarcado** e marcar um valor quer dizer "só este".
203
+ * - `'simple'`: abre com tudo **desmarcado** e marcar um valor quer dizer "só este".
194
204
  * Conjunto vazio = sem filtro.
195
- * - `'excel'`: abre com tudo **marcado** e desmarca-se o que se quer excluir, com uma linha
205
+ * - `'excel'` (default): abre com tudo **marcado** e desmarca-se o que se quer excluir, com uma linha
196
206
  * `(Selecionar tudo)` no topo e curingas (`*`, `?`, `~`) na pesquisa. É o que a folha de
197
207
  * cálculo faz, e o que quem vem de lá espera. Conjunto vazio = **nada seleccionado**, e a
198
208
  * tabela fica sem linhas.
@@ -218,6 +228,10 @@ interface DataTableProps<T> {
218
228
  /** Ilustração do estado vazio. */
219
229
  emptyIcon?: React.ReactNode;
220
230
  labels?: Partial<DataTableLabels>;
231
+ /** Linha de total no fim (fica fixa em baixo), com o `groupAggregate` de cada coluna sobre as linhas filtradas. */
232
+ totalRow?: boolean;
233
+ /** Agrupamento inicial (chaves de colunas, por ordem de nível). A pessoa pode mudá-lo depois. */
234
+ defaultGroupBy?: string[];
221
235
  }
222
236
  /**
223
237
  * Timestamp de um valor de coluna de data. As apps passam a data já formatada (`value:
@@ -250,5 +264,5 @@ export declare function pesquisaCuringa(q: string): (v: string) => boolean;
250
264
  * Com paginação de servidor, passa também `allData`/`onDataNeeded`: sem o dataset completo,
251
265
  * filtrar, ordenar e agrupar só olhariam para a página à vista.
252
266
  */
253
- export default function DataTable<T>({ columns, data, allData, onDataNeeded, isAllDataLoading, alwaysClient, onClientModeChange, rowKey, onRowClick, onRowDoubleClick, rowClassName, isLoading, isError, maxHeight, pageSize, pageSizeOptions, selectable, onSelectionChange, clearSelectionTrigger, storageKey, defaultMaxColumnWidth, resizableColumns, sortFromFilter, filterMode, defaultSortKey, defaultSortDir, viewRef, exportFileName, onExport, extraToolbar, emptySubLabel, emptyIcon, labels, }: DataTableProps<T>): React.JSX.Element;
267
+ export default function DataTable<T>({ columns, data, allData, onDataNeeded, isAllDataLoading, alwaysClient, onClientModeChange, rowKey, onRowClick, onRowDoubleClick, rowClassName, isLoading, isError, maxHeight, pageSize, pageSizeOptions, selectable, onSelectionChange, clearSelectionTrigger, storageKey, defaultMaxColumnWidth, resizableColumns, sortFromFilter, filterMode, defaultSortKey, defaultSortDir, viewRef, exportFileName, onExport, extraToolbar, emptySubLabel, emptyIcon, labels, totalRow, defaultGroupBy, }: DataTableProps<T>): React.JSX.Element;
254
268
  export {};
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ export interface CaixaPesquisaProps {
3
+ valor: string;
4
+ onMudar: (valor: string) => void;
5
+ placeholder?: string;
6
+ /** Nome acessível (leitores de ecrã). Por omissão, o placeholder. */
7
+ rotulo?: string;
8
+ /** Largura (classes tailwind). Por omissão w-56. */
9
+ className?: string;
10
+ autoFocus?: boolean;
11
+ }
12
+ /**
13
+ * Caixa de pesquisa das barras de tabela e listas: mesma altura (h-8) e cantos (rounded-lg) dos botões, do
14
+ * Exportar e do seletor de colunas. Lupa à esquerda; com texto, um "×" para limpar (Esc também limpa).
15
+ */
16
+ export default function CaixaPesquisa({ valor, onMudar, placeholder, rotulo, className, autoFocus }: CaixaPesquisaProps): React.JSX.Element;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ export interface OpcaoEscolha {
3
+ valor: string;
4
+ rotulo: string;
5
+ /** Texto pequeno por baixo do rótulo, na lista. */
6
+ descricao?: string;
7
+ }
8
+ export interface EscolhaProps {
9
+ valor: string;
10
+ /** Opções: texto simples (valor = rótulo) ou { valor, rotulo, descricao }. */
11
+ opcoes: readonly string[] | readonly OpcaoEscolha[];
12
+ onMudar: (valor: string) => void;
13
+ /** Nome acessível (leitores de ecrã). */
14
+ rotulo: string;
15
+ /** Texto do botão sem nada escolhido. */
16
+ placeholder?: string;
17
+ /**
18
+ * Primeira opção "vazia" (valor ''), para desfazer a escolha (ex.: "Todas"). Sem isto não há como voltar atrás
19
+ * depois de escolher.
20
+ */
21
+ opcaoVazia?: string;
22
+ disabled?: boolean;
23
+ /** Caixa de pesquisa no topo da lista. Por omissão, só com mais de 10 opções. */
24
+ pesquisa?: boolean;
25
+ /** Largura (classes tailwind). Por omissão a do conteúdo, entre 10rem e 18rem (etiqueta: a do texto). */
26
+ className?: string;
27
+ /**
28
+ * 'barra' (omissão): h-8, como os botões e filtros das barras. 'formulario': a altura dos campos de texto dos
29
+ * formulários (px-3 py-2), para alinhar com eles.
30
+ */
31
+ tamanho?: 'barra' | 'formulario';
32
+ /**
33
+ * 'campo' (omissão) ou 'etiqueta': o botão é uma etiqueta arredondada (ex.: o estado numa linha de tabela), com
34
+ * as cores de `corEtiqueta`. A lista é a mesma.
35
+ */
36
+ aspeto?: 'campo' | 'etiqueta';
37
+ /** Classes de cor da etiqueta (fundo, texto e variante dark:), normalmente conforme o valor escolhido. */
38
+ corEtiqueta?: string;
39
+ }
40
+ /**
41
+ * Lista suspensa para escolher um valor (substitui o `<select>` nativo, que abre com o aspeto do sistema e não
42
+ * segue o tema). Mesma altura e cantos dos botões e campos (h-8, rounded-lg); a lista tem o mesmo aspeto do
43
+ * MenuAcoes. Teclado: ↑/↓, Home/End, Enter escolhe, Esc fecha; ao escrever com a lista aberta salta para a opção.
44
+ */
45
+ export default function Escolha({ valor, opcoes, onMudar, rotulo, placeholder, opcaoVazia, disabled, pesquisa, className, tamanho, aspeto, corEtiqueta, }: EscolhaProps): React.JSX.Element;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import React, { type ReactNode } from 'react';
2
+ export interface AcaoMenu {
3
+ rotulo: ReactNode;
4
+ onClick: () => void;
5
+ /** Ícone à esquerda (ex.: um ícone do lucide-react com className="h-4 w-4"). */
6
+ icone?: ReactNode;
7
+ /** Ação destrutiva (eliminar, fechar…): a vermelho. */
8
+ perigo?: boolean;
9
+ desativado?: boolean;
10
+ /** Linha separadora antes deste item. */
11
+ separador?: boolean;
12
+ }
13
+ export interface MenuAcoesProps {
14
+ /** Itens; `false`/`null`/`undefined` são ignorados (para `cond && {...}`). */
15
+ acoes: (AcaoMenu | false | null | undefined)[];
16
+ /**
17
+ * Conteúdo do botão. Sem rótulo, o botão é o ícone "⋯" (ações de uma linha de tabela).
18
+ * Com rótulo, é um botão como o Btn, com uma seta.
19
+ */
20
+ rotulo?: ReactNode;
21
+ /** Nome acessível / tooltip do botão. */
22
+ titulo?: string;
23
+ /** Lado para onde a lista abre, a partir do botão. Por omissão, alinhada à direita do botão. */
24
+ alinhar?: 'esquerda' | 'direita';
25
+ disabled?: boolean;
26
+ }
27
+ /**
28
+ * Botão que abre uma lista de ações (ex.: "Ações do ano", o "⋯" de cada linha). Mesmo aspeto da lista da
29
+ * Escolha. Teclado: ↑/↓ percorrem, Enter executa, Esc fecha. Os cliques não chegam à linha da tabela.
30
+ */
31
+ export default function MenuAcoes({ acoes, rotulo, titulo, alinhar, disabled }: MenuAcoesProps): React.JSX.Element | null;
@@ -0,0 +1,20 @@
1
+ import { type CSSProperties } from 'react';
2
+ /**
3
+ * Aspeto comum das listas suspensas (Escolha e MenuAcoes): cartão arredondado com sombra, nos dois temas.
4
+ * Um só sítio para as duas ficarem iguais.
5
+ */
6
+ export declare const CLS_PAINEL = "fixed z-[60] min-w-[10rem] max-h-72 overflow-auto rounded-xl border border-slate-200 bg-white py-1 text-sm shadow-lg dark:border-slate-700 dark:bg-slate-900";
7
+ /** Item de uma lista suspensa; `ativo` = o que o teclado tem selecionado. */
8
+ export declare const clsItem: (ativo: boolean, perigo?: boolean) => string;
9
+ /**
10
+ * Painel flutuante preso a um botão: posição fixa (não é cortado por tabelas ou modais com scroll), abre para
11
+ * cima quando não cabe por baixo, fecha ao clicar fora, com Esc, ao fazer scroll fora dele ou ao redimensionar.
12
+ */
13
+ export declare function usePainelFlutuante(alinhar?: 'esquerda' | 'direita'): {
14
+ aberto: boolean;
15
+ setAberto: import("react").Dispatch<import("react").SetStateAction<boolean>>;
16
+ fechar: () => void;
17
+ refBotao: import("react").RefObject<HTMLButtonElement | null>;
18
+ refPainel: import("react").RefObject<HTMLDivElement | null>;
19
+ estilo: CSSProperties;
20
+ };
@@ -10,6 +10,12 @@ export { default as BarraAcoes } from '../components/ui/BarraAcoes';
10
10
  export type { BarraAcoesProps } from '../components/ui/BarraAcoes';
11
11
  export { default as FaixaAviso } from '../components/ui/FaixaAviso';
12
12
  export type { FaixaAvisoProps, TomFaixa } from '../components/ui/FaixaAviso';
13
+ export { default as Escolha } from '../components/ui/Escolha';
14
+ export type { EscolhaProps, OpcaoEscolha } from '../components/ui/Escolha';
15
+ export { default as MenuAcoes } from '../components/ui/MenuAcoes';
16
+ export type { MenuAcoesProps, AcaoMenu } from '../components/ui/MenuAcoes';
17
+ export { default as CaixaPesquisa } from '../components/ui/CaixaPesquisa';
18
+ export type { CaixaPesquisaProps } from '../components/ui/CaixaPesquisa';
13
19
  export { default as TextoAuto } from '../components/ui/TextoAuto';
14
20
  export type { TextoAutoProps } from '../components/ui/TextoAuto';
15
21
  export { default as Confirmacao } from '../components/ui/Confirmacao';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextelco/common-ui",
3
- "version": "2.1.96",
3
+ "version": "2.1.98",
4
4
  "description": "",
5
5
  "main": "dist/bundle.js",
6
6
  "types": "dist/types/index.d.ts",