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