@praxisui/dynamic-fields 8.0.0-beta.6 → 8.0.0-beta.60
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
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Dynamic Fields Inventory"
|
|
3
|
+
slug: "dynamic-fields-inventory"
|
|
4
|
+
description: "Inventario governado dos controlTypes realmente registrados por default em @praxisui/dynamic-fields, com cobertura de metadata, JSON API e exemplos."
|
|
5
|
+
doc_type: "reference"
|
|
6
|
+
document_kind: "governance-reference"
|
|
7
|
+
component: "dynamic-fields"
|
|
8
|
+
category: "components"
|
|
9
|
+
audience:
|
|
10
|
+
- "frontend"
|
|
11
|
+
- "architect"
|
|
12
|
+
- "platform-team"
|
|
13
|
+
level: "advanced"
|
|
14
|
+
status: "active"
|
|
15
|
+
owner: "praxis-ui"
|
|
16
|
+
tags:
|
|
17
|
+
- "dynamic-fields"
|
|
18
|
+
- "inventory"
|
|
19
|
+
- "controlType"
|
|
20
|
+
- "runtime"
|
|
21
|
+
order: 33
|
|
22
|
+
icon: "inventory_2"
|
|
23
|
+
toc: true
|
|
24
|
+
sidebar: true
|
|
25
|
+
search_boost: 0.95
|
|
26
|
+
reading_time: 18
|
|
27
|
+
estimated_setup_time: 20
|
|
28
|
+
version: "1.0"
|
|
29
|
+
related_docs:
|
|
30
|
+
- "dynamic-fields-overview"
|
|
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-inline-components-guide"
|
|
37
|
+
keywords:
|
|
38
|
+
- "component registry"
|
|
39
|
+
- "registered control types"
|
|
40
|
+
- "metadata coverage"
|
|
41
|
+
- "json api coverage"
|
|
42
|
+
last_updated: "2026-03-26"
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# Dynamic Fields Inventory
|
|
46
|
+
|
|
47
|
+
## Source of truth
|
|
48
|
+
|
|
49
|
+
Este inventario foi montado a partir do runtime real:
|
|
50
|
+
|
|
51
|
+
- `projects/praxis-dynamic-fields/src/lib/services/component-registry/component-registry.service.ts`
|
|
52
|
+
- `projects/praxis-dynamic-fields/src/lib/providers.ts`
|
|
53
|
+
- `projects/praxis-core/src/lib/utils/inline-filter-controls.util.ts`
|
|
54
|
+
|
|
55
|
+
Regras deste documento:
|
|
56
|
+
|
|
57
|
+
- lista apenas `controlType` efetivamente registrados por default;
|
|
58
|
+
- separa controles de formulario comuns de controles inline especializados;
|
|
59
|
+
- trata aliases/compatibilidade em trilha separada para nao confundir escolha de novos contratos.
|
|
60
|
+
|
|
61
|
+
## Runtime inventory vs published catalog
|
|
62
|
+
|
|
63
|
+
Este documento continua sendo a auditoria `runtime-first` da lib. Ele existe para responder:
|
|
64
|
+
|
|
65
|
+
- o que esta realmente registrado por default;
|
|
66
|
+
- quais aliases de compatibilidade ainda existem;
|
|
67
|
+
- qual e a cobertura de metadata, JSON API e exemplos.
|
|
68
|
+
|
|
69
|
+
Para consumo por hosts, landing page e playgrounds oficiais, a superficie canonica agora e o catalogo exportado pela propria lib em `src/lib/catalog/dynamic-fields-playground.catalog.ts`, reexportado pelo `public-api`.
|
|
70
|
+
|
|
71
|
+
Regra editorial:
|
|
72
|
+
|
|
73
|
+
- `inventory`: prova o runtime real;
|
|
74
|
+
- `catalog`: organiza descoberta, snippets, estados, `interactionPattern`, semantica de `icon` e links oficiais para consumidores;
|
|
75
|
+
- `docs markdown`: governam a narrativa e a referencia, mas nao dirigem o preview runtime.
|
|
76
|
+
|
|
77
|
+
Quando houver diferenca entre uma necessidade de UX de descoberta e a listagem deste inventario:
|
|
78
|
+
|
|
79
|
+
- o ajuste deve nascer no catalogo exportado da lib, nao em listas manuais do host;
|
|
80
|
+
- este inventario continua focado em registro, cobertura e auditoria de runtime;
|
|
81
|
+
- hosts oficiais devem projetar menus, vitrines e cues a partir do catalogo, nao desta tabela runtime-first.
|
|
82
|
+
|
|
83
|
+
## Coverage legend
|
|
84
|
+
|
|
85
|
+
- `metadata`: existe arquivo `*.metadata.ts` no componente.
|
|
86
|
+
- `json-api`: existe arquivo `*.json-api.md` no componente.
|
|
87
|
+
- `README`: aparece textualmente no `README.md` da lib.
|
|
88
|
+
- `examples`: aparece textualmente no `USAGE-EXAMPLES.md`.
|
|
89
|
+
|
|
90
|
+
## A. Primary form controls
|
|
91
|
+
|
|
92
|
+
| Familia | controlType | Angular component | metadata | json-api | README | examples | Notes |
|
|
93
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
94
|
+
| texto | `input` | `TextInputComponent` | `components/text-input/text-input.metadata.ts` | `components/text-input/pdx-text-input.json-api.md` | yes | yes | texto livre canônico |
|
|
95
|
+
| texto | `email` | `EmailInputComponent` | `components/email-input/email-input.metadata.ts` | `components/email-input/pdx-email-input.json-api.md` | yes | yes | email especializado |
|
|
96
|
+
| texto | `password` | `PasswordInputComponent` | `components/password-input/password-input.metadata.ts` | `components/password-input/pdx-password-input.json-api.md` | yes | yes | senha |
|
|
97
|
+
| texto | `textarea` | `MaterialTextareaComponent` | `components/material-textarea/material-textarea.metadata.ts` | `components/material-textarea/pdx-material-textarea.json-api.md` | yes | yes | texto longo |
|
|
98
|
+
| texto | `search` | `SearchInputComponent` | `components/search-input/search-input.metadata.ts` | `components/search-input/pdx-search-input.json-api.md` | yes | yes | busca textual |
|
|
99
|
+
| texto | `phone` | `PhoneInputComponent` | `components/phone-input/phone-input.metadata.ts` | `components/phone-input/pdx-phone-input.json-api.md` | no | yes | telefone |
|
|
100
|
+
| texto | `url` | `UrlInputComponent` | `components/url-input/url-input.metadata.ts` | `components/url-input/pdx-url-input.json-api.md` | no | no | URL |
|
|
101
|
+
| texto | `cpfCnpjInput` | `MaterialCpfCnpjInputComponent` | `components/material-cpf-cnpj-input/material-cpf-cnpj-input.metadata.ts` | `components/material-cpf-cnpj-input/pdx-material-cpf-cnpj-input.json-api.md` | no | no | documento BR |
|
|
102
|
+
| numero/moeda/range | `numericTextBox` | `NumberInputComponent` | `components/number-input/number-input.metadata.ts` | `components/number-input/pdx-number-input.json-api.md` | no | no | numero canônico |
|
|
103
|
+
| numero/moeda/range | `currency` | `MaterialCurrencyComponent` | `components/material-currency/material-currency.metadata.ts` | `components/material-currency/pdx-material-currency.json-api.md` | yes | no | moeda |
|
|
104
|
+
| numero/moeda/range | `slider` | `MaterialSliderComponent` | `components/material-slider/material-slider.metadata.ts` | `components/material-slider/pdx-material-slider.json-api.md` | yes | no | valor unico em faixa |
|
|
105
|
+
| numero/moeda/range | `rangeSlider` | `PdxMaterialRangeSliderComponent` | `components/material-range-slider/material-range-slider.metadata.ts` | `components/material-range-slider/pdx-material-range-slider.json-api.md` | no | no | faixa simples ou dupla |
|
|
106
|
+
| numero/moeda/range | `priceRange` | `MaterialPriceRangeComponent` | `components/material-price-range/material-price-range.metadata.ts` | `components/material-price-range/pdx-material-price-range.json-api.md` | no | no | faixa monetaria |
|
|
107
|
+
| numero/moeda/range | `rating` | `MaterialRatingComponent` | `components/material-rating/material-rating.metadata.ts` | `components/material-rating/pdx-material-rating.json-api.md` | yes | yes | pontuacao visual |
|
|
108
|
+
| data e tempo | `dateInput` | `DateInputComponent` | `components/date-input/date-input.metadata.ts` | `components/date-input/pdx-date-input.json-api.md` | no | no | input de data nativo |
|
|
109
|
+
| data e tempo | `date` | `MaterialDatepickerComponent` | `components/material-datepicker/material-datepicker.metadata.ts` | `components/material-datepicker/pdx-material-datepicker.json-api.md` | yes | yes | datepicker Material |
|
|
110
|
+
| data e tempo | `dateRange` | `MaterialDateRangeComponent` | `components/material-date-range/material-date-range.metadata.ts` | `components/material-date-range/pdx-material-date-range.json-api.md` | no | yes | intervalo de datas |
|
|
111
|
+
| data e tempo | `dateTimeLocal` | `DatetimeLocalInputComponent` | `components/datetime-local-input/datetime-local-input.metadata.ts` | `components/datetime-local-input/pdx-datetime-local-input.json-api.md` | no | no | data/hora local |
|
|
112
|
+
| data e tempo | `month` | `MonthInputComponent` | `components/month-input/month-input.metadata.ts` | `components/month-input/pdx-month-input.json-api.md` | no | yes | mes/ano |
|
|
113
|
+
| data e tempo | `time` | `TimeInputComponent` | `components/time-input/time-input.metadata.ts` | `components/time-input/pdx-time-input.json-api.md` | yes | yes | hora simples |
|
|
114
|
+
| data e tempo | `timePicker` | `MaterialTimepickerComponent` | `components/material-timepicker/material-timepicker.metadata.ts` | `components/material-timepicker/pdx-material-timepicker.json-api.md` | yes | yes | seletor de horario |
|
|
115
|
+
| data e tempo | `timeRange` | `PdxMaterialTimeRangeComponent` | `components/pdx-material-time-range/pdx-material-time-range.metadata.ts` | `components/pdx-material-time-range/pdx-material-time-range.json-api.md` | no | no | intervalo de horario |
|
|
116
|
+
| data e tempo | `week` | `WeekInputComponent` | `components/week-input/week-input.metadata.ts` | `components/week-input/pdx-week-input.json-api.md` | no | no | semana ISO |
|
|
117
|
+
| data e tempo | `year` | `PdxYearInputComponent` | `components/pdx-year-input/pdx-year-input.metadata.ts` | `components/pdx-year-input/pdx-year-input.json-api.md` | no | yes | ano |
|
|
118
|
+
| selecao | `select` | `MaterialSelectComponent` | `components/material-select/material-select.metadata.ts` | `components/material-select/pdx-material-select.json-api.md` | yes | yes | lista local/remota |
|
|
119
|
+
| selecao | `searchable-select` | `MaterialSearchableSelectComponent` | `components/material-searchable-select/material-searchable-select.metadata.ts` | `components/material-searchable-select/pdx-material-searchable-select.json-api.md` | no | yes | select com busca |
|
|
120
|
+
| selecao | `async-select` | `MaterialAsyncSelectComponent` | `components/material-async-select/material-async-select.metadata.ts` | `components/material-async-select/pdx-material-async-select.json-api.md` | no | yes | select remoto |
|
|
121
|
+
| selecao | `entityLookup` | `InlineEntityLookupComponent` | `editorial/wave1/entity-lookup.editorial.ts` | `components/inline-entity-lookup/pdx-inline-entity-lookup.json-api.md` | no | no | lookup corporativo para `RESOURCE_ENTITY`, reidratacao e politica de selecao |
|
|
122
|
+
| selecao | `autoComplete` | `MaterialAutocompleteComponent` | `components/material-autocomplete/material-autocomplete.metadata.ts` | `components/material-autocomplete/pdx-material-autocomplete.json-api.md` | yes | yes | autocomplete |
|
|
123
|
+
| selecao | `multiSelect` | `MaterialMultiSelectComponent` | `components/material-multi-select/material-multi-select.metadata.ts` | `components/material-multi-select/pdx-material-multi-select.json-api.md` | no | yes | multipla selecao |
|
|
124
|
+
| arvores/listas | `multiSelectTree` | `MaterialMultiSelectTreeComponent` | `components/material-multi-select-tree/material-multi-select-tree.metadata.ts` | `components/material-multi-select-tree/pdx-material-multi-select-tree.json-api.md` | no | no | arvore multipla |
|
|
125
|
+
| arvores/listas | `treeSelect` | `MaterialTreeSelectComponent` | `components/material-tree-select/material-tree-select.metadata.ts` | `components/material-tree-select/pdx-material-tree-select.json-api.md` | no | no | arvore simples |
|
|
126
|
+
| arvores/listas | `array` | `EditableCollectionComponent` | `editorial/wave1/editable-collection.editorial.ts` | n/a | no | no | colecao repetivel com `FormArray` e subcampos metadata-driven |
|
|
127
|
+
| arvores/listas | `selectionList` | `MaterialSelectionListComponent` | `components/material-selection-list/material-selection-list.metadata.ts` | `components/material-selection-list/pdx-material-selection-list.json-api.md` | no | yes | lista de opcoes; runtime basico funcional, mas `searchable` e `selectAll` ainda nao estao completos na superficie do componente |
|
|
128
|
+
| arvores/listas | `transferList` | `MaterialTransferListComponent` | `components/material-transfer-list/material-transfer-list.metadata.ts` | `components/material-transfer-list/pdx-material-transfer-list.json-api.md` | no | no | mover entre listas |
|
|
129
|
+
| arvores/listas | `chipInput` | `MaterialChipsComponent` | `components/material-chips/material-chips.metadata.ts` | `components/material-chips/pdx-material-chips.json-api.md` | no | no | entrada em chips |
|
|
130
|
+
| arvores/listas | `chipList` | `MaterialChipsComponent` | `components/material-chips/material-chips.metadata.ts` | `components/material-chips/pdx-material-chips.json-api.md` | no | no | lista de chips |
|
|
131
|
+
| toggle/choice | `checkbox` | `MaterialCheckboxGroupComponent` | `components/material-checkbox-group/material-checkbox-group.metadata.ts` | `components/material-checkbox-group/pdx-material-checkbox-group.json-api.md` | yes | yes | grupo de checkboxes |
|
|
132
|
+
| toggle/choice | `radio` | `MaterialRadioGroupComponent` | `components/material-radio-group/material-radio-group.metadata.ts` | `components/material-radio-group/pdx-material-radio-group.json-api.md` | yes | yes | grupo de radio |
|
|
133
|
+
| toggle/choice | `toggle` | `MaterialSlideToggleComponent` | `components/material-slide-toggle/material-slide-toggle.metadata.ts` | `components/material-slide-toggle/pdx-material-slide-toggle.json-api.md` | yes | no | booleano on/off |
|
|
134
|
+
| toggle/choice | `buttonToggle` | `MaterialButtonToggleComponent` | `components/material-button-toggle/material-button-toggle.metadata.ts` | `components/material-button-toggle/pdx-material-button-toggle.json-api.md` | no | no | grupo segmentado |
|
|
135
|
+
| upload | `upload` | `MaterialFileUploadComponent` | `components/material-file-upload/material-file-upload.metadata.ts` | `components/material-file-upload/pdx-material-file-upload.json-api.md` | yes | no | upload |
|
|
136
|
+
| cor | `color` | `ColorInputComponent` | `components/color-input/color-input.metadata.ts` | `components/color-input/pdx-color-input.json-api.md` | yes | yes | input textual/cor |
|
|
137
|
+
| cor | `colorPicker` | `PdxColorPickerComponent` | `components/color-picker/pdx-color-picker.metadata.ts` | `components/color-picker/pdx-color-picker.json-api.md` | yes | no | picker avançado |
|
|
138
|
+
| visual/acao | `avatar` | `MaterialAvatarComponent` | `components/material-avatar/material-avatar.metadata.ts` | `components/material-avatar/pdx-material-avatar.json-api.md` | yes | no | representacao visual |
|
|
139
|
+
| visual/acao | `button` | `MaterialButtonComponent` | `components/material-button/material-button.metadata.ts` | `components/material-button/pdx-material-button.json-api.md` | yes | yes | acao nao-CVA |
|
|
140
|
+
| visual/acao | `cronBuilder` | `PdxCronBuilderComponent` | n/a (lib externa) | n/a (lib externa) | no | no | depende de `@praxisui/cron-builder` |
|
|
141
|
+
|
|
142
|
+
## B. Specialized inline filter controls
|
|
143
|
+
|
|
144
|
+
Estes `controlType` sao registrados por default no mesmo registry, mas pertencem a uma trilha especializada de filtro inline. Eles nao devem ser apresentados como escolha padrao para formularios corporativos comuns.
|
|
145
|
+
As colunas de implementacao e metadata abaixo descrevem artefatos internos co-localizados ao `controlType`; caminhos fisicos e nomes historicos do workspace nao fazem parte do contrato recomendado.
|
|
146
|
+
|
|
147
|
+
| Familia | controlType | implementacao Angular | metadata | json-api | README | examples | Notes |
|
|
148
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
149
|
+
| inline de filtro | `inlineSelect` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | select compacto |
|
|
150
|
+
| inline de filtro | `inlineSearchableSelect` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | select com busca |
|
|
151
|
+
| inline de filtro | `inlineAsyncSelect` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | select remoto |
|
|
152
|
+
| inline de filtro | `inlineEntityLookup` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | lookup de entidade |
|
|
153
|
+
| inline de filtro | `inlineAutocomplete` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | autocomplete compacto |
|
|
154
|
+
| inline de filtro | `inlineNumber` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | numero compacto |
|
|
155
|
+
| inline de filtro | `inlineCurrency` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | moeda compacta |
|
|
156
|
+
| inline de filtro | `inlineCurrencyRange` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | range monetario |
|
|
157
|
+
| inline de filtro | `inlineMultiSelect` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | multipla selecao |
|
|
158
|
+
| inline de filtro | `inlineInput` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | texto compacto |
|
|
159
|
+
| inline de filtro | `inlineToggle` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | toggle compacto |
|
|
160
|
+
| inline de filtro | `inlineRange` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | slider compacto |
|
|
161
|
+
| inline de filtro | `inlineDate` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | date inline |
|
|
162
|
+
| inline de filtro | `inlineDateRange` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | date range inline |
|
|
163
|
+
| inline de filtro | `inlineTime` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | time inline |
|
|
164
|
+
| inline de filtro | `inlineTimeRange` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | time range inline |
|
|
165
|
+
| inline de filtro | `inlineTreeSelect` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | tree select inline |
|
|
166
|
+
| inline de filtro | `inlineRating` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | yes | yes | rating especializado |
|
|
167
|
+
| inline de filtro | `inlineDistanceRadius` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | distancia/raio |
|
|
168
|
+
| inline de filtro | `inlinePipelineStatus` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | status de pipeline |
|
|
169
|
+
| inline de filtro | `inlineScorePriority` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | score/prioridade |
|
|
170
|
+
| inline de filtro | `inlineRelativePeriod` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | periodo relativo |
|
|
171
|
+
| inline de filtro | `inlineSentiment` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | sentimento |
|
|
172
|
+
| inline de filtro | `inlineColorLabel` | `registrada por default no registry inline` | `metadata co-localizada ao controlType` | `co-localizado ao metadata (*.json-api.md)` | no | no | etiquetas por cor |
|
|
173
|
+
|
|
174
|
+
## C. Preferred Published Control Types
|
|
175
|
+
|
|
176
|
+
Estes valores existem no runtime, mas os contratos novos devem seguir a coluna `prefer`.
|
|
177
|
+
|
|
178
|
+
| Registered runtime value | Routed component | Prefer in new contracts | Notes |
|
|
179
|
+
| --- | --- | --- | --- |
|
|
180
|
+
| `dateTime` | `DatetimeLocalInputComponent` | `dateTimeLocal` | manter `dateTimeLocal` como nome publicado |
|
|
181
|
+
| `dateTimeRange` | `MaterialDateRangeComponent` | `dateRange` | reutiliza date range |
|
|
182
|
+
| `treeView` | `MaterialTreeSelectComponent` | `treeSelect` | publicar `treeSelect` |
|
|
183
|
+
|
|
184
|
+
## D. Coverage findings
|
|
185
|
+
|
|
186
|
+
### Strong coverage
|
|
187
|
+
|
|
188
|
+
- maioria dos fields principais possui `metadata` + `json-api`;
|
|
189
|
+
- inline filters especializados possuem cobertura estrutural forte em `metadata` + `json-api`;
|
|
190
|
+
- runtime de extensao do host esta documentado em `hot-metadata-updates.md` e no README.
|
|
191
|
+
|
|
192
|
+
### Runtime present but documentation still shallow
|
|
193
|
+
|
|
194
|
+
- `cronBuilder`: registrado por default, mas a documentacao detalhada vive na lib externa;
|
|
195
|
+
- `entityLookup`: contrato de formulario principal registrado e descobrivel, reutilizando a implementacao inline enquanto a documentacao detalhada permanece no JSON API de `inline-entity-lookup`;
|
|
196
|
+
- `array`: contrato de colecao repetivel registrado e descobrivel; a documentacao detalhada ainda deve ser aprofundada em JSON API proprio do `EditableCollectionComponent`;
|
|
197
|
+
- `dateInput`, `dateTimeLocal`, `numericTextBox`, `priceRange`, `rangeSlider`, `timeRange`, `multiSelectTree`, `treeSelect`, `transferList`, `buttonToggle`, `chipInput`, `chipList`: possuem runtime e arquivos de componente, mas aparecem pouco no README/USAGE examples;
|
|
198
|
+
- varios inline filters nao aparecem no README ou no `USAGE-EXAMPLES.md`, embora tenham metadata e JSON API.
|
|
199
|
+
|
|
200
|
+
### Governance decision
|
|
201
|
+
|
|
202
|
+
- `field catalog`: cobre os fields de formulario comuns e os componentes visuais/acao usados pelo runtime principal;
|
|
203
|
+
- `inline filter catalog`: fica separado para nao poluir a narrativa de formularios comuns;
|
|
204
|
+
- `inventory`: permanece como documento de auditoria do runtime real;
|
|
205
|
+
- `playable catalog exportado`: e a superficie de consumo recomendada para landing page, playground e outros hosts oficiais.
|
|
206
|
+
- `interactionPattern` e `icon`: fazem parte da semantica de descoberta do catalogo exportado, nao da prova de registro deste inventario.
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Dynamic Fields Playground Catalog Plan"
|
|
3
|
+
slug: "dynamic-fields-playground-catalog-plan"
|
|
4
|
+
description: "Plano canonico para publicar um catalogo jogavel de Dynamic Fields consumido pela landing/playground sem duplicar fonte de verdade no host."
|
|
5
|
+
doc_type: "reference"
|
|
6
|
+
document_kind: "governance-reference"
|
|
7
|
+
component: "dynamic-fields"
|
|
8
|
+
category: "components"
|
|
9
|
+
audience:
|
|
10
|
+
- "frontend"
|
|
11
|
+
- "architect"
|
|
12
|
+
- "platform-team"
|
|
13
|
+
level: "advanced"
|
|
14
|
+
status: "draft"
|
|
15
|
+
owner: "praxis-ui"
|
|
16
|
+
tags:
|
|
17
|
+
- "dynamic-fields"
|
|
18
|
+
- "playground"
|
|
19
|
+
- "catalog"
|
|
20
|
+
- "governance"
|
|
21
|
+
- "platform"
|
|
22
|
+
order: 31
|
|
23
|
+
icon: "view_quilt"
|
|
24
|
+
toc: true
|
|
25
|
+
sidebar: false
|
|
26
|
+
search_boost: 0.7
|
|
27
|
+
reading_time: 16
|
|
28
|
+
estimated_setup_time: 20
|
|
29
|
+
version: "1.0"
|
|
30
|
+
related_docs:
|
|
31
|
+
- "dynamic-fields-inventory"
|
|
32
|
+
- "dynamic-fields-field-catalog"
|
|
33
|
+
- "dynamic-fields-field-selection-guide"
|
|
34
|
+
- "dynamic-fields-inline-filter-catalog"
|
|
35
|
+
keywords:
|
|
36
|
+
- "playable catalog"
|
|
37
|
+
- "landing playground"
|
|
38
|
+
- "source of truth"
|
|
39
|
+
- "registry parity"
|
|
40
|
+
last_updated: "2026-03-26"
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
# Dynamic Fields Playground Catalog Plan
|
|
44
|
+
|
|
45
|
+
## Objective
|
|
46
|
+
|
|
47
|
+
Definir a modelagem canonica para um catalogo jogavel de `@praxisui/dynamic-fields` que possa ser consumido por `praxis-ui-landing-page` na rota `playground` sem criar uma lista manual paralela no host.
|
|
48
|
+
|
|
49
|
+
## Problem statement
|
|
50
|
+
|
|
51
|
+
Hoje existem tres camadas com papeis diferentes:
|
|
52
|
+
|
|
53
|
+
1. `ComponentRegistryService`
|
|
54
|
+
- define o suporte runtime real dos fields registrados por default
|
|
55
|
+
2. metadata exports e docs governadas
|
|
56
|
+
- descrevem friendly names, iconografia, uso recomendado, inventario e narrativa oficial
|
|
57
|
+
3. landing/playground
|
|
58
|
+
- publica docs e experiencias exploratorias para squads
|
|
59
|
+
|
|
60
|
+
O problema atual e que a landing ainda precisa montar algumas sementes manuais para navegacao/catalogo, enquanto o `playground` existente foi desenhado para macrocomponentes (`praxis-table`, `praxis-list`, `praxis-dynamic-form`), nao para dezenas de fields.
|
|
61
|
+
|
|
62
|
+
## Canonical source-of-truth model
|
|
63
|
+
|
|
64
|
+
### Runtime truth
|
|
65
|
+
|
|
66
|
+
A fonte de verdade do suporte default continua sendo o runtime da lib:
|
|
67
|
+
|
|
68
|
+
- `projects/praxis-dynamic-fields/src/lib/services/component-registry/component-registry.service.ts`
|
|
69
|
+
- `projects/praxis-core/src/lib/utils/inline-filter-controls.util.ts`
|
|
70
|
+
|
|
71
|
+
Essa camada responde:
|
|
72
|
+
|
|
73
|
+
- quais `controlType` existem
|
|
74
|
+
- quais sao canonicamente registrados por default
|
|
75
|
+
- quais aliases existem por compatibilidade
|
|
76
|
+
|
|
77
|
+
### Published catalog truth
|
|
78
|
+
|
|
79
|
+
O catalogo jogavel nao deve nascer na landing. Ele deve ser publicado pela lib canonica como um export agregado e tipado.
|
|
80
|
+
|
|
81
|
+
Essa camada responde:
|
|
82
|
+
|
|
83
|
+
- quais `controlType` devem aparecer para descoberta publica
|
|
84
|
+
- em qual `track` e `family` cada item entra
|
|
85
|
+
- quais estados sao demonstraveis
|
|
86
|
+
- qual snippet usar
|
|
87
|
+
- quais docs oficiais linkar
|
|
88
|
+
- quais tags e notas de UX expor
|
|
89
|
+
|
|
90
|
+
### Documentation truth
|
|
91
|
+
|
|
92
|
+
As docs governadas continuam sendo a narrativa oficial e a superficie editorial publica:
|
|
93
|
+
|
|
94
|
+
- inventario runtime-first
|
|
95
|
+
- field catalog
|
|
96
|
+
- field selection guide
|
|
97
|
+
- inline filter catalog
|
|
98
|
+
|
|
99
|
+
Essas docs nao devem ser parseadas para dirigir o preview. Elas devem ser referenciadas pelo catalogo exportado.
|
|
100
|
+
|
|
101
|
+
## Non-goals
|
|
102
|
+
|
|
103
|
+
Este plano nao pretende:
|
|
104
|
+
|
|
105
|
+
- transformar markdown em fonte primária do runtime
|
|
106
|
+
- permitir que a landing invente `controlType` ou families locais
|
|
107
|
+
- misturar aliases reconhecidos internamente como se fossem escolhas novas recomendadas
|
|
108
|
+
- substituir o `ComponentRegistryService` como prova de suporte real
|
|
109
|
+
- virar um builder visual completo dentro do `playground`
|
|
110
|
+
|
|
111
|
+
## Proposed architecture
|
|
112
|
+
|
|
113
|
+
Criar uma nova superficie publica em `@praxisui/dynamic-fields`:
|
|
114
|
+
|
|
115
|
+
- `DynamicFieldCatalogEntry`
|
|
116
|
+
- `DynamicFieldCatalogTrack`
|
|
117
|
+
- `DynamicFieldCatalogFamily`
|
|
118
|
+
- `DynamicFieldPreviewRecipe`
|
|
119
|
+
- `DYNAMIC_FIELDS_PLAYGROUND_CATALOG`
|
|
120
|
+
|
|
121
|
+
Essa superficie deve ser:
|
|
122
|
+
|
|
123
|
+
- publicada no `public-api.ts`
|
|
124
|
+
- derivada do runtime real
|
|
125
|
+
- enriquecida com metadata/governanca
|
|
126
|
+
- consumida pela landing e pelo playground
|
|
127
|
+
|
|
128
|
+
## Catalog entry contract
|
|
129
|
+
|
|
130
|
+
Cada entry do catalogo deve conter no minimo:
|
|
131
|
+
|
|
132
|
+
- `id`
|
|
133
|
+
- `controlType`
|
|
134
|
+
- `track`
|
|
135
|
+
- `primary-form`
|
|
136
|
+
- `inline-filter`
|
|
137
|
+
- `family`
|
|
138
|
+
- `status`
|
|
139
|
+
- `friendlyName`
|
|
140
|
+
- `description`
|
|
141
|
+
- `tags`
|
|
142
|
+
- `keywords`
|
|
143
|
+
- `valueShape`
|
|
144
|
+
- `recommendedWhen`
|
|
145
|
+
- `avoidWhen`
|
|
146
|
+
- `dataSourceKind`
|
|
147
|
+
- `supportsStates`
|
|
148
|
+
- `docs`
|
|
149
|
+
- `catalogSlug`
|
|
150
|
+
- `detailFragment`
|
|
151
|
+
- `selectionGuideSlug`
|
|
152
|
+
- `overviewSlug?`
|
|
153
|
+
- `jsonApiPath?`
|
|
154
|
+
- `previewRecipe`
|
|
155
|
+
- `snippetRecipe`
|
|
156
|
+
- `a11yNotes?`
|
|
157
|
+
- `themingNotes?`
|
|
158
|
+
|
|
159
|
+
## Governance rules
|
|
160
|
+
|
|
161
|
+
### Rule 1. The landing is a consumer
|
|
162
|
+
|
|
163
|
+
`praxis-ui-landing-page` nao pode manter o catalogo de Dynamic Fields como fonte primaria.
|
|
164
|
+
|
|
165
|
+
### Rule 2. Runtime parity is mandatory
|
|
166
|
+
|
|
167
|
+
Todo item publicado no catalogo precisa corresponder a um `controlType` realmente registrado por default no runtime, exceto quando marcado explicitamente como `experimental` ou `host-owned`.
|
|
168
|
+
|
|
169
|
+
### Rule 3. Docs are linked, not parsed
|
|
170
|
+
|
|
171
|
+
O catalogo aponta para docs governadas por slug/fragment. O preview nao depende de parsing de markdown.
|
|
172
|
+
|
|
173
|
+
### Rule 4. Inline filters remain a separate track
|
|
174
|
+
|
|
175
|
+
`inline*` continua sendo trilha especializada. O catalogo jogavel pode expor essa trilha, mas sem misturar a narrativa de formulario comum.
|
|
176
|
+
|
|
177
|
+
### Rule 5. Aliases are not discovery-first
|
|
178
|
+
|
|
179
|
+
Aliases como `dateTime` ou `treeView` continuam existindo por compatibilidade, mas nao entram como escolha principal no catalogo.
|
|
180
|
+
|
|
181
|
+
### Rule 6. States are governed
|
|
182
|
+
|
|
183
|
+
Estados como `default`, `filled`, `disabled`, `readonly` e `error` devem ser definidos por recipes governadas na lib, nao por patches soltos no host.
|
|
184
|
+
|
|
185
|
+
## Recommended rollout
|
|
186
|
+
|
|
187
|
+
### Phase 1. Contract and recipes
|
|
188
|
+
|
|
189
|
+
Publicar tipos e recipes basicas de estado dentro da lib.
|
|
190
|
+
|
|
191
|
+
### Phase 2. Canonical catalog export
|
|
192
|
+
|
|
193
|
+
Publicar o catalogo agregado da lib e exporta-lo em `public-api.ts`.
|
|
194
|
+
|
|
195
|
+
### Phase 3. Registry parity tests
|
|
196
|
+
|
|
197
|
+
Adicionar testes de paridade catalogo x runtime.
|
|
198
|
+
|
|
199
|
+
### Phase 4. Docs alignment
|
|
200
|
+
|
|
201
|
+
Atualizar inventario e catalogos governados para reconhecer o novo artefato publicado.
|
|
202
|
+
|
|
203
|
+
### Phase 5. Landing adoption
|
|
204
|
+
|
|
205
|
+
Trocar seeds manuais de `dynamic-fields` na landing por derivacao do catalogo exportado.
|
|
206
|
+
|
|
207
|
+
### Phase 6. Playground adoption
|
|
208
|
+
|
|
209
|
+
Adaptar o playground para suportar items do tipo `field`, com preview host canonico minimo e painel de detalhe.
|
|
210
|
+
|
|
211
|
+
## Validation requirements
|
|
212
|
+
|
|
213
|
+
Validacoes minimas esperadas ao implementar este plano:
|
|
214
|
+
|
|
215
|
+
- build focal de `praxis-dynamic-fields`
|
|
216
|
+
- teste focal de paridade catalogo x registry
|
|
217
|
+
- build focal da landing
|
|
218
|
+
- smoke da vitrine/playground
|
|
219
|
+
- verificacao de foco, teclado, contraste e links para docs oficiais
|
|
220
|
+
|
|
221
|
+
## Success criteria
|
|
222
|
+
|
|
223
|
+
O plano sera considerado bem-sucedido quando:
|
|
224
|
+
|
|
225
|
+
- a landing deixar de manter listas soltas de Dynamic Fields
|
|
226
|
+
- a fonte de verdade do catalogo jogavel passar a estar na lib canonica
|
|
227
|
+
- docs, runtime e vitrine permanecerem coerentes
|
|
228
|
+
- novos fields conseguirem entrar no ecossistema com uma trilha previsivel:
|
|
229
|
+
- runtime
|
|
230
|
+
- metadata
|
|
231
|
+
- catalogo
|
|
232
|
+
- docs
|
|
233
|
+
- preview
|
|
234
|
+
|
|
235
|
+
## Implementation note
|
|
236
|
+
|
|
237
|
+
Este documento e um artefato de planejamento de plataforma. Ele nao substitui:
|
|
238
|
+
|
|
239
|
+
- `dynamic-fields-inventory.md` como auditoria runtime-first
|
|
240
|
+
- `dynamic-fields-field-catalog.md` como referencia funcional
|
|
241
|
+
- `dynamic-fields-inline-filter-catalog.md` como trilha especializada
|
|
242
|
+
|
|
243
|
+
Ele apenas fixa a fronteira correta para a evolucao da surface jogavel.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# GenericCrudService — Diretrizes de Uso em Campos Dinâmicos
|
|
2
|
+
|
|
3
|
+
> IMPORTANTE: Não remova o GenericCrudService do `providers` de componentes de campos dinâmicos que carregam dados remotos (selects, radio, lists, etc.). Cada componente deve manter sua própria instância do serviço.
|
|
4
|
+
|
|
5
|
+
## Por que uma instância por componente?
|
|
6
|
+
|
|
7
|
+
- Isolamento de estado: `GenericCrudService.configure(resourcePath, endpointKey?)` altera o estado interno (baseApiUrl, resourcePath, endpoints). Dois selects com recursos distintos em uma mesma página precisam de estados independentes.
|
|
8
|
+
- Concorrência segura: com instância compartilhada (global), dois selects que configuram recursos diferentes em momentos próximos podem disputar o estado e causar requisições para o recurso “errado”.
|
|
9
|
+
- Ciclo de vida previsível: cada select controla quando configurar o recurso e quando recarregar opções, sem efeitos colaterais em outros selects.
|
|
10
|
+
|
|
11
|
+
## Evitando logs/duplicidades de configuração
|
|
12
|
+
|
|
13
|
+
- Short‑circuit no serviço: `GenericCrudService.configure` possui guarda para ignorar reconfigurações quando `baseApiUrl`, `resourcePath` e `endpointKey` não mudam.
|
|
14
|
+
- Guarda no componente: componentes como `MaterialAsyncSelectComponent` e `MaterialSearchableSelectComponent` mantêm `lastConfiguredPath` e só chamam `configureCrudService(path)` quando o `resourcePath` realmente mudar.
|
|
15
|
+
- Autoload controlado: para evitar requisições remotas duplicadas no ciclo de montagem, os componentes aplicam `super.setMetadata()` (base input) e gerenciam o carregamento remoto explicitamente (ex.: apenas quando o select abre/ao digitar), em vez de delegar ao autoload do base para selects.
|
|
16
|
+
|
|
17
|
+
## Padrões adotados nos componentes
|
|
18
|
+
|
|
19
|
+
- `MaterialAsyncSelectComponent` e `MaterialSearchableSelectComponent`:
|
|
20
|
+
- Providers incluem `GenericCrudService` local (não remover).
|
|
21
|
+
- Implementam `setSelectMetadata()` sem acionar o autoload do base.
|
|
22
|
+
- Usam guarda `lastConfiguredPath` para evitar reconfiguração redundante.
|
|
23
|
+
- Disparam carregamentos apenas em interações (abrir, digitar, retry), via `filterOptions` (POST /options/filter) e correlatos.
|
|
24
|
+
- Outros selects remotos (ex.: `material-select`, `material-radio-group`, `material-selection-list`) também mantêm `GenericCrudService` no `providers` e devem seguir o mesmo padrão quando necessário.
|
|
25
|
+
|
|
26
|
+
## Sintomas comuns ao remover o provider local
|
|
27
|
+
|
|
28
|
+
- Requisições com `resourcePath` incorreto quando existem múltiplos selects na mesma view.
|
|
29
|
+
- Logs “configure” intercalados para recursos diferentes.
|
|
30
|
+
- Comportamentos intermitentes em dev (re-renderizações) por competição de estado do serviço.
|
|
31
|
+
|
|
32
|
+
## Resumo das boas práticas
|
|
33
|
+
|
|
34
|
+
- Mantenha `GenericCrudService` no `providers` dos componentes que dependem de dados remotos.
|
|
35
|
+
- Adote guarda de reconfiguração (`lastConfiguredPath`) nos componentes.
|
|
36
|
+
- Centralize autoload em pontos previsíveis (ao abrir select, ao digitar), evitando autoload do base para selects.
|
|
37
|
+
- Confie no short‑circuit do serviço para evitar logs/estado redundante.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Endpoints suportados para selects (Options vs Filter)
|
|
42
|
+
|
|
43
|
+
- Options (OptionDTO) — recomendados para selects assíncronos
|
|
44
|
+
- `POST /{resource}/options/filter` → `filterOptions(criteria, pageable, opts)`
|
|
45
|
+
- Query params: `page`, `size`, `sort`, `includeIds` (reexibir rótulos já selecionados na primeira página)
|
|
46
|
+
- Corpo: `criteria` (ex.: `{ [optionLabelKey]: termo, ...filterCriteria }`)
|
|
47
|
+
- Cabeçalho: `X-Data-Version` quando `observeVersionHeader` estiver habilitado
|
|
48
|
+
- Retorna: `Page<OptionDTO<ID>>` (e opcionalmente `dataVersion`)
|
|
49
|
+
- `GET /{resource}/options/by-ids` → `getOptionsByIds(ids)`
|
|
50
|
+
- Query params: `ids=1&ids=2` ...
|
|
51
|
+
- Retorna: `OptionDTO<ID>[]`
|
|
52
|
+
- Cursor (quando disponível) → `POST /{resource}/filter/cursor` retornando `OptionDTO` em `CursorPage`
|
|
53
|
+
|
|
54
|
+
- Filter (entidade)
|
|
55
|
+
- `POST /{resource}/filter` → `filter(criteria, pageable)`
|
|
56
|
+
- Exige mapear no front: `optionLabelKey` e `optionValueKey` do item retornado para `{ label, value }`.
|
|
57
|
+
|
|
58
|
+
Notas
|
|
59
|
+
- Termo de busca: os componentes aplicam o termo em `criteria` usando a chave `optionLabelKey()`.
|
|
60
|
+
- `filterCriteria`: sempre compõe o corpo do POST (Options e Filter). Informe chaves conforme o backend espera.
|
|
61
|
+
- `OptionDTO`: `{ id: ID, label: string }` — formato esperado pelos selects assíncronos.
|
|
62
|
+
- Se o backend não expõe `/options`, prefira `filter` + `optionLabelKey/optionValueKey` em selects não‑assíncronos.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Exemplos de metadata (Options vs Filter)
|
|
67
|
+
|
|
68
|
+
Exemplo — Options (async-select, backend com `/options`)
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
const fields: FieldMetadata[] = [
|
|
72
|
+
{
|
|
73
|
+
name: 'rotaId',
|
|
74
|
+
label: 'Rota',
|
|
75
|
+
controlType: 'async-select',
|
|
76
|
+
resourcePath: 'requests/routes',
|
|
77
|
+
// async-select usa OptionDTO do backend; não exige optionLabelKey/optionValueKey
|
|
78
|
+
loadOn: 'open', // 'init' para carregar já na inicialização se desejado
|
|
79
|
+
searchable: true,
|
|
80
|
+
// filtros adicionais enviados no corpo do POST /options/filter
|
|
81
|
+
filterCriteria: { active: true },
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Exemplo — Filter genérico (select, backend só com `/filter`)
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
const fields: FieldMetadata[] = [
|
|
90
|
+
{
|
|
91
|
+
name: 'destinoReqId',
|
|
92
|
+
label: 'Destino',
|
|
93
|
+
controlType: 'select',
|
|
94
|
+
resourcePath: 'requests/destinations',
|
|
95
|
+
// necessárias para mapear entidade → {label,value}
|
|
96
|
+
optionLabelKey: 'nome',
|
|
97
|
+
optionValueKey: 'id',
|
|
98
|
+
searchable: true, // habilita busca local; termo remoto é aplicado via optionLabelKey
|
|
99
|
+
filterCriteria: {},
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Exemplo — Cursor (lista grande; OptionDTO por cursor)
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
const fields: FieldMetadata[] = [
|
|
108
|
+
{
|
|
109
|
+
name: 'propriedadeReqId',
|
|
110
|
+
label: 'Propriedade',
|
|
111
|
+
controlType: 'async-select',
|
|
112
|
+
resourcePath: 'requests/destination-properties',
|
|
113
|
+
useCursor: true, // ativa POST /filter/cursor
|
|
114
|
+
searchable: true,
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Diagrama de fluxo (simplificado)
|
|
122
|
+
|
|
123
|
+
Options (async-select)
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
Componente (async-select)
|
|
127
|
+
│ configura GenericCrudService(resourcePath)
|
|
128
|
+
▼
|
|
129
|
+
GenericCrudService
|
|
130
|
+
│ POST /{resource}/options/filter (criteria + pageable + includeIds)
|
|
131
|
+
│ GET /{resource}/options/by-ids (ids) [pré-carregar rótulos]
|
|
132
|
+
▼
|
|
133
|
+
Backend (OptionDTO)
|
|
134
|
+
│ { id, label } + paginação/cursor
|
|
135
|
+
▼
|
|
136
|
+
Componente mapeia OptionDTO → opções visíveis
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Filter genérico (select)
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
Componente (select)
|
|
143
|
+
│ configura GenericCrudService(resourcePath)
|
|
144
|
+
▼
|
|
145
|
+
GenericCrudService
|
|
146
|
+
│ POST /{resource}/filter (criteria + pageable)
|
|
147
|
+
▼
|
|
148
|
+
Backend (Entidade)
|
|
149
|
+
│ [{ ... entidade ... }]
|
|
150
|
+
▼
|
|
151
|
+
Componente mapeia entidade usando optionLabelKey/optionValueKey → {label,value}
|
|
152
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { EditableCollectionComponent, PDX_EDITABLE_COLLECTION_COMPONENT_METADATA } from './praxisui-dynamic-fields.mjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { EntityLookupDialogComponent, InlineEntityLookupComponent, PDX_ENTITY_LOOKUP_COMPONENT_METADATA, PDX_INLINE_ENTITY_LOOKUP_COMPONENT_METADATA } from './praxisui-dynamic-fields.mjs';
|