Whether the variant dropdown menu is currently open. Toggled by the control's click handler; closed on blur or after a row is picked.
Number of attachments linked to this record
Emitted BEFORE cancel - can be cancelled by setting event.Cancel = true
Emitted BEFORE delete - can be cancelled by setting event.Cancel = true
Emitted BEFORE history view - can be cancelled by setting event.Cancel = true
Emitted BEFORE list management - can be cancelled by setting event.Cancel = true
Emitted BEFORE refresh - can be cancelled by setting event.Cancel = true
Emitted BEFORE save - can be cancelled by setting event.Cancel = true
Emitted when cancel is requested (only in standalone mode)
Persisted per entity. Pinned (default) keeps the left rail open. Unpinned auto-collapses after the user picks another section.
Expanded rail width in px. Persisted per entity.
Override ID currently rendered. The picker highlights this entry. May be null when the active form is a class-based
Emitted when a custom toolbar button is clicked
Emitted when delete is confirmed (host app handles actual deletion)
Emitted when edit mode changes (only in standalone mode; FormComponent mode handled internally)
Emitted when favorite toggle is requested
Reference to the parent form component (e.g. BaseFormComponent subclass). When provided, the container derives toolbar state from this reference and handles Save/Cancel/Edit internally by calling its methods.
Emitted when history view is requested
Emitted when list management is requested
Emitted for all navigation actions (the host app maps these to its routing)
If specified, this provider will be used for communication and for all metadata purposes. By default, if not provided, the Metadata and RunView classes are used for this and the default GraphQLDataProvider is used which is connected to the same back-end MJAPI instance as the Metadata and RunView classes. If you want to have this component connect to a different MJAPI back-end, create an instance of a ProviderBase sub-class like GraphQLDataProvider/etc, and configure it as appropriate to connect to the MJAPI back-end you want to use, and then pass it in here.
ReadonlyRailReadonlyRailThe entity record being displayed/edited
Emitted when refresh is requested (only in standalone mode)
Emitted when save is requested (only in standalone mode)
Controls visibility of attachments slide panel
Emitted when show-changes is requested
Controls visibility of list management dialog
Controls visibility of record changes drawer
Controls visibility of section manager drawer
Controls visibility of tags panel
Number of tags on this record
Persisted tags panel width
Emitted when any toolbar item (standard or custom) is clicked
Emitted when the user chooses a different form variant from the picker. Carries the selected variant's override ID, or null when the user picks the "Default form" row. The host is responsible for persisting the choice (via FormResolverService.SetSelectedVariant) and reloading the record so the new form mounts.
Variants available for this entity record. When more than one variant is provided, a compact picker appears between the toolbar and the form body letting the user switch which form is rendered. Empty / single-variant lists hide the picker entirely.
Each item is a plain object — we don't take a hard dep on the resolver's row type from here (this is a Generic component; the Explorer-level single-record component shapes the resolver row into this minimal form).
Number of tracked record change versions for this record
StaticɵdirStaticɵfacWhether the attachments feature is available for the current record. True when record is saved and entity allows attachments (default true).
SectionKeys of related-entity panels projected into the container (CodeGen-baked or hand-written). View-children we mount as fill-ins are not in this ContentChildren list.
True when the rail is the thin rotated strip. Search keeps the full list visible so matches stay clickable.
Label for the currently-selected variant (or "Default form" if none).
Whether the in-form toolbar renders at all. Driven by the form's
Config.Toolbar: an explicit null (the dialog/slide-in default) hides
the entire toolbar so the surrounding chrome can own Save/Cancel/title.
Any other value (undefined or a partial config) keeps the toolbar.
Effective toolbar config: the bound ToolbarConfig (or the default)
with the form's Config.Toolbar partial merged on top. This is the
no-regeneration bridge — generated templates never bind [Config],
yet per-instance toolbar tweaks still take effect through fc.Config.
Effective variants — prefer the form component's list (set by the host
resolver) when present, fall back to the directly-bound @Input. This
means generated form templates don't need to bind [Variants] explicitly;
the host populates instance.Variants post-construction and the
container reads it through this accessor.
Typed accessor for the form component reference
Whole-form totals — what the COLLAPSED rail spine shows, since no individual rail item is visible there. Summed over the RAIL GROUPS (first-class + More), not over every registered panel: a panel the chrome dropped from the rail (System Metadata in left-nav, a claimed baked grid) is not something the user can reach from the rail, so the spine must add up to exactly what the expanded rail shows. Includes form-level validation failures no section claims, so a rejected save never leaves the user with a clean-looking rail.
One sentence for the persistent polite live region. The badges themselves are
plain indicators (role="img"): they are inserted together with their text, which
screen readers announce unreliably, and one edit can add three at once. A single
region that exists from the start and changes its text announces once, reliably.
Whether the current record has IS-A related items to display in the side panel
Returns either the default Metadata provider or the one specified in the Provider property, if it was specified
Returns either the default RunQuery provider or the one specified in the Provider property, if it was specified
Returns either the default RunView provider or the one specified in the Provider property, if it was specified
True when the current section search matches nothing in this layout.
Builds section info array from projected panels for the section manager drawer
Current section order from the form component
Left-nav rail stays up while searching even if only one group matches.
Whether to show the variant picker at all. Hidden when the entity has zero or one applicable variant — there's nothing to switch between.
Failures no registered section claims — kept visible on the spine total.
Unsaved-edit / invalid-field / warning counts for a rail group — summed over the
section keys it fronts, since one group (notably Details) fronts many panels.
Read live from each panel through FormSectionIndicatorCoordinator, so the
rail can never disagree with the fields' own dot and underline.
A callback method that is invoked immediately after Angular has completed initialization of all of the directive's content. It is invoked only once when the directive is instantiated.
Edit mode and Show Empty Fields both flip mj-panel-empty on a panel whose
fields are all blank (see MjFormFieldComponent.ShouldHideField), and
domPanelSnapshots() drops those panels from the rail. The panel itself
recomputes live, but the rail is only resolved on structural changes — so
without this the nav entry never comes back on switching to edit.
Watched here rather than in OnEditModeChange because the toolbar is not
the only writer: SaveRecord() and CancelEdit() call EndEditMode() on
the form component directly, bypassing that handler entirely.
A callback method that performs custom clean-up, invoked immediately before a directive, pipe, or service instance is destroyed.
Handles live attachment count updates from the attachments panel component.
Cancel: delegate to FormComponent if available, otherwise re-emit.
Delete, Favorite, History, Lists, ShowChanges: always re-emit for host app.
Edit mode change: delegate to FormComponent if available, otherwise re-emit.
Fired when the list-management dialog applies changes. Surfaces the outcome — especially silently-skipped duplicates and failures, which users otherwise misread as "everything was added".
Navigation events are always re-emitted for the host app to handle.
Refresh: delegate to FormComponent if available, otherwise re-emit.
Badge reload + related-grid fan-out happen on RecordRefreshed so
host.Refresh() (which calls RefreshRecord() directly) still notifies.
Handles a restore request from the record-changes panel.
The event payload now carries the FULL snapshot the user opted to apply
(the panel computes current-vs-snapshot diffs using the source change's
FullRecordJSON, and the user can deselect individual fields). Setting
the restore context before Save() causes the data provider to write the
resulting RecordChange row with Source='Restore', RestoredFromID,
and RestoreReason populated — building the auditable lineage chain.
Save: delegate to FormComponent if available, otherwise re-emit.
Handles live tag count updates from the tags panel component.
User picked an item from the variant menu. If the host installed a
handler via instance.OnVariantChanged, call it; otherwise emit the
VariantChange event for standalone consumers.
Compact subtitle: scope + status, e.g. "User · Active".
Top-level container that composes the toolbar, content slots, and sticky behavior.
Two usage modes:
With FormComponent (generated forms): Pass
[FormComponent]="this"and the container derives all state from the BaseFormComponent instance. Save/Cancel/Edit are handled internally by calling FormComponent methods.Standalone: Pass individual
Input
properties and handle all
Output
events.
Example: Generated form usage: