@praxisui/table 1.0.0-beta.5 → 1.0.0-beta.52
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/README.md +467 -26
- package/fesm2022/praxisui-table-filter-drawer-adapter.mjs +18 -0
- package/fesm2022/praxisui-table-filter-drawer-adapter.mjs.map +1 -0
- package/fesm2022/praxisui-table-filter-form-dialog-host.component-C2rQnHE1.mjs +166 -0
- package/fesm2022/praxisui-table-filter-form-dialog-host.component-C2rQnHE1.mjs.map +1 -0
- package/fesm2022/praxisui-table-table-ai.adapter-DAmsfime.mjs +816 -0
- package/fesm2022/praxisui-table-table-ai.adapter-DAmsfime.mjs.map +1 -0
- package/fesm2022/praxisui-table.mjs +31949 -9027
- package/fesm2022/praxisui-table.mjs.map +1 -1
- package/filter-drawer-adapter/index.d.ts +34 -0
- package/filter-drawer-adapter/package.json +3 -0
- package/index.d.ts +1786 -474
- package/package.json +14 -8
- package/fesm2022/praxisui-table-filter-form-dialog-host.component-DI8aWSSJ.mjs +0 -85
- package/fesm2022/praxisui-table-filter-form-dialog-host.component-DI8aWSSJ.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,11 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Table"
|
|
3
|
+
slug: "table-overview"
|
|
4
|
+
description: "Visao geral do @praxisui/table com TableConfig unificada, filtros, renderers, performance e integracao enterprise."
|
|
5
|
+
doc_type: "reference"
|
|
6
|
+
document_kind: "component-overview"
|
|
7
|
+
component: "table"
|
|
8
|
+
category: "components"
|
|
9
|
+
audience:
|
|
10
|
+
- "frontend"
|
|
11
|
+
- "host"
|
|
12
|
+
- "architect"
|
|
13
|
+
level: "intermediate"
|
|
14
|
+
status: "active"
|
|
15
|
+
owner: "praxis-ui"
|
|
16
|
+
tags:
|
|
17
|
+
- "table"
|
|
18
|
+
- "tableconfig"
|
|
19
|
+
- "filters"
|
|
20
|
+
- "renderers"
|
|
21
|
+
- "enterprise"
|
|
22
|
+
order: 25
|
|
23
|
+
icon: "table_chart"
|
|
24
|
+
toc: true
|
|
25
|
+
sidebar: true
|
|
26
|
+
search_boost: 1.0
|
|
27
|
+
reading_time: 14
|
|
28
|
+
estimated_setup_time: 25
|
|
29
|
+
version: "1.0"
|
|
30
|
+
related_docs:
|
|
31
|
+
- "dynamic-filter-architecture-overview"
|
|
32
|
+
- "dynamic-filter-host-integration-guide"
|
|
33
|
+
- "dynamic-filter-payload-contract"
|
|
34
|
+
- "dynamic-filter-range-filters-guide"
|
|
35
|
+
- "dynamic-filter-editor-settings-guide"
|
|
36
|
+
- "dynamic-filter-inline-catalog"
|
|
37
|
+
- "dynamic-filter-troubleshooting-guide"
|
|
38
|
+
- "dynamic-filter-backend-contract-cheatsheet"
|
|
39
|
+
- "adr-dynamic-filter-cross-lib-coupling-2026-03"
|
|
40
|
+
- "host-integration-guide"
|
|
41
|
+
- "consumer-integration-quickstart"
|
|
42
|
+
keywords:
|
|
43
|
+
- "TableConfig"
|
|
44
|
+
- "filters"
|
|
45
|
+
- "renderers"
|
|
46
|
+
- "performance"
|
|
47
|
+
- "dynamic filter"
|
|
48
|
+
last_updated: "2026-03-07"
|
|
49
|
+
---
|
|
50
|
+
|
|
1
51
|
# @praxisui/table
|
|
2
52
|
|
|
53
|
+
## 🔰 Exemplos / Quickstart
|
|
54
|
+
|
|
55
|
+
Para ver esta biblioteca em funcionamento em uma aplicação completa, utilize o projeto de exemplo (Quickstart):
|
|
56
|
+
|
|
57
|
+
- Repositório: https://github.com/codexrodrigues/praxis-ui-quickstart
|
|
58
|
+
- O Quickstart demonstra a integração das bibliotecas `@praxisui/*` em um app Angular, incluindo instalação, configuração e uso em telas reais.
|
|
59
|
+
|
|
3
60
|
> Componente de tabela empresarial avançado com arquitetura unificada
|
|
4
61
|
|
|
5
62
|
## 🌟 Visão Geral
|
|
6
63
|
|
|
7
64
|
A biblioteca `@praxisui/table` fornece um componente de tabela robusto e altamente configurável para aplicações Angular empresariais. Com a nova arquitetura unificada, oferece uma experiência de desenvolvimento simplificada mantendo todos os recursos avançados.
|
|
8
65
|
|
|
66
|
+
## 🎨 Tema M3 (tokens mínimos)
|
|
67
|
+
|
|
68
|
+
Para garantir que a tabela, filtros e editores reflitam o tema do app host:
|
|
69
|
+
|
|
70
|
+
- Superfícies: `--md-sys-color-surface`, `--md-sys-color-surface-variant`, `--md-sys-color-surface-container-*`
|
|
71
|
+
- Texto/contorno: `--md-sys-color-on-surface`, `--md-sys-color-on-surface-variant`, `--md-sys-color-on-primary`, `--md-sys-color-outline`, `--md-sys-color-outline-variant`
|
|
72
|
+
- Semânticos: `--md-sys-color-primary`, `--md-sys-color-secondary`, `--md-sys-color-tertiary`, `--md-sys-color-error`
|
|
73
|
+
- Containers: `--md-sys-color-primary-container`, `--md-sys-color-secondary-container`, `--md-sys-color-tertiary-container`, `--md-sys-color-error-container`
|
|
74
|
+
- Overlay: `--md-sys-color-scrim`
|
|
75
|
+
- Elevação: `--md-sys-elevation-level1`–`--md-sys-elevation-level3`
|
|
76
|
+
|
|
77
|
+
Observação: tokens `--md-sys-*` e `--mdc-theme-*` continuam aceitos quando presentes.
|
|
78
|
+
Nota: a classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.theme-light`); mantenha tokens e componentes no mesmo escopo.
|
|
79
|
+
|
|
9
80
|
## ✨ Características Principais
|
|
10
81
|
|
|
11
82
|
### 🏗️ Arquitetura Unificada
|
|
@@ -27,6 +98,15 @@ A biblioteca `@praxisui/table` fornece um componente de tabela robusto e altamen
|
|
|
27
98
|
- **Acessibilidade**: WCAG 2.1 AA compliant
|
|
28
99
|
- **Verificação de Schema**: ETag/If-None-Match com notificações (somente em customização)
|
|
29
100
|
|
|
101
|
+
### 📄 Contrato Inline do Filtro
|
|
102
|
+
|
|
103
|
+
- Referencia canonica: `projects/praxis-dynamic-fields/docs/filter-inline-components-guide.md` (slug publicado: `dynamic-fields-filter-inline-components-guide`)
|
|
104
|
+
- No contexto da tabela, use este contrato para definir `controlType` inline e politica de compatibilidade (canonica vs legado).
|
|
105
|
+
|
|
106
|
+
### 🧭 Decisoes de Arquitetura (ADR)
|
|
107
|
+
|
|
108
|
+
- Bundle/adapters: `projects/praxis-table/docs/adr/2026-03-filter-drawer-adapter-light-entrypoint.md`
|
|
109
|
+
|
|
30
110
|
### 🎨 Editores Visuais
|
|
31
111
|
|
|
32
112
|
- **Behavior Editor**: Configuração de comportamentos
|
|
@@ -34,6 +114,205 @@ A biblioteca `@praxisui/table` fornece um componente de tabela robusto e altamen
|
|
|
34
114
|
- **Toolbar Editor**: Personalização de ações
|
|
35
115
|
- **Messages Editor**: Textos e localização
|
|
36
116
|
|
|
117
|
+
Nota (Regras)
|
|
118
|
+
- A antiga aba visual genérica foi removida deste pacote. O editor especializado de regras da Tabela já está disponível no painel de configuração.
|
|
119
|
+
|
|
120
|
+
### 🧩 Editor de Regras (column-first)
|
|
121
|
+
|
|
122
|
+
O novo editor é "column-first" e usa uma tipagem compartilhada com o Editor de Colunas. Principais pontos:
|
|
123
|
+
|
|
124
|
+
- Escopo: aplique regras na linha inteira (rowConditionalStyles) ou em uma coluna específica (columns[].conditionalStyles).
|
|
125
|
+
- Operadores por tipo: o conjunto de operadores é filtrado por tipo (string/number/date/boolean/enum).
|
|
126
|
+
- Editores de valor dinâmicos: inputs numéricos, listas (CSV/múltipla seleção), datepickers.
|
|
127
|
+
- Grupos lógicos: construa condições com AND/OR/NOT e reordene via arrastar-e-soltar (CDK DragDrop).
|
|
128
|
+
- Preview: execute “Testar” para ver quantas linhas seriam afetadas pelas regras ativas.
|
|
129
|
+
- Import/Export: exporta JSON sem o campo `enabled`; importa com validação de DSL e sanitização de estilos (allowlist).
|
|
130
|
+
|
|
131
|
+
Exemplos de DSL:
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
contains(status, 'Ativo')
|
|
135
|
+
not (status in ['A', 'I'])
|
|
136
|
+
(price >= 10 and price <= 20)
|
|
137
|
+
(createdAt >= '2024-10-01' and createdAt <= '2024-10-31')
|
|
138
|
+
(name == null or name == '')
|
|
139
|
+
active == true
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Notas sobre enum/CSV:
|
|
143
|
+
- Para campos enumerados, as opções são inferidas de `valueMapping` da coluna ou de `fields?.options`.
|
|
144
|
+
- Para `in/not in` em números/strings, use CSV (ex.: `10, 20, 30` ou `Alice, Bob`).
|
|
145
|
+
|
|
146
|
+
#### Extensões de DSL (runtime nativo + custom)
|
|
147
|
+
|
|
148
|
+
O runtime da tabela já inclui helpers de JSON/tempo/listas/texto sem configuração extra:
|
|
149
|
+
|
|
150
|
+
- JSON: `jsonGet`, `hasJsonKey`, `jsonPathMatches`, `jsonEq`, `jsonIn`, `jsonType`
|
|
151
|
+
- Texto/valor: `isBlank`, `eqIgnoreCase`, `coalesce`
|
|
152
|
+
- Faixas: `between`, `dateBetween`
|
|
153
|
+
- Coleções: `containsAny`, `containsAll`, `len`, `lenEq`, `lenGt`, `lenLt`, `lenAtLeast`
|
|
154
|
+
- Tempo: `today`, `now`, `dateAdd`, `dateFormat`, `isToday`, `inLast`, `isPast`, `isPastOrNow`, `isFuture`, `isFutureOrNow`, `weekdayIn`
|
|
155
|
+
|
|
156
|
+
Exemplos de DSL (canônica):
|
|
157
|
+
- `jsonEq(payload, '$.user.name', 'Alice')`
|
|
158
|
+
- `jsonIn(customer, '$.id', [10, 20])`
|
|
159
|
+
- `eqIgnoreCase(status, 'ATIVO')`
|
|
160
|
+
- `between(amount, 10, 20)`
|
|
161
|
+
- `dateBetween(createdAt, '2025-01-01', '2025-12-31')`
|
|
162
|
+
- `containsAll(tags, ['vip', 'gold'])`
|
|
163
|
+
|
|
164
|
+
Observação de gramática:
|
|
165
|
+
- comparações diretas sobre retorno de função (`fn(...) == 'x'`) não são suportadas pela gramática atual; prefira funções predicativas (booleanas) na `condition`.
|
|
166
|
+
|
|
167
|
+
Guia completo: `projects/praxis-table/docs/DSL-Extensions-Guide.md`
|
|
168
|
+
|
|
169
|
+
#### 🎨 Efeitos (Conteúdo C)
|
|
170
|
+
|
|
171
|
+
O bloco de Efeitos permite aplicar estilo e visuais quando a condição é verdadeira:
|
|
172
|
+
|
|
173
|
+
- Toolbar de texto com ícones (negrito, itálico, sublinhado) e presets rápidos (tachado, maiúsculas/minúsculas/capitalizar, tamanho +/- e reset).
|
|
174
|
+
- Presets de feedback com ícones (sucesso, aviso, erro, info) — mantêm o rótulo via tooltip e `aria-label`.
|
|
175
|
+
- “Posição do valor” como grupo de alternância (antes / entre-1 / entre-2 / depois / oculto).
|
|
176
|
+
- “Ordem dos visuais” com seletor compacto (3 mais comuns) e menu para opções extras.
|
|
177
|
+
- Layout do compose: espaçamento, alinhamento, quebra de linha e reticências.
|
|
178
|
+
|
|
179
|
+
Dicas
|
|
180
|
+
- Use “Resetar texto” para reverter efeitos de texto sem perder cor de fundo/borda.
|
|
181
|
+
- Para acessibilidade, os grupos possuem `role="toolbar"`, tooltips e navegação por teclado consistente.
|
|
182
|
+
|
|
183
|
+
Como reverter efeitos
|
|
184
|
+
- “Reset Text” remove apenas propriedades de tipografia e transformação de texto.
|
|
185
|
+
- “Limpar efeitos” apaga classe e estilo livres do bloco rápido.
|
|
186
|
+
|
|
187
|
+
Observação: capturas de tela “antes/depois” podem ser adicionadas no PR conforme necessário.
|
|
188
|
+
|
|
189
|
+
#### Relacionais (lookup)
|
|
190
|
+
|
|
191
|
+
Campos relacionais (FK/objetos) podem ser editados no Rules Editor com busca assíncrona (typeahead) e seleção single/multiple.
|
|
192
|
+
|
|
193
|
+
Boas práticas
|
|
194
|
+
- Informe `resourcePath` (ou `endpoint`) no `FieldDefinition` para habilitar o lookup via `GenericCrudService` do host.
|
|
195
|
+
- Defina `valueField` (chave estável, tipicamente `id`) e `displayField` (label amigável, como `name`).
|
|
196
|
+
|
|
197
|
+
## 🔎 Filtro: Atalhos para Período (DateRange)
|
|
198
|
+
|
|
199
|
+
Habilite atalhos de período no filtro dinâmico sem alterar o contrato do `praxis-filter` — apenas via metadata do campo:
|
|
200
|
+
|
|
201
|
+
```ts
|
|
202
|
+
// Em FilterConfig (ou na metadata de campos do filtro)
|
|
203
|
+
{
|
|
204
|
+
name: 'period',
|
|
205
|
+
label: 'Período',
|
|
206
|
+
controlType: 'dateRange',
|
|
207
|
+
showShortcuts: true,
|
|
208
|
+
shortcuts: ['thisMonth','lastMonth','thisYear'],
|
|
209
|
+
// Opcional:
|
|
210
|
+
// i18nShortcuts: { thisMonth: 'Este mês', lastMonth: 'Mês passado' },
|
|
211
|
+
// applyOnShortcutClick: true
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
- Para múltipla seleção, use `multiple: true` no `FieldDefinition` quando aplicável.
|
|
215
|
+
- No runtime da tabela não é necessário registrar funções JSON/data manualmente; os helpers já são embutidos.
|
|
216
|
+
- APIs com busca: suporte a um parâmetro livre de texto (por ex. `search`) facilita a experiência do autocomplete.
|
|
217
|
+
|
|
218
|
+
Exemplo de FieldDefinition (lookup)
|
|
219
|
+
```ts
|
|
220
|
+
import type { FieldDefinition } from '@praxisui/core';
|
|
221
|
+
|
|
222
|
+
const fields: FieldDefinition[] = [
|
|
223
|
+
{
|
|
224
|
+
name: 'customer',
|
|
225
|
+
type: 'object',
|
|
226
|
+
// Habilita o lookup via GenericCrudService
|
|
227
|
+
resourcePath: 'customers',
|
|
228
|
+
// Mapeia o id/label que virão do backend
|
|
229
|
+
valueField: 'id',
|
|
230
|
+
displayField: 'name',
|
|
231
|
+
// Se quiser multiseleção em todo o app
|
|
232
|
+
// multiple: true,
|
|
233
|
+
},
|
|
234
|
+
];
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Operadores e DSL gerada (relacional)
|
|
238
|
+
- `id ==` → `jsonEq(customer, '$.id', 10)`
|
|
239
|
+
- `id in` → `jsonIn(customer, '$.id', [10, 20])`
|
|
240
|
+
- `has property` → `hasJsonKey(customer, '$.meta.etag')`
|
|
241
|
+
- Condições por caminho (join simples): use `key ==` (JSON Path + valor)
|
|
242
|
+
|
|
243
|
+
UI (no editor)
|
|
244
|
+
- `id ==` (single): autocomplete + chip “label [id]” com ação “Limpar”.
|
|
245
|
+
- `id in` (multi): autocomplete + chips removíveis por item.
|
|
246
|
+
- `has property`: input do caminho (ex.: `$.meta.etag`).
|
|
247
|
+
|
|
248
|
+
Formato esperado do payload (relacional)
|
|
249
|
+
|
|
250
|
+
Para que o editor/preview e o runtime avaliem corretamente as regras relacionais, o valor do campo deve ser um objeto (ou compatível com JSON) contendo ao menos o identificador e, opcionalmente, propriedades exibidas:
|
|
251
|
+
|
|
252
|
+
```ts
|
|
253
|
+
// Exemplo de linha (row) com campo relacional "customer"
|
|
254
|
+
const row = {
|
|
255
|
+
id: 123,
|
|
256
|
+
customer: {
|
|
257
|
+
id: 10, // ← usado em id == / id in via jsonEq/jsonIn
|
|
258
|
+
name: 'ACME', // ← usado para exibir label no autocomplete/chip
|
|
259
|
+
meta: { etag: 'v1' },
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
// Regras DSL comuns
|
|
264
|
+
// id ==
|
|
265
|
+
// jsonEq(customer, '$.id', 10)
|
|
266
|
+
// id in
|
|
267
|
+
// jsonIn(customer, '$.id', [10, 20])
|
|
268
|
+
// has property
|
|
269
|
+
// hasJsonKey(customer, '$.meta.etag')
|
|
270
|
+
// caminho/valor (join simples)
|
|
271
|
+
// jsonEq(customer, '$.name', 'ACME')
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Notas
|
|
275
|
+
- O editor usa `displayField` (ex.: `name`) para compor o rótulo, e `valueField` (ex.: `id`) para gerar a DSL.
|
|
276
|
+
- Se o backend devolver o relacionamento já "normalizado" (ex.: `customerId` e `customerName` na mesma linha), você ainda pode expressar condições com operadores padrão (`==`, `in`) no campo numérico/literal — a abordagem relacional é útil quando o payload contém o objeto.
|
|
277
|
+
|
|
278
|
+
Onde é consumido (preview e runtime)
|
|
279
|
+
|
|
280
|
+
- Preview/validação no Editor de Regras (usa `DslParser` interno):
|
|
281
|
+
- Validação da expressão (parse): projects/praxis-table/src/lib/rules-editor/table-rules-editor.component.ts:536
|
|
282
|
+
- Preview “Testar” (parse + evaluate): projects/praxis-table/src/lib/rules-editor/table-rules-editor.component.ts:909
|
|
283
|
+
- Runtime na Tabela (aplica `rowConditionalStyles`/`conditionalStyles`):
|
|
284
|
+
- Parser interno do componente: projects/praxis-table/src/lib/praxis-table.ts:282
|
|
285
|
+
|
|
286
|
+
Observação
|
|
287
|
+
- O runtime da tabela já injeta o registry DSL padrão para validação/parse/execução.
|
|
288
|
+
- Para funções realmente custom, injete via input `[dslFunctionRegistry]` no componente.
|
|
289
|
+
|
|
290
|
+
Exemplo de Provider (recomendado)
|
|
291
|
+
|
|
292
|
+
```ts
|
|
293
|
+
import { Injectable } from '@angular/core';
|
|
294
|
+
import { FunctionRegistry } from '@praxisui/specification';
|
|
295
|
+
|
|
296
|
+
@Injectable({ providedIn: 'root' })
|
|
297
|
+
export class TableDslRegistryFactory {
|
|
298
|
+
private readonly registry = FunctionRegistry.getInstance<any>('orders-table-rules');
|
|
299
|
+
|
|
300
|
+
constructor() {
|
|
301
|
+
this.registry.clear();
|
|
302
|
+
this.registry.register('isStatus', (_row: any, value: any, expected: any) =>
|
|
303
|
+
String(value ?? '').toLowerCase() === String(expected ?? '').toLowerCase(),
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
get(): FunctionRegistry<any> {
|
|
308
|
+
return this.registry;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Uso no host:
|
|
313
|
+
// <praxis-table [dslFunctionRegistry]="tableDslRegistryFactory.get()" ... />
|
|
314
|
+
```
|
|
315
|
+
|
|
37
316
|
### ⚙️ Painel de Configurações
|
|
38
317
|
|
|
39
318
|
Para abrir o painel de configurações, habilite o modo de edição na tabela:
|
|
@@ -84,7 +363,7 @@ Neste exemplo:
|
|
|
84
363
|
|
|
85
364
|
- `resourcePath="human-resources/departamentos"` instrui a tabela a se comunicar com o endpoint `/api/human-resources/departamentos`.
|
|
86
365
|
- A tabela fará requisições como `POST /api/human-resources/departamentos/filter` para obter os dados e `GET /api/human-resources/departamentos/schemas` para obter a configuração das colunas.
|
|
87
|
-
- `[editModeEnabled]="
|
|
366
|
+
- `editModeEnabled` controla explicitamente o gate de edição visual. No runtime atual o default já é `true`; declare `[editModeEnabled]="false"` quando o host precisar publicar a tabela em modo estritamente read-only.
|
|
88
367
|
|
|
89
368
|
### Empty State + Quick Connect (sem `resourcePath`)
|
|
90
369
|
|
|
@@ -178,6 +457,46 @@ sequenceDiagram
|
|
|
178
457
|
- Virtualização: habilite em Comportamento → Virtualização para listas grandes (requer altura de linha previsível).
|
|
179
458
|
- Densidade e linhas de grade: ajuste em Comportamento → Aparência rápida (compacta/confortável/espaçosa; bordas horizontais/verticais).
|
|
180
459
|
|
|
460
|
+
## Rolagem Horizontal (owner do scroll)
|
|
461
|
+
|
|
462
|
+
Por padrão, a `<praxis-table>` agora assume a responsabilidade pela rolagem horizontal quando o conteúdo excede a largura do container. Isso evita cortes de conteúdo e comportamentos inconsistentes entre projetos.
|
|
463
|
+
|
|
464
|
+
### Input: `horizontalScroll`
|
|
465
|
+
|
|
466
|
+
```
|
|
467
|
+
@Input() horizontalScroll: 'auto' | 'wrap' | 'none' = 'auto';
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
- `auto` (padrão): a tabela cria um viewport com `overflow-x: auto` e permite que a tabela interna cresça com `width: max-content`. Quando a soma das colunas > container, aparece a barra de rolagem horizontal neste viewport.
|
|
471
|
+
- `wrap`: permite quebra de linha nas células (libera `white-space: normal`), reduzindo a largura necessária; ideal quando você prefere minimizar a rolagem horizontal.
|
|
472
|
+
- `none`: desabilita o comportamento interno; o host (página) deve fornecer o container com `overflow-x: auto` e as regras de largura necessárias.
|
|
473
|
+
|
|
474
|
+
Exemplo:
|
|
475
|
+
|
|
476
|
+
```html
|
|
477
|
+
<!-- Comportamento padrão (auto) -->
|
|
478
|
+
<praxis-table resourcePath="employees"></praxis-table>
|
|
479
|
+
|
|
480
|
+
<!-- Reduz rolagem: permite quebra de linha nas células -->
|
|
481
|
+
<praxis-table resourcePath="employees" horizontalScroll="wrap"></praxis-table>
|
|
482
|
+
|
|
483
|
+
<!-- Host controla o scroll horizontal -->
|
|
484
|
+
<div class="table-shell" style="overflow-x:auto">
|
|
485
|
+
<praxis-table resourcePath="employees" horizontalScroll="none"></praxis-table>
|
|
486
|
+
<!-- host pode usar width: max-content na tabela interna conforme seu design system -->
|
|
487
|
+
</div>
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Editor de Configuração (Settings Panel)
|
|
491
|
+
|
|
492
|
+
Na aba “Visão Geral & Comportamento”, há um seletor “Scroll Horizontal” com as opções `Auto`, `Wrap` e `Host` (none). As alterações podem ser aplicadas (Aplicar) ou salvas (Salvar & Fechar). O valor é persistido junto com outras preferências da tabela.
|
|
493
|
+
|
|
494
|
+
### Notas
|
|
495
|
+
|
|
496
|
+
- O caminho virtual (CDK Virtual Scroll) permanece sendo o owner da rolagem vertical; o viewport horizontal é um contêiner externo que não interfere no scroll vertical.
|
|
497
|
+
- Cabeçalho sticky continua funcional. Teste combinações com colunas sticky/virt para seu caso.
|
|
498
|
+
- Para grids alternativos (ex.: Kendo), as mesmas regras de `max-content`/`min-width: 100%` se aplicam ao elemento de tabela interno.
|
|
499
|
+
|
|
181
500
|
## Virtualização (CDK)
|
|
182
501
|
|
|
183
502
|
Quando `behavior.virtualization.enabled` estiver ativo, as linhas da tabela são renderizadas com `cdk-virtual-scroll-viewport` (cabeçalho permanece igual).
|
|
@@ -201,6 +520,10 @@ Quando `behavior.virtualization.enabled` estiver ativo, as linhas da tabela são
|
|
|
201
520
|
- `behavior.pagination.position`: `top` | `bottom` | `both`.
|
|
202
521
|
- `behavior.pagination.style`: `default` | `compact` (aplica classe de estilo no paginator).
|
|
203
522
|
|
|
523
|
+
Nota sobre estratégia (client vs server)
|
|
524
|
+
- Se `behavior.pagination.strategy` não estiver definido, a tabela assume `server` automaticamente quando há `resourcePath` (dados remotos). Caso contrário, usa `client`.
|
|
525
|
+
- O mesmo vale para `behavior.sorting.strategy`.
|
|
526
|
+
|
|
204
527
|
## Duplo clique na linha
|
|
205
528
|
|
|
206
529
|
Ative em Comportamento → Interação.
|
|
@@ -234,6 +557,7 @@ onRowDoubleClick(evt: { action: string; row: any }) {
|
|
|
234
557
|
|
|
235
558
|
- Configure em `behavior.sorting.defaultSort`.
|
|
236
559
|
- Aceita objeto único (coluna/direção) ou array para multi‑sort.
|
|
560
|
+
- Status runtime atual: `behavior.sorting.multiSort` está **schema-only** (apenas 1 critério efetivo em runtime).
|
|
237
561
|
|
|
238
562
|
Exemplos:
|
|
239
563
|
|
|
@@ -259,9 +583,18 @@ sorting: {
|
|
|
259
583
|
```
|
|
260
584
|
|
|
261
585
|
Observação: quando informado, o defaultSort é aplicado na carga inicial se não houver estado de ordenação ativo.
|
|
586
|
+
Observação enterprise: para evitar ambiguidade de contrato, mantenha `multiSort: false` no runtime atual. Se um array for informado em `defaultSort`, trate como payload de compatibilidade/roadmap e valide no host como single-sort efetivo.
|
|
587
|
+
|
|
588
|
+
### Roadmap / migração de multiSort
|
|
589
|
+
|
|
590
|
+
- Curto prazo: `multiSort` segue schema-only no runtime.
|
|
591
|
+
- Recomendação de migração: desenhar integrações com fallback para ordenação única (`column` + `direction`).
|
|
592
|
+
- Planejamento: quando multi-sort runtime for implementado, publicar release note com guia de ativação gradual (feature-flag + validação de payload legado).
|
|
262
593
|
|
|
263
594
|
## Coluna de ações (sticky)
|
|
264
595
|
|
|
596
|
+
Nota: por padrão a coluna de ações vem desabilitada. Habilite explicitamente em `actions.row.enabled` e defina as ações desejadas.
|
|
597
|
+
|
|
265
598
|
- Fixe a coluna de ações no início/fim configurando `actions.row.sticky`:
|
|
266
599
|
|
|
267
600
|
```ts
|
|
@@ -345,10 +678,14 @@ sequenceDiagram
|
|
|
345
678
|
|
|
346
679
|
- Inputs (efetivos apenas quando `editModeEnabled = true`):
|
|
347
680
|
- `notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both'`
|
|
348
|
-
- `snoozeMs: number = 86400000`
|
|
681
|
+
- `snoozeMs: number = 86400000`
|
|
349
682
|
- `autoOpenSettingsOnOutdated: boolean = false`
|
|
350
|
-
-
|
|
351
|
-
|
|
683
|
+
- `dslFunctionRegistry: FunctionRegistry<any> | null = null`
|
|
684
|
+
- Outputs:
|
|
685
|
+
- `schemaStatusChange: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string; trigger?: string; tableId?: string }`
|
|
686
|
+
- Emitido tanto na verificação leve (304/200) quanto no bootstrap do schema (primeira carga via `loadSchema()`).
|
|
687
|
+
- `metadataChange: { trigger: string; meta: any; tableId?: string }`
|
|
688
|
+
- Emitido quando `config.meta` é atualizado (ex.: após bootstrap ou verificação ETag). Útil para sincronizar sidebars/bridges de metadados.
|
|
352
689
|
|
|
353
690
|
### Fallback Global (opcional)
|
|
354
691
|
|
|
@@ -403,7 +740,7 @@ onSchemaStatus(ev: { outdated: boolean; serverHash?: string; lastVerifiedAt?: st
|
|
|
403
740
|
### Boas práticas para estabilidade
|
|
404
741
|
|
|
405
742
|
- Evite literais em bindings para o carregador dinâmico:
|
|
406
|
-
- Não use `[fields]="[
|
|
743
|
+
- Não use `[fields]="[pinnedFieldMeta]"`; prefira um array estável como `pinnedFieldMetaArray` atualizado apenas quando o metadata mudar.
|
|
407
744
|
- Reutilize `FormGroup` quando possível. Se precisar trocar o `FormGroup` sem mudar os campos, deixe o `DynamicFieldLoader` reatribuir os controles (rebind-only) em vez de recriar componentes.
|
|
408
745
|
- Evite recriar arrays/objetos desnecessariamente em `ngOnChanges`/`ngAfterViewInit`. Prefira atualizar valores (`setValue`, `patchValue`) e manter referências estáveis.
|
|
409
746
|
- Observers (Resize/Mutation): atualize `overlayOrigin` e largura apenas quando houver mudanças reais; isso evita loops de CD.
|
|
@@ -431,7 +768,7 @@ onSchemaStatus(ev: { outdated: boolean; serverHash?: string; lastVerifiedAt?: st
|
|
|
431
768
|
- O `PraxisFilter` busca schema do DTO de filtro via `/schemas/filtered` com ETag/If-None-Match
|
|
432
769
|
e emite `metaChanged` com `{ schemaId, serverHash, context }`.
|
|
433
770
|
- O schema é normalizado e `advancedConfig.metadata` é preenchido para auditoria/telemetria.
|
|
434
|
-
- Detalhes: `docs/schemas/fluxo-schema.md` (cliente/caching, 200/304
|
|
771
|
+
- Detalhes: `projects/praxis-core/docs/schema-flow.md` (canônico) e `docs/schemas/fluxo-schema.md` (resumo operacional) para cliente/caching, 200/304 e reconciliadores Form/Filter.
|
|
435
772
|
|
|
436
773
|
### Resolução da chave primária (idField)
|
|
437
774
|
|
|
@@ -488,7 +825,9 @@ sequenceDiagram
|
|
|
488
825
|
|
|
489
826
|
### Uso com Dados Locais (Client-Side)
|
|
490
827
|
|
|
491
|
-
Se você precisar fornecer os dados manualmente (por exemplo, de uma fonte que não é uma API Praxis), pode usar o input `[data]` e omitir o `resourcePath`.
|
|
828
|
+
Se você precisar fornecer os dados manualmente (por exemplo, de uma fonte que não é uma API Praxis), pode usar o input `[data]` e omitir o `resourcePath`.
|
|
829
|
+
Importante: o modo local está protegido por feature flag e exige `behavior.localDataMode.enabled = true` (default é `false`).
|
|
830
|
+
Quando a flag está ativa, as operações de paginação, ordenação e filtro são executadas no lado do cliente.
|
|
492
831
|
|
|
493
832
|
```typescript
|
|
494
833
|
import { PraxisTable } from "@praxisui/table";
|
|
@@ -508,12 +847,13 @@ export class ExampleComponent {
|
|
|
508
847
|
{ field: "name", header: "Nome", type: "string" },
|
|
509
848
|
{ field: "email", header: "Email", type: "string" },
|
|
510
849
|
],
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
850
|
+
behavior: {
|
|
851
|
+
pagination: { enabled: true, pageSize: 10 },
|
|
852
|
+
sorting: { enabled: true },
|
|
853
|
+
filtering: { enabled: true },
|
|
854
|
+
localDataMode: { enabled: true }, // obrigatório para fluxo local oficial
|
|
855
|
+
},
|
|
856
|
+
};
|
|
517
857
|
|
|
518
858
|
employees = [
|
|
519
859
|
{ id: 1, name: "João Silva", email: "joao@empresa.com" },
|
|
@@ -527,6 +867,8 @@ export class ExampleComponent {
|
|
|
527
867
|
|
|
528
868
|
Quando a `<praxis-table>` é conectada a um `resourcePath`, as operações de paginação, ordenação e filtro são delegadas ao backend. Isso garante alta performance, pois apenas os dados visíveis na tela são trafegados pela rede.
|
|
529
869
|
|
|
870
|
+
Importante: se você não configurar explicitamente as estratégias de paginação/ordenação no `TableConfig`, a tabela resolve automaticamente como `server` quando há `resourcePath`. Se preferir operar no cliente, defina `behavior.pagination.strategy = 'client'` e/ou `behavior.sorting.strategy = 'client'` conscientemente.
|
|
871
|
+
|
|
530
872
|
O diagrama abaixo detalha a sequência de eventos, desde a interação do usuário na UI até a construção da consulta JPA no servidor.
|
|
531
873
|
|
|
532
874
|
```mermaid
|
|
@@ -598,7 +940,7 @@ sequenceDiagram
|
|
|
598
940
|
|
|
599
941
|
## 🎨 Edição Visual da Tabela: O Poder do Low-Code
|
|
600
942
|
|
|
601
|
-
A `<praxis-table>` vem com um poderoso editor de configuração visual que permite personalizar quase todos os aspectos da sua tabela em tempo real, sem escrever uma única linha de código.
|
|
943
|
+
A `<praxis-table>` vem com um poderoso editor de configuração visual que permite personalizar quase todos os aspectos da sua tabela em tempo real, sem escrever uma única linha de código. No runtime atual, o editor já nasce habilitado por padrão; use `[editModeEnabled]="false"` quando o host precisar bloquear customização e manter a tabela em modo estritamente operacional.
|
|
602
944
|
|
|
603
945
|
A seguir, veja os principais recursos que você pode configurar visualmente:
|
|
604
946
|
|
|
@@ -831,7 +1173,8 @@ export class MyComponent {
|
|
|
831
1173
|
this.configService.setConfig(this.tableConfig);
|
|
832
1174
|
|
|
833
1175
|
// Verificar recursos disponíveis
|
|
834
|
-
|
|
1176
|
+
// No runtime atual, multiSort permanece schema-only.
|
|
1177
|
+
const hasMultiSort = false;
|
|
835
1178
|
const hasBulkActions = this.configService.isFeatureEnabled('bulkActions');
|
|
836
1179
|
}
|
|
837
1180
|
}
|
|
@@ -1006,7 +1349,7 @@ Para documentação completa da API, consulte a [documentação da @praxisui/cor
|
|
|
1006
1349
|
O `PraxisFilter` pode ser acoplado à barra de ferramentas da tabela. O exemplo abaixo mostra a busca de pessoas por CPF e status.
|
|
1007
1350
|
|
|
1008
1351
|
```html
|
|
1009
|
-
<praxis-filter [resourcePath]="'pessoas'" [formId]="'pessoas-filter'" [persistenceKey]="'pessoas-filter-v1'" [
|
|
1352
|
+
<praxis-filter [resourcePath]="'pessoas'" [formId]="'pessoas-filter'" [persistenceKey]="'pessoas-filter-v1'" [alwaysVisibleFields]="['status']" (submit)="onFilter($event)"></praxis-filter> <praxis-table [data]="tableData"></praxis-table>
|
|
1010
1353
|
```
|
|
1011
1354
|
|
|
1012
1355
|
```ts
|
|
@@ -1018,15 +1361,15 @@ onFilter(dto: any) {
|
|
|
1018
1361
|
}
|
|
1019
1362
|
```
|
|
1020
1363
|
|
|
1021
|
-
### ⚙️
|
|
1364
|
+
### ⚙️ Configuração do Filtro
|
|
1022
1365
|
|
|
1023
|
-
O `PraxisFilter`
|
|
1024
|
-
|
|
1366
|
+
O `PraxisFilter` pode ser configurado por inputs/JSON de configuração. O atalho
|
|
1367
|
+
visual por ícone de engrenagem não é exposto por padrão na tabela/demo.
|
|
1368
|
+
Quando necessário, também é possível abrir o painel programaticamente via
|
|
1025
1369
|
`openSettings()`. Nesse painel é possível ajustar:
|
|
1026
1370
|
|
|
1027
|
-
- **quickField** – campo utilizado para a busca rápida
|
|
1028
1371
|
- **alwaysVisibleFields** – campos que permanecem sempre visíveis
|
|
1029
|
-
- **
|
|
1372
|
+
- **alwaysVisibleFieldMetadataOverrides** – patch de metadata por campo sempre visível (controle, clearButton, inlineAutoSize etc.)
|
|
1030
1373
|
- **showAdvanced** – define se a seção avançada inicia aberta
|
|
1031
1374
|
|
|
1032
1375
|
```ts
|
|
@@ -1038,19 +1381,43 @@ abrirConfiguracoes() {
|
|
|
1038
1381
|
```
|
|
1039
1382
|
|
|
1040
1383
|
Ao aplicar ou salvar, as escolhas são validadas contra os metadados
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
uma
|
|
1384
|
+
do **DTO de filtro** (schema de `POST /{resource}/filter`). Campos ausentes
|
|
1385
|
+
no DTO não são aplicados em `alwaysVisibleFields`.
|
|
1386
|
+
O componente exibe uma barra de progresso durante o processo de persistência e
|
|
1387
|
+
mensagens de sucesso ou erro via _snack bar_, garantindo uma experiência
|
|
1388
|
+
consistente.
|
|
1389
|
+
|
|
1390
|
+
### 🔖 Mini‑guia: Atalhos do Filtro (tags)
|
|
1391
|
+
|
|
1392
|
+
Atalhos são “chips” que guardam um conjunto de filtros (DTO) para reuso rápido.
|
|
1393
|
+
|
|
1394
|
+
- Criar/Salvar
|
|
1395
|
+
- Modal (padrão): o host do diálogo exibe o botão quando `allowSaveTags === true`.
|
|
1396
|
+
- Gaveta (Drawer): o Adapter recebe `allowSaveTags?`, `i18nSaveAsShortcut?` e `onSaveShortcut?` (opcionais). O host deve exibir o botão e chamar `onSaveShortcut(clean({ ...initialDto, ...lastValue }))`.
|
|
1397
|
+
- O DTO é limpo antes de persistir (remove `'' | null | undefined`).
|
|
1398
|
+
- Aplicar
|
|
1399
|
+
- Clique/Enter no chip aplica imediatamente `tag.patch` (substitui o estado atual), emite `submit` e persiste.
|
|
1400
|
+
- O chip ativo é destacado (cor/borda + ícone de “check”) quando o DTO atual é igual ao patch do atalho.
|
|
1401
|
+
- Editar/Renomear
|
|
1402
|
+
- Apenas atalhos do usuário exibem ícone de lápis. Predefinidos mostram ícone de “cadeado” (somente leitura).
|
|
1403
|
+
- Excluir (com Undo)
|
|
1404
|
+
- Exclusão remove imediatamente o atalho do usuário e exibe snackbar “Atalho removido” com ação “Desfazer” quando `confirmTagDelete === true`.
|
|
1405
|
+
- Ao clicar em “Desfazer”, o atalho é restaurado na mesma posição e os eventos são reemitidos.
|
|
1406
|
+
- i18n
|
|
1407
|
+
- Chaves úteis: `saveAsShortcut`, `renameShortcut`, `removeShortcut`, `shortcutSaved`, `shortcutRemoved`, `undo`, `readonlyShortcut`.
|
|
1408
|
+
|
|
1409
|
+
Veja também: `docs/host-crud-integration.md` (guia operacional host) e `projects/praxis-crud/docs/host-crud-runtime-and-openmode.md` (contrato técnico canônico) para detalhes do contrato do Adapter.
|
|
1044
1410
|
|
|
1045
1411
|
### Novos Inputs/Outputs (PraxisFilter)
|
|
1046
1412
|
|
|
1047
1413
|
- Inputs (efetivos apenas quando `editModeEnabled = true`):
|
|
1048
1414
|
- `editModeEnabled: boolean` — habilita o gate de customização para notificações de schema.
|
|
1049
|
-
- `notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both'` —
|
|
1415
|
+
- `notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both'` — seleciona como o runtime publica avisos de drift quando a política operacional estiver habilitada.
|
|
1050
1416
|
- `snoozeMs: number = 86400000` — tempo de soneca para avisos (ms).
|
|
1051
1417
|
- `autoOpenSettingsOnOutdated: boolean = false` — abre Configurações ao detectar schema desatualizado.
|
|
1418
|
+
- `dslFunctionRegistry: FunctionRegistry<any> | null = null` — adiciona funções DSL custom sem substituir o registry nativo.
|
|
1052
1419
|
- Output:
|
|
1053
|
-
- `schemaStatusChange: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string;
|
|
1420
|
+
- `schemaStatusChange: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string; tableId?: string }` — emitido após verificação leve (304/200).
|
|
1054
1421
|
|
|
1055
1422
|
#### Fallback Global (opcional)
|
|
1056
1423
|
|
|
@@ -1064,6 +1431,80 @@ Notas rápidas (Flow ETag no Filter):
|
|
|
1064
1431
|
- 200: atualiza `serverHash/lastVerifiedAt`; marca `outdated=true` apenas quando em customização; não aplica o schema automaticamente.
|
|
1065
1432
|
- O corpo do schema é baixado apenas quando necessário para renderização (ex.: `alwaysVisibleFields` ou ao abrir o painel Avançado).
|
|
1066
1433
|
|
|
1434
|
+
## Formatação de Colunas (format)
|
|
1435
|
+
|
|
1436
|
+
Cada coluna pode declarar `type` e uma string de formatação `format` consumida pelo `DataFormattingService`. Os tipos suportados são: `string`, `number`, `currency`, `percentage`, `date`, `boolean`, `custom`.
|
|
1437
|
+
|
|
1438
|
+
Regra geral: a formatação só é aplicada quando há `format` não vazio e `type !== 'custom'`.
|
|
1439
|
+
|
|
1440
|
+
Tipos e padrões de `format`:
|
|
1441
|
+
- number (DecimalPipe)
|
|
1442
|
+
- Padrões: `minInt.minFrac-maxFrac`
|
|
1443
|
+
- Exemplos: `1.0-0`, `1.2-2`, `1.0-3|nosep` (remove separador de milhar)
|
|
1444
|
+
- currency (CurrencyPipe)
|
|
1445
|
+
- Sintaxe: `CURRENCY|DISPLAY|DECIMALS[|nosep]`
|
|
1446
|
+
- Exemplos: `BRL|symbol|2`, `USD|code|0`, `EUR|symbol|2|nosep`
|
|
1447
|
+
- percentage (PercentPipe/DecimalPipe)
|
|
1448
|
+
- Sem multiplicador: `1.0-0` (PercentPipe)
|
|
1449
|
+
- Multiplicar por 100: `1.1-1|x100` (DecimalPipe×100 + `%`)
|
|
1450
|
+
- date (DatePipe)
|
|
1451
|
+
- Tokens Angular: `shortDate`, `mediumDate`, `longDate`, `fullDate`, `short`, `shortTime`
|
|
1452
|
+
- Padrões customizados: `dd/MM/yyyy`, `yyyy-MM-dd`, `dd/MM/yyyy HH:mm`
|
|
1453
|
+
- string (transformações + truncamento)
|
|
1454
|
+
- Transform: `uppercase` | `lowercase` | `titlecase` | `capitalize` | `none`
|
|
1455
|
+
- Transform + truncar: `<transform>|truncate|<max>|<suffix>`
|
|
1456
|
+
- Exemplos: `uppercase|truncate|50|...`, `titlecase`
|
|
1457
|
+
- boolean (pré-definidos ou custom)
|
|
1458
|
+
- Presets: `true-false` | `yes-no` | `active-inactive` | `on-off` | `enabled-disabled`
|
|
1459
|
+
- Custom: `custom|Verdadeiro|Falso`
|
|
1460
|
+
|
|
1461
|
+
Exemplos de ColumnDefinition:
|
|
1462
|
+
```ts
|
|
1463
|
+
{ field: 'salario', type: 'currency', format: 'BRL|symbol|2', header: 'Salário' }
|
|
1464
|
+
{ field: 'desconto', type: 'percentage', format: '1.1-1|x100', header: 'Desconto' }
|
|
1465
|
+
{ field: 'criadoEm', type: 'date', format: 'dd/MM/yyyy', header: 'Criado em' }
|
|
1466
|
+
{ field: 'nome', type: 'string', format: 'titlecase|truncate|32|…', header: 'Nome' }
|
|
1467
|
+
{ field: 'ativo', type: 'boolean', format: 'yes-no', header: 'Ativo' }
|
|
1468
|
+
```
|
|
1469
|
+
|
|
1470
|
+
Observações:
|
|
1471
|
+
- `|nosep` remove separadores de milhar da saída formatada.
|
|
1472
|
+
- Para datas inválidas ou valores não numéricos, o serviço retorna o valor original (com aviso no console).
|
|
1473
|
+
- Colunas com renderizador `custom` não passam por formatação automática.
|
|
1474
|
+
|
|
1475
|
+
Exemplos práticos no workspace (rotas):
|
|
1476
|
+
- Regras Visuais (Simples): `/table-rules-simple`
|
|
1477
|
+
- Regras Visuais (Complexas): `/table-rules-complex`
|
|
1478
|
+
|
|
1479
|
+
## Auto-render de Avatar (strict mode)
|
|
1480
|
+
|
|
1481
|
+
No bootstrap de schema (quando `config.columns` esta vazio), a tabela detecta automaticamente colunas de avatar e aplica `renderer.type = 'avatar'`.
|
|
1482
|
+
|
|
1483
|
+
Deteccao:
|
|
1484
|
+
- somente quando `FieldDefinition.controlType === 'avatar'`
|
|
1485
|
+
|
|
1486
|
+
Renderer aplicado:
|
|
1487
|
+
- `renderer: { type: 'avatar', avatar: { srcField, initialsExpr, shape: 'circle', size: 28 } }`
|
|
1488
|
+
- alinhamento central e largura compacta (~56px)
|
|
1489
|
+
- `initialsExpr` com fallback para `nomeCompleto|nome|fullName|name|title`
|
|
1490
|
+
|
|
1491
|
+
Comportamento importante:
|
|
1492
|
+
- a autodeteccao ocorre apenas no bootstrap (nao sobrescreve configuracoes de colunas persistidas)
|
|
1493
|
+
- se quiser desabilitar, defina renderer explicito na coluna (`image` ou `text`)
|
|
1494
|
+
- para cenarios sem `x-ui`, exponha renderer no config ou ajuste backend para enviar `x-ui.controlType`
|
|
1495
|
+
|
|
1496
|
+
Ajustes comuns:
|
|
1497
|
+
- `renderer.avatar.shape`: `'square' | 'rounded' | 'circle'`
|
|
1498
|
+
- `renderer.avatar.size`: numero em px
|
|
1499
|
+
- `renderer.avatar.alt` / `altField`
|
|
1500
|
+
- use `conditionalRenderers` para variar renderer por linha
|
|
1501
|
+
|
|
1502
|
+
A11y, seguranca e performance:
|
|
1503
|
+
- `alt`/`altField` sao respeitados
|
|
1504
|
+
- fallback para iniciais quando imagem falha/nao existe
|
|
1505
|
+
- URL da imagem sanitizada (bloqueia esquemas perigosos)
|
|
1506
|
+
- imagem com `loading=\"lazy\"`
|
|
1507
|
+
|
|
1067
1508
|
## 📊 Roadmap
|
|
1068
1509
|
|
|
1069
1510
|
### Próximas Versões
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
function getFilterDrawerAdapterToken() {
|
|
4
|
+
const registryKey = '__PAX_FILTER_DRAWER_ADAPTER_TOKEN__';
|
|
5
|
+
const globalRegistry = globalThis;
|
|
6
|
+
if (!globalRegistry[registryKey]) {
|
|
7
|
+
globalRegistry[registryKey] = new InjectionToken('FILTER_DRAWER_ADAPTER');
|
|
8
|
+
}
|
|
9
|
+
return globalRegistry[registryKey];
|
|
10
|
+
}
|
|
11
|
+
const FILTER_DRAWER_ADAPTER = getFilterDrawerAdapterToken();
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Generated bundle index. Do not edit.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export { FILTER_DRAWER_ADAPTER };
|
|
18
|
+
//# sourceMappingURL=praxisui-table-filter-drawer-adapter.mjs.map
|