@praxisui/table 1.0.0-beta.3 → 1.0.0-beta.30
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 +286 -1
- package/fesm2022/{praxisui-table-filter-form-dialog-host.component-DI8aWSSJ.mjs → praxisui-table-filter-form-dialog-host.component-Du_IEq0W.mjs} +10 -2
- package/fesm2022/praxisui-table-filter-form-dialog-host.component-Du_IEq0W.mjs.map +1 -0
- package/fesm2022/praxisui-table.mjs +6639 -1313
- package/fesm2022/praxisui-table.mjs.map +1 -1
- package/index.d.ts +444 -85
- package/package.json +9 -8
- package/fesm2022/praxisui-table-filter-form-dialog-host.component-DI8aWSSJ.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @praxisui/table
|
|
2
2
|
|
|
3
|
+
## 🔰 Exemplos / Quickstart
|
|
4
|
+
|
|
5
|
+
Para ver esta biblioteca em funcionamento em uma aplicação completa, utilize o projeto de exemplo (Quickstart):
|
|
6
|
+
|
|
7
|
+
- Repositório: https://github.com/codexrodrigues/praxis-ui-quickstart
|
|
8
|
+
- O Quickstart demonstra a integração das bibliotecas `@praxisui/*` em um app Angular, incluindo instalação, configuração e uso em telas reais.
|
|
9
|
+
|
|
3
10
|
> Componente de tabela empresarial avançado com arquitetura unificada
|
|
4
11
|
|
|
5
12
|
## 🌟 Visão Geral
|
|
@@ -34,6 +41,188 @@ A biblioteca `@praxisui/table` fornece um componente de tabela robusto e altamen
|
|
|
34
41
|
- **Toolbar Editor**: Personalização de ações
|
|
35
42
|
- **Messages Editor**: Textos e localização
|
|
36
43
|
|
|
44
|
+
Nota (Regras)
|
|
45
|
+
- A antiga aba visual genérica foi removida deste pacote. Um editor especializado para regras da Tabela está em desenvolvimento e já pode ser usado no painel de configuração.
|
|
46
|
+
|
|
47
|
+
### 🧩 Editor de Regras (column-first)
|
|
48
|
+
|
|
49
|
+
O novo editor é "column-first" e usa uma tipagem compartilhada com o Editor de Colunas. Principais pontos:
|
|
50
|
+
|
|
51
|
+
- Escopo: aplique regras na linha inteira (rowConditionalStyles) ou em uma coluna específica (columns[].conditionalStyles).
|
|
52
|
+
- Operadores por tipo: o conjunto de operadores é filtrado por tipo (string/number/date/boolean/enum).
|
|
53
|
+
- Editores de valor dinâmicos: inputs numéricos, listas (CSV/múltipla seleção), datepickers.
|
|
54
|
+
- Grupos lógicos: construa condições com AND/OR/NOT e reordene via arrastar-e-soltar (CDK DragDrop).
|
|
55
|
+
- Preview: execute “Testar” para ver quantas linhas seriam afetadas pelas regras ativas.
|
|
56
|
+
- Import/Export: exporta JSON sem o campo `enabled`; importa com validação de DSL e sanitização de estilos (allowlist).
|
|
57
|
+
|
|
58
|
+
Exemplos de DSL:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
contains(status, 'Ativo')
|
|
62
|
+
not (status in ['A', 'I'])
|
|
63
|
+
(price >= 10 and price <= 20)
|
|
64
|
+
(createdAt >= '2024-10-01' and createdAt <= '2024-10-31')
|
|
65
|
+
(name == null or name == '')
|
|
66
|
+
active == true
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Notas sobre enum/CSV:
|
|
70
|
+
- Para campos enumerados, as opções são inferidas de `valueMapping` da coluna ou de `fields?.options`.
|
|
71
|
+
- Para `in/not in` em números/strings, use CSV (ex.: `10, 20, 30` ou `Alice, Bob`).
|
|
72
|
+
|
|
73
|
+
#### Extensões de DSL (JSON/Tempo)
|
|
74
|
+
|
|
75
|
+
Você pode registrar funções adicionais no `DslParser` do app host para expressões com JSON e data/tempo.
|
|
76
|
+
|
|
77
|
+
Exemplo rápido (registro direto):
|
|
78
|
+
```ts
|
|
79
|
+
import { DslParser } from '@praxisui/specification';
|
|
80
|
+
import { registerJsonDslFunctions, registerDateDslFunctions } from '@praxisui/table';
|
|
81
|
+
|
|
82
|
+
const parser = new DslParser<any>();
|
|
83
|
+
registerJsonDslFunctions(parser);
|
|
84
|
+
registerDateDslFunctions(parser);
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Exemplos de DSL:
|
|
88
|
+
- `jsonGet(payload, '$.user.name') == 'Alice'`
|
|
89
|
+
- `hasJsonKey(payload, '$.meta.etag')`
|
|
90
|
+
- `jsonPathMatches(payload, '$.roles[0]', '^admin$')`
|
|
91
|
+
|
|
92
|
+
Guia completo: `projects/praxis-table/docs/DSL-Extensions-Guide.md`
|
|
93
|
+
|
|
94
|
+
#### 🎨 Efeitos (Conteúdo C)
|
|
95
|
+
|
|
96
|
+
O bloco de Efeitos permite aplicar estilo e visuais quando a condição é verdadeira:
|
|
97
|
+
|
|
98
|
+
- Toolbar de texto com ícones (negrito, itálico, sublinhado) e presets rápidos (tachado, maiúsculas/minúsculas/capitalizar, tamanho +/- e reset).
|
|
99
|
+
- Presets de feedback com ícones (sucesso, aviso, erro, info) — mantêm o rótulo via tooltip e `aria-label`.
|
|
100
|
+
- “Posição do valor” como grupo de alternância (antes / entre-1 / entre-2 / depois / oculto).
|
|
101
|
+
- “Ordem dos visuais” com seletor compacto (3 mais comuns) e menu para opções extras.
|
|
102
|
+
- Layout do compose: espaçamento, alinhamento, quebra de linha e reticências.
|
|
103
|
+
|
|
104
|
+
Dicas
|
|
105
|
+
- Use “Resetar texto” para reverter efeitos de texto sem perder cor de fundo/borda.
|
|
106
|
+
- Para acessibilidade, os grupos possuem `role="toolbar"`, tooltips e navegação por teclado consistente.
|
|
107
|
+
|
|
108
|
+
Como reverter efeitos
|
|
109
|
+
- “Reset Text” remove apenas propriedades de tipografia e transformação de texto.
|
|
110
|
+
- “Limpar efeitos” apaga classe e estilo livres do bloco rápido.
|
|
111
|
+
|
|
112
|
+
Observação: capturas de tela “antes/depois” podem ser adicionadas no PR conforme necessário.
|
|
113
|
+
|
|
114
|
+
#### Relacionais (lookup)
|
|
115
|
+
|
|
116
|
+
Campos relacionais (FK/objetos) podem ser editados no Rules Editor com busca assíncrona (typeahead) e seleção single/multiple.
|
|
117
|
+
|
|
118
|
+
Boas práticas
|
|
119
|
+
- Informe `resourcePath` (ou `endpoint`) no `FieldDefinition` para habilitar o lookup via `GenericCrudService` do host.
|
|
120
|
+
- Defina `valueField` (chave estável, tipicamente `id`) e `displayField` (label amigável, como `name`).
|
|
121
|
+
- Para múltipla seleção, use `multiple: true` no `FieldDefinition` quando aplicável.
|
|
122
|
+
- No runtime, registre as funções JSON no parser (ver guia) para que as expressões de ID/JSON funcionem: `jsonGet/hasJsonKey/jsonPathMatches`.
|
|
123
|
+
- APIs com busca: suporte a um parâmetro livre de texto (por ex. `search`) facilita a experiência do autocomplete.
|
|
124
|
+
|
|
125
|
+
Exemplo de FieldDefinition (lookup)
|
|
126
|
+
```ts
|
|
127
|
+
import type { FieldDefinition } from '@praxisui/core';
|
|
128
|
+
|
|
129
|
+
const fields: FieldDefinition[] = [
|
|
130
|
+
{
|
|
131
|
+
name: 'customer',
|
|
132
|
+
type: 'object',
|
|
133
|
+
// Habilita o lookup via GenericCrudService
|
|
134
|
+
resourcePath: 'customers',
|
|
135
|
+
// Mapeia o id/label que virão do backend
|
|
136
|
+
valueField: 'id',
|
|
137
|
+
displayField: 'name',
|
|
138
|
+
// Se quiser multiseleção em todo o app
|
|
139
|
+
// multiple: true,
|
|
140
|
+
},
|
|
141
|
+
];
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Operadores e DSL gerada (relacional)
|
|
145
|
+
- `id ==` → `jsonGet(customer, '$.id') == 10`
|
|
146
|
+
- `id in` → `jsonGet(customer, '$.id') in [10, 20]`
|
|
147
|
+
- `has property` → `hasJsonKey(customer, '$.meta.etag')`
|
|
148
|
+
- Condições por caminho (join simples): use `key ==` (JSON Path + valor)
|
|
149
|
+
|
|
150
|
+
UI (no editor)
|
|
151
|
+
- `id ==` (single): autocomplete + chip “label [id]” com ação “Limpar”.
|
|
152
|
+
- `id in` (multi): autocomplete + chips removíveis por item.
|
|
153
|
+
- `has property`: input do caminho (ex.: `$.meta.etag`).
|
|
154
|
+
|
|
155
|
+
Formato esperado do payload (relacional)
|
|
156
|
+
|
|
157
|
+
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:
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
// Exemplo de linha (row) com campo relacional "customer"
|
|
161
|
+
const row = {
|
|
162
|
+
id: 123,
|
|
163
|
+
customer: {
|
|
164
|
+
id: 10, // ← usado em id == / id in via jsonGet(customer, '$.id')
|
|
165
|
+
name: 'ACME', // ← usado para exibir label no autocomplete/chip
|
|
166
|
+
meta: { etag: 'v1' },
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Regras DSL comuns
|
|
171
|
+
// id ==
|
|
172
|
+
// jsonGet(customer, '$.id') == 10
|
|
173
|
+
// id in
|
|
174
|
+
// jsonGet(customer, '$.id') in [10, 20]
|
|
175
|
+
// has property
|
|
176
|
+
// hasJsonKey(customer, '$.meta.etag')
|
|
177
|
+
// caminho/valor (join simples)
|
|
178
|
+
// jsonGet(customer, '$.name') == 'ACME'
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Notas
|
|
182
|
+
- O editor usa `displayField` (ex.: `name`) para compor o rótulo, e `valueField` (ex.: `id`) para gerar a DSL.
|
|
183
|
+
- 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.
|
|
184
|
+
|
|
185
|
+
Onde é consumido (preview e runtime)
|
|
186
|
+
|
|
187
|
+
- Preview/validação no Editor de Regras (usa `DslParser` interno):
|
|
188
|
+
- Validação da expressão (parse): projects/praxis-table/src/lib/rules-editor/table-rules-editor.component.ts:536
|
|
189
|
+
- Preview “Testar” (parse + evaluate): projects/praxis-table/src/lib/rules-editor/table-rules-editor.component.ts:909
|
|
190
|
+
- Runtime na Tabela (aplica `rowConditionalStyles`/`conditionalStyles`):
|
|
191
|
+
- Parser interno do componente: projects/praxis-table/src/lib/praxis-table.ts:282
|
|
192
|
+
|
|
193
|
+
Observação
|
|
194
|
+
- Ao registrar funções via `DslParserFactory` (ex.: `registerJsonDslFunctions`/`registerDateDslFunctions`), use a mesma estratégia para o parser que avalia regras no runtime (Tabela) e para qualquer serviço que precise avaliar DSL. O Editor usa um parser interno para validação/preview; as funções de data já são suportadas por padrão, e as de JSON podem exigir extensão no runtime (ver guia).
|
|
195
|
+
|
|
196
|
+
Exemplo de Provider (recomendado)
|
|
197
|
+
|
|
198
|
+
```ts
|
|
199
|
+
import { Injectable } from '@angular/core';
|
|
200
|
+
import { DslParser } from '@praxisui/specification';
|
|
201
|
+
import { registerJsonDslFunctions, registerDateDslFunctions } from '@praxisui/table';
|
|
202
|
+
|
|
203
|
+
@Injectable({ providedIn: 'root' })
|
|
204
|
+
export class DslParserFactory {
|
|
205
|
+
private parser: DslParser<any>;
|
|
206
|
+
|
|
207
|
+
constructor() {
|
|
208
|
+
this.parser = new DslParser<any>();
|
|
209
|
+
registerJsonDslFunctions(this.parser);
|
|
210
|
+
registerDateDslFunctions(this.parser);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
get(): DslParser<any> {
|
|
214
|
+
return this.parser;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Em um componente/serviço que avalia regras:
|
|
219
|
+
// constructor(factory: DslParserFactory) {
|
|
220
|
+
// const parser = factory.get();
|
|
221
|
+
// const spec = parser.parse("jsonGet(payload, '$.user.name') == 'Alice'");
|
|
222
|
+
// const ok = spec.isSatisfiedBy({ payload: { user: { name: 'Alice' } } });
|
|
223
|
+
// }
|
|
224
|
+
```
|
|
225
|
+
|
|
37
226
|
### ⚙️ Painel de Configurações
|
|
38
227
|
|
|
39
228
|
Para abrir o painel de configurações, habilite o modo de edição na tabela:
|
|
@@ -178,6 +367,46 @@ sequenceDiagram
|
|
|
178
367
|
- Virtualização: habilite em Comportamento → Virtualização para listas grandes (requer altura de linha previsível).
|
|
179
368
|
- Densidade e linhas de grade: ajuste em Comportamento → Aparência rápida (compacta/confortável/espaçosa; bordas horizontais/verticais).
|
|
180
369
|
|
|
370
|
+
## Rolagem Horizontal (owner do scroll)
|
|
371
|
+
|
|
372
|
+
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.
|
|
373
|
+
|
|
374
|
+
### Input: `horizontalScroll`
|
|
375
|
+
|
|
376
|
+
```
|
|
377
|
+
@Input() horizontalScroll: 'auto' | 'wrap' | 'none' = 'auto';
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
- `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.
|
|
381
|
+
- `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.
|
|
382
|
+
- `none`: desabilita o comportamento interno; o host (página) deve fornecer o container com `overflow-x: auto` e as regras de largura necessárias.
|
|
383
|
+
|
|
384
|
+
Exemplo:
|
|
385
|
+
|
|
386
|
+
```html
|
|
387
|
+
<!-- Comportamento padrão (auto) -->
|
|
388
|
+
<praxis-table resourcePath="employees"></praxis-table>
|
|
389
|
+
|
|
390
|
+
<!-- Reduz rolagem: permite quebra de linha nas células -->
|
|
391
|
+
<praxis-table resourcePath="employees" horizontalScroll="wrap"></praxis-table>
|
|
392
|
+
|
|
393
|
+
<!-- Host controla o scroll horizontal -->
|
|
394
|
+
<div class="table-shell" style="overflow-x:auto">
|
|
395
|
+
<praxis-table resourcePath="employees" horizontalScroll="none"></praxis-table>
|
|
396
|
+
<!-- host pode usar width: max-content na tabela interna conforme seu design system -->
|
|
397
|
+
</div>
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Editor de Configuração (Settings Panel)
|
|
401
|
+
|
|
402
|
+
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.
|
|
403
|
+
|
|
404
|
+
### Notas
|
|
405
|
+
|
|
406
|
+
- 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.
|
|
407
|
+
- Cabeçalho sticky continua funcional. Teste combinações com colunas sticky/virt para seu caso.
|
|
408
|
+
- Para grids alternativos (ex.: Kendo), as mesmas regras de `max-content`/`min-width: 100%` se aplicam ao elemento de tabela interno.
|
|
409
|
+
|
|
181
410
|
## Virtualização (CDK)
|
|
182
411
|
|
|
183
412
|
Quando `behavior.virtualization.enabled` estiver ativo, as linhas da tabela são renderizadas com `cdk-virtual-scroll-viewport` (cabeçalho permanece igual).
|
|
@@ -201,6 +430,10 @@ Quando `behavior.virtualization.enabled` estiver ativo, as linhas da tabela são
|
|
|
201
430
|
- `behavior.pagination.position`: `top` | `bottom` | `both`.
|
|
202
431
|
- `behavior.pagination.style`: `default` | `compact` (aplica classe de estilo no paginator).
|
|
203
432
|
|
|
433
|
+
Nota sobre estratégia (client vs server)
|
|
434
|
+
- Se `behavior.pagination.strategy` não estiver definido, a tabela assume `server` automaticamente quando há `resourcePath` (dados remotos). Caso contrário, usa `client`.
|
|
435
|
+
- O mesmo vale para `behavior.sorting.strategy`.
|
|
436
|
+
|
|
204
437
|
## Duplo clique na linha
|
|
205
438
|
|
|
206
439
|
Ative em Comportamento → Interação.
|
|
@@ -262,6 +495,8 @@ Observação: quando informado, o defaultSort é aplicado na carga inicial se n
|
|
|
262
495
|
|
|
263
496
|
## Coluna de ações (sticky)
|
|
264
497
|
|
|
498
|
+
Nota: por padrão a coluna de ações vem desabilitada. Habilite explicitamente em `actions.row.enabled` e defina as ações desejadas.
|
|
499
|
+
|
|
265
500
|
- Fixe a coluna de ações no início/fim configurando `actions.row.sticky`:
|
|
266
501
|
|
|
267
502
|
```ts
|
|
@@ -347,8 +582,11 @@ sequenceDiagram
|
|
|
347
582
|
- `notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both'`
|
|
348
583
|
- `snoozeMs: number = 86400000` (24h)
|
|
349
584
|
- `autoOpenSettingsOnOutdated: boolean = false`
|
|
350
|
-
-
|
|
585
|
+
- Outputs:
|
|
351
586
|
- `schemaStatusChange: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string; resourcePath?: string }`
|
|
587
|
+
- Emitido tanto na verificação leve (304/200) quanto no bootstrap do schema (primeira carga via `loadSchema()`).
|
|
588
|
+
- `metadataChange: { meta: any; reason: 'bootstrap'|'verification'|'applied' }`
|
|
589
|
+
- Emitido quando `config.meta` é atualizado (ex.: após bootstrap ou verificação ETag). Útil para sincronizar sidebars/bridges de metadados.
|
|
352
590
|
|
|
353
591
|
### Fallback Global (opcional)
|
|
354
592
|
|
|
@@ -527,6 +765,8 @@ export class ExampleComponent {
|
|
|
527
765
|
|
|
528
766
|
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
767
|
|
|
768
|
+
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.
|
|
769
|
+
|
|
530
770
|
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
771
|
|
|
532
772
|
```mermaid
|
|
@@ -1064,6 +1304,51 @@ Notas rápidas (Flow ETag no Filter):
|
|
|
1064
1304
|
- 200: atualiza `serverHash/lastVerifiedAt`; marca `outdated=true` apenas quando em customização; não aplica o schema automaticamente.
|
|
1065
1305
|
- O corpo do schema é baixado apenas quando necessário para renderização (ex.: `alwaysVisibleFields` ou ao abrir o painel Avançado).
|
|
1066
1306
|
|
|
1307
|
+
## Formatação de Colunas (format)
|
|
1308
|
+
|
|
1309
|
+
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`.
|
|
1310
|
+
|
|
1311
|
+
Regra geral: a formatação só é aplicada quando há `format` não vazio e `type !== 'custom'`.
|
|
1312
|
+
|
|
1313
|
+
Tipos e padrões de `format`:
|
|
1314
|
+
- number (DecimalPipe)
|
|
1315
|
+
- Padrões: `minInt.minFrac-maxFrac`
|
|
1316
|
+
- Exemplos: `1.0-0`, `1.2-2`, `1.0-3|nosep` (remove separador de milhar)
|
|
1317
|
+
- currency (CurrencyPipe)
|
|
1318
|
+
- Sintaxe: `CURRENCY|DISPLAY|DECIMALS[|nosep]`
|
|
1319
|
+
- Exemplos: `BRL|symbol|2`, `USD|code|0`, `EUR|symbol|2|nosep`
|
|
1320
|
+
- percentage (PercentPipe/DecimalPipe)
|
|
1321
|
+
- Sem multiplicador: `1.0-0` (PercentPipe)
|
|
1322
|
+
- Multiplicar por 100: `1.1-1|x100` (DecimalPipe×100 + `%`)
|
|
1323
|
+
- date (DatePipe)
|
|
1324
|
+
- Tokens Angular: `shortDate`, `mediumDate`, `longDate`, `fullDate`, `short`, `shortTime`
|
|
1325
|
+
- Padrões customizados: `dd/MM/yyyy`, `yyyy-MM-dd`, `dd/MM/yyyy HH:mm`
|
|
1326
|
+
- string (transformações + truncamento)
|
|
1327
|
+
- Transform: `uppercase` | `lowercase` | `titlecase` | `capitalize` | `none`
|
|
1328
|
+
- Transform + truncar: `<transform>|truncate|<max>|<suffix>`
|
|
1329
|
+
- Exemplos: `uppercase|truncate|50|...`, `titlecase`
|
|
1330
|
+
- boolean (pré-definidos ou custom)
|
|
1331
|
+
- Presets: `true-false` | `yes-no` | `active-inactive` | `on-off` | `enabled-disabled`
|
|
1332
|
+
- Custom: `custom|Verdadeiro|Falso`
|
|
1333
|
+
|
|
1334
|
+
Exemplos de ColumnDefinition:
|
|
1335
|
+
```ts
|
|
1336
|
+
{ field: 'salario', type: 'currency', format: 'BRL|symbol|2', header: 'Salário' }
|
|
1337
|
+
{ field: 'desconto', type: 'percentage', format: '1.1-1|x100', header: 'Desconto' }
|
|
1338
|
+
{ field: 'criadoEm', type: 'date', format: 'dd/MM/yyyy', header: 'Criado em' }
|
|
1339
|
+
{ field: 'nome', type: 'string', format: 'titlecase|truncate|32|…', header: 'Nome' }
|
|
1340
|
+
{ field: 'ativo', type: 'boolean', format: 'yes-no', header: 'Ativo' }
|
|
1341
|
+
```
|
|
1342
|
+
|
|
1343
|
+
Observações:
|
|
1344
|
+
- `|nosep` remove separadores de milhar da saída formatada.
|
|
1345
|
+
- Para datas inválidas ou valores não numéricos, o serviço retorna o valor original (com aviso no console).
|
|
1346
|
+
- Colunas com renderizador `custom` não passam por formatação automática.
|
|
1347
|
+
|
|
1348
|
+
Exemplos práticos no workspace (rotas):
|
|
1349
|
+
- Regras Visuais (Simples): `/table-rules-simple`
|
|
1350
|
+
- Regras Visuais (Complexas): `/table-rules-complex`
|
|
1351
|
+
|
|
1067
1352
|
## 📊 Roadmap
|
|
1068
1353
|
|
|
1069
1354
|
### Próximas Versões
|
|
@@ -19,7 +19,15 @@ class FilterFormDialogHostComponent {
|
|
|
19
19
|
this.data = data;
|
|
20
20
|
this.ref = ref;
|
|
21
21
|
}
|
|
22
|
-
onReady(
|
|
22
|
+
onReady(ev) {
|
|
23
|
+
try {
|
|
24
|
+
const dto = this.data?.initialDto || {};
|
|
25
|
+
if (ev?.formGroup && dto && Object.keys(dto).length) {
|
|
26
|
+
ev.formGroup.patchValue(dto, { emitEvent: false });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch { }
|
|
30
|
+
}
|
|
23
31
|
onChange(ev) {
|
|
24
32
|
this.lastValue = ev?.formData ?? {};
|
|
25
33
|
}
|
|
@@ -82,4 +90,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImpor
|
|
|
82
90
|
}] }, { type: i1.MatDialogRef }] });
|
|
83
91
|
|
|
84
92
|
export { FilterFormDialogHostComponent };
|
|
85
|
-
//# sourceMappingURL=praxisui-table-filter-form-dialog-host.component-
|
|
93
|
+
//# sourceMappingURL=praxisui-table-filter-form-dialog-host.component-Du_IEq0W.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"praxisui-table-filter-form-dialog-host.component-Du_IEq0W.mjs","sources":["../../../projects/praxis-table/src/lib/components/praxis-filter/filter-form-dialog-host.component.ts"],"sourcesContent":["import { Component, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { PraxisFilterForm } from '@praxisui/dynamic-form';\n\n@Component({\n selector: 'praxis-filter-form-dialog-host',\n standalone: true,\n imports: [CommonModule, MatDialogModule, MatButtonModule, MatProgressBarModule, PraxisFilterForm],\n template: `\n <h2 mat-dialog-title id=\"filterDialogTitle\">{{ data.title || 'Filtro Avançado' }}</h2>\n <mat-dialog-content class=\"pfx-filter-dialog-content\" aria-labelledby=\"filterDialogTitle\">\n <mat-progress-bar *ngIf=\"data?.schemaLoading\" mode=\"indeterminate\"></mat-progress-bar>\n <praxis-filter-form\n *ngIf=\"data?.config\"\n [formId]=\"data.formId\"\n [resourcePath]=\"data.resourcePath\"\n [mode]=\"'edit'\"\n [config]=\"data.config\"\n (formReady)=\"onReady($event)\"\n (valueChange)=\"onChange($event)\"\n (validityChange)=\"onValidity($event)\"\n ></praxis-filter-form>\n <p *ngIf=\"!data?.config && !data?.schemaLoading\">Nenhum dado</p>\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <button mat-stroked-button mat-dialog-close>Cancelar</button>\n <button mat-flat-button color=\"primary\" (click)=\"apply()\" [disabled]=\"!valid\">Aplicar</button>\n </mat-dialog-actions>\n `,\n})\nexport class FilterFormDialogHostComponent {\n valid = true;\n private lastValue: any = {};\n constructor(\n @Inject(MAT_DIALOG_DATA)\n public data: {\n formId: string;\n resourcePath: string;\n config: any;\n title?: string;\n schemaLoading?: boolean;\n initialDto?: Record<string, any>;\n },\n private ref: MatDialogRef<FilterFormDialogHostComponent>,\n ) {}\n\n onReady(ev: { formGroup: any }): void {\n try {\n const dto = this.data?.initialDto || {};\n if (ev?.formGroup && dto && Object.keys(dto).length) {\n ev.formGroup.patchValue(dto, { emitEvent: false });\n }\n } catch {}\n }\n onChange(ev: { formData: Record<string, any> }): void {\n this.lastValue = ev?.formData ?? {};\n }\n onValidity(v: boolean): void { this.valid = v; }\n apply(): void { this.ref.close({ formData: this.lastValue }); }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;MAiCa,6BAA6B,CAAA;AAK/B,IAAA,IAAA;AAQC,IAAA,GAAA;IAZV,KAAK,GAAG,IAAI;IACJ,SAAS,GAAQ,EAAE;IAC3B,WAAA,CAES,IAON,EACO,GAAgD,EAAA;QARjD,IAAA,CAAA,IAAI,GAAJ,IAAI;QAQH,IAAA,CAAA,GAAG,GAAH,GAAG;;AAGb,IAAA,OAAO,CAAC,EAAsB,EAAA;AAC5B,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE;AACvC,YAAA,IAAI,EAAE,EAAE,SAAS,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;AACnD,gBAAA,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;;QAEpD,MAAM;;AAEV,IAAA,QAAQ,CAAC,EAAqC,EAAA;QAC5C,IAAI,CAAC,SAAS,GAAG,EAAE,EAAE,QAAQ,IAAI,EAAE;;IAErC,UAAU,CAAC,CAAU,EAAA,EAAU,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;AAC9C,IAAA,KAAK,KAAW,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AA5BlD,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,kBAI9B,eAAe,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAJd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtB9B;;;;;;;;;;;;;;;;;;;;GAoBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EArBS,YAAY,oIAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,oBAAoB,0NAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAuBrF,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBA1BzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gCAAgC;AAC1C,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,CAAC;AACjG,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;AAoBT,EAAA,CAAA;AACF,iBAAA;;0BAKI,MAAM;2BAAC,eAAe;;;;;"}
|