docs/fix: add JCR authoring schema for all Adaptive Forms components (#donotmerge)#1840
docs/fix: add JCR authoring schema for all Adaptive Forms components (#donotmerge)#1840
Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…mponents Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…mponents Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nents Adds JCR authoring schema YAML files for dropdown, radiobutton, checkboxgroup, checkbox, and switch components, and replaces the legacy numbered-list Edit Dialog Properties sections in all corresponding READMEs (v1 and v2 where they exist) with structured tables covering base, field, and component-specific properties. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…scribble Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…scribble Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… review, termsandconditions components Adds per-component JCR authoring schema YAML files for fragment, recaptcha, hcaptcha, turnstile, termsandconditions, and review, each extending the appropriate base/field/container parent schema. Updates all six component READMEs to replace the legacy numbered-list property docs with structured Markdown tables and a link to the new schema file. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ckBoxImplTest Add fixture and test for the case where enableUncheckedValue is absent (null), verifying that Boolean.TRUE.equals(null) evaluates to false and only the checkedValue is included in enums. Also adds explicit tests for readOnly-absent and required-absent defaulting to false. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…, fix shadow conflicts, normalize structure
…r schema - Add Utils.testJcrSchemaValidation() mirroring existing testSchemaValidation() pattern — validates resource.getValueMap() as JSON against authoring schema - Add flattened JSON schemas for test validation (textinput, dropdown) - Add testJcrAuthoringSchemaCompliance() tests in TextInputImplTest and DropDownImplTest - Add adaptive-form-component.authoring.schema.yaml root discriminator schema routing to per-component schema based on fieldType/fd:viewType - Fix $id values in test JSON schemas to valid URIs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…on tests - Add adaptive-form-component.authoring.schema.yaml as root discriminator schema using oneOf/if-then to select the correct per-component schema based on fieldType and fd:viewType. - Add JcrAuthoringSchemaValidationTest with 6 tests covering textinput, dropdown, and panelcontainer JCR property maps validated against the YAML authoring schemas. - Add jackson-dataformat-yaml 2.13.4 as test-scope dependency for YAML parsing in the schema validation test. - Strategy: YAML schemas are converted to JSON at test setup and written to a temp directory; file: URIs let networknt resolve relative $refs naturally without custom URI factories. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add formcontainer.authoring.schema.json (flattened) covering all flat JCR properties: auto-save (fd:enableAutoSave, fd:autoSaveStrategyType, fd:autoSaveInterval), submission (actionType, mailto, from, subject, cc, bcc, spreadsheetUrl), post-submission (thankYouOption, thankYouMessage, redirect), and general (prefillService, specVersion, clientLibRef) - Add formcontainerv2-full fixture in test-content.json with every schema property populated to exercise full coverage - Add testJcrAuthoringSchemaCompliance() in FormContainerImplTest (v2) using Utils.testJcrSchemaValidation() following existing runtime schema validation pattern Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
c60a681 to
077cecf
Compare
…string coercion for boolean/integer properties - fix oneOf discriminator: add else:false to all branches so non-matching branches actively fail (without else, false-if is trivially valid, causing all N-1 non-matching branches to also pass and breaking oneOf semantics) - fix scribble/fragment/captcha branches: add required:[fd:viewType] to if conditions so absent fd:viewType does not match vacuously - add form container branch (fieldType:form) to root discriminator - add text branch (fieldType:text, legacy static text value) to root discriminator - add form and text to base.authoring.schema.yaml fieldType enum - allow [boolean,string] for all boolean properties: JCR may store as String true/false depending on dialog component — Sling auto-coerces transparently - allow [integer,string] for minOccur/maxOccur/minItems/maxItems/dorNumCols/ fd:autoSaveInterval: JCR may store as String — Sling auto-coerces - add page to thankYouOption enum (valid v1 legacy value alongside message/redirect) - add label and caption to assistPriority enum (observed in live AEM content) Validated against 19 sample forms on localhost:4502 — all pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…roperties
- flattened JSON test schemas (textinput, dropdown, formcontainer):
* additionalProperties: false (strict enforcement via patternProperties)
* patternProperties for ^jcr:, ^sling:, ^cq:, ^fd: prefixed JCR internals
* boolean props → [boolean, string] to reflect JCR Sling auto-coercion
* integer props → [integer, string] to reflect JCR Sling auto-coercion
* assistPriority enum: add 'label' and 'caption' (observed in live AEM)
* thankYouOption enum: add 'page' (legacy v1 value observed in live AEM)
* fieldType enum: add 'form'; formcontainer fd:autoSaveInterval → [integer, string]
- base.authoring.schema.yaml:
* remove additionalProperties:false (draft-07 allOf limitation: would reject
field-specific props like readOnly/lazy when validated via allOf chains)
* keep patternProperties as documentation; update comment to explain the
limitation and point to flattened schemas for strict enforcement
* remove 'text' from fieldType enum (not a supported product fieldType)
- adaptive-form-component.authoring.schema.yaml:
* remove 'text (static text, older fieldType value)' branch (not supported)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…pl richText serialization bug - TextImpl: change textIsRich from @default boolean to @nullable Boolean; add @JsonIgnore to isRichText() and a separate @JsonProperty("richText") @JsonInclude(NON_NULL) getRichText() so richText is absent from JSON when textIsRich is not authored in JCR (was always emitting "richText": false) - Update golden fixtures: remove spurious "richText": false from exporter-text* and exporter-termsandconditions (text child) - Add TextImplTest.testRichTextAbsentFromJcr asserting isRichText()=false and no "richText" key in serialized JSON when property is absent from JCR - Annotate all boolean default properties across YAML schemas with "Omit from JCR when [default]" guidance, distinguishing OPTIONAL+NON_NULL (visible, enabled, readOnly, etc.) from @default+@JsonIgnore computation inputs (multiSelect, multiLine, exclusiveMinimum, excludeMinimum, etc.) - Correct base schema top-level note: @default properties are NOT serialized to JSON (getters are @JsonIgnore or have no public JSON getter) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
…kson BOM, datetime format, richText docs - Replace hardcoded PRELOADED_SCHEMA_PATHS list with Files.walk() directory scan in JcrAuthoringSchemaValidationTest — any new schema added to docs/authoring-schema/ is automatically picked up, no list to maintain - Add maven-resources-plugin execution to copy docs/authoring-schema/ YAML files to test classpath at generate-test-resources phase; delete YAML duplicates from src/test/resources/authoring-schema/ — docs/ is now the single source of truth - Add jackson-dataformat-yaml to parent/pom.xml dependencyManagement; remove hardcoded version from bundles/af-core/pom.xml so all Jackson deps track together - Add format:date-time annotation and OffsetDateTime description to minimumDateTime/ maximumDateTime in field.authoring.schema.yaml (prevents silent DateTimeParseException) - Add Javadoc to TextImpl.getRichText() documenting the richText omission behavior change - Set additionalProperties:true in flattened JSON schemas to allow customer-authored JCR properties (customProp* and any other custom properties) - Fix copyright year 2024 → 2026 in JcrAuthoringSchemaValidationTest.java - Apply code formatter across bundles/af-core Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… truth in docs/ Add Utils.SchemaCache: a lazy static inner class that converts all *.yaml files under /authoring-schema classpath directory to JSON in a temp dir at first use. networknt resolves relative $ref chains via file: URIs with zero pre-flattened copies in source control. - Utils.loadAuthoringSchema(yamlPath): new public method backed by SchemaCache - Utils.testJcrSchemaValidation(): now accepts a .yaml path, delegates to SchemaCache - JcrAuthoringSchemaValidationTest: remove duplicate setUpSchemas() / fields, loadSchema() delegates to Utils.loadAuthoringSchema() - TextInputImplTest, DropDownImplTest, FormContainerImplTest(v2): pass .yaml paths - Delete textinput/dropdown/formcontainer .json flattened schemas from test/resources docs/authoring-schema/ is now the only schema source in git. Adding a new component schema requires zero Java changes — the directory walk picks it up automatically. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
Fixed in commits 11316e693 and 58602f092. Dual schema locations: Deleted all 34 YAML duplicates from
Copyright year: Fixed to 2026. |
|
Fixed in commit 11316e693. Added |
…_clone Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…bcommands, and examples Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a Cypress spec that fetches random sample forms via infinity.json and validates every guideContainer node against the root adaptive-form-component authoring schema in a single Node.js task call. Also widens minLength/maxLength schema type to [integer, string] since Sling's ValueMap coerces both to Integer at runtime, so both are valid JCR representations. New files: - ui.tests/test-module/specs/authoring-schema/authoring-schema.validation.cy.js - ui.tests/test-module/yarn.lock (ajv, ajv-formats, json-schema-ref-parser) Modified: - ui.tests/test-module/libs/plugins/index.js — validateJcrTree task - ui.tests/test-module/package.json — add schema validation devDependencies - docs/authoring-schema/field.authoring.schema.yaml — minLength/maxLength type Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…s CRISPR rationale Documents why a JCR authoring schema layer was introduced alongside (not replacing) CRISPR: different validation points, Sites Edit Dialog path, Content API validation, authoring-only properties (fd:channel, langDisplayValue, rule-editor AST blobs), and the 2-JCR-property → 1-runtime-property derivation pattern (exclusiveMinimum). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add _validate_tree() helper that accepts any JCR subtree shape: - single component dict (fieldType at top level) - guideContainer .infinity.json subtree - full page .infinity.json (jcr:content wrapper) cmd_validate now uses _validate_tree() instead of validate_component() so users can pipe guideContainer .infinity.json directly and get all component nodes validated in one pass with a component count in output. validate_form_payload() refactored to delegate to _validate_tree(). --payload help text updated to document the three accepted shapes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Exclude docs/authoring-schema/**/* from RAT (YAML schema files are not source code and don't carry license headers) - Add Apache License header to scripts/content_api_forms.py Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…g library The deprecated RefResolver had a scope-stack leak when patternProperties processed 2+ children with ref chains (container to adaptive-form-component to components/textinput). The second child ref resolved from the wrong directory. Changes: - Replace RefResolver + build_schema_store() with referencing.Registry + build_registry(). The referencing library resolves nested ref chains correctly, enabling schema-native recursion in patternProperties. - container.authoring.schema.yaml: add patternProperties so any child dict with fieldType is validated against the root discriminator. - field.authoring.schema.yaml: allow validatePictureClauseMessage as string or array (Granite writes it as JCR multi-value String[]). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…n on violations
The patternProperties added to container.authoring.schema.yaml introduced
a circular $ref chain:
container -> adaptive-form-component -> formcontainer -> container
libs/plugins/index.js:
- dereference() + stripIds() crashed with 'Maximum call stack size exceeded'
when traversing the circular JS object produced by the circular $ref
- Replace with AJV v8 addSchema() per-file approach: each YAML is loaded
and registered under its file:// URI; AJV resolves $refs lazily at
validation time, handling circular refs natively
- Remove $Ref import (json-schema-ref-parser no longer needed)
- Remove stripIds() helper (no longer needed)
authoring-schema.validation.cy.js:
- Fix assertion: expect(result).to.have.property('violations') always
passed and never failed even when violations were found (checked only
that the key existed). Change to expect(result.violations).to.be.empty
so the test actually fails on schema violations.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…-file to put - create-site: creates a cq:Page at an arbitrary JCR path via Sling import and discovers the resulting siteId from the Content API. Handles sling:Folder stub cleanup (delete + retry) and polls until the site is indexed. - put: accepts --content (inline JSON) and --content-file (path to JSON file) in addition to the existing --title-only path. Validates mutual exclusivity. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When EditableToolbar exists in DOM but is display:none, the openEditableToolbar command now scrolls #OverlayWrapper into view before clicking — matching the behaviour of the already-visible branch. Without scrollIntoView the click could miss the overlay and leave the toolbar hidden, causing a 10-second timeout on the visibility assertion. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…it SHA Previously the cache was keyed on the branch HEAD commit SHA, causing a cache miss (and full schema re-download) on every unrelated commit to a busy branch like dev/master even when no schema file changed. Replace _resolve_branch_sha + _list_schema_paths with a single _fetch_schema_tree_info() call that uses the recursive Git tree API to extract both the docs/authoring-schema/ subtree SHA and the yaml paths in one request. The subtree SHA only changes when a schema file changes, so the cache is now stable across unrelated commits. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…gle captcha branch fd:viewType is NOT written to JCR by any captcha component (_cq_template.xml for recaptcha/hcaptcha/turnstile all only set fieldType=captcha). The three captcha types are distinguished at JCR level by sling:resourceType, not fd:viewType. fd:viewType is only used for scribble (signature) and fragment. The previous four captcha branches with required:[fd:viewType] guards were wrong — they caused fieldType=captcha nodes without fd:viewType (all real captcha nodes) to match no branch and fail oneOf. Replace with a single 'captcha' branch routing to a new shared captcha.authoring.schema.yaml that covers rcCloudServicePath (reCAPTCHA), cloudServicePath (hCaptcha/Turnstile), recaptchaSize, and size properties. Fixes: AssertionError in authoring-schema.validation.cy.js for /content/forms/af/core-components-it/samples/recaptcha/basic Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Root causes and fixes: 1. Button type collision: PN_BUTTON_TYPE="type" stores "button"/"submit"/"reset" in the same JCR property as the data-type enum. Extended base type enum to include these values and allowed type to also be an object (child-node collision with JCR nodes literally named "type"). 2. String booleans: Granite dialogs write areOptionsRichText, multiLine, multiSelection, readOnly, wrapData as JCR String "true"/"false" instead of Boolean. Changed all five to type: [boolean, string]. 3. Missing data-type values: Added float (bank-form), h1-h6 (plain-text heading variants) to the type enum. 4. Child-node naming collisions: JCR child nodes named "name", "id", "description" appear as objects in infinity.json. Changed those base properties to type: [string, object]. 5. Scalar enum/enumNames: Granite/sample forms occasionally write a single option value as a JCR String scalar instead of String[]. Changed enum/enumNames in dropdown, radiobutton, checkboxgroup to type: [array, string]. 6. fieldType=text: Undocumented alias used by forms-components-examples. Added discriminator branch mapping to text.authoring.schema.yaml. Validated against all 148 forms in /content/forms/af/core-components-it/samples. Result: PASS 148 / FAIL 0. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the 2-level manual traversal + Cypress._.sampleSize(5) with a single QueryBuilder request (type=cq:Page, p.limit=-1) that returns all cq:Page nodes under the samples root regardless of nesting depth. The old discovery missed top-level form pages directly under samples/ (e.g. accessibility, setfocustest) and was non-deterministic — different runs validated different subsets, so schema regressions could go undetected. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ple forms - Remove format: date-time from minimumDate/maximumDate and minimumDateTime/maximumDateTime — JCR Date properties serialize via .infinity.json as JS toUTCString() (e.g. "Wed Jul 10 2024 00:00:00 GMT+0000"), not ISO 8601, so AJV format validation rejected them - Allow mailto as string or array — Granite dialog writes it as JCR multi-value String[] - Allow fd:enableAutoSave as boolean or string — Granite writes it as JCR String "true" - Fix Cypress test to collect all violations across all forms before asserting, so every form is validated even when some have failures (no early exit) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The previous conditional logic (3 branches based on toolbar DOM state)
used synchronous $.is(':visible') snapshots inside .then() callbacks,
which Cypress cannot retry. This caused flaky failures when AEM's editor
was still processing a dialog close: the snapshot found the toolbar hidden,
the click fired into an unsettled AEM state, and the toolbar never appeared.
All three branches were equivalent in outcome (scroll → click → assert),
so collapse them into one unconditional path. Use .first() to handle the
Sites-editor case where the same data-path selector matches two overlays.
| "fieldType": "plain-text", | ||
| "name": "consenttext", | ||
| "value": "Text related to the terms and conditions come here", | ||
| "richText": false, |
There was a problem hiding this comment.
This is expected, having a default value was polluting the json, hence removed this.
After dialog submission AEM may still be processing the close (component refresh, overlay re-render) when openEditableToolbar fires the click. The single click lands in a transitional state and AEM ignores it, leaving #EditableToolbar display:none for the full 10 s retry window. Targeted fix: in the hidden-toolbar branch only, add a synchronous re-check after the first click and fire a second click if the toolbar is still not visible. The original 3-branch structure is preserved to avoid regressions in other tests.
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
sakshi-arora1
left a comment
There was a problem hiding this comment.
Review: JCR Authoring Schema for Adaptive Forms Components
What's Good
-
Well-designed schema hierarchy —
base→field/container/panelimpl→ per-component. Uses JSON Schema Draft 7 with properallOf/$refcomposition and a root discriminator viaoneOf/if-thenonfieldType/fd:viewType. -
DRY —
panelimpl.authoring.schema.yamlshared across 5 PanelImpl-backed components eliminates ~120 lines of duplication. -
Single source of truth — YAML duplicates removed from
src/test/resources/;maven-resources-plugincopies fromdocs/authoring-schema/at build time. Divergence is structurally impossible. -
Auto-discovery in tests — Hardcoded
ALL_SCHEMA_PATHSreplaced withFiles.walk()so new schemas are picked up automatically. -
Good test coverage — 8 test cases validating actual JCR property maps for textinput, dropdown, and panelcontainer with both minimal and full-property variants.
-
Reviewer feedback addressed thoroughly — All 6 review comments from @vdua were fixed with clear commit-by-commit responses.
Issues & Concerns
High — Mislabeled PR / Breaking behavioral change
The PR is titled docs: but includes a runtime behavioral change in TextImpl.java:
textIsRichchanged from@Default(booleanValues = false) booleanto@Nullable Boolean- JSON output now omits
"richText"entirely when the property isn't in JCR (previously always emitted"richText": false) - The
getRichText()/isRichText()split is well-implemented, but this is afix:orfeat:change, notdocs:. Downstream consumers that check for the presence ofrichTextin JSON could break.
@vdua already flagged this. The Javadoc on getRichText() documents the change, but the PR title and commit convention should be corrected, and a release note is warranted.
Medium — Extensive formatter-only changes inflate the diff
A large portion of the 221 changed files are whitespace/formatting-only changes to Java source (line-wrapping annotations, reflowing Javadoc, collapsing multi-line expressions). Examples:
Heading.java: enum values collapsed to one lineFeatureToggleConstants.java: 65 changes, all Javadoc rewrappingReservedProperties.java: comment line-break reformattingCheckBoxImpl.java,ScribbleImpl.java,StaticImageImpl.java, etc.: annotation reformatting
These add noise and make the meaningful changes harder to review. Consider separating formatter changes into a dedicated commit or PR.
Medium — Patch coverage at 87.5%
Codecov reports 21 lines missing coverage, notably:
AbstractFormComponentImpl.java— 71.4% patch coverageFormContainerImpl.java(v1) — 0% patch coverageTurnstileImpl.java— 25% patch coverage
Most appear to be in reformatted code, but worth confirming no logic changes slipped in with the reformatting.
Low — .gitignore addition
.worktrees/ added to .gitignore — this is a local tooling artifact that may be better suited to a personal global gitignore rather than the project .gitignore.
Summary
| Priority | Item |
|---|---|
| High | Relabel PR from docs: to reflect the TextImpl behavioral change; add release note |
| Medium | Consider separating formatter-only changes into a dedicated commit |
| Medium | Confirm no logic changes hidden in formatter-only diffs (coverage gaps) |
| Low | Move .worktrees/ to global gitignore |
The core contribution — the authoring schema hierarchy, build-time copy, and validation tests — is well-architected and solid.
sakshi-arora1
left a comment
There was a problem hiding this comment.
Inline comments on specific files. See the earlier top-level review comment for the full summary.
...-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TextImpl.java
Show resolved
Hide resolved
bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/Heading.java
Show resolved
Hide resolved
.../src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TurnstileImpl.java
Show resolved
Hide resolved
...-core/src/main/java/com/adobe/cq/forms/core/components/internal/form/ReservedProperties.java
Show resolved
Hide resolved
…ger visibility Forms Manager (/aem/forms.html) queries dam:Asset nodes under /content/dam/formsanddocuments — not the cq:Page nodes under /content/forms/af that the Content API creates. Without a matching dam:Asset, script-created forms are invisible in Forms Manager. Fix: add Forms Manager integration helpers that mirror the two-node pattern AEM's own UI uses: - _ensure_dam_folder(): creates sling:Folder at /content/dam/formsanddocuments/<site> alongside the cq:Page site root. - _create_dam_asset_stub(): creates a dam:Asset stub (dam:AssetContent + metadata with fd:version, title, formmodel) so the form appears in the Forms Manager listing. Uses a two-step Sling POST because :operation=import cannot override the auto-created node's jcr:primaryType — step 1 creates the node with jcr:primaryType=dam:Asset, step 2 imports jcr:content. - _delete_dam_asset_stub(): removes the stub on form deletion. Wired into: create_site_root_page, cmd_create_site, validate_and_create, cmd_create, delete_forms, cmd_delete. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add validate_content_api_payload() — walks Content API items[] tree, validates each component node individually against the authoring schema - Add validate_patch_ops() — pre-flight validation for JSON Patch ops: add/whole-replace validate node directly; replace /properties/key simulates patch and validates post-patch component - Add _content_api_to_jcr() and _simulate_patch() helpers - Fix stale v2 resource types → v1 in sanity check and wcm_form_ops - Remove dead _navigate_pointer(); inline via _get_at_pointer() - fix(e2e): wait for dialog close after submit in viewQualifiedName test Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
validate_exporter_json (GitHub Actions) — Blocking until passing or team overrides workflow. Confirm whether failures are expected due to intentional key removals (e.g. richText) and update workflow or exporter files accordingly. File: .github/workflows/exporter-validate-pr.yml interaction with changed */exporter.json. JcrAuthoringSchemaValidationTest.java — Update class Javadoc (lines 33–34) to reflect Maven copy + classpath layout (bundles/af-core/pom.xml already documents intent). PR scope — Consider splitting follow-up work (large Python CLI expansions, unrelated E2E flakiness fixes, pure chore(af-core): apply code formatter) into separate PRs next time to preserve review signal. |
Summary
base→field/container→ per-component) documenting every JCR property written by dialog editors and consumed by Sling models for all 23+ Adaptive Forms componentspanelimpl.authoring.schema.yamlas a shared intermediate layer for the five PanelImpl-backed components (accordion, panelcontainer, tabsontop, verticaltabs, wizard), eliminating ~120 lines of duplicationadaptive-form-component.authoring.schema.yaml) that routes to the correct component schema based onfieldType/fd:viewTypefd:rules,fd:events)Utils.testJcrSchemaValidation()utility and JCR authoring schema validation tests for TextInput, Dropdown, and FormContainer (full property coverage including auto-save, submission, and post-submission properties)Test plan
mvn test -pl bundles/af-core -Dspotbugs.skip=truepasses (~860 unit tests)JcrAuthoringSchemaValidationTest— 6 tests covering minimal/full fixtures for textinput, dropdown, panelcontainerTextInputImplTest#testJcrAuthoringSchemaCompliancevalidates textinput JCR node against flattened schemaDropDownImplTest#testJcrAuthoringSchemaCompliancevalidates dropdown JCR node against flattened schemaFormContainerImplTest#testJcrAuthoringSchemaCompliancevalidates fully-populated formcontainer fixture (all 30+ properties) against formcontainer schema🤖 Generated with Claude Code