@praxisui/dynamic-form 10.0.0-rc.4 → 10.0.0-rc.41
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 +92 -0
- package/ai/component-registry.json +630 -156
- package/docs/custom-fields-enterprise-review.md +229 -0
- package/docs/dynamic-form-authoring-document-semantics.md +68 -2
- package/docs/evidence/form-authoring-635-20261023/final-review.md +46 -0
- package/docs/evidence/form-authoring-635-20261023/independent-review-vb-form.md +50 -0
- package/docs/evidence/form-authoring-635-20261023/validation.md +76 -0
- package/docs/evidence/p1-authoring-20261022/validation.md +134 -0
- package/docs/governed-page-widget-adapter.md +58 -0
- package/docs/hot-metadata-updates.md +16 -0
- package/fesm2022/praxisui-dynamic-form.mjs +4177 -1130
- package/package.json +8 -8
- package/src/lib/config-editor/praxis-dynamic-form-config-editor.json-api.md +11 -3
- package/src/lib/praxis-dynamic-form.json-api.md +41 -7
- package/types/praxisui-dynamic-form.d.ts +310 -27
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# P1 form authoring — issues #631, #632 and #633
|
|
2
|
+
|
|
3
|
+
Classification: public behavior change with cross-library consumers. Canonical owners are Dynamic Form (rules bridge, form client/context and hydration) and Metadata Editor (cascade authoring). No exported type, endpoint, workspace configuration or dependency change.
|
|
4
|
+
|
|
5
|
+
## Scope and compatibility
|
|
6
|
+
|
|
7
|
+
- Preserve wizard JSON Logic and both property branches through Apply/Save/reopen. Invalid graphs remain available for repair and cannot silently become unconditional rules.
|
|
8
|
+
- Preserve non-identity cascade filter maps and extraction paths. Table rows own the current edit draft; suggestions fill missing mappings.
|
|
9
|
+
- Give each mounted form its own mutable CRUD client and editor context. This is a breaking beta DI correction; ancestor GenericCrudService replacements must migrate to supported component inputs or component-level test overrides. Shared HTTP infrastructure remains inherited.
|
|
10
|
+
- Make the Quickstart dependency demo a local relationship explorer. Selectors query real resources individually; fields are omitted from domain payloads. Its new document identities avoid inheriting old schema-backed connections.
|
|
11
|
+
- Open field customization from the current canonical materialization, rather than stale selection/render snapshots.
|
|
12
|
+
|
|
13
|
+
Existing contracts cover these behaviors: already supported but incorrectly materialized. No parallel contract or new authoring vocabulary was introduced.
|
|
14
|
+
|
|
15
|
+
## Review and gate resolution
|
|
16
|
+
|
|
17
|
+
The implementation was isolated on main 8da9401a8; unrelated dirty checkout changes and unrelated documentation hunks were excluded. Reviewers different from the authors inspected conversion/diagnostics, cascade editing, DI ownership, demo and both remaining gates.
|
|
18
|
+
|
|
19
|
+
The old label test conflated a selected snapshot with the current materialization. Regression tests now preserve the Cargo expectation while giving the canonical document/presentation that label, and making selection/cache explicitly obsolete.
|
|
20
|
+
|
|
21
|
+
The earlier host-test compilation failure involved a nullable assertion in an unrelated dirty test. That test is absent from this main baseline; the demo target is compiled and executed without importing the unrelated changes or altering TypeScript configuration.
|
|
22
|
+
|
|
23
|
+
Additional review covered deleting the last invalid rule, repairing through the properties panel, diagnostics for conditions outside the graph subset and loading rules without formRulesState. Valid runtime-only conditions must remain intact; invalid conditions must remain blocked. JSON Logic var:'' is a valid root-data reference, not an invalid field path.
|
|
24
|
+
|
|
25
|
+
## Validation
|
|
26
|
+
|
|
27
|
+
All selected gates passed on the isolated source tree:
|
|
28
|
+
|
|
29
|
+
| Gate | Result |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| Rule converters, configuration editor, diagnostics and isolation | 114 passed |
|
|
32
|
+
| Dynamic Form main/config/editorial/presentation/manifest/hydration/protocol | 334 passed |
|
|
33
|
+
| Cascade service and tab | 17 passed |
|
|
34
|
+
| CRUD dialog host consumer | 50 passed |
|
|
35
|
+
| Additional DI consumers: entity selection, schema recovery, layout tabs, presentation preset and widget editor | 77 passed |
|
|
36
|
+
| Dependency demo host target | 1 passed |
|
|
37
|
+
| Official build helper: Metadata Editor, Dynamic Form, CRUD + dependency closure | Passed |
|
|
38
|
+
| Final Dynamic Form and CRUD builds after gate repairs | Passed |
|
|
39
|
+
| Published documentation assets | Passed, 5 packages |
|
|
40
|
+
| MatSelect content model and diff whitespace | Passed |
|
|
41
|
+
|
|
42
|
+
The isolated dependency tree was installed using npm ci. No broad full-test-suite
|
|
43
|
+
or release certification is claimed. Counts represent separate lanes, not a
|
|
44
|
+
claim about unique test coverage.
|
|
45
|
+
|
|
46
|
+
Exact focal spec includes and commands are reproducible from the changed spec
|
|
47
|
+
paths; the main lane also includes first/external hydration, authoring protocol
|
|
48
|
+
and the authoring manifest. Builds use development configuration. Artifact logs
|
|
49
|
+
are retained in the workspace under artifacts/form-p1-fixes-20261022/clean-*.log.
|
|
50
|
+
|
|
51
|
+
## Final local browser smoke
|
|
52
|
+
|
|
53
|
+
The isolated checkout was served frozen on official UI4003, with its proxy
|
|
54
|
+
explicitly directed to unavailable local API8088. This smoke exercised the local
|
|
55
|
+
editor only and did not attempt option loading or domain submission.
|
|
56
|
+
|
|
57
|
+
Through the visible JSON tab of dependency-fields-demo, a malformed condition
|
|
58
|
+
(`{"===": []}`) produced an invalid-condition diagnostic and disabled Apply and
|
|
59
|
+
Save. Correcting the document by removing rule/state through the same JSON tab
|
|
60
|
+
re-enabled both buttons. Drafts were cancelled and tabs closed; nothing was
|
|
61
|
+
saved to the host or remote configuration.
|
|
62
|
+
|
|
63
|
+

|
|
64
|
+
|
|
65
|
+

|
|
66
|
+
|
|
67
|
+
The native confirmation for the visual Remove button could not be accepted by
|
|
68
|
+
the browser-control adapter because its focus command timed out. That attempt
|
|
69
|
+
was abandoned and its tab closed. Visual deletion via that button is not claimed
|
|
70
|
+
as passed; the component regression covers deletion and reopen. The rule list
|
|
71
|
+
also retained a stale row after JSON replacement while canonical diagnostics
|
|
72
|
+
were empty: the remaining UI coherence work belongs to #635. The screenshots
|
|
73
|
+
record this limit rather than hiding it.
|
|
74
|
+
|
|
75
|
+
Tests are unit/component tests using ChromeHeadless, without a database. Dependency builds use the official build-libs helper and its dependency closure. No release workflow, deployment or domain mutation is performed.
|
|
76
|
+
|
|
77
|
+
## Earlier visual audit evidence
|
|
78
|
+
|
|
79
|
+
The analyst journeys were repeated in Chrome on the previous shared source snapshot, using official UI4003/API8088 and assigned remote Neon branches with runtime identities/TLS. Those screenshots are historical visual evidence, not proof of this isolated revision. Current revision validation is listed separately above.
|
|
80
|
+
|
|
81
|
+
- #631: wizard Ativo=true/false controlled Foto visibility and required state; persisted expression and both effects survived reload.
|
|
82
|
+
- #632: Cargo/Departamento non-identity mapping survived explicit Edit, Save, Apply and reload.
|
|
83
|
+
- #633: RH, Base/Equipe/Membro and Ameaça/Missão/Incidente/Indenização chains completed with real filtered option requests; parent replacement/clear emptied descendants; no-result search and sibling-tab independence were checked.
|
|
84
|
+
- CRUD native Add dialog loaded its command schema and was closed without submission.
|
|
85
|
+
|
|
86
|
+
Limits retained: Foto originally arrived formHidden and required temporary exposure in the visible JSON editor. After reload the target catalog again omitted it, a remaining #635 issue. Structural dotted mapping proof does not certify backend acceptance of that filter. No narrow-screen, screen-reader, adverse-latency, remote ETag/concurrency or latest-release certification is claimed.
|
|
87
|
+
|
|
88
|
+
Detailed original audit artifacts are retained in the workspace artifacts/form-p1-fixes-20261022 directory and linked from the issue discussions. No credentials/network headers are published.
|
|
89
|
+
|
|
90
|
+
## Derived artifacts and skills
|
|
91
|
+
|
|
92
|
+
README/JSON API owner documentation explains DI migration and the explorer; Metadata Editor README explains lossless cascade editing. No public-api, AI operation/path, manifest shape, HTTP corpus or landing-page contract changed, so no parallel derived contract was created. Authoring manifest tests and published documentation asset checks cover the existing surfaces.
|
|
93
|
+
|
|
94
|
+
Canonical cascade and runtime DI skill updates were previously integrated through praxis-codex-skills#826 and #827 and selectively synchronized. Existing form roundtrip guidance remains adequate: formRulesState is derived, canonical rules are preserved, and runtime discovery does not own persisted semantics. The additional gate repairs enforce that existing guidance.
|
|
95
|
+
|
|
96
|
+
## Final review before integration — 2026-10-23
|
|
97
|
+
|
|
98
|
+
A new independent review of cad84dd00 found and corrected three cases before
|
|
99
|
+
integration:
|
|
100
|
+
|
|
101
|
+
- A missing or targetless rule root was silently dropped, so the new empty-rule
|
|
102
|
+
branch could delete the last accepted rules. Projection now rejects every
|
|
103
|
+
referenced invalid root, including a mixed valid/invalid graph. The editor
|
|
104
|
+
keeps the accepted document and invalid draft and blocks saving; an explicit
|
|
105
|
+
rootNodes=[] still supports intentional deletion.
|
|
106
|
+
- Blocking diagnostics used a built-in-only JSON Logic instance and rejected a
|
|
107
|
+
valid host operator. Editor diagnostics and command validation now share the
|
|
108
|
+
injected runtime service. A real registered operator is tested through runtime
|
|
109
|
+
evaluation and editor Save/reopen; unknown operators and invalid arity fail.
|
|
110
|
+
- Removing a cascade dependency retained its extraction override record. The
|
|
111
|
+
save path now removes both mapping and extraction override for removed
|
|
112
|
+
dependencies; save/reopen/re-add and last-dependency/default cases are covered.
|
|
113
|
+
|
|
114
|
+
An additional consumer inventory found four test fixtures still providing the
|
|
115
|
+
CRUD mock in the ancestor injector. They now use the documented component-level
|
|
116
|
+
replacement. The entity-selection fixture also supplies the current HttpResponse
|
|
117
|
+
read API while preserving request, error and cancellation assertions. The widget
|
|
118
|
+
editor fixture does not mount Dynamic Form and was intentionally left unchanged.
|
|
119
|
+
|
|
120
|
+
Before/after evidence: missing-root regressions failed before the fix; the host
|
|
121
|
+
operator regression failed before registry propagation; the extra DI lane had
|
|
122
|
+
19 failures before fixture updates and finished 77/77. Final focused rules lane
|
|
123
|
+
114/114 and cascades 17/17 passed. The 334-test form lane, 50-test CRUD lane and demo lane were also rerun after
|
|
124
|
+
the production repairs and passed. All three owner/consumer builds were rerun after production repairs.
|
|
125
|
+
No database or remote release workflow was required for these review repairs.
|
|
126
|
+
|
|
127
|
+
The earlier native-dialog/browser and #635 limitations remain unchanged. They
|
|
128
|
+
are not presented as newly validated by these unit/component regressions.
|
|
129
|
+
|
|
130
|
+
The two narrowly scoped guidance additions were independently reviewed and
|
|
131
|
+
integrated through praxis-codex-skills#829 (merge fb0fb5c). Both affected skills
|
|
132
|
+
were selectively synchronized and audited; the other 787 installed skill files
|
|
133
|
+
remained byte-identical and seven unrelated drifts were preserved. No new skill
|
|
134
|
+
or public contract was introduced.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Dynamic Form em páginas governadas
|
|
2
|
+
|
|
3
|
+
O adapter do owner mantém `definition.inputs.config` como a única fonte de configuração do filho.
|
|
4
|
+
A página guarda autoria; o documento nativo é reconstruído a partir desses inputs. A projeção de
|
|
5
|
+
execução é transitória e nunca deve ser gravada de volta no documento da página.
|
|
6
|
+
|
|
7
|
+
O perfil inicial vem do contrato P0 `page-publication-p0` de `praxis-config-starter` (PR #506).
|
|
8
|
+
Core valida estrutura, referências, limites e exige validators dos owners. Este adapter valida o
|
|
9
|
+
perfil nativo local; não autoriza uma fonte, registra uma seed ou substitui a admissão no servidor.
|
|
10
|
+
|
|
11
|
+
`decodeDynamicFormPageInputs` reconstrói `praxis.dynamic-form.editor` v1:
|
|
12
|
+
config, bindings presentes (`mode`, `emptyState`, `presentationModeGlobal`) e contexto presente
|
|
13
|
+
(`backConfig`, `presentation`, `schemaPrefs`). Schema prefs só existe se algum dos três inputs
|
|
14
|
+
`notifyIfOutdated`, `snoozeMs`, `autoOpenSettingsOnOutdated` estiver presente. Ausência, `false`,
|
|
15
|
+
zero, objeto vazio admitido e `null` são preservados. Null em objetos mesclados de config é negado;
|
|
16
|
+
null dentro de arrays atômicos permanece autoria. `layoutScope` não cabe neste perfil.
|
|
17
|
+
|
|
18
|
+
Os cinco modos nativos são `create`, `edit`, `view`, `presentation` e `dossier`. O editor visual
|
|
19
|
+
continua preferindo os três modos de operação com `presentationModeGlobal` separado. Abrir um
|
|
20
|
+
documento nativo dos demais modos não deve convertê-lo. Filter Form mantém somente seus três modos.
|
|
21
|
+
|
|
22
|
+
`encodeDynamicFormPageInputs` é a projeção inversa sem defaults. Campos fora do perfil,
|
|
23
|
+
blocos vazios sem representação nos inputs, identidade/storage e dados de execução recebem
|
|
24
|
+
diagnóstico. O adapter não filtra silenciosamente autoria incompatível.
|
|
25
|
+
|
|
26
|
+
`projectDynamicFormPageEditorChanges(authoredInputs, editorBaseline, editorValue)` aplica apenas
|
|
27
|
+
deltas explícitos sobre a autoria original usando o reconciliador nativo do owner. Capture o
|
|
28
|
+
baseline após a normalização/montagem do editor e preserve-o durante aquela sessão. Alterar
|
|
29
|
+
bindings ou contexto do mesmo widget retorna `seed.replacement-required`; a página precisa
|
|
30
|
+
substituir o widget com nova key e nova fonte admitida. A API de projeção altera somente o draft
|
|
31
|
+
que o chamador recebe; ela não salva preferências nem persiste a página.
|
|
32
|
+
|
|
33
|
+
`materializeDynamicFormPageRuntimeInputs(inputs, pageId, widgetKey)` usa o helper canônico Core para
|
|
34
|
+
identidades `page:<pageId>:widget:<widgetKey>`, projeta `configPersistenceStrategy: 'volatile'`
|
|
35
|
+
e desabilita customização/copiloto independentes no filho. Submit e dados continuam nos contratos
|
|
36
|
+
de domínio existentes. Não existe input runtime `authoringDocument`.
|
|
37
|
+
|
|
38
|
+
A estratégia `volatile` impede leitura, gravação e limpeza de preferências próprias e conexão
|
|
39
|
+
persistida. O Form preserva identidade operacional para montar o formulário, mas as trilhas de
|
|
40
|
+
config/bindings/contexto/schema preferences ficam sem I/O de storage.
|
|
41
|
+
Defaults visuais/materializações transitórias permanecem internos ao runtime e ao editor.
|
|
42
|
+
|
|
43
|
+
Limites: JSON lossless, 256 KiB UTF-8 e profundidade 64 pelo helper Core compartilhado; o documento
|
|
44
|
+
integral da página também tem o mesmo orçamento. Não há host publicado, endpoint de publicação,
|
|
45
|
+
fonte admitida, banco ou release novos neste incremento. A integração Page Builder/host governado
|
|
46
|
+
é trabalho posterior; os wrappers comuns continuam atendendo os fluxos não governados existentes.
|
|
47
|
+
|
|
48
|
+
`volatile` também exclui overlays pessoais de configuração global nos defaults/estado de autoria
|
|
49
|
+
que o owner consome. A instância compartilhada `GlobalConfigService` pode ler sua chave global;
|
|
50
|
+
isso não é prova de zero leitura na aplicação. Tenant, cache, locale e CSP continuam infraestrutura
|
|
51
|
+
do host. O gate comprova ausência de I/O nas chaves do filho e ausência de influência da autoria
|
|
52
|
+
pessoal sobre a configuração publicada. Em Table, `TableDefaultsProvider.getDefaults(id,
|
|
53
|
+
{ includeGlobal: false })` preserva defaults nativos sem duplicá-los; mudanças globais e reset
|
|
54
|
+
seguem a mesma política, inclusive o fallback de timezone usado em regras JSON Logic.
|
|
55
|
+
|
|
56
|
+
Respostas e filas de preferências capturam a geração, a identidade e a estratégia do filho. Trocar identidade, documento ou estratégia (inclusive A → volatile → A), ou destruir a instância, invalida a continuação antiga antes do próximo I/O ou da materialização. Uma requisição já enviada não é cancelada retroativamente. Respostas tardias de erro também passam pelo mesmo fence.
|
|
57
|
+
|
|
58
|
+
O fence segue a chave do recurso: conexão, inputs e schema preferences usam identidade do owner e geração do host; apresentação acrescenta a chave `form-pres:<id>:<mode>`. Hidratar mode/path das próprias preferências iniciais não troca o owner. Eventos de inputs do host invalidam a geração e iniciam uma resolução atual. Schema, config e escritas também capturam os bindings de runtime.
|
|
@@ -95,6 +95,22 @@ Regra operacional:
|
|
|
95
95
|
- se o loader da coluna for localizado, apenas ele e atualizado;
|
|
96
96
|
- se o loader nao puder ser localizado, o runtime usa fallback seguro de rebuild do form.
|
|
97
97
|
|
|
98
|
+
## Saved configuration after request schema removal
|
|
99
|
+
|
|
100
|
+
When reconciling saved configuration with the current request schema, Core retains
|
|
101
|
+
removed schema-backed fields for authored layout continuity, but marks them hidden,
|
|
102
|
+
disabled and `submitPolicy: "omit"`. A required orphan with a null value therefore
|
|
103
|
+
does not invalidate the group, and a value still returned by the read projection
|
|
104
|
+
cannot reenter the request payload through `getRawValue()`.
|
|
105
|
+
|
|
106
|
+
A field whose `source` is absent is schema-backed for this reconciliation. Explicit
|
|
107
|
+
`source: "local"` fields preserve existing local/transient policies and may opt into
|
|
108
|
+
submission with `submitPolicy: "include"`. Hidden fields still present in the request
|
|
109
|
+
schema remain submit-eligible; do not turn all hidden controls into omitted fields.
|
|
110
|
+
If the server publishes a retained field again, current server validation, visibility,
|
|
111
|
+
enabled state and submit semantics replace the orphan state. No host payload strip,
|
|
112
|
+
new flag or layout deletion is needed.
|
|
113
|
+
|
|
98
114
|
## Melhorias no DynamicFieldLoader
|
|
99
115
|
|
|
100
116
|
O guard de rerender do loader passou a incluir no snapshot:
|