@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,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.
|