@praxisui/dynamic-fields 8.0.0-beta.7 → 8.0.0-beta.70
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 +19 -0
- package/docs/dynamic-fields-field-catalog.md +217 -0
- package/docs/dynamic-fields-field-selection-guide.md +204 -0
- package/docs/dynamic-fields-host-custom-field-guide.md +252 -0
- package/docs/dynamic-fields-host-custom-field-troubleshooting.md +160 -0
- package/docs/dynamic-fields-inline-components-guide.md +582 -0
- package/docs/dynamic-fields-inline-filter-catalog.md +502 -0
- package/docs/dynamic-fields-inline-filter-custom-component-guide.md +241 -0
- package/docs/dynamic-fields-inline-filter-inventory.md +247 -0
- package/docs/dynamic-fields-inline-filter-runtime-contract.md +391 -0
- package/docs/dynamic-fields-inline-filter-selection-guide.md +419 -0
- package/docs/dynamic-fields-inline-filter-troubleshooting.md +201 -0
- package/docs/dynamic-fields-inventory.md +206 -0
- package/docs/dynamic-fields-playground-catalog-plan.md +243 -0
- package/docs/generic-crud-service.md +152 -0
- package/fesm2022/praxisui-dynamic-fields-index-CBogy3si.mjs +1 -0
- package/fesm2022/praxisui-dynamic-fields-index-CWPZdn1Y.mjs +6 -0
- package/fesm2022/praxisui-dynamic-fields-index-CrHhyUMO.mjs +1 -0
- package/fesm2022/praxisui-dynamic-fields-index-DhGo5In4.mjs +6 -0
- package/fesm2022/praxisui-dynamic-fields.mjs +19551 -10669
- package/package.json +14 -13
- package/src/lib/base/pdx-base-input-runtime-contract.json-api.md +526 -0
- package/src/lib/base/pdx-base-select-runtime-contract.json-api.md +474 -0
- package/src/lib/components/color-input/pdx-color-input.json-api.md +573 -0
- package/src/lib/components/color-picker/pdx-color-picker.json-api.md +686 -0
- package/src/lib/components/date-input/pdx-date-input.json-api.md +581 -0
- package/src/lib/components/datetime-local-input/pdx-datetime-local-input.json-api.md +560 -0
- package/src/lib/components/email-input/pdx-email-input.json-api.md +546 -0
- package/src/lib/components/field-shell/praxis-field-shell.json-api.md +523 -0
- package/src/lib/components/inline-async-select/pdx-inline-async-select.json-api.md +566 -0
- package/src/lib/components/inline-autocomplete/pdx-inline-autocomplete.json-api.md +554 -0
- package/src/lib/components/inline-color-label/pdx-inline-color-label.json-api.md +615 -0
- package/src/lib/components/inline-currency/pdx-inline-currency.json-api.md +542 -0
- package/src/lib/components/inline-currency-range/pdx-inline-currency-range.json-api.md +630 -0
- package/src/lib/components/inline-date/pdx-inline-date.json-api.md +529 -0
- package/src/lib/components/inline-date-range/pdx-inline-date-range.json-api.md +592 -0
- package/src/lib/components/inline-distance-radius/pdx-inline-distance-radius.json-api.md +649 -0
- package/src/lib/components/inline-entity-lookup/pdx-inline-entity-lookup.json-api.md +656 -0
- package/src/lib/components/inline-input/pdx-inline-input.json-api.md +538 -0
- package/src/lib/components/inline-multi-select/pdx-inline-multi-select.json-api.md +566 -0
- package/src/lib/components/inline-number/pdx-inline-number.json-api.md +533 -0
- package/src/lib/components/inline-pipeline-status/pdx-inline-pipeline-status.json-api.md +619 -0
- package/src/lib/components/inline-range-slider/pdx-inline-range-slider.json-api.md +605 -0
- package/src/lib/components/inline-rating/pdx-inline-rating.json-api.md +594 -0
- package/src/lib/components/inline-relative-period/pdx-inline-relative-period.json-api.md +623 -0
- package/src/lib/components/inline-score-priority/pdx-inline-score-priority.json-api.md +632 -0
- package/src/lib/components/inline-searchable-select/pdx-inline-searchable-select.json-api.md +564 -0
- package/src/lib/components/inline-select/pdx-inline-select.json-api.md +571 -0
- package/src/lib/components/inline-sentiment/pdx-inline-sentiment.json-api.md +661 -0
- package/src/lib/components/inline-time/pdx-inline-time.json-api.md +573 -0
- package/src/lib/components/inline-time-range/pdx-inline-time-range.json-api.md +635 -0
- package/src/lib/components/inline-toggle/pdx-inline-toggle.json-api.md +516 -0
- package/src/lib/components/inline-tree-select/pdx-inline-tree-select.json-api.md +637 -0
- package/src/lib/components/material-async-select/pdx-material-async-select.json-api.md +566 -0
- package/src/lib/components/material-autocomplete/pdx-material-autocomplete.json-api.md +561 -0
- package/src/lib/components/material-avatar/pdx-material-avatar.json-api.md +670 -0
- package/src/lib/components/material-button/pdx-material-button.json-api.md +572 -0
- package/src/lib/components/material-button-toggle/pdx-material-button-toggle.json-api.md +577 -0
- package/src/lib/components/material-checkbox-group/pdx-material-checkbox-group.json-api.md +611 -0
- package/src/lib/components/material-chips/pdx-material-chips.json-api.md +601 -0
- package/src/lib/components/material-colorpicker/pdx-material-colorpicker.json-api.md +545 -0
- package/src/lib/components/material-cpf-cnpj-input/pdx-material-cpf-cnpj-input.json-api.md +531 -0
- package/src/lib/components/material-currency/pdx-material-currency.json-api.md +569 -0
- package/src/lib/components/material-date-range/pdx-material-date-range.json-api.md +636 -0
- package/src/lib/components/material-datepicker/pdx-material-datepicker.json-api.md +551 -0
- package/src/lib/components/material-file-upload/pdx-material-file-upload.json-api.md +511 -0
- package/src/lib/components/material-multi-select/pdx-material-multi-select.json-api.md +596 -0
- package/src/lib/components/material-multi-select-tree/pdx-material-multi-select-tree.json-api.md +623 -0
- package/src/lib/components/material-price-range/pdx-material-price-range.json-api.md +619 -0
- package/src/lib/components/material-radio-group/pdx-material-radio-group.json-api.md +585 -0
- package/src/lib/components/material-range-slider/pdx-material-range-slider.json-api.md +664 -0
- package/src/lib/components/material-rating/pdx-material-rating.json-api.md +551 -0
- package/src/lib/components/material-searchable-select/pdx-material-searchable-select.json-api.md +602 -0
- package/src/lib/components/material-select/pdx-material-select.json-api.md +601 -0
- package/src/lib/components/material-selection-list/pdx-material-selection-list.json-api.md +607 -0
- package/src/lib/components/material-slide-toggle/pdx-material-slide-toggle.json-api.md +522 -0
- package/src/lib/components/material-slider/pdx-material-slider.json-api.md +602 -0
- package/src/lib/components/material-textarea/pdx-material-textarea.json-api.md +598 -0
- package/src/lib/components/material-timepicker/pdx-material-timepicker.json-api.md +554 -0
- package/src/lib/components/material-transfer-list/pdx-material-transfer-list.json-api.md +614 -0
- package/src/lib/components/material-tree-select/pdx-material-tree-select.json-api.md +649 -0
- package/src/lib/components/month-input/pdx-month-input.json-api.md +527 -0
- package/src/lib/components/number-input/pdx-number-input.json-api.md +594 -0
- package/src/lib/components/password-input/pdx-password-input.json-api.md +574 -0
- package/src/lib/components/pdx-material-time-range/pdx-material-time-range.json-api.md +592 -0
- package/src/lib/components/pdx-year-input/pdx-year-input.json-api.md +543 -0
- package/src/lib/components/phone-input/pdx-phone-input.json-api.md +583 -0
- package/src/lib/components/preload-status/pdx-preload-status.json-api.md +455 -0
- package/src/lib/components/search-input/pdx-search-input.json-api.md +536 -0
- package/src/lib/components/text-input/pdx-text-input.json-api.md +600 -0
- package/src/lib/components/time-input/pdx-time-input.json-api.md +546 -0
- package/src/lib/components/url-input/pdx-url-input.json-api.md +542 -0
- package/src/lib/components/week-input/pdx-week-input.json-api.md +533 -0
- package/{index.d.ts → types/praxisui-dynamic-fields.d.ts} +874 -440
- package/fesm2022/praxisui-dynamic-fields-index-C9IUU4lo.mjs +0 -1
- package/fesm2022/praxisui-dynamic-fields-index-GJtthzkD.mjs +0 -1
- package/fesm2022/praxisui-dynamic-fields-index-XvVS6lAQ.mjs +0 -1
package/README.md
CHANGED
|
@@ -115,6 +115,12 @@ Notas:
|
|
|
115
115
|
- A classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.theme-light`); mantenha tokens e componentes no mesmo escopo.
|
|
116
116
|
- Datepicker usa `panelClass="pdx-datepicker-panel"`; personalize o overlay via essa classe no tema do host.
|
|
117
117
|
|
|
118
|
+
### Prefixos Material e labels flutuantes
|
|
119
|
+
|
|
120
|
+
O Angular Material documenta uma limitação real em `mat-form-field` com aparência `fill` ou `outline`: prefixos/sufixos de texto não alinham bem com o label em repouso, e a recomendação oficial atual é usar `floatLabel="always"` nesses casos. A plataforma segue essa recomendação para adornos estruturais permanentes, como swatches de cor e símbolos que fazem parte do valor visual.
|
|
121
|
+
|
|
122
|
+
Não substitua essa política por offsets CSS locais. Offsets dependem de densidade, fonte, idioma, aparência Material e do tamanho do prefixo, e tendem a quebrar quando o Angular Material muda a estrutura MDC interna. Se o Angular Material passar a oferecer suporte nativo melhor para prefixos em `fill`/`outline`, reavalie esta decisão de plataforma e prefira voltar a delegar o alinhamento ao Material.
|
|
123
|
+
|
|
118
124
|
Peers (instale no app host):
|
|
119
125
|
- `@angular/core` `^20.1.0`, `@angular/common` `^20.1.0`, `@angular/forms` `^20.1.0`
|
|
120
126
|
- `@angular/material` `^20.1.0`, `@angular/cdk` `^20.1.0`, `@angular/router` `^20.1.0`
|
|
@@ -181,6 +187,19 @@ Estado atual da trilha:
|
|
|
181
187
|
- familias fora da wave 1 ainda podem expor `ComponentDocMeta` proprio, mas isso nao as transforma em nova fonte canonica;
|
|
182
188
|
- ao promover uma nova familia para a trilha canonica, a ordem correta e: descriptor editorial -> metadata derivado -> catalogo derivado -> consumo no `dynamic-form`.
|
|
183
189
|
|
|
190
|
+
## Agentic Authoring & Manifest
|
|
191
|
+
|
|
192
|
+
`@praxisui/dynamic-fields` publica `PRAXIS_DYNAMIC_FIELDS_AUTHORING_MANIFEST` como contrato executavel de authoring para a familia de controles. Diferente de componentes com um unico config editor, este manifesto governa a cadeia runtime/editorial/tooling.
|
|
193
|
+
|
|
194
|
+
- **Component family:** `praxis-dynamic-fields`
|
|
195
|
+
- **Config Schema:** `FieldMetadata`
|
|
196
|
+
- **Editable targets:** 7 target kinds: `controlType`, `controlAlias`, `editorialDescriptor`, `selectorMapping`, `fieldMetadataPath`, `runtimeCoverage`, `editorCoverage`.
|
|
197
|
+
- **Operation families:** 8 operations: `controlType.register`, `controlType.alias.add`, `controlType.alias.remove`, `descriptor.update`, `selector.mapping.set`, `metadata.mapping.set`, `editorCoverage.validate`, `runtimeCoverage.validate`.
|
|
198
|
+
- **Validation:** 14 validators separam cobertura runtime de cobertura editorial/tooling, protegem aliases e selector mappings deterministas, alinham capabilities de `FieldMetadata` e exigem evidencia de cobertura.
|
|
199
|
+
- **Control profiles:** 18 perfis (`text-input`, `numeric`, `currency`, `select`, `entity-lookup`, `tree-select`, `list-transfer`, `date`, `date-range`, `time-range`, `toggle`, `color`, `regional-document`, `file-upload`, `collection`, `avatar`, `display-action`, `field-shell`) adicionam operacoes, validators e examples granulares por classe de controle sem duplicar 1 manifesto completo por componente.
|
|
200
|
+
- **Registry projection:** o manifesto e projetado na entrada agregada `praxis-dynamic-fields` e tambem nos componentes de `@praxisui/dynamic-fields` no `ai_registry`; cada componente projetado recebe `authoringManifestProfiles` com o perfil aplicavel, e runtime render sozinho nao e evidencia suficiente de suporte editorial.
|
|
201
|
+
- **Selector mappings:** `selector.mapping.set` governa entradas do `FieldSelectorRegistry`; selectors de host precisam ser registrados explicitamente em vez de depender de convencao textual ou fallback por nome parecido.
|
|
202
|
+
|
|
184
203
|
### Componentes Suportados
|
|
185
204
|
|
|
186
205
|
A fonte de verdade do suporte default e o `ComponentRegistryService`.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Dynamic Fields Field Catalog"
|
|
3
|
+
slug: "dynamic-fields-field-catalog"
|
|
4
|
+
description: "Catalogo principal dos fields padrao registrados em @praxisui/dynamic-fields para formularios metadata-driven."
|
|
5
|
+
doc_type: "reference"
|
|
6
|
+
document_kind: "governance-reference"
|
|
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
|
+
- "catalog"
|
|
19
|
+
- "controlType"
|
|
20
|
+
- "forms"
|
|
21
|
+
order: 34
|
|
22
|
+
icon: "toc"
|
|
23
|
+
toc: true
|
|
24
|
+
sidebar: true
|
|
25
|
+
search_boost: 1.05
|
|
26
|
+
reading_time: 24
|
|
27
|
+
estimated_setup_time: 30
|
|
28
|
+
version: "1.0"
|
|
29
|
+
related_docs:
|
|
30
|
+
- "dynamic-fields-overview"
|
|
31
|
+
- "dynamic-fields-inventory"
|
|
32
|
+
- "dynamic-fields-field-selection-guide"
|
|
33
|
+
- "dynamic-fields-host-custom-field-guide"
|
|
34
|
+
- "dynamic-fields-inline-filter-catalog"
|
|
35
|
+
keywords:
|
|
36
|
+
- "field catalog"
|
|
37
|
+
- "which field to use"
|
|
38
|
+
- "controlType"
|
|
39
|
+
- "metadata snippet"
|
|
40
|
+
last_updated: "2026-03-26"
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
# Dynamic Fields Field Catalog
|
|
44
|
+
|
|
45
|
+
## Overview
|
|
46
|
+
|
|
47
|
+
Este catalogo cobre os fields padrao registrados por default para formularios dinamicos comuns.
|
|
48
|
+
|
|
49
|
+
Nao entram aqui:
|
|
50
|
+
|
|
51
|
+
- aliases de compatibilidade (`dateTime`, `treeView`);
|
|
52
|
+
- fields inline especializados de filtro.
|
|
53
|
+
|
|
54
|
+
Para auditoria completa do runtime, consulte [Dynamic Fields Inventory](./dynamic-fields-inventory.md). Para inline filter controls, consulte [Dynamic Fields Inline Filter Catalog](./dynamic-fields-inline-filter-catalog.md).
|
|
55
|
+
|
|
56
|
+
## Published surface for hosts
|
|
57
|
+
|
|
58
|
+
Este markdown continua sendo a referencia governada de narrativa, recomendacoes de uso e snippets curtos.
|
|
59
|
+
|
|
60
|
+
Para consumo operacional por hosts oficiais, a superficie canonica e o catalogo exportado pela lib em `src/lib/catalog/dynamic-fields-playground.catalog.ts`, reexportado pelo `public-api` de `@praxisui/dynamic-fields`.
|
|
61
|
+
|
|
62
|
+
Regra de uso:
|
|
63
|
+
|
|
64
|
+
- host, landing e playground consomem o catalogo exportado;
|
|
65
|
+
- este documento explica quando usar, quando evitar e para onde navegar;
|
|
66
|
+
- mudancas de runtime ou descoberta devem nascer primeiro na lib canonica, nao em listas locais do host.
|
|
67
|
+
|
|
68
|
+
## Canonical editorial source
|
|
69
|
+
|
|
70
|
+
Para os controls ja cobertos pela trilha editorial/i18n canonica, este catalogo nao e a fonte primaria de `friendlyName`, `description` ou `icon`.
|
|
71
|
+
|
|
72
|
+
Regra de governanca:
|
|
73
|
+
|
|
74
|
+
- descriptor em `src/lib/editorial/**`: fonte canonica da semantica editorial;
|
|
75
|
+
- `ComponentDocMeta`: artefato derivado da mesma semantica para builders/registry;
|
|
76
|
+
- catalogo playground/showcase: artefato derivado para discovery e narrativa de uso;
|
|
77
|
+
- `dynamic-form`: consumidor do resolver canonico, sem mapa editorial local.
|
|
78
|
+
|
|
79
|
+
Se um novo field precisar entrar neste catalogo com copy governada, ele deve primeiro entrar na trilha canonica da lib. Nao e aceitavel publicar copy nova apenas aqui.
|
|
80
|
+
|
|
81
|
+
## How to read this catalog
|
|
82
|
+
|
|
83
|
+
- `quando usar`: caso de uso preferencial;
|
|
84
|
+
- `quando evitar`: quando outro field entrega UX melhor;
|
|
85
|
+
- `valor esperado`: shape mental do valor no form;
|
|
86
|
+
- `snippet`: exemplo curto de metadata, focado no `controlType`.
|
|
87
|
+
|
|
88
|
+
## Published discovery semantics
|
|
89
|
+
|
|
90
|
+
O catalogo exportado por `@praxisui/dynamic-fields` agora publica semantica de descoberta para hosts oficiais:
|
|
91
|
+
|
|
92
|
+
- `track`: separa `primary-form` de `inline-filter`;
|
|
93
|
+
- `family`: agrupa a taxonomia funcional do field;
|
|
94
|
+
- `interactionPattern`: resume o padrao dominante de uso, como `single-value`, `lookup`, `range`, `visual` ou `trigger`;
|
|
95
|
+
- `icon.key` + `icon.tone`: entregam identidade visual canonica para menus, vitrines e playgrounds.
|
|
96
|
+
|
|
97
|
+
Regra editorial:
|
|
98
|
+
|
|
99
|
+
- este markdown continua explicando `quando usar` e `quando evitar`;
|
|
100
|
+
- landing, playground e outros hosts devem derivar navegacao, cues e mini-cards do catalogo exportado da lib;
|
|
101
|
+
- a documentacao nao deve manter uma tabela paralela de icones ou interaction patterns fora da fonte canonica.
|
|
102
|
+
|
|
103
|
+
## Texto
|
|
104
|
+
|
|
105
|
+
| Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
|
|
106
|
+
| -------------- | --------------------------------------------- | ---------------------------- | ------------------------------------ | -------------- | ----------------------------------------------------- | ----------------------------------------- |
|
|
107
|
+
| Text input | <span id="input"></span>`input` | texto livre curto | quando ha formato fechado | `string` | `{ name: 'fullName', controlType: 'input' }` | `pdx-text-input.json-api.md` |
|
|
108
|
+
| Email input | <span id="email"></span>`email` | email validado | se o campo aceita qualquer texto | `string` | `{ name: 'email', controlType: 'email' }` | `pdx-email-input.json-api.md` |
|
|
109
|
+
| Password input | <span id="password"></span>`password` | segredo/senha | quando o valor precisa ficar legivel | `string` | `{ name: 'password', controlType: 'password' }` | `pdx-password-input.json-api.md` |
|
|
110
|
+
| Textarea | <span id="textarea"></span>`textarea` | descricao longa, observacoes | conteudo curto de uma linha | `string` | `{ name: 'notes', controlType: 'textarea', rows: 4 }` | `pdx-material-textarea.json-api.md` |
|
|
111
|
+
| Search input | <span id="search"></span>`search` | busca textual dedicada | entrada comum sem semantica de busca | `string` | `{ name: 'query', controlType: 'search' }` | `pdx-search-input.json-api.md` |
|
|
112
|
+
| Phone input | <span id="phone"></span>`phone` | telefone | se o dominio nao usa telefone | `string` | `{ name: 'phone', controlType: 'phone' }` | `pdx-phone-input.json-api.md` |
|
|
113
|
+
| URL input | <span id="url"></span>`url` | links/URLs | strings livres sem validacao de URL | `string` | `{ name: 'website', controlType: 'url' }` | `pdx-url-input.json-api.md` |
|
|
114
|
+
| CPF/CNPJ input | <span id="cpfcnpjinput"></span>`cpfCnpjInput` | documento brasileiro | dominio internacional/generalista | `string` | `{ name: 'document', controlType: 'cpfCnpjInput' }` | `pdx-material-cpf-cnpj-input.json-api.md` |
|
|
115
|
+
|
|
116
|
+
## Numero, moeda e range
|
|
117
|
+
|
|
118
|
+
| Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
|
|
119
|
+
| -------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------ | --------------- | -------------------------------------------------------------------------------------------------- | --------------------------------------- |
|
|
120
|
+
| Number input | <span id="numerictextbox"></span>`numericTextBox` | numero simples | intervalo guiado por slider | `number` | `{ name: 'age', controlType: 'numericTextBox' }` | `pdx-number-input.json-api.md` |
|
|
121
|
+
| Currency input | <span id="currency"></span>`currency` | valor monetario unico | faixa monetaria | `number` | `{ name: 'budget', controlType: 'currency' }` | `pdx-material-currency.json-api.md` |
|
|
122
|
+
| Slider | <span id="slider"></span>`slider` | valor unico em faixa continua, com marks, value label, bandas semanticas e histograma responsivo ao valor | campos financeiros complexos | `number` | `{ name: 'score', controlType: 'slider', min: 0, max: 10, valueLabelDisplay: 'on' }` | `pdx-material-slider.json-api.md` |
|
|
123
|
+
| Range slider | <span id="rangeslider"></span>`rangeSlider` | faixa numerica com marks, inputs opcionais, distancia min/max, bandas e distribuicao responsiva ao range | datas/horarios | `{ start,end }` | `{ name: 'range', controlType: 'rangeSlider', mode: 'range', min: 0, max: 100, showInputs: true }` | `pdx-material-range-slider.json-api.md` |
|
|
124
|
+
| Price range | <span id="pricerange"></span>`priceRange` | faixa monetaria | uma moeda unica | `{ min,max }` | `{ name: 'priceBand', controlType: 'priceRange' }` | `pdx-material-price-range.json-api.md` |
|
|
125
|
+
| Rating | <span id="rating"></span>`rating` | nota/avaliacao visual | quando precisao numerica e dominante | `number` | `{ name: 'satisfaction', controlType: 'rating' }` | `pdx-material-rating.json-api.md` |
|
|
126
|
+
|
|
127
|
+
### Contrato de preview do catalogo jogavel
|
|
128
|
+
|
|
129
|
+
`previewRecipe.presets[].initialValue` define a semente padrao do preset apos aplicar o metadata do estado ativo. Quando um preset precisa que um estado especifico tenha valor proprio, use `previewRecipe.presets[].stateInitialValues`.
|
|
130
|
+
|
|
131
|
+
Precedencia da semente no playground:
|
|
132
|
+
|
|
133
|
+
1. `preset.stateInitialValues[state]`
|
|
134
|
+
2. `state.initialValue`
|
|
135
|
+
3. `preset.initialValue`
|
|
136
|
+
4. `defaultState.initialValue`
|
|
137
|
+
5. fallback gerado pelo runtime do playground
|
|
138
|
+
|
|
139
|
+
Use `stateInitialValues` apenas quando o valor do preset precisa continuar coerente com a semantica daquele estado, como `Currency + Filled` em `rangeSlider`.
|
|
140
|
+
|
|
141
|
+
## Data e tempo
|
|
142
|
+
|
|
143
|
+
| Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
|
|
144
|
+
| -------------- | ----------------------------------------------- | ----------------------------- | ----------------------------------------------- | ----------------------- | ------------------------------------------------------- | -------------------------------------- |
|
|
145
|
+
| Date input | <span id="dateinput"></span>`dateInput` | integracao com input nativo | quando o host precisa UX Material forte | `string \| Date` | `{ name: 'birthDate', controlType: 'dateInput' }` | `pdx-date-input.json-api.md` |
|
|
146
|
+
| Date picker | <span id="date"></span>`date` | selecao de data no formulario | se o fluxo pede intervalo | `Date \| string` | `{ name: 'startDate', controlType: 'date' }` | `pdx-material-datepicker.json-api.md` |
|
|
147
|
+
| Date range | <span id="daterange"></span>`dateRange` | intervalo de datas | data unica | `{ startDate,endDate }` | `{ name: 'period', controlType: 'dateRange' }` | `pdx-material-date-range.json-api.md` |
|
|
148
|
+
| Datetime local | <span id="datetimelocal"></span>`dateTimeLocal` | data + hora local em um campo | quando o fluxo precisa seletor dedicado de hora | `string` | `{ name: 'appointment', controlType: 'dateTimeLocal' }` | `pdx-datetime-local-input.json-api.md` |
|
|
149
|
+
| Month input | <span id="month"></span>`month` | mes/ano | datas completas | `string` | `{ name: 'competence', controlType: 'month' }` | `pdx-month-input.json-api.md` |
|
|
150
|
+
| Time input | <span id="time"></span>`time` | hora simples | intervalo de horario | `string` | `{ name: 'startAt', controlType: 'time' }` | `pdx-time-input.json-api.md` |
|
|
151
|
+
| Time picker | <span id="timepicker"></span>`timePicker` | seletor de horario Material | campo simples sem picker | `string` | `{ name: 'slot', controlType: 'timePicker' }` | `pdx-material-timepicker.json-api.md` |
|
|
152
|
+
| Time range | <span id="timerange"></span>`timeRange` | janela de horario | apenas uma hora | `{ start,end }` | `{ name: 'window', controlType: 'timeRange' }` | `pdx-material-time-range.json-api.md` |
|
|
153
|
+
| Week input | <span id="week"></span>`week` | semana ISO | quando o negocio trabalha por data convencional | `string` | `{ name: 'weekRef', controlType: 'week' }` | `pdx-week-input.json-api.md` |
|
|
154
|
+
| Year input | <span id="year"></span>`year` | ano isolado | mes/ano ou data completa | `number \| string` | `{ name: 'fiscalYear', controlType: 'year' }` | `pdx-year-input.json-api.md` |
|
|
155
|
+
|
|
156
|
+
## Selecao
|
|
157
|
+
|
|
158
|
+
| Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
|
|
159
|
+
| ----------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------- |
|
|
160
|
+
| Select | <span id="select"></span>`select` | lista fechada simples | bases muito grandes sem busca | `string \| number \| object` | `{ name: 'status', controlType: 'select', options: [...] }` | `pdx-material-select.json-api.md` |
|
|
161
|
+
| Searchable select | <span id="searchable-select"></span>`searchable-select` | lista maior com busca | consultas remotas pesadas | `string \| number \| object` | `{ name: 'department', controlType: 'searchable-select' }` | `pdx-material-searchable-select.json-api.md` |
|
|
162
|
+
| Async select | <span id="async-select"></span>`async-select` | opcoes remotas | lista pequena local | `string \| number \| object` | `{ name: 'city', controlType: 'async-select', resourcePath: 'cities' }` | `pdx-material-async-select.json-api.md` |
|
|
163
|
+
| Entity lookup | <span id="entitylookup"></span>`entityLookup` | entidade corporativa com identidade, status, reidratacao e politica de selecao | opcoes simples sem semantica de entidade | `entity id \| EntityRef` | `{ name: 'supplierId', controlType: 'entityLookup', optionSource: { key: 'suppliers', type: 'RESOURCE_ENTITY' } }` | `pdx-inline-entity-lookup.json-api.md` |
|
|
164
|
+
| Autocomplete | <span id="autocomplete"></span>`autoComplete` | busca progressiva com sugestoes | quando o usuario deve escolher so de lista fechada simples | `string \| number \| object` | `{ name: 'role', controlType: 'autoComplete' }` | `pdx-material-autocomplete.json-api.md` |
|
|
165
|
+
| Multi select | <span id="multiselect"></span>`multiSelect` | multiplas escolhas | se o usuario so pode escolher uma opcao | `unknown[]` | `{ name: 'tags', controlType: 'multiSelect' }` | `pdx-material-multi-select.json-api.md` |
|
|
166
|
+
|
|
167
|
+
## Arvores e listas
|
|
168
|
+
|
|
169
|
+
| Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
|
|
170
|
+
| ------------------- | --------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------- |
|
|
171
|
+
| Multi select tree | <span id="multiselecttree"></span>`multiSelectTree` | hierarquia com multiplas selecoes | lista plana pequena | `unknown[]` | `{ name: 'permissions', controlType: 'multiSelectTree' }` | `pdx-material-multi-select-tree.json-api.md` |
|
|
172
|
+
| Tree select | <span id="treeselect"></span>`treeSelect` | hierarquia com selecao simples | multiplas selecoes | `string \| number \| object` | `{ name: 'category', controlType: 'treeSelect' }` | `pdx-material-tree-select.json-api.md` |
|
|
173
|
+
| Editable collection | <span id="array"></span>`array` | lista repetivel de objetos com subcampos metadata-driven | uma entidade unica ou selecao simples de opcoes | `Array<Record<string, unknown>>` | `{ name: 'contacts', controlType: 'array', array: { itemSchema: { fields: [...] } } }` | `pdx-editable-collection` |
|
|
174
|
+
| Selection list | <span id="selectionlist"></span>`selectionList` | lista grande com affordance de lista | layouts que pedem dropdown compacto | `unknown[]` | `{ name: 'channels', controlType: 'selectionList' }` | `pdx-material-selection-list.json-api.md` |
|
|
175
|
+
| Transfer list | <span id="transferlist"></span>`transferList` | mover itens entre disponivel/selecionado | selecoes simples | `unknown[]` | `{ name: 'members', controlType: 'transferList' }` | `pdx-material-transfer-list.json-api.md` |
|
|
176
|
+
| Chip input | <span id="chipinput"></span>`chipInput` | lista textual editavel | se ordem/edicao nao importam | `string[]` | `{ name: 'emails', controlType: 'chipInput' }` | `pdx-material-chips.json-api.md` |
|
|
177
|
+
| Chip list | <span id="chiplist"></span>`chipList` | exibicao/edicao em chips | entrada de valor unico | `string[]` | `{ name: 'labels', controlType: 'chipList' }` | `pdx-material-chips.json-api.md` |
|
|
178
|
+
|
|
179
|
+
## Toggle e choice
|
|
180
|
+
|
|
181
|
+
| Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
|
|
182
|
+
| ------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------ | ----------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------- |
|
|
183
|
+
| Checkbox | <span id="checkbox"></span>`checkbox` | booleano simples com `selectionMode: 'boolean'` ou multiplas escolhas com `selectionMode: 'multiple'` | contrato novo sem `selectionMode`; escolha unica | `boolean \| unknown[]` | `{ name: 'privacyConsent', controlType: 'checkbox', selectionMode: 'boolean' }` | `pdx-material-checkbox-group.json-api.md` |
|
|
184
|
+
| Radio group | <span id="radio"></span>`radio` | escolha unica explicita com `selectionMode: 'single'` | muitas opcoes/espaco restrito | `string \| number \| boolean` | `{ name: 'priority', controlType: 'radio', selectionMode: 'single' }` | `pdx-material-radio-group.json-api.md` |
|
|
185
|
+
| Toggle | <span id="toggle"></span>`toggle` | booleano binario | multiplos estados | `boolean` | `{ name: 'active', controlType: 'toggle' }` | `pdx-material-slide-toggle.json-api.md` |
|
|
186
|
+
| Button toggle | <span id="buttontoggle"></span>`buttonToggle` | escolha segmentada curta | listas longas | `string \| number` | `{ name: 'mode', controlType: 'buttonToggle' }` | `pdx-material-button-toggle.json-api.md` |
|
|
187
|
+
|
|
188
|
+
## Upload
|
|
189
|
+
|
|
190
|
+
| Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
|
|
191
|
+
| ----------- | --------------------------------- | ------------------- | -------------------------------- | ---------------------------- | ----------------------------------------------- | -------------------------------------- |
|
|
192
|
+
| File upload | <span id="upload"></span>`upload` | anexos e documentos | quando o fluxo nao exige arquivo | `File \| File[] \| metadata` | `{ name: 'attachment', controlType: 'upload' }` | `pdx-material-file-upload.json-api.md` |
|
|
193
|
+
|
|
194
|
+
## Cor
|
|
195
|
+
|
|
196
|
+
| Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
|
|
197
|
+
| ------------ | ------------------------------------------- | ----------------------------- | ------------------------- | -------------- | ------------------------------------------------ | ------------------------------ |
|
|
198
|
+
| Color input | <span id="color"></span>`color` | cor simples por valor textual | UX rica de paleta | `string` | `{ name: 'brandColor', controlType: 'color' }` | `pdx-color-input.json-api.md` |
|
|
199
|
+
| Color picker | <span id="colorpicker"></span>`colorPicker` | paleta, presets, selecao rica | entrada rapida sem picker | `string` | `{ name: 'accent', controlType: 'colorPicker' }` | `pdx-color-picker.json-api.md` |
|
|
200
|
+
|
|
201
|
+
## Visual e acao
|
|
202
|
+
|
|
203
|
+
| Field | controlType | Quando usar | Quando evitar | Valor esperado | Snippet | Detail doc |
|
|
204
|
+
| ------------ | ------------------------------------------- | ---------------------------------------- | ------------------------------ | ------------------ | -------------------------------------------------------------------------------- | --------------------------------- |
|
|
205
|
+
| Avatar | <span id="avatar"></span>`avatar` | representacao visual de usuario/entidade | captura de dado textual | `string \| object` | `{ name: 'ownerAvatar', controlType: 'avatar' }` | `pdx-material-avatar.json-api.md` |
|
|
206
|
+
| Button | <span id="button"></span>`button` | acao auxiliar dentro do layout | submit/cancel padrao do form | n/a | `{ name: 'validateBtn', controlType: 'button', action: 'validateCustomerData' }` | `pdx-material-button.json-api.md` |
|
|
207
|
+
| Cron builder | <span id="cronbuilder"></span>`cronBuilder` | agenda/expressao cron | datas simples ou ranges comuns | `string` | `{ name: 'schedule', controlType: 'cronBuilder' }` | `@praxisui/cron-builder` |
|
|
208
|
+
|
|
209
|
+
## Notes for enterprise use
|
|
210
|
+
|
|
211
|
+
- prefira `select`/`searchable-select`/`async-select` conforme o tamanho e a origem dos dados;
|
|
212
|
+
- prefira `entityLookup` quando o valor representa uma entidade real do dominio e precisa de `RESOURCE_ENTITY`, reidratacao por id, status, permissao de selecao ou dependencias;
|
|
213
|
+
- prefira `array` quando o usuario precisa editar uma colecao repetivel de objetos, como contatos, linhas de pedido ou itens de contrato;
|
|
214
|
+
- prefira `date` sobre `dateInput` quando o design system precisa consistencia Material;
|
|
215
|
+
- trate `button`, `avatar` e `cronBuilder` como controls especializados, nao como default;
|
|
216
|
+
- para trilha de filtros compactos, use o catalogo separado de inline filters;
|
|
217
|
+
- para vitrine jogavel e descoberta entre squads, prefira derivar categorias, tags, snippets, `interactionPattern` e `icon` a partir do catalogo exportado da lib.
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Dynamic Fields Field Selection Guide"
|
|
3
|
+
slug: "dynamic-fields-field-selection-guide"
|
|
4
|
+
description: "Guia para escolher o field certo em @praxisui/dynamic-fields, considerando UX, contrato, origem dos dados e extensao no host."
|
|
5
|
+
doc_type: "guide"
|
|
6
|
+
document_kind: "governance-reference"
|
|
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
|
+
- "decision guide"
|
|
19
|
+
- "controlType"
|
|
20
|
+
- "ux"
|
|
21
|
+
order: 35
|
|
22
|
+
icon: "rule"
|
|
23
|
+
toc: true
|
|
24
|
+
sidebar: true
|
|
25
|
+
search_boost: 1.08
|
|
26
|
+
reading_time: 14
|
|
27
|
+
estimated_setup_time: 20
|
|
28
|
+
version: "1.0"
|
|
29
|
+
related_docs:
|
|
30
|
+
- "dynamic-fields-field-catalog"
|
|
31
|
+
- "dynamic-fields-inventory"
|
|
32
|
+
- "dynamic-fields-host-custom-field-guide"
|
|
33
|
+
- "dynamic-fields-inline-filter-catalog"
|
|
34
|
+
- "dynamic-fields-inline-components-guide"
|
|
35
|
+
keywords:
|
|
36
|
+
- "choose field"
|
|
37
|
+
- "select vs autocomplete"
|
|
38
|
+
- "custom host field"
|
|
39
|
+
- "inline filter"
|
|
40
|
+
last_updated: "2026-03-26"
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
# Dynamic Fields Field Selection Guide
|
|
44
|
+
|
|
45
|
+
## Objective
|
|
46
|
+
|
|
47
|
+
Escolher o `controlType` certo nao e apenas um detalhe visual. A decisao afeta:
|
|
48
|
+
|
|
49
|
+
- clareza de UX;
|
|
50
|
+
- shape do valor no contrato;
|
|
51
|
+
- performance do runtime;
|
|
52
|
+
- chance de hot update funcionar sem refresh estrutural;
|
|
53
|
+
- custo de manutencao no host.
|
|
54
|
+
|
|
55
|
+
## Fonte canonica para descoberta
|
|
56
|
+
|
|
57
|
+
Para decisao humana, este guia e o field catalog continuam sendo a referencia editorial principal.
|
|
58
|
+
|
|
59
|
+
Para descoberta operacional em landing pages, playgrounds e outros hosts oficiais, use o catalogo exportado por `@praxisui/dynamic-fields`. Ele centraliza `controlType`, trilha (`primary-form` ou `inline-filter`), categorias, `interactionPattern`, semantica de `icon`, estados relevantes, snippets e links oficiais, com validacao de paridade contra o runtime.
|
|
60
|
+
|
|
61
|
+
Regra pratica para hosts:
|
|
62
|
+
|
|
63
|
+
- use `interactionPattern` para comunicar como o field decide ou captura valor;
|
|
64
|
+
- use `dataSourceKind` para deixar claro se o caso e local, remoto, misto ou especializado;
|
|
65
|
+
- use `icon.key` e `icon.tone` apenas como projecao visual do catalogo canonico, nunca como regra inventada no host.
|
|
66
|
+
|
|
67
|
+
## Politica visual para labels, icones e prefixos
|
|
68
|
+
|
|
69
|
+
Campos Material com `appearance: 'fill'` ou `'outline'` e conteudo em
|
|
70
|
+
`matPrefix`/`matSuffix` precisam de cuidado especial. Isso inclui `prefixIcon`,
|
|
71
|
+
`suffixIcon`, `clearButton`, datepicker toggle, seletor de cor, simbolo de moeda
|
|
72
|
+
e controles equivalentes.
|
|
73
|
+
|
|
74
|
+
Para esses casos, use a configuracao canonica:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"materialDesign": {
|
|
79
|
+
"floatLabel": "always",
|
|
80
|
+
"subscriptSizing": "dynamic"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Essa configuracao deve vir da metadata ou da politica global do host que gera os
|
|
86
|
+
campos, nao de CSS local. O Angular Material documenta que, em campos
|
|
87
|
+
`fill`/`outline`, prefixos/sufixos nao se alinham bem com labels em repouso; por
|
|
88
|
+
isso a recomendacao oficial e manter o label sempre flutuante nesses cenarios.
|
|
89
|
+
|
|
90
|
+
## 1. Texto livre vs selecao
|
|
91
|
+
|
|
92
|
+
### Use `input` / `textarea` quando
|
|
93
|
+
|
|
94
|
+
- o usuario realmente precisa escrever;
|
|
95
|
+
- o dominio aceita grande variacao lexical;
|
|
96
|
+
- nao existe catalogo confiavel de opcoes.
|
|
97
|
+
|
|
98
|
+
### Use `select` / `searchable-select` / `async-select` / `autoComplete` quando
|
|
99
|
+
|
|
100
|
+
- o valor deve vir de um conjunto governado;
|
|
101
|
+
- o backend precisa consistencia sem normalizacao extra;
|
|
102
|
+
- a opcao precisa carregar label + id de forma previsivel.
|
|
103
|
+
|
|
104
|
+
### Sinal de erro de escolha
|
|
105
|
+
|
|
106
|
+
Se o schema usa `input` para algo que depois exige validacao pesada, busca semantica ou reconciliacao contra catalogo, provavelmente deveria ser selecao.
|
|
107
|
+
|
|
108
|
+
## 2. Local vs remoto
|
|
109
|
+
|
|
110
|
+
| Scenario | Prefer | Why |
|
|
111
|
+
| --- | --- | --- |
|
|
112
|
+
| poucas opcoes estaveis | `select` | simples, previsivel, barato |
|
|
113
|
+
| lista media/grande com busca local | `searchable-select` | reduz carga visual |
|
|
114
|
+
| lista remota/paginada | `async-select` | evita preload caro |
|
|
115
|
+
| entidade de negocio remota com status, permissao, reidratacao ou dependencias | `entityLookup` | preserva identidade de entidade e usa contrato `RESOURCE_ENTITY` em vez de tratar entidade como opcao simples |
|
|
116
|
+
| busca incremental com semantica de sugestao | `autoComplete` | boa UX para descoberta |
|
|
117
|
+
|
|
118
|
+
## 3. Simples vs range
|
|
119
|
+
|
|
120
|
+
| Need | Prefer | Avoid |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| um numero | `numericTextBox` | `rangeSlider` |
|
|
123
|
+
| um valor monetario | `currency` | `priceRange` |
|
|
124
|
+
| uma data | `date` | `dateRange` |
|
|
125
|
+
| uma hora | `time` ou `timePicker` | `timeRange` |
|
|
126
|
+
| faixa numerica | `rangeSlider` | dois `numericTextBox` desconectados |
|
|
127
|
+
| faixa monetaria | `priceRange` | dois `currency` soltos |
|
|
128
|
+
| faixa temporal | `dateRange` ou `timeRange` | dois campos sem semantica de range |
|
|
129
|
+
| lista repetivel de objetos | `array` | varios grupos duplicados manualmente |
|
|
130
|
+
|
|
131
|
+
## 4. Padrao vs custom host
|
|
132
|
+
|
|
133
|
+
### Fique no catalogo padrao quando
|
|
134
|
+
|
|
135
|
+
- o field ja esta registrado por default;
|
|
136
|
+
- a diferenca e apenas visual ou de metadata;
|
|
137
|
+
- o comportamento cabe em inputs/props do componente existente;
|
|
138
|
+
- o runtime ja cobre CVA, hot update e editor metadata.
|
|
139
|
+
|
|
140
|
+
### Crie field custom no host quando
|
|
141
|
+
|
|
142
|
+
- o dominio pede interacao especializada que nao cabe no catalogo;
|
|
143
|
+
- o componente precisa de semantica propria no editor;
|
|
144
|
+
- o contrato precisa de `controlType` exclusivo e governado pelo host.
|
|
145
|
+
|
|
146
|
+
Antes de criar, consulte [Dynamic Fields Host Custom Field Guide](./dynamic-fields-host-custom-field-guide.md).
|
|
147
|
+
|
|
148
|
+
## 5. Form field vs inline filter field
|
|
149
|
+
|
|
150
|
+
Nao misture as duas narrativas:
|
|
151
|
+
|
|
152
|
+
- formulario comum: use `input`, `select`, `date`, `upload`, `toggle`, etc.;
|
|
153
|
+
- filtro inline compacto: use `inline*` apenas em trilhas de filtro.
|
|
154
|
+
|
|
155
|
+
Se o caso e filtro corporativo compacto, consulte:
|
|
156
|
+
|
|
157
|
+
- [Dynamic Fields Inline Filter Catalog](./dynamic-fields-inline-filter-catalog.md)
|
|
158
|
+
- [Dynamic Fields Inline Components Guide](./dynamic-fields-inline-components-guide.md)
|
|
159
|
+
|
|
160
|
+
## 6. Decision table
|
|
161
|
+
|
|
162
|
+
| Question | Prefer |
|
|
163
|
+
| --- | --- |
|
|
164
|
+
| o usuario escreve texto curto? | `input` |
|
|
165
|
+
| o usuario escreve texto longo? | `textarea` |
|
|
166
|
+
| o usuario escolhe 1 opcao de lista pequena? | `select` |
|
|
167
|
+
| o usuario escolhe 1 opcao de lista grande? | `searchable-select` |
|
|
168
|
+
| a lista vem do backend sob demanda? | `async-select` |
|
|
169
|
+
| o usuario escolhe entidade real do dominio? | `entityLookup` |
|
|
170
|
+
| a UX parece busca com sugestoes? | `autoComplete` |
|
|
171
|
+
| o valor e monetario? | `currency` / `priceRange` |
|
|
172
|
+
| o valor e data? | `date` / `dateRange` |
|
|
173
|
+
| o valor e horario? | `time` / `timePicker` / `timeRange` |
|
|
174
|
+
| o padrao e lookup governado com busca? | `entityLookup` quando houver identidade/status/politica; `searchable-select` / `async-select` / `autoComplete` para opcoes simples |
|
|
175
|
+
| o padrao e range com semantica propria? | `priceRange` / `dateRange` / `timeRange` / `inlineDateRange` |
|
|
176
|
+
| o padrao e visual semantico? | `rating` / `inlinePipelineStatus` / `inlineSentiment` / `inlineColorLabel` |
|
|
177
|
+
| o valor e booleano? | `toggle` |
|
|
178
|
+
| a escolha unica precisa ser muito explicita? | `radio` ou `buttonToggle` |
|
|
179
|
+
| ha multiplas escolhas discretas? | `checkbox` ou `multiSelect` |
|
|
180
|
+
| ha hierarquia? | `treeSelect` / `multiSelectTree` |
|
|
181
|
+
| ha uma colecao repetivel de objetos? | `array` |
|
|
182
|
+
| ha anexos? | `upload` |
|
|
183
|
+
| o controle e acao, nao dado? | `button` |
|
|
184
|
+
| nada do catalogo resolve sem gambiarra? | field custom do host |
|
|
185
|
+
|
|
186
|
+
## 7. Enterprise recommendations
|
|
187
|
+
|
|
188
|
+
- prefira nomes canonicos de `controlType`; deixe aliases apenas para compatibilidade;
|
|
189
|
+
- nao use inline filter controls em formularios normais para “economizar espaco”;
|
|
190
|
+
- para campos remotos, explicite origem de dados e comportamento de busca;
|
|
191
|
+
- para entidades de negocio, use `entityLookup` com `optionSource.type = RESOURCE_ENTITY`, `byIds`, `dependsOn`, `dependencyFilterMap` e `selectionPolicy` quando a selecao depender de status, permissao ou contexto;
|
|
192
|
+
- para colecoes repetiveis, use `array` com `array.itemSchema.fields` em vez de criar campos numerados como `item1`, `item2`, `item3`;
|
|
193
|
+
- para custom fields, alinhe runtime registry + metadata registry + hot update desde o inicio.
|
|
194
|
+
|
|
195
|
+
## Nota de governanca para hosts
|
|
196
|
+
|
|
197
|
+
Se um host precisar montar vitrine, filtros ou snippets jogaveis, derive isso do catalogo exportado da lib em vez de manter listas autorais locais.
|
|
198
|
+
|
|
199
|
+
Isso inclui explicitamente:
|
|
200
|
+
|
|
201
|
+
- cues de decisao;
|
|
202
|
+
- navegacao por tipo de interacao;
|
|
203
|
+
- iconografia de cards e menus;
|
|
204
|
+
- agrupamentos por track/family para descoberta operacional.
|