Size of the bottom area as a percentage (0-100) for angular-split. Used by CodeGen-generated templates with as-split.
The Component row ID resolved for this (entity, user, roles) tuple. Set
by SingleRecordComponent.LoadForm after the resolver returns an
override.
Loaded ComponentSpec, parsed from the Component row's Specification JSON.
Two ways to populate this:
ComponentID (the standard path): set the input, ngOnInit
fetches the row from MJ: Components and assigns the parsed spec.componentSpec directly. In that case ComponentID should be left
null and the DB fetch is skipped.Per-instance presentation config (toolbar visibility, related-entity
sections, collapsibility, width, in-form navigation). Set by the form host
(MjEntityFormHostComponent) or any consumer that instantiates the form
directly. Read back by MjRecordFormContainerComponent and the collapsible
panels through the FormComponent reference, so it takes effect WITHOUT
regenerating the CodeGen-produced template. Null means "use the container's
own defaults" (the classic full-page tab behavior).
ID of the currently-rendered variant (null when no override is active and the form is the CodeGen /
ProtectedelementFormHostProps passed to the React component. Recomputed when record or mode changes.
ProtectedformEmitted when navigation is requested (record link, external link, email, new record, etc.)
Emitted when a user-facing notification should be shown
Hook called when the user picks a different variant from the picker.
Default is a no-op; the Explorer-level single-record component replaces
this on the form instance to wire FormResolverService.SetSelectedVariant
and reload the record. Kept as a method (not an EventEmitter) so the host
doesn't need to subscribe — assignment is enough.
When true, render the React component without the
<mj-record-form-container> wrapper — i.e. no toolbar (no Save /
Cancel / Edit / Delete / History / Tags / Lists).
Used by the Form Builder cockpit's Preview tab where the toolbar's actions don't apply (Save would save the record, but the cockpit's own Save button saves the spec; History/Tags assume a real persistent record, but the preview record can be a synthetic NewRecord). Keeping just the form body produces a clean "this is what the form looks like" view.
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.
OptionalreactReference to the mounted React component. Used by the SaveRecord /
CancelEdit overrides below to invoke the component's registered
RequestSave / RequestCancel methods when the host toolbar fires
Save/Cancel — so the single user-visible Save lives on the toolbar
(consistent with every other entity form in MJ) and not duplicated
inside the form body.
Emitted after a record is deleted successfully
Emitted when a record delete fails
Emitted once after ngOnInit completes and the record is fully initialized (favorites loaded, form state initialized). This is the safe point for the container to start loading badge counts and other record-dependent data.
Emitted after a record is saved successfully
Emitted when a record save fails
ProtectedsectionsHeight of the top area when a splitter layout is used. Referenced by CodeGen-generated templates for entities with "top area" sections.
Size of the top area as a percentage (0-100) for angular-split. Used by CodeGen-generated templates with as-split.
Emitted when validation fails before save
Variants applicable to the current (entity, user) tuple, supplied by the Explorer-level form resolver. When more than one entry is present, the record-form-container shows a picker that lets the user switch between variants. Empty / single-entry arrays hide the picker.
The container reads this via its EffectiveVariants accessor — generated
form templates do NOT need to bind it explicitly.
StaticɵdirStaticɵfacReturns all organic key related entities across all organic keys, flattened and sorted.
Whether the current entity has any active organic keys with related entities configured.
Loaded-spec error (component row missing, JSON parse failure,
React-runtime bootstrap failure, etc.). Setter auto-emits
LoadErrorChanged so host surfaces (e.g. Form Builder cockpit
Preview tab) can show their own error state — retrospective fix #10.
Returns all active organic keys for the current entity, or an empty array if none.
ProtectedPendingReturns 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 RunReport 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
Builds RunViewParams for a specific organic key related entity.
Convenience method to build organic key view params by organic key name and related entity name.
OptionalrelatedEntityJoinField: stringToolbar Cancel override. Asks the React component to discard
its draft via RequestCancel, then flips out of edit mode the
same way the base implementation would. The React component is
expected to (a) clear its local draft state and (b) emit
EditModeChangeRequested({ requestedMode: 'view' }) — though we
call EndEditMode here directly anyway, so even a no-op handler
leaves the form in a coherent state.
Component-level default width mode, used when the user has NOT
explicitly chosen a width for this entity yet (first visit, nothing
persisted in User Settings). Subclasses can override this — for
example, custom forms with full-bleed layouts should return
'full-width' here and the container will respect it on first open.
Once the user toggles the width via the toolbar, their choice
persists via setFormWidthMode() and takes priority over this
default on subsequent opens.
OptionalrelatedEntityJoinField: stringProtectedgetProtectedinitProtectedInternalOptionaldefaultExpanded: booleanA callback method that is invoked immediately after Angular has completed initialization of a component's view. It is invoked only once when the view is instantiated.
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.
Handles delete requests from the form container. Emits RecordDeleted on success, RecordDeleteFailed on failure. Generated form templates bind this as: (DeleteRequested)="OnDeleteRequested()"
Handles favorite toggle from the form container. Generated form templates bind this as: (FavoriteToggled)="OnFavoriteToggled()"
Handles navigation events from the form container and related entity grids. Relays the event upward via the Navigate
Handles history view requests from the form container. Generated form templates bind this as: (HistoryRequested)="OnHistoryRequested()"
Handles list management requests from the form container. Generated form templates bind this as: (ListManagementRequested)="OnListManagementRequested()"
Called when the form-role component drills into a related record via
callbacks.OpenEntityRecord(...). Relays it upward as a Navigate event
(the same path normal FK links use) so the host opens the target record.
Called by the React component via mj-react-component's componentEvent
@Output. Maps the form-role event names to BaseEntity operations.
ProtectedPendingProtectedPopulateProtectedRaiseToolbar Save override. Routes the click through the React
component's registered RequestSave method so the React layer can
(a) run its own validation, (b) flush its draft state, (c) emit
BeforeSave with the dirty-field diff — exactly the flow the
in-form Save button would trigger. The wrapper then awaits the
BeforeSave handler via pendingSaveResolver, gets a real
success/failure boolean, and honors StopEditModeAfterSave.
Falls back to the base implementation for components that haven't
registered RequestSave — preserves correctness for forms that
keep their own in-form Save button (older sample, hand-authored
forms that pre-date this contract).
Called when the splitter layout changes (for entities with "top area" sections). No-op in the generic version; override in host application if splitter resizing is needed.
Propagate Angular-toolbar-driven mode changes into the React component's
FormHostProps.mode. Without these overrides, clicking Edit on the
<mj-record-form-container> toolbar flips this.EditMode but the React
side still sees mode: 'view'.
ProtectedValidate
Wraps a Component (the IC kind — declared
componentRole: 'form') so it can stand in for an Angular form on any entity.Layering invariant: the React component never touches BaseEntity. This wrapper owns the entity lifecycle (
record.Save,record.Delete, mode transitions). The React component sees only the snapshot in FormHostProps and communicates back viaBeforeSave/BeforeDelete/EditModeChangeRequestedevents plus its dirty-field diff.Instantiated by
SingleRecordComponent.LoadFormwhen the resolver finds anEntityFormOverridematching the user's scope. Behaves exactly like the generated Angular form from the host's perspective: samerecordsetter, sameEditModetoggle, same outputs.