Summary
A native (non-pluggable) listview's design properties — Remove empty text,
Remove loadmore button, Reset list style — cannot be written by ALTER PAGE. Both available
routes pass mxcli check --references cleanly and then fail at mxcli exec.
This is reported primarily as a detection gap. The syntax check is not merely unhelpful here;
it actively asserts the operation is valid. An agent that trusts check will draft the script,
report it validated, and only discover the truth when it mutates a real model.
Reproduction
On any page containing a native listview whose DesignProperties include 'Remove empty text':
Route 1 — set the property directly
alter page <Module>.<Page> {
set 'Remove empty text' = off on <listviewName>
};
mxcli check <script> -p <model>.mpr --references → Check passed!
mxcli exec <script> -p <model>.mpr → fails:
failed to set Remove empty text on <listviewName>: property "Remove empty text" not found (widget has no pluggable Object)
Route 2 — restate the widget
alter page <Module>.<Page> {
replace <listviewName> with { ...subtree without the property... }
};
mxcli check ... --references → Check passed!
mxcli exec ... → fails: htmlelement, attribute and tagcontentcontainer reported as
not a widget in this project [MDL-WIDGET25].
Route 2's failure is the sharper one: those three keywords are exactly what describe page
emits for that subtree on the unmodified model. So describe page produces output that
create/replace will not accept — the round-trip is not closed for pages containing an
HTMLElement.
Cause
Native listview design properties live in Forms$Appearance.DesignProperties. The SET path
looks for a pluggable widget's Object.Properties and finds nothing to write. The check stage
does not distinguish the two storage locations, so it validates the name against neither.
Suggested fixes, ranked
- Close the false green. Make
check resolve a design-property name against the widget's
actual storage location and fail at check time when the widget is native. A check that cannot
tell should say so rather than pass.
- Implement the write for
Forms$Appearance.DesignProperties on native widgets.
- Close the describe/create round-trip for
htmlelement / attribute /
tagcontentcontainer, so replace remains a usable fallback.
- Failing all three, have
exec name the workaround in its error text: this property is only
reachable from Studio Pro.
How to retest
Run both routes above. Route 1 is fixed when check fails with a clear message, or exec
succeeds. Route 2 is fixed when a describe page of a page containing an htmlelement can be fed
back through replace without MDL-WIDGET25.
Found on Mendix 11.12.2. Both routes were tested on a disposable scratch copy of a model, never a
real one. A CSS-class workaround covers the inner listview (ALTER PAGE ... SET Class writes
fine); only the design property itself is blocked.
Summary
A native (non-pluggable)
listview's design properties —Remove empty text,Remove loadmore button,Reset list style— cannot be written byALTER PAGE. Both availableroutes pass
mxcli check --referencescleanly and then fail atmxcli exec.This is reported primarily as a detection gap. The syntax check is not merely unhelpful here;
it actively asserts the operation is valid. An agent that trusts
checkwill draft the script,report it validated, and only discover the truth when it mutates a real model.
Reproduction
On any page containing a native
listviewwhoseDesignPropertiesinclude'Remove empty text':Route 1 — set the property directly
mxcli check <script> -p <model>.mpr --references→Check passed!mxcli exec <script> -p <model>.mpr→ fails:failed to set Remove empty text on <listviewName>: property "Remove empty text" not found (widget has no pluggable Object)Route 2 — restate the widget
mxcli check ... --references→Check passed!mxcli exec ...→ fails:htmlelement,attributeandtagcontentcontainerreported asnot a widget in this project [MDL-WIDGET25].Route 2's failure is the sharper one: those three keywords are exactly what
describe pageemits for that subtree on the unmodified model. So
describe pageproduces output thatcreate/replacewill not accept — the round-trip is not closed for pages containing anHTMLElement.
Cause
Native listview design properties live in
Forms$Appearance.DesignProperties. TheSETpathlooks for a pluggable widget's
Object.Propertiesand finds nothing to write. The check stagedoes not distinguish the two storage locations, so it validates the name against neither.
Suggested fixes, ranked
checkresolve a design-property name against the widget'sactual storage location and fail at check time when the widget is native. A check that cannot
tell should say so rather than pass.
Forms$Appearance.DesignPropertieson native widgets.htmlelement/attribute/tagcontentcontainer, soreplaceremains a usable fallback.execname the workaround in its error text: this property is onlyreachable from Studio Pro.
How to retest
Run both routes above. Route 1 is fixed when
checkfails with a clear message, orexecsucceeds. Route 2 is fixed when a
describe pageof a page containing anhtmlelementcan be fedback through
replacewithoutMDL-WIDGET25.Found on Mendix 11.12.2. Both routes were tested on a disposable scratch copy of a model, never a
real one. A CSS-class workaround covers the inner listview (
ALTER PAGE ... SET Classwritesfine); only the design property itself is blocked.