Repository navigation
Conversation
…itability `Editable: '$currentObject/Locked = false'` on an input widget passed check, exec said "Created page", and the widget was stored `Editable: Always` with no ConditionalEditabilitySettings, so a field meant to be locked stayed editable. `Visible: '<expr>'` was stored as a conditional visibility: its consumer (pages.StaticVisibleExpression) returns any other string as the condition, while Editable's (pages.CanonicalEditability) knew only Always|Never|Conditional and the builder skipped every other string without a word. New pages.StaticEditability is the Editable counterpart: an enum word, a boolean (false is Never, true is Always) or, for any other string, the condition. A list view's and a grid column's Editable stays their own plain bool. check now refuses what still cannot be stored (a misspelt word, a quoted text that is not an expression, `Conditional` with no condition) as MDL-WIDGET19 naming the accepted spellings, and a quoted condition gets the checks the bare one gets (MDL-WIDGET13, MDL-BUTTON02, MDL-WIDGET41, MDL-WIDGET20). describe prints the stored condition bare, so describe -> exec is stable. ALTER PAGE set (Editable: '<expr>') keeps its loud refusal. Control: same script on the pre-fix binary stores Always/null for the quoted widgets; with the fix they are byte-equal (ids stripped) to the bare spelling and mx check reports 0 errors on Mendix 11.12.5. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…r pluggable and data view Follow-up to the quoted Editable expression fix. MDL-WIDGET31 still tested the raw string for "Never", so an input marked `editable: false` (now Never) in a read-only list view kept earning the warning that tells it to mark itself Never; it reads the same resolved value as the builder now. Tests added for the shapes a review asked about: a pluggable widget that declares Editability is refused the same unstorable values by MDL-WIDGET19, and a data view carries the quoted condition exactly as the bare one (its static Never/Always is stored from its own ReadOnly flag, which this change does not touch). CHANGELOG, finding record updated to match. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
AI Code ReviewCritical IssuesNone found. Moderate IssuesNone found. Minor IssuesNone found. What Looks Good
Automated review via OpenRouter (Nemotron Super 120B) — workflow source |
ako
added a commit
to ako/mxcli
that referenced
this pull request
Oct 19, 2026
Integrate wave 1 of the upstream PRs (mendixlabs/mxcli mendixlabs#1574 mendixlabs#1575 mendixlabs#1572 mendixlabs#1570 mendixlabs#1563 mendixlabs#1561 mendixlabs#1568 mendixlabs#1566 #1368), with review follow-ups. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
This branch has not been deployed
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.
Closes #1567.
What it fixes
Editable: '$currentObject/Locked = false'on an input widget passedcheckandexec, and was stored asEditable: Alwayswith no condition, so a field meant to be locked stayed editable. The quotedVisible:next to it was kept.Editable: falseon an input widget was dropped the same way, because the builder read the value only as a string.How
One rule now covers both keys: a string that isn't a plain value of the property is its condition.
StaticEditability(sdk/pages) is the Editable counterpart ofStaticVisibleExpression:Always,NeverandConditional(any case) map to the enum;true/falsemap toAlways/Never;The page builder (
applyConditionalSettings) and the pluggable-widget path use it. A list view and a grid column keep their plain booleanEditable(MDL-WIDGET20 falsely warns thatEditableis dropped onlistviewandcolumn— it is written ako/mxcli#510).Check parity. A quoted condition now gets the same checks as the bare one: MDL-WIDGET13 (association step), MDL-BUTTON02, MDL-WIDGET20 and MDL-WIDGET41. MDL-WIDGET31 treats
editable: falseasNever.New refusal (MDL-WIDGET19, error). Check now refuses an
Editable:value that exec can't store, where before it was silently ignored. The message names the accepted spellings. It covers:'Neever'orReadOnly;Conditionalwith no condition.This is a behaviour change: a script that relied on one of these being ignored now fails check. The docs had shown
Editable: ReadOnlyas valid, so they are corrected toNever.alter page … set (Editable: '<expr>')still refuses a non-enum string with its existing message, before anything is written.replaceandinsertrebuild through the builder and are fixed.Docs:
pages.md,widget-types.md,alter-page.md,create-page.mdandmxcli syntax page.Also included: a CHANGELOG entry (Fixed), a finding in
findings/mdl-executor/, and the regression scriptsmdl-examples/bug-tests/1567-quoted-editable-expression.mdland a.fail.mdlnegative companion.Evidence
Control run: with the tests in place and the production code at
main, 11 test functions fail, each for the intended reason. For example, the quoted widget is stored("Always", ""),Editable: falseis storedAlways, and MDL-WIDGET19 is silent onNeever. All pass with the fix. The controls pass both ways: enum words,Visibleunchanged, and list-view/column booleans.Real run (Mendix 11.12.5 scratch app), stored values:
Editable: '$currentObject/Locked = false'$currentObject/Locked = falseEditable: falseEditable: 'Never'Unchanged page, andmx checkreports 0 errors.alter page … replace/insertandcreate snippetstore the same condition.checkover all 891mdl-examplesscripts: themainbinary and this branch give identical pass/fail results, apart from the new.fail.mdl, which fails check as designed.Windows:
go test ./mdl/executor/ ./sdk/pages/...shows the same 28 pre-existing failures asmain(the sorted lists are identical).go vetandgofmtare clean.Linux (
golang:1.26.6-bookworm, ANTLR 4.13.2):make grammar build test check-mdl check-findings check-conformance check-migration-reference lint-goall pass.Not in this PR
ReadOnlyflag, which the builder never sets fromEditable:.dataview (Editable: Never),falseandtrueare all stored as Editability Always, onmainand here. Only the condition is carried. That's a separate silent drop in the same family, and I can file it.Visible:still gets no syntax check, MDL-WIDGET13 or MDL-BUTTON02. This PR only bringsEditableup toVisible.🤖 Generated with Claude Code