@praxisui/dynamic-form 8.0.0-beta.17 → 8.0.0-beta.19
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 +51 -7
- package/fesm2022/praxisui-dynamic-form.mjs +24832 -22047
- package/index.d.ts +229 -8
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -586,25 +586,30 @@ Os paths micro são normalizados para `fieldMetadata[].<prop>` para garantir que
|
|
|
586
586
|
|
|
587
587
|
## Regras de formulário (novo contrato)
|
|
588
588
|
|
|
589
|
-
- Formato: cada regra tem `targetType` (`field | section | action | row | column`), `targets: string[]` (IDs canônicos do alvo), e `effect` com `condition` (`JsonLogicExpression | null`), `properties` e `propertiesWhenFalse`.
|
|
589
|
+
- Formato: cada regra tem `targetType` (`field | section | action | row | column | visualBlock`), `targets: string[]` (IDs canônicos do alvo), e `effect` com `condition` (`JsonLogicExpression | null`), `properties` e `propertiesWhenFalse`.
|
|
590
|
+
- Regras de orientação visual geradas por LLM devem usar `type: "visualBlockGuidance"`, `targetType: "visualBlock"`, `context: "notification"` e `metadata.origin: "llm"` com `metadata.reviewStatus: "pending"`; o editor aceita a sugestão, marca como `accepted` e materializa `formRulesState`.
|
|
590
591
|
- Compatibilidade: regras antigas (`context/targetField`) são migradas para `properties/targets` automaticamente; prefixes legados `section:/action:/row:/column:` continuam sendo normalizados quando representarem alvos tradicionais. Para header actions de seção, o ID canônico é preservado como `section:<sectionId>:header-action:<actionLogicalId>`.
|
|
591
592
|
- Semântica de limpeza: valores `null` em `properties/propertiesWhenFalse` removem o override e retornam ao valor base do layout; ausência mantém o valor base.
|
|
592
593
|
- Whitelist por tipo (somente propriedades a seguir são aplicadas; demais são descartadas e logadas em dev):
|
|
593
594
|
- `field`: `visible`, `required`, `readonly`, `disabled`, `className`, `style`, `label`, `description`, `placeholder`, `hint`, `tooltip`, `prefixIcon`, `suffixIcon`, `prefixText`, `suffixText`, `defaultValue`, `options` (array `{label,value,disabled?}`), `appearance` (`fill|outline`), `color` (`primary|accent|warn`), `floatLabel` (`auto|always|never`), `hintPosition` (`start|end`), `validators` (primitivos por chave).
|
|
594
595
|
- `section`: `visible`, `title`, `description`, `icon`, `sectionHeader` (objeto rico), `headerActions` (ações contextuais do cabeçalho) e tambem subpropriedades tipadas como `sectionHeader.mode`, `sectionHeader.sourceField`, `sectionHeader.initialsSourceField`, `sectionHeader.altField`, `sectionHeader.fallbackIcon`, `sectionHeader.emptyState`, `sectionHeader.size`, `sectionHeader.initialsMaxLength`, `className`, `style`, `collapsible`, `collapsed`, `headerTooltip`, `headerAlign` (`start|center`), `appearance` (`card|plain|step`), `stepLabel`, gaps (`gapBottom`, `titleGapBottom`, `descriptionGapBottom`), cores/tipografia (`titleColor`, `descriptionColor`, `titleStyle`, `descriptionStyle`).
|
|
595
596
|
- `action`: `visible`, `disabled`, `loading`, `label`, `icon`, `tooltip`, `color` (`primary|accent|warn|basic`), `variant` (`raised|stroked|flat|fab`), `size` (`small|medium|large`), `className`, `style`.
|
|
596
|
-
- IDs canônicos de regras para actions do header de seção usam o formato `section:<sectionId>:header-action:<actionLogicalId>`, evitando colisão com botões globais e com ações repetidas em seções diferentes.
|
|
597
|
-
- Se a seção ainda não tiver `id`, o runtime aceita o fallback `header-action:<actionLogicalId>` por compatibilidade; para contratos persistidos, prefira sempre materializar `section.id`.
|
|
598
597
|
- `row`: `visible`, `gap`, `rowGap`, `className`, `style`.
|
|
599
598
|
- `column`: `visible`, `span`, `offset`, `order`, `hidden`, `align` (`start|center|end|stretch`), `padding`, `className`, `style`.
|
|
600
|
-
-
|
|
601
|
-
-
|
|
599
|
+
- `visualBlock`: `visible`, `hidden`, `layout`, `className`, `rootClassName`, `style`, `text`, `title`, `message`; para documentos compostos, use `textNodeId`, `titleNodeId` ou `messageNodeId` para apontar o node textual seguro.
|
|
600
|
+
- IDs canônicos de regras para actions do header de seção usam o formato `section:<sectionId>:header-action:<actionLogicalId>`, evitando colisão com botões globais e com ações repetidas em seções diferentes.
|
|
601
|
+
- Se a seção ainda não tiver `id`, o runtime aceita o fallback `header-action:<actionLogicalId>` por compatibilidade; para contratos persistidos, prefira sempre materializar `section.id`.
|
|
602
|
+
- Runtime (FormRulesService): filtra por whitelist, converte tipos (enum/number/boolean/string), saneia objetos (`options/validators/style`), aplica remoção de chaves com `null` e retorna mapas `fieldProps/sectionProps/actionProps/rowProps/columnProps/visualBlockProps`.
|
|
603
|
+
- Renderização: `PraxisDynamicForm` aplica overrides em campos/seções/ações/linhas/colunas/blocos visuais (visibilidade, gaps, padding, classes, estilos, labels e texto seguro, conforme o tipo); colunas respeitam `align/span/offset/order/hidden/padding` vindo das regras.
|
|
604
|
+
- Regras de `visualBlock` são visual-only: elas não criam `FieldMetadata`, `FormControl`, valor em `formData` ou payload HTTP. Use campo local com `submitPolicy` quando a experiência precisar de valor persistível ou leitura em `rawFormData`.
|
|
602
605
|
|
|
603
606
|
### Builder integrado
|
|
604
607
|
|
|
605
|
-
- No editor visual, use a aba “Propriedades” (integrada ao builder) para selecionar o alvo (`targetType` + autocomplete de IDs de campos/seções/ações/linhas/colunas), escolher propriedades whitelisted e definir valores para `properties` (branch true) e `propertiesWhenFalse` (branch false). Botão “Limpar override” remove a propriedade (equivalente a `null`).
|
|
608
|
+
- No editor visual, use a aba “Propriedades” (integrada ao builder) para selecionar o alvo (`targetType` + autocomplete de IDs de campos/seções/ações/linhas/colunas/blocos visuais), escolher propriedades whitelisted e definir valores para `properties` (branch true) e `propertiesWhenFalse` (branch false). Botão “Limpar override” remove a propriedade (equivalente a `null`).
|
|
609
|
+
- Para `visualBlock`, o painel de propriedades exibe um seletor de node quando a propriedade é `text`, `title` ou `message`; o editor persiste `textNodeId`, `titleNodeId` ou `messageNodeId` automaticamente para evitar sobrescrever o node errado em documentos compostos.
|
|
610
|
+
- No round-trip do builder, `config.type` continua sendo reservado para o tipo visual do node; semântica de regra como `visualBlockGuidance` é preservada internamente em `config.ruleType` e volta para `formRules[].type`.
|
|
606
611
|
- A aba de Propriedades usa inputs tipados (enum/number/boolean/string/JSON) conforme o schema injetado; valores inválidos são ignorados.
|
|
607
|
-
- O config editor fornece `targetSchemas` (campos/seções/ações/linhas/colunas) e `targetPropertySchemas` para o builder; `formRules` são salvas no formato canônico (sem `context/targetField`).
|
|
612
|
+
- O config editor fornece `targetSchemas` (campos/seções/ações/linhas/colunas/blocos visuais) e `targetPropertySchemas` para o builder; `formRules` são salvas no formato canônico (sem `context/targetField`).
|
|
608
613
|
|
|
609
614
|
## Layout padrão (sem FormConfig)
|
|
610
615
|
|
|
@@ -830,3 +835,42 @@ Apache-2.0 – see the `LICENSE` packaged with this library or the repository ro
|
|
|
830
835
|
- Quando `API_URL.default.baseUrl` for relativo (ex.: `'/api'`), a lib resolve a origem a partir de `location.origin` no browser. Isso cobre o cenário comum com proxy de dev (`/api`, `/schemas`).
|
|
831
836
|
- Em SSR (sem `location.origin`), configure `baseUrl` absoluto (ex.: `https://api.acme.com/api`) para evitar erros do tipo “Invalid URL” ao construir chamadas de `/schemas/filtered`.
|
|
832
837
|
- O `GenericCrudService.getSchemasFilteredBaseUrl()` retorna sempre uma URL absoluta; o `SchemaMetadataClient` também aceita `baseUrl` relativo quando há origin disponível.
|
|
838
|
+
|
|
839
|
+
## Regras de Domínio Compartilhadas
|
|
840
|
+
|
|
841
|
+
`praxis-dynamic-form` pode consumir regras materializadas pelo backend sem gravá-las dentro de `FormConfig`. O input `domainRules` é opt-in e combina as regras remotas com `config.formRules` no mesmo `FormRulesService`.
|
|
842
|
+
|
|
843
|
+
```html
|
|
844
|
+
<praxis-dynamic-form
|
|
845
|
+
formId="funcionarios-form-demo"
|
|
846
|
+
[config]="formConfig"
|
|
847
|
+
[domainRules]="{
|
|
848
|
+
enabled: true,
|
|
849
|
+
targetArtifactKey: 'funcionarios-form-demo',
|
|
850
|
+
targetLayer: 'form_config',
|
|
851
|
+
targetArtifactType: 'praxis-dynamic-form',
|
|
852
|
+
status: 'pending_review'
|
|
853
|
+
}">
|
|
854
|
+
</praxis-dynamic-form>
|
|
855
|
+
```
|
|
856
|
+
|
|
857
|
+
- `targetArtifactKey` usa `formId`/`componentInstanceId` quando omitido.
|
|
858
|
+
- `targetLayer` default: `form_config`.
|
|
859
|
+
- `targetArtifactType` default: `praxis-dynamic-form`.
|
|
860
|
+
- `materializedPayload` pode ser um `FormLayoutRule` direto ou uma operação reconhecida, como `rule.visualBlockGuidance.add`.
|
|
861
|
+
- A rastreabilidade da regra compartilhada fica em `metadata.domainRule`.
|
|
862
|
+
|
|
863
|
+
E2E vivo com API real:
|
|
864
|
+
|
|
865
|
+
```bash
|
|
866
|
+
PAX_PROXY_TARGET=https://praxis-api-quickstart.onrender.com \
|
|
867
|
+
node scripts/run-playwright-with-dev-host.js \
|
|
868
|
+
--port 4003 \
|
|
869
|
+
--path /funcionarios-form-demo \
|
|
870
|
+
--spec projects/praxis-dynamic-form/test-dev/e2e/funcionarios-form-demo-domain-rules.playwright.spec.ts
|
|
871
|
+
```
|
|
872
|
+
|
|
873
|
+
Validado em 2026-04-23 contra `praxis-api-quickstart` publicado no Render com
|
|
874
|
+
`praxis-config-starter:0.1.0-rc.22`: o spec confirmou resposta 200 de
|
|
875
|
+
`/api/praxis/config/domain-rules/materializations` e presença de materialização
|
|
876
|
+
`form_config` com `operation: "rule.visualBlockGuidance.add"`.
|