Skip to content

docs/fix: add JCR authoring schema for all Adaptive Forms components (#donotmerge)#1840

Open
rismehta wants to merge 48 commits intodevfrom
rismehta/jcr-authoring-schema
Open

docs/fix: add JCR authoring schema for all Adaptive Forms components (#donotmerge)#1840
rismehta wants to merge 48 commits intodevfrom
rismehta/jcr-authoring-schema

Conversation

@rismehta
Copy link
Copy Markdown
Collaborator

Summary

  • Adds a three-layer YAML schema hierarchy (basefield/container → per-component) documenting every JCR property written by dialog editors and consumed by Sling models for all 23+ Adaptive Forms components
  • Introduces panelimpl.authoring.schema.yaml as a shared intermediate layer for the five PanelImpl-backed components (accordion, panelcontainer, tabsontop, verticaltabs, wizard), eliminating ~120 lines of duplication
  • Adds a root discriminator schema (adaptive-form-component.authoring.schema.yaml) that routes to the correct component schema based on fieldType / fd:viewType
  • Updates all component READMEs with structured property tables (base/field/component-specific) and child-node documentation (fd:rules, fd:events)
  • Adds 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=true passes (~860 unit tests)
  • JcrAuthoringSchemaValidationTest — 6 tests covering minimal/full fixtures for textinput, dropdown, panelcontainer
  • TextInputImplTest#testJcrAuthoringSchemaCompliance validates textinput JCR node against flattened schema
  • DropDownImplTest#testJcrAuthoringSchemaCompliance validates dropdown JCR node against flattened schema
  • FormContainerImplTest#testJcrAuthoringSchemaCompliance validates fully-populated formcontainer fixture (all 30+ properties) against formcontainer schema

🤖 Generated with Claude Code

rismehta and others added 16 commits March 19, 2026 14:22
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>
…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>
@rismehta rismehta force-pushed the rismehta/jcr-authoring-schema branch from c60a681 to 077cecf Compare March 19, 2026 08:52
rismehta and others added 3 commits March 19, 2026 14:45
…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>
@vdua

This comment has been minimized.

@vdua

This comment has been minimized.

@vdua

This comment has been minimized.

@vdua

This comment has been minimized.

@vdua

This comment has been minimized.

@vdua

This comment has been minimized.

rismehta and others added 2 commits March 19, 2026 17:45
…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>
@rismehta
Copy link
Copy Markdown
Collaborator Author

Fixed in commits 11316e693 and 58602f092.

Dual schema locations: Deleted all 34 YAML duplicates from src/test/resources/authoring-schema/. Added maven-resources-plugin to copy docs/authoring-schema/**/*.yaml → test classpath at generate-test-resources phase. docs/authoring-schema/ is now the only YAML source in git — no divergence possible.

ALL_SCHEMA_PATHS hardcoded list: Replaced entirely with Files.walk() directory scan in both JcrAuthoringSchemaValidationTest and a new shared Utils.SchemaCache static inner class. Any new schema added to docs/authoring-schema/ is picked up automatically — no list to maintain, no silent FileNotFoundException.

Copyright year: Fixed to 2026.

@rismehta
Copy link
Copy Markdown
Collaborator Author

Fixed in commit 11316e693.

Added jackson-dataformat-yaml to parent/pom.xml dependencyManagement at 2.13.4 (with a comment to keep in sync with the other Jackson artifacts). Removed the hardcoded <version> from bundles/af-core/pom.xml — it now inherits from the BOM like jackson-databind, jackson-annotations, and jackson-core.

rismehta and others added 18 commits March 19, 2026 18:26
…_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,
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.
Copy link
Copy Markdown
Contributor

@sakshi-arora1 sakshi-arora1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: JCR Authoring Schema for Adaptive Forms Components

What's Good

  1. Well-designed schema hierarchybasefield/container/panelimpl → per-component. Uses JSON Schema Draft 7 with proper allOf/$ref composition and a root discriminator via oneOf/if-then on fieldType/fd:viewType.

  2. DRYpanelimpl.authoring.schema.yaml shared across 5 PanelImpl-backed components eliminates ~120 lines of duplication.

  3. Single source of truth — YAML duplicates removed from src/test/resources/; maven-resources-plugin copies from docs/authoring-schema/ at build time. Divergence is structurally impossible.

  4. Auto-discovery in tests — Hardcoded ALL_SCHEMA_PATHS replaced with Files.walk() so new schemas are picked up automatically.

  5. Good test coverage — 8 test cases validating actual JCR property maps for textinput, dropdown, and panelcontainer with both minimal and full-property variants.

  6. 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:

  • textIsRich changed from @Default(booleanValues = false) boolean to @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 a fix: or feat: change, not docs:. Downstream consumers that check for the presence of richText in 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 line
  • FeatureToggleConstants.java: 65 changes, all Javadoc rewrapping
  • ReservedProperties.java: comment line-break reformatting
  • CheckBoxImpl.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 coverage
  • FormContainerImpl.java (v1) — 0% patch coverage
  • TurnstileImpl.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.

Copy link
Copy Markdown
Contributor

@sakshi-arora1 sakshi-arora1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inline comments on specific files. See the earlier top-level review comment for the full summary.

rismehta and others added 3 commits March 23, 2026 12:09
…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>
@rismehta rismehta changed the title docs: add JCR authoring schema for all Adaptive Forms components docs/fix: add JCR authoring schema for all Adaptive Forms components Mar 23, 2026
@vdua
Copy link
Copy Markdown
Collaborator

vdua commented Mar 23, 2026

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.

@rismehta rismehta changed the title docs/fix: add JCR authoring schema for all Adaptive Forms components docs/fix: add JCR authoring schema for all Adaptive Forms components (#donotmerge) Mar 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants