@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.
Files changed (97) hide show
  1. package/README.md +19 -0
  2. package/docs/dynamic-fields-field-catalog.md +217 -0
  3. package/docs/dynamic-fields-field-selection-guide.md +204 -0
  4. package/docs/dynamic-fields-host-custom-field-guide.md +252 -0
  5. package/docs/dynamic-fields-host-custom-field-troubleshooting.md +160 -0
  6. package/docs/dynamic-fields-inline-components-guide.md +582 -0
  7. package/docs/dynamic-fields-inline-filter-catalog.md +502 -0
  8. package/docs/dynamic-fields-inline-filter-custom-component-guide.md +241 -0
  9. package/docs/dynamic-fields-inline-filter-inventory.md +247 -0
  10. package/docs/dynamic-fields-inline-filter-runtime-contract.md +391 -0
  11. package/docs/dynamic-fields-inline-filter-selection-guide.md +419 -0
  12. package/docs/dynamic-fields-inline-filter-troubleshooting.md +201 -0
  13. package/docs/dynamic-fields-inventory.md +206 -0
  14. package/docs/dynamic-fields-playground-catalog-plan.md +243 -0
  15. package/docs/generic-crud-service.md +152 -0
  16. package/fesm2022/praxisui-dynamic-fields-index-CBogy3si.mjs +1 -0
  17. package/fesm2022/praxisui-dynamic-fields-index-CWPZdn1Y.mjs +6 -0
  18. package/fesm2022/praxisui-dynamic-fields-index-CrHhyUMO.mjs +1 -0
  19. package/fesm2022/praxisui-dynamic-fields-index-DhGo5In4.mjs +6 -0
  20. package/fesm2022/praxisui-dynamic-fields.mjs +19551 -10669
  21. package/package.json +14 -13
  22. package/src/lib/base/pdx-base-input-runtime-contract.json-api.md +526 -0
  23. package/src/lib/base/pdx-base-select-runtime-contract.json-api.md +474 -0
  24. package/src/lib/components/color-input/pdx-color-input.json-api.md +573 -0
  25. package/src/lib/components/color-picker/pdx-color-picker.json-api.md +686 -0
  26. package/src/lib/components/date-input/pdx-date-input.json-api.md +581 -0
  27. package/src/lib/components/datetime-local-input/pdx-datetime-local-input.json-api.md +560 -0
  28. package/src/lib/components/email-input/pdx-email-input.json-api.md +546 -0
  29. package/src/lib/components/field-shell/praxis-field-shell.json-api.md +523 -0
  30. package/src/lib/components/inline-async-select/pdx-inline-async-select.json-api.md +566 -0
  31. package/src/lib/components/inline-autocomplete/pdx-inline-autocomplete.json-api.md +554 -0
  32. package/src/lib/components/inline-color-label/pdx-inline-color-label.json-api.md +615 -0
  33. package/src/lib/components/inline-currency/pdx-inline-currency.json-api.md +542 -0
  34. package/src/lib/components/inline-currency-range/pdx-inline-currency-range.json-api.md +630 -0
  35. package/src/lib/components/inline-date/pdx-inline-date.json-api.md +529 -0
  36. package/src/lib/components/inline-date-range/pdx-inline-date-range.json-api.md +592 -0
  37. package/src/lib/components/inline-distance-radius/pdx-inline-distance-radius.json-api.md +649 -0
  38. package/src/lib/components/inline-entity-lookup/pdx-inline-entity-lookup.json-api.md +656 -0
  39. package/src/lib/components/inline-input/pdx-inline-input.json-api.md +538 -0
  40. package/src/lib/components/inline-multi-select/pdx-inline-multi-select.json-api.md +566 -0
  41. package/src/lib/components/inline-number/pdx-inline-number.json-api.md +533 -0
  42. package/src/lib/components/inline-pipeline-status/pdx-inline-pipeline-status.json-api.md +619 -0
  43. package/src/lib/components/inline-range-slider/pdx-inline-range-slider.json-api.md +605 -0
  44. package/src/lib/components/inline-rating/pdx-inline-rating.json-api.md +594 -0
  45. package/src/lib/components/inline-relative-period/pdx-inline-relative-period.json-api.md +623 -0
  46. package/src/lib/components/inline-score-priority/pdx-inline-score-priority.json-api.md +632 -0
  47. package/src/lib/components/inline-searchable-select/pdx-inline-searchable-select.json-api.md +564 -0
  48. package/src/lib/components/inline-select/pdx-inline-select.json-api.md +571 -0
  49. package/src/lib/components/inline-sentiment/pdx-inline-sentiment.json-api.md +661 -0
  50. package/src/lib/components/inline-time/pdx-inline-time.json-api.md +573 -0
  51. package/src/lib/components/inline-time-range/pdx-inline-time-range.json-api.md +635 -0
  52. package/src/lib/components/inline-toggle/pdx-inline-toggle.json-api.md +516 -0
  53. package/src/lib/components/inline-tree-select/pdx-inline-tree-select.json-api.md +637 -0
  54. package/src/lib/components/material-async-select/pdx-material-async-select.json-api.md +566 -0
  55. package/src/lib/components/material-autocomplete/pdx-material-autocomplete.json-api.md +561 -0
  56. package/src/lib/components/material-avatar/pdx-material-avatar.json-api.md +670 -0
  57. package/src/lib/components/material-button/pdx-material-button.json-api.md +572 -0
  58. package/src/lib/components/material-button-toggle/pdx-material-button-toggle.json-api.md +577 -0
  59. package/src/lib/components/material-checkbox-group/pdx-material-checkbox-group.json-api.md +611 -0
  60. package/src/lib/components/material-chips/pdx-material-chips.json-api.md +601 -0
  61. package/src/lib/components/material-colorpicker/pdx-material-colorpicker.json-api.md +545 -0
  62. package/src/lib/components/material-cpf-cnpj-input/pdx-material-cpf-cnpj-input.json-api.md +531 -0
  63. package/src/lib/components/material-currency/pdx-material-currency.json-api.md +569 -0
  64. package/src/lib/components/material-date-range/pdx-material-date-range.json-api.md +636 -0
  65. package/src/lib/components/material-datepicker/pdx-material-datepicker.json-api.md +551 -0
  66. package/src/lib/components/material-file-upload/pdx-material-file-upload.json-api.md +511 -0
  67. package/src/lib/components/material-multi-select/pdx-material-multi-select.json-api.md +596 -0
  68. package/src/lib/components/material-multi-select-tree/pdx-material-multi-select-tree.json-api.md +623 -0
  69. package/src/lib/components/material-price-range/pdx-material-price-range.json-api.md +619 -0
  70. package/src/lib/components/material-radio-group/pdx-material-radio-group.json-api.md +585 -0
  71. package/src/lib/components/material-range-slider/pdx-material-range-slider.json-api.md +664 -0
  72. package/src/lib/components/material-rating/pdx-material-rating.json-api.md +551 -0
  73. package/src/lib/components/material-searchable-select/pdx-material-searchable-select.json-api.md +602 -0
  74. package/src/lib/components/material-select/pdx-material-select.json-api.md +601 -0
  75. package/src/lib/components/material-selection-list/pdx-material-selection-list.json-api.md +607 -0
  76. package/src/lib/components/material-slide-toggle/pdx-material-slide-toggle.json-api.md +522 -0
  77. package/src/lib/components/material-slider/pdx-material-slider.json-api.md +602 -0
  78. package/src/lib/components/material-textarea/pdx-material-textarea.json-api.md +598 -0
  79. package/src/lib/components/material-timepicker/pdx-material-timepicker.json-api.md +554 -0
  80. package/src/lib/components/material-transfer-list/pdx-material-transfer-list.json-api.md +614 -0
  81. package/src/lib/components/material-tree-select/pdx-material-tree-select.json-api.md +649 -0
  82. package/src/lib/components/month-input/pdx-month-input.json-api.md +527 -0
  83. package/src/lib/components/number-input/pdx-number-input.json-api.md +594 -0
  84. package/src/lib/components/password-input/pdx-password-input.json-api.md +574 -0
  85. package/src/lib/components/pdx-material-time-range/pdx-material-time-range.json-api.md +592 -0
  86. package/src/lib/components/pdx-year-input/pdx-year-input.json-api.md +543 -0
  87. package/src/lib/components/phone-input/pdx-phone-input.json-api.md +583 -0
  88. package/src/lib/components/preload-status/pdx-preload-status.json-api.md +455 -0
  89. package/src/lib/components/search-input/pdx-search-input.json-api.md +536 -0
  90. package/src/lib/components/text-input/pdx-text-input.json-api.md +600 -0
  91. package/src/lib/components/time-input/pdx-time-input.json-api.md +546 -0
  92. package/src/lib/components/url-input/pdx-url-input.json-api.md +542 -0
  93. package/src/lib/components/week-input/pdx-week-input.json-api.md +533 -0
  94. package/{index.d.ts → types/praxisui-dynamic-fields.d.ts} +874 -440
  95. package/fesm2022/praxisui-dynamic-fields-index-C9IUU4lo.mjs +0 -1
  96. package/fesm2022/praxisui-dynamic-fields-index-GJtthzkD.mjs +0 -1
  97. package/fesm2022/praxisui-dynamic-fields-index-XvVS6lAQ.mjs +0 -1
@@ -0,0 +1,391 @@
1
+ ---
2
+ title: "Dynamic Fields Inline Filter Runtime Contract"
3
+ slug: "dynamic-fields-inline-filter-runtime-contract"
4
+ description: "Contrato runtime-first dos inline filters, cobrindo schema, promocao no praxis-filter, shape de valor, ranges e alinhamento com backend."
5
+ doc_type: "reference"
6
+ document_kind: "host-guide"
7
+ component: "dynamic-fields"
8
+ category: "integration"
9
+ audience:
10
+ - "frontend"
11
+ - "host"
12
+ - "backend"
13
+ - "architect"
14
+ level: "advanced"
15
+ status: "active"
16
+ owner: "praxis-ui"
17
+ tags:
18
+ - "dynamic-fields"
19
+ - "dynamic-filter"
20
+ - "runtime"
21
+ - "payload"
22
+ - "contract"
23
+ order: 44
24
+ icon: "account_tree"
25
+ toc: true
26
+ sidebar: true
27
+ search_boost: 1.2
28
+ reading_time: 22
29
+ estimated_setup_time: 25
30
+ version: "1.0"
31
+ related_docs:
32
+ - "dynamic-fields-inline-filter-inventory"
33
+ - "dynamic-fields-inline-filter-catalog"
34
+ - "dynamic-filter-payload-contract"
35
+ - "dynamic-filter-range-filters-guide"
36
+ - "dynamic-filter-backend-contract-cheatsheet"
37
+ keywords:
38
+ - "controlType"
39
+ - "range payload"
40
+ - "praxis-filter"
41
+ - "metadata-starter"
42
+ last_updated: "2026-03-07"
43
+ ---
44
+
45
+ # Dynamic Fields Inline Filter Runtime Contract
46
+
47
+ ## Objetivo
48
+
49
+ Explicar como um inline filter component participa da pipeline completa:
50
+
51
+ - schema e metadata
52
+ - resolucao de `controlType`
53
+ - runtime do `praxis-filter`
54
+ - valor emitido pelo front
55
+ - integracao com backend
56
+
57
+ ## Pre-requisitos
58
+
59
+ - Conhecimento basico de `PraxisFilter`, `GenericFilterDTO` e serializacao do host
60
+ - Leitura recomendada dos guias de payload e range da trilha de `table`
61
+
62
+ ## Pipeline completa
63
+
64
+ 1. schema define `controlType` e metadata do campo
65
+ 2. `praxis-filter` decide se o campo vai para toolbar compacta
66
+ 3. `praxis-filter` pode promover um control generico para variante inline
67
+ 4. `DynamicFieldLoader` pede o componente ao `ComponentRegistryService`
68
+ 5. componente inline produz o valor no `FormGroup`
69
+ 6. `PraxisFilter` emite `change` e `submit`
70
+ 7. host envia DTO ao backend
71
+ 8. starter normaliza ranges quando aplicavel
72
+
73
+ ```mermaid
74
+ sequenceDiagram
75
+ participant Schema
76
+ participant Filter as praxis-filter
77
+ participant Loader as DynamicFieldLoader
78
+ participant Inline as inline component
79
+ participant Host
80
+ participant Backend as metadata-starter
81
+
82
+ Schema->>Filter: controlType and metadata
83
+ Filter->>Loader: resolve inline variant
84
+ Loader->>Inline: instantiate component
85
+ Inline-->>Filter: form value
86
+ Filter-->>Host: change / submit
87
+ Host->>Backend: send DTO
88
+ Backend-->>Host: normalize ranges and process payload
89
+ ```
90
+
91
+ ## Camada 1. `controlType` canonico
92
+
93
+ Para novos contratos, o canone e:
94
+
95
+ - `inline*`
96
+
97
+ Fonte de verdade:
98
+
99
+ - `projects/praxis-core/src/lib/utils/inline-filter-controls.util.ts`
100
+
101
+ ## Camada 2. contrato publicado
102
+
103
+ O contrato publicado do runtime usa apenas `controlType` canônico `inline*`.
104
+
105
+ Regra:
106
+
107
+ - novos schemas persistem somente o nome canônico `inline*`
108
+ - documentacao, exemplos, testes e hosts devem usar apenas o nome canônico
109
+
110
+ ## Camada 3. fallback quando o schema nao vem com inline explicito
111
+
112
+ O `PraxisFilter` consegue promover alguns controls genericos para inline.
113
+
114
+ Exemplos:
115
+
116
+ - `select` -> `inlineSelect`
117
+ - `searchable-select` -> `inlineSearchableSelect` por padrao; use `useInlineSearchableSelectVariant = false` para opt-out
118
+ - `async-select` -> `inlineAsyncSelect` por padrao; use a mesma flag em `false` para opt-out
119
+ - `dateRange` -> `inlineDateRange` por padrao; use `useInlineDateRangeVariant = false` para opt-out
120
+ - `year + mode=range` -> `inlinePeriodRange` com `granularity: "year"` por padrao; use `controlType` explicito quando quiser garantir o comportamento
121
+ - `month + mode=range` -> `inlinePeriodRange` com `granularity: "month"` por padrao; use `controlType` explicito quando quiser garantir o comportamento
122
+
123
+ Conclusao importante:
124
+
125
+ - `dynamic-fields` publica todos os componentes
126
+ - `table` decide quando cada um entra na jornada do filtro
127
+
128
+ ## Camada 4. shape do valor no front
129
+
130
+ ### Valores simples
131
+
132
+ - texto: `string`
133
+ - numero/moeda: `number`
134
+ - toggle: `boolean | null`
135
+ - time: **canonico recomendado** `HH:mm`; o runtime tambem aceita `HH:mm:ss` e `Date`
136
+ - presets relativos: `string`
137
+
138
+ ### Valores de selecao
139
+
140
+ - select simples: valor simples
141
+ - variantes remotas: valor simples ou option object, conforme metadata e source
142
+ - multiselect: array
143
+
144
+ ### Valores de range
145
+
146
+ - range generico em modo simples: `number`
147
+ - range generico em `mode: "range"`: `{ start?, end? }`
148
+ - year range inline: `[startYear, endYear]` ou `{ start?, end? }`, mantendo valores numericos
149
+ - month range inline: `[startMonth, endMonth]` ou `{ start?, end? }`, com meses numericos de `1..12`
150
+ - currency range: `{ minPrice?, maxPrice?, currency? }`
151
+ - date range: `{ startDate?, endDate? }`
152
+ - time range: **canonico recomendado** `{ start?, end? }` com strings `HH:mm`; o runtime tambem aceita segundos e numeros em minutos para compatibilidade interna
153
+
154
+ ## Normalizacao de range
155
+
156
+ O componente inline nao normaliza para o formato final do backend sozinho.
157
+
158
+ Ele apenas produz um shape coerente para o form.
159
+
160
+ Depois:
161
+
162
+ - o host envia o DTO
163
+ - `FilterRequestBodyAdvice` intercepta
164
+ - `RangePayloadNormalizer` canonicaliza quando preciso
165
+
166
+ Por isso:
167
+
168
+ - nao documente o valor interno do componente como se fosse o contrato HTTP final
169
+ - alinhe sempre com `dynamic-filter-range-filters-guide.md`
170
+ - para operacoes Java de range, payload escalar nao e contrato valido; use objeto/lista canonica publicada pelo backend
171
+
172
+ ## Compatibilidade com backend
173
+
174
+ ### O que precisa bater
175
+
176
+ - nome do campo do DTO
177
+ - tipo esperado pelo backend
178
+ - shape de ranges
179
+ - serializacao de data/hora
180
+
181
+ ### O que nao vai para o backend
182
+
183
+ - `clearButton`
184
+ - `inlineAutoSize`
185
+ - `materialDesign.*`
186
+ - `tooltip`
187
+ - `aria*`
188
+
189
+ Esses campos sao de renderizacao.
190
+
191
+ ### Politica de `materialDesign` em filtros
192
+
193
+ Filtros inline e filtros avancados frequentemente usam icones de prefixo,
194
+ sufixos funcionais, `clearButton`, datepicker toggle ou simbolos de unidade. Em
195
+ campos Material `fill`/`outline`, esses adornos podem conflitar com o label
196
+ quando `floatLabel` fica em `auto`.
197
+
198
+ A politica recomendada para metadata de filtro e:
199
+
200
+ ```json
201
+ {
202
+ "materialDesign": {
203
+ "floatLabel": "always",
204
+ "subscriptSizing": "dynamic"
205
+ }
206
+ }
207
+ ```
208
+
209
+ O `praxis-filter` aplica essa politica aos campos promovidos para a barra
210
+ compacta e ao `FormConfig` do formulario avancado. Hosts que fornecem metadata
211
+ propria ou overrides devem preservar essa regra globalmente na metadata de
212
+ filtro, especialmente quando o schema publica `prefixIcon`, `suffixIcon`,
213
+ `clearButton`, campos de data, moeda ou cor.
214
+
215
+ ## Estados de interacao
216
+
217
+ Regra canonica da plataforma:
218
+
219
+ - `FormControl.disabled` continua sendo a fonte de verdade do estado `disabled` no DOM do controle nativo/Material
220
+ - `disabledMode` e `readonlyMode` bloqueiam interacao no `FieldShell`, sem obrigar o runtime a injetar `disabled` diretamente em componentes como `mat-select`
221
+ - `presentationMode` vence os dois estados acima e remove overlays de bloqueio
222
+
223
+ Implicacao pratica:
224
+
225
+ - nao use binding local de `[disabled]` como substituto para `disabledMode`
226
+ - componentes inline e nao-inline devem deixar o shell controlar bloqueio visual/interativo e deixar o `FormControl` controlar o estado semantico nativo
227
+
228
+ ## Fallback quando o schema chega sem `controlType`
229
+
230
+ Nao existe fallback magico para inline especializado sem pista suficiente.
231
+
232
+ O que existe:
233
+
234
+ - promocao de controls genericos conhecida pelo `praxis-filter`
235
+ - defaults do editor/settings do filtro
236
+
237
+ Para specialized controls como:
238
+
239
+ - `inlineRating`
240
+ - `inlineDistanceRadius`
241
+ - `inlinePipelineStatus`
242
+ - `inlineRelativePeriod`
243
+ - `inlineSentiment`
244
+ - `inlineColorLabel`
245
+ - `inlinePeriodRange`
246
+ - `inlineYearRange` (alias compativel)
247
+ - `inlineMonthRange` (alias compativel)
248
+
249
+ use `controlType` explicito.
250
+
251
+ Regra adicional de produto/plataforma:
252
+
253
+ - `inlinePipelineStatus`, `inlineRelativePeriod`, `inlineRating`, `inlineDistanceRadius`,
254
+ `inlineScorePriority`, `inlineSentiment` e `inlineColorLabel` pertencem a trilha `graphic specialized`
255
+ - esses componentes sao `opt-in` explicito
256
+ - eles nao devem ser inferidos ou promovidos automaticamente a partir de `select`, `enum`, `status` ou outros controles genericos
257
+
258
+ ## Relacao com `metadata-starter`
259
+
260
+ `metadata-starter` nao conhece a UX do componente.
261
+ Ele conhece o DTO e a normalizacao de payload.
262
+
263
+ Portanto:
264
+
265
+ - `dynamic-fields` define como o controle funciona
266
+ - `table` define como ele entra na jornada do filtro
267
+ - `metadata-starter` define como o payload eh tratado no backend
268
+
269
+ ## Exemplos curtos
270
+
271
+ ### Select remoto inline
272
+
273
+ ```json
274
+ {
275
+ "name": "departmentId",
276
+ "controlType": "inlineSearchableSelect",
277
+ "resourcePath": "/departments/options",
278
+ "optionLabelKey": "label",
279
+ "optionValueKey": "id"
280
+ }
281
+ ```
282
+
283
+ ### Range monetario inline
284
+
285
+ ```json
286
+ {
287
+ "name": "salaryRange",
288
+ "controlType": "inlineCurrencyRange",
289
+ "currency": "BRL"
290
+ }
291
+ ```
292
+
293
+ ### Range numerico inline
294
+
295
+ ```json
296
+ {
297
+ "name": "scoreRange",
298
+ "controlType": "inlineRange",
299
+ "min": 0,
300
+ "max": 100,
301
+ "mode": "range"
302
+ }
303
+ ```
304
+
305
+ Valor do form:
306
+
307
+ ```json
308
+ {
309
+ "scoreRange": {
310
+ "start": 10,
311
+ "end": 80
312
+ }
313
+ }
314
+ ```
315
+
316
+ Na trilha Java canonica, o backend publica `mode: "range"` para ranges numericos e canonicaliza esse objeto para a lista esperada pelo `GenericFilterDTO`.
317
+
318
+ ### Faixa anual inline
319
+
320
+ ```json
321
+ {
322
+ "name": "anoBetween",
323
+ "controlType": "inlinePeriodRange",
324
+ "granularity": "year",
325
+ "min": 2020,
326
+ "max": 2026,
327
+ "mode": "range"
328
+ }
329
+ ```
330
+
331
+ ### Faixa mensal inline
332
+
333
+ ```json
334
+ {
335
+ "name": "mesBetween",
336
+ "controlType": "inlinePeriodRange",
337
+ "granularity": "month",
338
+ "mode": "range"
339
+ }
340
+ ```
341
+
342
+ Valor do form:
343
+
344
+ ```json
345
+ {
346
+ "salaryRange": {
347
+ "minPrice": 6500,
348
+ "maxPrice": 15000,
349
+ "currency": "BRL"
350
+ }
351
+ }
352
+ ```
353
+
354
+ ### Periodo relativo
355
+
356
+ ```json
357
+ {
358
+ "name": "periodPreset",
359
+ "controlType": "inlineRelativePeriod"
360
+ }
361
+ ```
362
+
363
+ Valor do form:
364
+
365
+ ```json
366
+ {
367
+ "periodPreset": "last7"
368
+ }
369
+ ```
370
+
371
+ Na trilha canonica com `praxis-metadata-starter`, esse preset e normalizado automaticamente antes da desserializacao do DTO para um dos contratos primitivos ja suportados pelo backend:
372
+
373
+ - `today` e `yesterday` -> `onDate`
374
+ - `last7` e `last30` -> `lastDays`
375
+ - `thisMonth`, `lastMonth`, `thisQuarter`, `thisYear` -> `between`
376
+
377
+ Timezone de referencia:
378
+
379
+ - por padrao, o starter usa `UTC`
380
+ - a API pode sobrescrever isso com `praxis.filter.relative-period.zone-id`
381
+
382
+ Se a API nao usa essa trilha canonica, o host/backend precisa fornecer semantica equivalente antes de tratar o valor como contrato HTTP final.
383
+
384
+ ## Regras operacionais
385
+
386
+ 1. Nao invente `controlType`.
387
+ 2. Use sempre o `controlType` canônico `inline*`.
388
+ 3. Distinga `shape canonico recomendado` de ajustes internos de runtime.
389
+ 4. Nao trate valor do componente como contrato HTTP final sem passar pela trilha de `table`.
390
+ 5. Se o filtro for de range, valide o shape no backend cheatsheet.
391
+ 6. Se o controle depende de lista remota, valide `resourcePath`, auth e latencia como parte da feature.