@praxisui/dynamic-form 9.0.66 → 9.0.68-rc.0
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 +170 -0
- package/ai/component-registry.json +32 -16
- package/docs/actions-optional-text-validation-2026-09-08.md +49 -0
- package/docs/dynamic-form-authoring-document-semantics.md +105 -0
- package/docs/entity-read-feedback.md +162 -0
- package/docs/layout-apply-save-reopen-2026-09-08.md +114 -0
- package/docs/layout-toolbar-accessibility-2026-09-08.md +57 -0
- package/docs/master-detail-customization-matrix-2026-09-08.md +182 -0
- package/docs/schema-loading-recovery.md +74 -0
- package/docs/section-spacing-authoring-2026-09-08.md +61 -0
- package/fesm2022/praxisui-dynamic-form.mjs +3730 -2320
- package/package.json +8 -8
- package/src/lib/config-editor/praxis-dynamic-form-config-editor.json-api.md +28 -0
- package/src/lib/layout-editor/praxis-layout-editor.json-api.md +8 -4
- package/src/lib/praxis-dynamic-form.json-api.md +31 -3
- package/types/praxisui-dynamic-form.d.ts +140 -11
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Schema loading: timeout, cancellation and recovery
|
|
2
|
+
|
|
3
|
+
## Owner and configuration
|
|
4
|
+
|
|
5
|
+
Schema transport policy belongs to Core. Dynamic Form consumes the existing
|
|
6
|
+
`SchemaMetadataClient` through `SCHEMA_METADATA_CLIENT_OPTIONS`; there is no
|
|
7
|
+
widget-specific timeout input or JSON property. A host configures the provider:
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { SCHEMA_METADATA_CLIENT_OPTIONS } from '@praxisui/core';
|
|
11
|
+
|
|
12
|
+
{ provide: SCHEMA_METADATA_CLIENT_OPTIONS, useValue: { requestTimeoutMs: 15000 } }
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The shared Core default is 30,000 ms. An explicit zero disables the deadline;
|
|
16
|
+
cancellation remains available. Core also owns transport error names:
|
|
17
|
+
`TimeoutError` and `AbortError`. The Form legacy Observable schema adapter uses
|
|
18
|
+
the same configured deadline and unsubscribes when cancelled.
|
|
19
|
+
|
|
20
|
+
## Runtime behavior
|
|
21
|
+
|
|
22
|
+
A schema timeout reaches the existing recoverable initialization error surface.
|
|
23
|
+
The message is localized in the Form catalog. Retry starts a new initialization;
|
|
24
|
+
it does not silently replace the requested `/all` schema with the legacy
|
|
25
|
+
`/filter` schema after a timeout or cancellation.
|
|
26
|
+
|
|
27
|
+
Destroy, retry, mode changes, resource changes and explicit schema URL changes
|
|
28
|
+
cancel the outstanding schema reads. Initialization generations prevent an older
|
|
29
|
+
configuration read, schema result, error handler or finally block from modifying
|
|
30
|
+
the replacement initialization. The saved page layout is retained for retry and
|
|
31
|
+
reconciled with the canonical schema after a successful response.
|
|
32
|
+
|
|
33
|
+
## Scope and limitations
|
|
34
|
+
|
|
35
|
+
This is transport resilience. During the investigation, the backend returned
|
|
36
|
+
HTTP 200 to the exact schema URL while the internal browser reported
|
|
37
|
+
`ERR_BLOCKED_BY_CLIENT`. A recoverable timeout does not remove that client block
|
|
38
|
+
and must not be reported as correcting its origin.
|
|
39
|
+
|
|
40
|
+
The deadline does not bound all initialization work. Hook execution keeps its
|
|
41
|
+
existing hook-registry policy. Diagnostic schema metadata persistence is not part
|
|
42
|
+
of the transport deadline; a non-transient host with stalled persistence can
|
|
43
|
+
still need separate investigation. Transient layout policy skips those writes.
|
|
44
|
+
No general initialization budget or local business rule was introduced.
|
|
45
|
+
|
|
46
|
+
## Focused validation
|
|
47
|
+
|
|
48
|
+
`praxis-dynamic-form.schema-loading.spec.ts` covers pending schema → localized
|
|
49
|
+
error → retry, no timeout fallback to a different schema contract, destroy,
|
|
50
|
+
late schema results, and late saved configuration after superseding initialization.
|
|
51
|
+
The fixtures use the existing sections-only `input-first` path so reconciliation
|
|
52
|
+
cannot swallow the timeout and report success with missing field metadata.
|
|
53
|
+
Transport fetch cancellation and concurrent-consumer behavior are tested in Core.
|
|
54
|
+
Live browser and integrated package builds are recorded by the integration review.
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
The focal schema-loading, external-config-hydration and entity-selection run
|
|
58
|
+
passed 29 tests (`/private/tmp/praxis-form-schema-loading-tests.log`). This run
|
|
59
|
+
includes the error/retry DOM and isolated service fixtures; it does not claim
|
|
60
|
+
live network or production publication validation.
|
|
61
|
+
|
|
62
|
+
### Non-cooperative custom transports
|
|
63
|
+
|
|
64
|
+
The canonical Core transport reports `AbortError` on cancellation. Two additional
|
|
65
|
+
regressions exercise a transport that ignores cancellation and later rejects with
|
|
66
|
+
a generic error, through both generated-config and host-config initialization.
|
|
67
|
+
The inner construction error handlers validate the initialization generation
|
|
68
|
+
before changing UI state, so the old error cannot stop the newer loading state.
|
|
69
|
+
The late-success and late-error paths are covered independently.
|
|
70
|
+
|
|
71
|
+
The two generic late-error cases failed before the guard (`2 FAILED, 5 SUCCESS`)
|
|
72
|
+
and all seven schema-loading tests passed afterwards. Logs:
|
|
73
|
+
`/private/tmp/praxis-form-late-schema-rejection-red.log` and
|
|
74
|
+
`/private/tmp/praxis-form-late-schema-rejection-green.log`.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Section spacing: canonical eligibility and clear copy
|
|
2
|
+
|
|
3
|
+
Classification: `local-pequena`, owned by Dynamic Form's layout editor.
|
|
4
|
+
Adherence: `ja-suportado-mal-nomeado-ou-mal-materializado`. Core already defines
|
|
5
|
+
`FormSection.gapBottom` as space after the entire section. The Form runtime reads
|
|
6
|
+
that field; no contract, runtime spacing rule, backend or public API changed.
|
|
7
|
+
|
|
8
|
+
The toolbar described column spacing but wrote section `gapBottom`. Eligibility
|
|
9
|
+
depended on a noncanonical `gapCustomized` marker rather than the existing value,
|
|
10
|
+
so an explicitly authored gap without that marker could be overwritten. New
|
|
11
|
+
sections and bulk updates also generated the marker despite the JSON API guide
|
|
12
|
+
warning that it was not stable configuration.
|
|
13
|
+
|
|
14
|
+
The command now fills only absent/null `gapBottom`, preserves explicit values
|
|
15
|
+
(including zero), and emits nothing when no sections are eligible. It no longer
|
|
16
|
+
generates or consults the old marker; unrelated unknown properties in a loaded
|
|
17
|
+
document are not bulk-migrated by this operation. Non-finite proposed numbers
|
|
18
|
+
are rejected. Changing the proposed value alone still does not emit config.
|
|
19
|
+
The existing output-to-input host flow commits the emitted draft.
|
|
20
|
+
|
|
21
|
+
Labels, tooltips and accessible names use the layout editor i18n catalog in
|
|
22
|
+
pt-BR/en-US. **Espaço após as seções** and **Preencher espaços não definidos**
|
|
23
|
+
explain the scope and distinguish this command from editor-only density/guides.
|
|
24
|
+
Existing icons, control styling and theme tokens are retained.
|
|
25
|
+
|
|
26
|
+
## Browser proof
|
|
27
|
+
|
|
28
|
+
On `/page-builder-ia`, selected Ayla, opened the Form editor and Layout, and
|
|
29
|
+
captured the rendered Layout baseline. Entering 24 kept **Sem alterações** and
|
|
30
|
+
disabled Apply/Save. Invoking **Preencher espaços não definidos** enabled
|
|
31
|
+
Apply/Save and disabled the fill command. Reading the actual JSON editor showed
|
|
32
|
+
the canonical editor envelope with `gapBottom: 24` on the four previously unset
|
|
33
|
+
sections and no `gapCustomized` property.
|
|
34
|
+
|
|
35
|
+
Cancelled, confirmed discard and reopened Layout on the same page. Its full
|
|
36
|
+
rendered text exactly matched the baseline. No Apply, component Save, page Save
|
|
37
|
+
or employee write was performed. Screenshot review covered the dark desktop
|
|
38
|
+
editor, expanded and reduced panels; the new label wrapped without overlap.
|
|
39
|
+
This is not mobile or full screen-reader certification. The runtime effect of
|
|
40
|
+
gapBottom was not newly changed or certified through a persisted save.
|
|
41
|
+
|
|
42
|
+
## Validation and artifacts
|
|
43
|
+
|
|
44
|
+
The focused toolbar/editor suite adds explicit spacing, zero, fill-once,
|
|
45
|
+
non-finite values, no empty emission and marker-free section creation checks.
|
|
46
|
+
The first compile required a fixture assertion to acknowledge EventEmitter's
|
|
47
|
+
optional value argument; no production typing was relaxed.
|
|
48
|
+
Logs: `/tmp/praxis-section-spacing-tests-final.log` and
|
|
49
|
+
`/tmp/praxis-section-spacing-build.log`.
|
|
50
|
+
Final result: **41 tests passed** and `npm run build:praxis-dynamic-form`
|
|
51
|
+
succeeded through the official dependency/build closure. A final Config API
|
|
52
|
+
GET matched the prior receipt exactly, including version 92 and ETag:
|
|
53
|
+
`/tmp/praxis-section-spacing-config-after.json`. The existing port 4003 server
|
|
54
|
+
remains available; no new server or interactive shell was started.
|
|
55
|
+
|
|
56
|
+
README and the owning JSON API guide were corrected together. The existing Form
|
|
57
|
+
authoring manifest does not declare the removed marker or a separate bulk-fill
|
|
58
|
+
contract; no manifest input, operation or path changed. Public-site examples,
|
|
59
|
+
HTTP corpus and registry generation require no new artifact for this editor
|
|
60
|
+
correction. Existing skills already require canonical layout semantics and
|
|
61
|
+
draft isolation; no skill guidance diverged and no sync was necessary.
|