@nextelco/common-ui 2.1.96 → 2.1.97
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.
- package/dist/bundle.js +1 -1
- package/dist/style.css +1 -1
- package/dist/style.layered.css +1 -1
- package/dist/types/components/molecules/DataTable/DataTable.d.ts +22 -8
- package/dist/types/components/ui/CaixaPesquisa.d.ts +16 -0
- package/dist/types/components/ui/CaixaPesquisa.test.d.ts +1 -0
- package/dist/types/components/ui/Escolha.d.ts +33 -0
- package/dist/types/components/ui/Escolha.test.d.ts +1 -0
- package/dist/types/components/ui/MenuAcoes.d.ts +31 -0
- package/dist/types/components/ui/painelFlutuante.d.ts +20 -0
- package/dist/types/exports/ui.d.ts +6 -0
- package/package.json +1 -1
|
@@ -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
|
-
/**
|
|
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
|
|
28
|
-
*
|
|
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
|
-
*
|
|
187
|
-
*
|
|
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'
|
|
203
|
+
* - `'simple'`: abre com tudo **desmarcado** e marcar um valor quer dizer "só este".
|
|
194
204
|
* Conjunto vazio = sem filtro.
|
|
195
|
-
* - `'excel'
|
|
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,33 @@
|
|
|
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. */
|
|
26
|
+
className?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Lista suspensa para escolher um valor (substitui o `<select>` nativo, que abre com o aspeto do sistema e não
|
|
30
|
+
* segue o tema). Mesma altura e cantos dos botões e campos (h-8, rounded-lg); a lista tem o mesmo aspeto do
|
|
31
|
+
* MenuAcoes. Teclado: ↑/↓, Home/End, Enter escolhe, Esc fecha; ao escrever com a lista aberta salta para a opção.
|
|
32
|
+
*/
|
|
33
|
+
export default function Escolha({ valor, opcoes, onMudar, rotulo, placeholder, opcaoVazia, disabled, pesquisa, className, }: 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';
|