Repository navigation
[FEATURE] Add attribute-configured custom controls - #42
Merged
Merged
Conversation
This was referenced Oct 5, 2026
Open
Kanti
force-pushed
the
feature/issue-16-extensible-controls
branch
from
October 7, 2026 07:41
f7555bd to
1711cb1
Compare
Kanti
marked this pull request as ready for review
October 7, 2026 09:00
Kanti
force-pushed
the
feature/issue-16-extensible-controls
branch
from
October 7, 2026 12:16
1711cb1 to
d59fec6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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-nullstate as native inputs. An initially empty adapter value representsnullwhile 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 ford59fec6.