The host form component (use for EditMode, dirty notifications, etc). Set by the slot host.
OptionalFormOptional form context — same shape the collapsible-panel chrome expects. Set by the slot host.
ReadonlyHostSlot-mounted hosts must not sit in the left-nav flex column — leftover
height targets mj-collapsible-panel as a direct child of
.mj-forms-all-panels. display: contents makes the inner panel that child.
Load-time failure only: missing ComponentID, component not found, bad Specification JSON, wrong role. Shown in place of the React component.
OptionalReactThe entity record being edited. Set by the slot host before view init.
OptionalRegistrationThe registration this panel was mounted from. Set by the slot host.
A panel reads its own slot from here, which is the only way it can know where in the form it was asked to sit: the class registration is looked up by the host, not by the panel, so nothing else on the instance carries it.
A failure after the React component loaded, shown above it: an error event from
<mj-react-component> (initialization, render timeout, a throw its error boundary
caught, or an error event the panel raises), or a Validate that threw. A throw during
render stays inside this panel's subtree, so the rest of the form renders and saves
normally.
An error event stays until the panel is mounted again, and a Validate that throws
does not replace it. A Validate failure clears when a later Validate answers.
The slot element the panel was mounted in, set by the slot host. It is where the panel is on the page, which DisplayOrder reads its neighbours from.
The key a bare strip is filed under in the rail, when it replaces blocks and so belongs to their tab. Null for a strip that replaces nothing, which sits above every tab.
Flex order for the panel's own mj-collapsible-panel, to pass as [Order].
A panel's section key is not in the form's section order, so without this the form falls back to the section count and draws every panel at the bottom whatever slot it asked for. A panel standing in for a section takes that section's place instead, so replacing something does not also move it.
A slot between the form's blocks takes the order of the section beside it on the page, so the panel draws where the slot is (see SlotAnchorSectionKey). The very top and the very bottom keep fixed bands: the bottom has to stay below the More folder.
Convenience getter for read-only / edit-mode rendering. Falls back to
false when the panel is shown outside a BaseFormComponent host (e.g.,
a dashboard quick-edit dialog reusing the same panel — see the
"composable panel" docs).
The panel's icon, completed if it was stored without a style.
Font Awesome needs a style class beside the name: fa-chart-column alone matches a
rule that sets a glyph but no font family, so nothing draws. Rows written before the
picker existed carry bare names, and normalizing on the way out makes them render
rather than requiring each one to be edited.
ProtectedPanelThe registration this panel renders, which it holds as a whole contribution rather
than as the bare bag the slot host assigns. Answers DisplayOrder on the base.
Section identity — ContributionSectionKey, the key the rail files this panel by.
The panel's header and rail label.
Configures overrides for any toolbar item (standard built-in items like 'edit', 'delete', 'favorite', 'history', etc., or custom items).
Dynamically disables a toolbar item by key, with an optional reason string for the tooltip.
Optionalreason: stringThe last state the panel reported through ValidationChanged; valid when it has reported none.
Edit mode, expanded state and the parent record's values are not inputs; detect their changes cheaply. A field the user edits elsewhere on the form reaches the panel this way.
A callback method that performs custom clean-up, invoked immediately before a directive, pipe, or service instance is destroyed.
A callback method that is invoked immediately after the default change detector has checked the directive's data-bound properties for the first time, and before any of the view or content children have been checked. It is invoked only once when the directive is instantiated.
Called after the parent form reloads the current record from the database. Default is a no-op. Override to refresh panel-owned data that is not a related-entity grid (those already subscribe to FormRecordRefreshCoordinator themselves).
Registers a dynamic toolbar action item / button into the host form toolbar.
Sets the numeric display order for a toolbar item.
Unregisters a previously registered dynamic toolbar item by key.
Use Validate.
Surface the panel's validity to the parent form's save.
The React method may be async — any validator that checks something
server-side will be — and invokeMethod returns whatever the method
returned. Awaiting is therefore load-bearing: a synchronous 'isValid' in live test sees a Promise, fails, silently falls back to the last cached
ValidationChanged payload, and the form saves an invalid record with no
error and no log. Resolving a non-Promise is a no-op, so one code path
covers both shapes.
A validator that throws or rejects does not block the save by itself. It is logged and
shown in the panel (RenderError) unless the panel already shows an error event,
and the result falls back to the last ValidationChanged state, so a failure the panel
reported before still blocks.
Generic host for a metadata form contribution (
MJ: Entity Form Contributionsrow →componentRole: 'form-panel'React component). Mounted by<mj-form-panel-slot>forSource: 'metadata'winners exactly where a compiled BaseFormPanel would mount.Layering: the React component never touches BaseEntity. This host owns the
FormPanelHostPropssnapshot and rebuilds it when the parent record's values change, appliesFieldChangedto the PARENT record (only for the fields the contribution claims, and only in edit mode; the parent form's Save persists it), forwardsRowCountChangedto the rail badge, and surfacesValidatethroughBaseFormPanel.Validate().