@praxisui/dynamic-fields 1.0.0-beta.5 → 1.0.0-beta.53
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 +227 -27
- package/fesm2022/praxisui-dynamic-fields.mjs +31615 -3288
- package/fesm2022/praxisui-dynamic-fields.mjs.map +1 -1
- package/index.d.ts +2862 -270
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -1,10 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Dynamic Fields"
|
|
3
|
+
slug: "dynamic-fields-overview"
|
|
4
|
+
description: "Visao geral do @praxisui/dynamic-fields com renderizacao metadata-driven, registro lazy de componentes, tokens M3 e campos enterprise."
|
|
5
|
+
doc_type: "reference"
|
|
6
|
+
document_kind: "component-overview"
|
|
7
|
+
component: "dynamic-fields"
|
|
8
|
+
category: "components"
|
|
9
|
+
audience:
|
|
10
|
+
- "frontend"
|
|
11
|
+
- "host"
|
|
12
|
+
- "architect"
|
|
13
|
+
level: "intermediate"
|
|
14
|
+
status: "active"
|
|
15
|
+
owner: "praxis-ui"
|
|
16
|
+
tags:
|
|
17
|
+
- "dynamic-fields"
|
|
18
|
+
- "metadata"
|
|
19
|
+
- "forms"
|
|
20
|
+
- "runtime"
|
|
21
|
+
- "material"
|
|
22
|
+
order: 32
|
|
23
|
+
icon: "toc"
|
|
24
|
+
toc: true
|
|
25
|
+
sidebar: true
|
|
26
|
+
search_boost: 1.0
|
|
27
|
+
reading_time: 16
|
|
28
|
+
estimated_setup_time: 25
|
|
29
|
+
version: "1.0"
|
|
30
|
+
related_docs:
|
|
31
|
+
- "dynamic-fields-field-catalog"
|
|
32
|
+
- "dynamic-fields-field-selection-guide"
|
|
33
|
+
- "dynamic-fields-host-custom-field-guide"
|
|
34
|
+
- "dynamic-fields-host-custom-field-troubleshooting"
|
|
35
|
+
- "dynamic-fields-inline-filter-catalog"
|
|
36
|
+
- "dynamic-fields-filter-inline-components-guide"
|
|
37
|
+
- "host-integration-guide"
|
|
38
|
+
- "consumer-integration-quickstart"
|
|
39
|
+
keywords:
|
|
40
|
+
- "dynamic field loader"
|
|
41
|
+
- "metadata-driven fields"
|
|
42
|
+
- "material controls"
|
|
43
|
+
- "runtime registry"
|
|
44
|
+
last_updated: "2026-03-07"
|
|
45
|
+
---
|
|
46
|
+
|
|
1
47
|
# @praxisui/dynamic-fields — Dynamic Form Fields
|
|
2
48
|
|
|
49
|
+
## 🔰 Exemplos / Quickstart
|
|
50
|
+
|
|
51
|
+
Para ver esta biblioteca em funcionamento em uma aplicação completa, utilize o projeto de exemplo (Quickstart):
|
|
52
|
+
|
|
53
|
+
- Repositório: https://github.com/codexrodrigues/praxis-ui-quickstart
|
|
54
|
+
- O Quickstart demonstra a integração das bibliotecas `@praxisui/*` em um app Angular, incluindo instalação, configuração e uso em telas reais.
|
|
55
|
+
|
|
3
56
|
### Concept Usage
|
|
4
57
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
58
|
+
- Dynamic component rendering
|
|
59
|
+
- Headless UI and design systems
|
|
60
|
+
- Data-driven forms
|
|
8
61
|
|
|
9
62
|
Biblioteca de campos dinâmicos para aplicações Angular (v20+) com Material Design. Renderiza campos a partir de metadados, com carregamento lazy e integração com Reactive Forms.
|
|
10
63
|
|
|
@@ -14,6 +67,37 @@ Biblioteca de campos dinâmicos para aplicações Angular (v20+) com Material De
|
|
|
14
67
|
npm install @praxisui/dynamic-fields
|
|
15
68
|
```
|
|
16
69
|
|
|
70
|
+
### Estilos e tokens (opcional)
|
|
71
|
+
|
|
72
|
+
- Largura dos campos: quando o host usa `providePraxisDynamicFields()`, a lib injeta um estilo escopado que garante `mat-form-field { width: 100% }` dentro dos componentes. Não é necessário repetir no app.
|
|
73
|
+
- Gradiente de marca (se desejar): o host pode definir um gradiente para detalhes visuais da lib (ex.: toolbar de edição):
|
|
74
|
+
|
|
75
|
+
```scss
|
|
76
|
+
:root {
|
|
77
|
+
--p-primary-gradient: linear-gradient(90deg, #1f8a8a, #6c63ff);
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Sem essa variável, o toolbar usa fallback sólido em `--md-sys-color-primary`.
|
|
82
|
+
|
|
83
|
+
Tema e escopo (host)
|
|
84
|
+
- A classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.theme-light`); mantenha tokens e componentes no mesmo escopo.
|
|
85
|
+
|
|
86
|
+
### Tokens M3 obrigatórios (host)
|
|
87
|
+
|
|
88
|
+
Para que os componentes reflitam corretamente o tema do app host, garanta no mínimo:
|
|
89
|
+
|
|
90
|
+
- Superfícies: `--md-sys-color-surface`, `--md-sys-color-surface-variant`, `--md-sys-color-surface-container-*`
|
|
91
|
+
- Texto/contorno: `--md-sys-color-on-surface`, `--md-sys-color-on-surface-variant`, `--md-sys-color-outline`, `--md-sys-color-outline-variant`
|
|
92
|
+
- Semânticos: `--md-sys-color-primary`, `--md-sys-color-on-primary`, `--md-sys-color-secondary`, `--md-sys-color-on-secondary`, `--md-sys-color-tertiary`, `--md-sys-color-on-tertiary`, `--md-sys-color-error`, `--md-sys-color-on-error`
|
|
93
|
+
- Containers: `--md-sys-color-primary-container`, `--md-sys-color-on-primary-container`, `--md-sys-color-secondary-container`, `--md-sys-color-on-secondary-container`, `--md-sys-color-tertiary-container`, `--md-sys-color-on-tertiary-container`, `--md-sys-color-error-container`, `--md-sys-color-on-error-container`
|
|
94
|
+
- Elevação: `--md-sys-elevation-level1`–`--md-sys-elevation-level3`
|
|
95
|
+
|
|
96
|
+
Notas:
|
|
97
|
+
- Color pickers agora derivam paletas por padrão de tokens M3. Se quiser cores específicas, use `paletteColors`/`paletteSettings`.
|
|
98
|
+
- A classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.theme-light`); mantenha tokens e componentes no mesmo escopo.
|
|
99
|
+
- Datepicker usa `panelClass="pdx-datepicker-panel"`; personalize o overlay via essa classe no tema do host.
|
|
100
|
+
|
|
17
101
|
Peers (instale no app host):
|
|
18
102
|
- `@angular/core` `^20.1.0`, `@angular/common` `^20.1.0`, `@angular/forms` `^20.1.0`
|
|
19
103
|
- `@angular/material` `^20.1.0`, `@angular/cdk` `^20.1.0`, `@angular/router` `^20.1.0`
|
|
@@ -47,32 +131,34 @@ const component = await registry.getComponent(FieldControlType.INPUT);
|
|
|
47
131
|
const isRegistered = registry.isRegistered(FieldControlType.INPUT);
|
|
48
132
|
```
|
|
49
133
|
|
|
134
|
+
## 📄 Documentacao Tecnica da Lib
|
|
135
|
+
|
|
136
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-inventory.md`
|
|
137
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-field-catalog.md`
|
|
138
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-field-selection-guide.md`
|
|
139
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-host-custom-field-guide.md`
|
|
140
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-host-custom-field-troubleshooting.md`
|
|
141
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-inventory.md`
|
|
142
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-catalog.md`
|
|
143
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-selection-guide.md`
|
|
144
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-runtime-contract.md`
|
|
145
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-custom-component-guide.md`
|
|
146
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-inline-filter-troubleshooting.md`
|
|
147
|
+
- `projects/praxis-dynamic-fields/docs/filter-inline-components-guide.md` (slug: `dynamic-fields-filter-inline-components-guide`)
|
|
148
|
+
- `projects/praxis-dynamic-fields/docs/generic-crud-service.md`
|
|
149
|
+
|
|
50
150
|
### Componentes Suportados
|
|
51
151
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
- `
|
|
60
|
-
- `
|
|
61
|
-
-
|
|
62
|
-
- `FieldControlType.CURRENCY_INPUT` - Campo monetário
|
|
63
|
-
- `FieldControlType.NUMERIC_TEXT_BOX` - Campo numérico
|
|
64
|
-
- `FieldControlType.MULTI_SELECT` - Seleção múltipla
|
|
65
|
-
- `FieldControlType.AUTO_COMPLETE` - Auto completar (busca habilitada por padrão)
|
|
66
|
-
- `FieldControlType.DATE_TIME_PICKER` - Data e hora
|
|
67
|
-
- `FieldControlType.DATE_RANGE` - Intervalo de datas
|
|
68
|
-
- `FieldControlType.FILE_UPLOAD` - Upload de arquivos
|
|
69
|
-
- `FieldControlType.TOGGLE` - Interruptor Material Design
|
|
70
|
-
- `FieldControlType.SLIDER` - Slider Material Design
|
|
71
|
-
- `FieldControlType.TIME_PICKER` - Seletor de horário
|
|
72
|
-
- `FieldControlType.RATING` - Classificação por estrelas
|
|
73
|
-
- `FieldControlType.COLOR_PICKER` - Seletor de cores
|
|
74
|
-
|
|
75
|
-
Campos com `FieldControlType.AUTO_COMPLETE` utilizam internamente o `MaterialSearchableSelectComponent`, habilitando busca automaticamente.
|
|
152
|
+
A fonte de verdade do suporte default e o `ComponentRegistryService`.
|
|
153
|
+
|
|
154
|
+
Use os documentos governados abaixo em vez de manter listas textuais soltas:
|
|
155
|
+
|
|
156
|
+
- inventario auditavel do runtime: `dynamic-fields-inventory.md`
|
|
157
|
+
- catalogo principal de fields de formulario: `dynamic-fields-field-catalog.md`
|
|
158
|
+
- guia de escolha do field correto: `dynamic-fields-field-selection-guide.md`
|
|
159
|
+
- extensao do host: `dynamic-fields-host-custom-field-guide.md`
|
|
160
|
+
- troubleshooting de extensao: `dynamic-fields-host-custom-field-troubleshooting.md`
|
|
161
|
+
- trilha especializada de filtros compactos: `dynamic-fields-inline-filter-catalog.md`
|
|
76
162
|
|
|
77
163
|
## 🧩 MaterialSelectComponent
|
|
78
164
|
|
|
@@ -101,6 +187,44 @@ Grupo de botões de rádio que consome metadados ou dados remotos para criar sel
|
|
|
101
187
|
- **Carregamento Dinâmico**: mesmas chaves de configuração de `MaterialSelectComponent` para buscar opções.
|
|
102
188
|
- **Layout Flexível**: configuração de orientação, `labelPosition` e `color` segundo a [documentação oficial](https://material.angular.dev/components/radio/overview).
|
|
103
189
|
|
|
190
|
+
## 🧩 Avatar Field
|
|
191
|
+
|
|
192
|
+
Componente visual para exibir representação de usuário/entidade/estado, com prioridade de conteúdo:
|
|
193
|
+
|
|
194
|
+
- imageSrc > icon > initials > ng-content
|
|
195
|
+
|
|
196
|
+
Propriedades principais: `themeColor`, `rounded`, `size`, `fillMode`, `border`, `tooltip`, `ariaLabel`.
|
|
197
|
+
|
|
198
|
+
Exemplos:
|
|
199
|
+
|
|
200
|
+
```html
|
|
201
|
+
<pdx-material-avatar [imageSrc]="user.img" size="large" themeColor="tertiary"></pdx-material-avatar>
|
|
202
|
+
<pdx-material-avatar initials="MB" themeColor="secondary"></pdx-material-avatar>
|
|
203
|
+
<pdx-material-avatar icon="person" fillMode="outline"></pdx-material-avatar>
|
|
204
|
+
<pdx-material-avatar><app-status-badge></app-status-badge></pdx-material-avatar>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Uso em formulários dinâmicos (via metadata):
|
|
208
|
+
|
|
209
|
+
```ts
|
|
210
|
+
import { FieldControlType, type FieldMetadata } from '@praxisui/core';
|
|
211
|
+
|
|
212
|
+
const fields: FieldMetadata[] = [
|
|
213
|
+
{
|
|
214
|
+
name: 'avatar',
|
|
215
|
+
label: 'Avatar',
|
|
216
|
+
controlType: FieldControlType.AVATAR,
|
|
217
|
+
// opções específicas via `extra` (quando aplicável)
|
|
218
|
+
extra: { imageSrc: 'https://example.com/u/42.png', size: 'large' }
|
|
219
|
+
}
|
|
220
|
+
];
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Tokens M3 aplicados:
|
|
224
|
+
|
|
225
|
+
- `--pfx-avatar-bg`, `--pfx-avatar-fg`, `--pfx-avatar-border-color`, `--pfx-avatar-border-w`
|
|
226
|
+
- `--pfx-avatar-size`, `--pfx-avatar-radius-[full|lg|md|sm]`
|
|
227
|
+
|
|
104
228
|
## 📦 Instalação
|
|
105
229
|
|
|
106
230
|
```bash
|
|
@@ -309,6 +433,18 @@ _Sistema desenvolvido seguindo diretrizes de simplicidade e foco no essencial._
|
|
|
309
433
|
|
|
310
434
|
## 🔌 Extensão pelo App Host (registrando seu próprio componente)
|
|
311
435
|
|
|
436
|
+
Resumo executivo:
|
|
437
|
+
|
|
438
|
+
- `ComponentRegistryService.register(...)`: registra o componente que o runtime carrega.
|
|
439
|
+
- `ComponentMetadataRegistry.register(...)`: registra nome/ícone/superfície editorial.
|
|
440
|
+
- `controlType` do contrato deve bater com `ComponentDocMeta.id`.
|
|
441
|
+
- Hot metadata funciona melhor quando o componente expõe `setInputMetadata(...)` e/ou signal de metadata.
|
|
442
|
+
|
|
443
|
+
Para o guia governado completo, consulte:
|
|
444
|
+
|
|
445
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-host-custom-field-guide.md`
|
|
446
|
+
- `projects/praxis-dynamic-fields/docs/dynamic-fields-host-custom-field-troubleshooting.md`
|
|
447
|
+
|
|
312
448
|
Aplicações host podem registrar componentes próprios para uso no DynamicFieldLoader e expor metadados para título/ícone amigáveis no editor.
|
|
313
449
|
|
|
314
450
|
### 1) Registrar o componente no runtime (DynamicFieldLoader)
|
|
@@ -395,3 +531,67 @@ const field: FieldMetadata = {
|
|
|
395
531
|
- Suporta `setInputMetadata` ou signal `metadata` com `.set(...)` para hot updates.
|
|
396
532
|
- Opcional: aceita `[readonlyMode]`, `[disabledMode]`, `[visible]`, `[presentationMode]`.
|
|
397
533
|
- O `controlType` do campo coincide com o `id` do `ComponentDocMeta` (para resolver título/ícone no editor).
|
|
534
|
+
|
|
535
|
+
### 🧼 Botão de limpar (clearButton)
|
|
536
|
+
|
|
537
|
+
Muitos campos suportam um botão de limpar configurável via metadata. Ele aparece como um `mat-icon-button` no suffix do `mat-form-field` e respeita `readonly`, `disabled` e `presentationMode`.
|
|
538
|
+
|
|
539
|
+
Exemplo de uso:
|
|
540
|
+
|
|
541
|
+
```ts
|
|
542
|
+
const field: FieldMetadata = {
|
|
543
|
+
name: 'search',
|
|
544
|
+
label: 'Buscar',
|
|
545
|
+
controlType: FieldControlType.INPUT,
|
|
546
|
+
clearButton: {
|
|
547
|
+
enabled: true,
|
|
548
|
+
icon: 'mi:clear',
|
|
549
|
+
iconColor: 'primary', // ou cor CSS (#496ddb, rgb(73,109,219), red)
|
|
550
|
+
tooltip: 'Limpar',
|
|
551
|
+
ariaLabel: 'Limpar busca',
|
|
552
|
+
showOnlyWhenFilled: true,
|
|
553
|
+
},
|
|
554
|
+
};
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
Observações:
|
|
558
|
+
- `iconColor` aceita tokens de tema (`primary`, `accent`, `warn`) ou cores CSS.
|
|
559
|
+
- Em campos com comportamentos especializados (ex.: currency), o clear também limpa o valor visual.
|
|
560
|
+
- `clearButton` também aceita boolean (`true/false`) por compatibilidade retroativa.
|
|
561
|
+
- No `pdx-color-picker`, o clear é exibido no menu interno, mas aceita `clearButton` como boolean ou objeto (ícone/cor/tooltip).
|
|
562
|
+
|
|
563
|
+
### ⭐ Filter Inline Rating (faixa)
|
|
564
|
+
|
|
565
|
+
Use `controlType: 'filter-rating-inline'` quando o filtro de avaliação precisar trabalhar com intervalo no toolbar.
|
|
566
|
+
|
|
567
|
+
Contrato de valor (payload):
|
|
568
|
+
- `null` => sem filtro aplicado
|
|
569
|
+
- `{ start: number | null, end: number | null }` => faixa de avaliação
|
|
570
|
+
|
|
571
|
+
Exemplo:
|
|
572
|
+
|
|
573
|
+
```ts
|
|
574
|
+
const ratingRangeField: FieldMetadata = {
|
|
575
|
+
name: 'ratingRange',
|
|
576
|
+
label: 'Avaliação',
|
|
577
|
+
controlType: 'filter-rating-inline',
|
|
578
|
+
min: 1,
|
|
579
|
+
max: 5,
|
|
580
|
+
allowHalf: true,
|
|
581
|
+
ratingToneLowColor: '#ef4444',
|
|
582
|
+
ratingToneMidColor: '#f59e0b',
|
|
583
|
+
ratingToneHighColor: '#22a45d',
|
|
584
|
+
ratingBadgeColor: '#f59e0b',
|
|
585
|
+
clearButton: { enabled: true, showOnlyWhenFilled: true },
|
|
586
|
+
};
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
Compatibilidade corporativa:
|
|
590
|
+
- `FieldControlType.RATING` continua sendo valor único (ex.: `4`).
|
|
591
|
+
- A conversão para faixa ocorre apenas com `controlType` explícito de inline rating (`filter-rating-inline` ou aliases inline).
|
|
592
|
+
- Para permitir meia estrela, use `allowHalf: true` (ou `step: 0.5` quando precisar de controle manual).
|
|
593
|
+
- Cores das estrelas no popover podem ser definidas por:
|
|
594
|
+
- `ratingToneLowColor`
|
|
595
|
+
- `ratingToneMidColor`
|
|
596
|
+
- `ratingToneHighColor`
|
|
597
|
+
- `ratingBadgeColor`
|