Skip to content

[FEATURE] Add attribute-configured custom controls - #42

Merged
Kanti merged 2 commits into
mainfrom
feature/issue-16-extensible-controls
Oct 7, 2026
Merged

Kanti merged 2 commits into
mainfrom
feature/issue-16-extensible-controls

Conversation

@Kanti

@Kanti Kanti commented Oct 5, 2026 •

Copy link
Copy Markdown
Member

Implements #16: extensions can register attribute-configured controls without changing the inspector for each new input. Providers receive the original argument and transformer-input context; explicit parameter attributes, deterministic exact/wildcard selection, trusted Fluid templates and import-map modules compose with existing transformers.

The adapter lifecycle awaits asynchronous startup before snapshots and writes, supports dirty tracking, validation, Reset, preview values and save/copy, and destroys late mounts after navigation. Includes an extension-owned example with a nested transformer input and registration documentation. This is the base of the planned #12 → #15 → #38 stack; no dependency PR.

Validation: PHP 8.5 unit 331 tests/1332 assertions; SQLite functional 87 tests/501 assertions; GrumPHP all 12 tasks including PHPStan, Rector, lint and Composer audit; Node 95 tests; TypeScript check. Chromium exercised delayed mounting, dirty state, nested values, preview URL, Reset, validation, Save/copy request payloads and teardown. Browser transport/document/notification services were mocked; authenticated TYPO3 browser and MySQL/PostgreSQL flows were not exercised. Screenshot and browser evidence are in the task workspace (/workspace/issue16-control.png, /workspace/issue16-browser.log), not remotely hosted.

API scope: matching uses normalized exact types then wildcard providers with context predicates, rather than implicit class-subtype matching. This makes matching explicit for union-specific controls.

Rebase validation (2026-10-07)

Rebased onto current main. Includes the equivalent null-safe variant-copy rewrite required by current Rector.

Local PHP 8.5 unit: 346 tests/1534 assertions; MySQL functional: 95 tests/558 assertions; Node/Chromium: 118 tests; TypeScript and all GrumPHP tasks passed.

Current-head CI: all 8 jobs passed for 1711cb1.

Nullable custom adapters use the same data-fixture-value-null state as native inputs. An initially empty adapter value represents null while that flag is set; editing to a value clears it, and Reset restores the saved null flag before updating the adapter. Clearing an edited value remains an empty string. A regression covers mounting, collection, editing and Reset.

Stack rebased onto current main: #42 → #46 → #48. Current-head CI: all 8 jobs passed for d59fec6.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@Kanti
Kanti marked this pull request as ready for review October 7, 2026 09:00
@Kanti
Kanti force-pushed the feature/issue-16-extensible-controls branch from 1711cb1 to d59fec6 Compare October 7, 2026 12:16
@Kanti
Kanti requested a balanced review from Copilot October 7, 2026 12:16

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@Kanti
Kanti merged commit e3cb6ed into main Oct 7, 2026
8 checks passed
@Kanti
Kanti deleted the feature/issue-16-extensible-controls branch October 14, 2026 08:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants