Skip to content

Show Page actions get an empty TitleOverride instead of null, blanking every popup's caption #812

Description

@dimenus

mxcli version: v0.16.0-303-gb344f999-dirty (built from b344f999, 2026-07-30) · OS: macOS 15.6.1 (Darwin 24.6.0, Apple Silicon) · Studio Pro: 11.13.0 Beta · Mendix project: 11.13.0

Summary

Every Show Page action written by mxcli gets FormSettings.TitleOverride set to a non-null but empty Microflows$TextTemplate. Studio Pro leaves that field null.

An empty override is not the same as an absent one. mxbuild emits it as "title": selectTranslation([{ "type": "literal", "value": "" }]), and at runtime that overrides the target page's own title with an empty string. Every popup opened by an mxcli-authored button therefore shows an empty caption — just the ×.

The page itself is fine: its Title is stored correctly, survives round-trip, and reaches the client. So editing the page's Title in Studio Pro appears to do nothing, which makes this look like a lost title rather than an override. That took a while to unpick.

Minimal repro

Any page opened as a popup from an mxcli-created button.

create or modify page ContentManager.ProbePopup (
  Title: 'Probe title',
  Layout: Atlas_Core.PopupLayout,
  Folder: 'PageHost',
  PopupResizable: true
) {
  layoutgrid layoutGrid1 {
    row row1 {
      column col1 (DesktopWidth: AutoFill) {
        dynamictext text1 (Content: 'body')
      }
    }
  }
}
/

alter page ContentManager.SomeExistingPage {
  insert after someWidget {
    actionbutton btnProbe (
      Caption: 'Open probe',
      Action: show_page ContentManager.ProbePopup
    )
  }
}
/

Run the app, click Open probe.

Expected

The modal header shows Probe title — the target page's title, as it does for a button created in Studio Pro.

Actual

The modal header shows only the ×. The caption element exists and is empty:

<div class="modal-header mx-window-header">
  <button type="button" class="close" title="close" aria-label="close">×</button>
  <h4 id="mxui_widget_Window_0_caption" role="heading" aria-level="2"></h4>
</div>

Root cause — the model

Two buttons on the same page, opening two popups that use the same Atlas_Core.PopupLayout. One button was drawn in Studio Pro, the other written by mxcli:

Studio Pro button
  Forms$FormAction.FormSettings = {
    Form: "ContentManager.PageFromStudioPro",
    TitleOverride: null                       <-- absent
  }

mxcli button
  Forms$FormAction.FormSettings = {
    Form: "ContentManager.ProbePopupNoParam",
    TitleOverride: {                          <-- present but empty
      $Type: "Microflows$TextTemplate",
      Text:  { $Type: "Texts$Text", Items: [] },
      Parameters: []
    }
  }

Root cause — what mxbuild does with it

Generated client bundle for the page holding both buttons, deployment/web/dist/pages/…DebugBucketContents.js:

// Studio Pro button — no title key at all
"config": { "name": "ContentManager/PageFromStudioPro.page.xml",
            "location": "modal", "resizable": true,}

// mxcli button — empty title override wins over the page's own title
"config": { "name": "ContentManager/ProbePopupNoParam.page.xml",
            "title": selectTranslation([{ "type": "literal", "value": "" }]),
            "location": "modal", "resizable": true,}

Confirmation

Removing only that "title": selectTranslation(...) key from the served bundle and reloading makes the caption render correctly:

before  caption = ""
after   caption = "Probe A no param"

Nothing else was changed.

Ruled out

Each tested as a single variable, in the running app:

  • Page parameters — a parameterless mxcli popup is equally broken.
  • Popup sizing — probe mirrored the Studio Pro page (PopupResizable: true, no fixed width/height); still broken.
  • Autofocus — mxcli always writes DesktopOnly where Studio Pro had Off; patching the served bundle to off did not fix it.
  • Stale build — the edited title was present in the deployed JS and metadata.json was newer than the .mpr.
  • Missing translation — the page's Title is a normal Texts$Text with a correct en_US Texts$Translation, identical in shape to the Studio Pro page.
  • The layout — both pages use the same Atlas_Core.PopupLayout. The caption is drawn by the client's window chrome, not by the layout.

Scope in one project

Scanning every Forms$FormSettings in a project built mostly with mxcli:

TitleOverride Count Origin
empty (caption blank) 10 all mxcli-authored
null or a real template 58 all Studio Pro / marketplace modules (OIDC, UserCommons, Administration, FeedbackModule, AWSAuthentication), including the one Studio Pro button sitting on the same page as a broken one

The split is total — no mxcli-written Show Page action is correct, and no Studio Pro one is broken.

Suggested fix

When no title override is specified in MDL, leave FormSettings.TitleOverride as null rather than constructing an empty Microflows$TextTemplate. An empty template is indistinguishable from "override the title with nothing".

It would also be useful to expose the override in MDL — there appears to be no syntax for setting a Show Page action's title, so today it can only be cleared in Studio Pro.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions