Layout the container resolved for this form. Set by <mj-record-form-container>; read by panel hosts.
Last composition snapshot the container published — what is actually on this form: sections, related grids, contributions and slots. Consumers: agent context (so Skip can target a real slot and section key) and Form Studio.
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 /
Emitted whenever edit mode starts (true) or ends (false). The Explorer
shell uses the true edge to PROMOTE a records preview tab — pin it — the
moment the user starts editing (VS Code's promote-on-modify), so a record
being edited is neither replaceable by the next plain open nor italic.
Fires on every call, not only on transitions: a new record's ngOnInit
re-asserts edit mode and the shell's pin is idempotent.
ProtectedelementProtectedformEmitted 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.
ProtectedplacementThe placement dialog's unsaved panel, when this form is the dialog's preview.
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.
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 refreshed from the database successfully
Emitted after a record is saved successfully
Emitted when a record save fails
Fires when a section's known row count changes — from the container's batched
count prefetch, a related grid load (including a manual grid refresh), or a
contribution reporting its own count. The container re-resolves empty-section
chrome (whenEmpty) when a count crosses zero.
ProtectedsectionsReadonlyToolbarHeight 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.
Use AvailableModels.
Use AvailablePromptTypes.
Use AvailableVendors.
Use CanExecute.
Checks if the AI prompt can be executed
Use DraggedIndex.
The entry-time duplicate check. While a person enters a new record it asks the server, after
each pause in editing, whether the values duplicate existing records, and holds the ones to
flag. It only flags: saving is never blocked and nothing is merged. mj-record-form-container
shows the notice.
Use ExecutionHistory.
Context handed to every field, panel and slot in the form.
Returns the SAME object while nothing in it has changed. Templates bind this getter in dozens of places per form, and Angular evaluates each binding on every change-detection pass — so allocating a fresh object per access handed every child a new reference each pass, defeating input-identity checks and cascading re-renders through the whole form. Building the candidate is cheap (the expensive part, hidden section keys, is memoized); the identity comparison below is what stops the cascade.
Unsaved changes a form holds OUTSIDE its record's fields and pending records.
A form whose sections own editors — a flow canvas, a designer, a grid — accumulates edits that
neither record.Dirty nor PendingRecordsDirty() can see, because nothing on the entity
changed. Without this the toolbar reports "no changes" while the user is looking at their own
work, and the navigate-away guard lets them lose it silently.
Default false, so no existing form changes behaviour. Override to consult whatever holds the
extra state.
Whether the current entity has any active organic keys with related entities configured.
Use HasUnsavedChanges.
Use HistorySortDirection.
Use HistorySortField.
Use HistorySortField.
Use IsLoadingHistory.
Use IsLoadingModels.
Use IsLoadingPromptTypes.
Use IsLoadingTemplate.
Use ModelVendorsMap.
Use ModelVendorsMap.
Returns all active organic keys for the current entity, or an empty array if none.
Whether this form renders its own body in full.
A form that returns true accepts nothing the container would otherwise compose into
it: no BaseFormPanel mounts, no contribution claims a section, and no stock grid is
filled in for a DisplayInForm relationship. The composition snapshot reports none of
them either. Container chrome that belongs to the record rather than to the body —
the toolbar, Save/Delete, History, Record Changes — is unaffected.
The fill-in reads an unbaked relationship as stale CodeGen and supplies the missing grid. A form that replaced the body bakes nothing by design, so without this flag every relationship reads as missing and the container composes a form the author never asked for.
ProtectedPendingUse PromptModels.
Returns either the default Metadata provider or the one specified in the Provider property, if it was specified
Returns all dynamically registered toolbar items.
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
Whether the possible-duplicate notice shows: a new record with flagged candidates not dismissed.
Use ShowOutputExample.
Checks if OutputExample field should be visible
Checks if ParallelConfigParam field should be visible
Use ShowParallelCount.
Checks if ParallelCount field should be visible
Use ShowTestHarness.
Use Template.
Use TemplateContent.
Use TemplateEditor.
Use TemplateEditorConfig.
Use TemplateParams.
Use ToolbarConfig.
Returns the map of toolbar item overrides.
Check if user can create AI Prompt Models
Check if user can create Template Contents
Check if user can create Templates
Check if user can delete AI Prompt Models
Check if user can delete Templates
Check if user can read Templates
Check if user can update AI Prompt Models
Check if user can update Template Contents
Check if user can update Templates
Use AddNewModel.
Adds a new model to the prompt (deferred until save)
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: stringOne grid over several FKs to the same related entity (Bill-To OR Ship-To).
Override CancelEdit to restore original state
Use ChangeHistorySort.
Change sort field and direction for execution history
ProtectedCheckAsks the server whether the values being entered duplicate existing records. A form on a
provider that is not a GraphQLDataProvider has no server to ask, so the check reports
NotConfigured and stops for the entity. Override to send the check elsewhere.
Use ClearPermissionCache.
Clears the permission cache. Call this when user context changes or permissions are updated.
Configures overrides for any toolbar item (standard built-in items like 'edit', 'delete', 'favorite', 'history', etc., or custom items). Allows dynamically changing visibility, disabled state, tooltips, order, icon, etc.
Use CreateNewTemplate.
Creates a new template for this AI prompt (deferred until save)
Dynamically disables a toolbar item by key, with an optional reason string for the tooltip.
Optionalreason: stringThe person dismissed the possible-duplicate notice.
Use ExecuteAIPrompt.
Opens the AI prompt execution dialog
Format cost for display
Format duration for display
Optionaldecimals: numberOptionalcurrency: stringFormat tokens for display
Optionaldecimals: numberOptionalcurrency: stringGets the display name for a configuration ID
Custom-layout AI Prompt form looks best full-width on first open.
OptionalrelatedEntityJoinField: stringGet status color for execution
Get status icon for execution
Gets the display name for a model ID
Gets a stable identifier for a model (for form tracking)
Gets the status for a model-vendor combination
Use GetOutputTypeDisplay.
Gets the display text for output type
Gets the display text for parallelization mode
Gets the color for a template parameter type
Gets a friendly description of the parameter type
Gets the icon for a template parameter type
Gets the display name for a prompt ID from the tree data
Gets the display name for a prompt type ID
ProtectedgetWhere this key sits in the section order, or null when it is not in it at all.
getSectionDisplayOrder cannot answer that: it returns the section count for an unknown key, which is indistinguishable from a real last position. A contribution panel is not in the form's declared sections, so a caller has to be able to tell "the user placed this here" from "nobody has said where this goes".
The row count shown as a section's badge. undefined until known, and always
undefined for a section whose badge is turned off (showCount: false) — use
PeekSectionRowCount for the underlying number.
Use GetStatusBadgeColor.
Gets status badge color
Use GetValidationColor.
Gets the color for validation behavior display
Gets the display name for a vendor ID
Gets vendors for a specific model from cache or loads them
Gets the color for vendor status display
Handles template content record deletion This method should be called by the template editor to properly manage deletions
Handles template content record creation/modification This method should be called by the template editor to properly manage saves
ProtectedinitProtectedInternalOverride InternalSaveRecord to handle template dependencies and related entity changes Templates must be saved before AI Prompts to avoid foreign key constraint errors
OptionaldefaultExpanded: booleanUse LinkExistingTemplate.
Opens a dialog to link an existing template
Loads available AI configurations for selection
Use LoadAvailableModels.
Loads available AI models for selection
Loads available AI prompt types for selection
Use LoadAvailableVendors.
Loads available AI vendors for selection
Use LoadExecutionHistory.
Load execution history for this prompt
Use LoadPromptModels.
Loads prompt models for this AI prompt
Loads the result selector tree data (categories and prompts)
Loads the template associated with this AI prompt
Use LoadVendorsForModel.
Loads vendors available for a specific model
Moves a model down in the list by swapping with the next item
Moves a model up in the list by swapping with the previous item
Navigate to a prompt run record
Default values for a new related-entity record so it links back here.
Pass relatedEntityJoinField when more than one relationship targets the
same entity (Bill-To vs Ship-To). When omitted and several matches exist,
every matching FK is set — same fields the related grid is filtering on.
OptionalrelatedEntityJoinField: stringDefault values for a new related record, setting every listed join field to this record's key. Pair with BuildRelationshipViewParamsForJoinFields.
A 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.
Handles configuration change for a prompt model
Hook invoked when a custom or dynamic toolbar item is clicked. Subclasses can override this method to handle custom button clicks.
Handles delete requests from the form container. Emits RecordDeleted on success, RecordDeleteFailed on failure. Generated form templates bind this as: (DeleteRequested)="OnDeleteRequested()"
Handles drag end event
Handles drag over event
Handles drag start event
Handles drop event
Handles favorite toggle from the form container. Generated form templates bind this as: (FavoriteToggled)="OnFavoriteToggled()"
A person edited a field on this form. For a new record this restarts the entry-time duplicate
check. mj-record-form-container calls it for every mj-form-field edit; a custom editor that
changes the record some other way can call it too.
A user who cannot read the entity (one who may only create its records) never starts a check: the server would refuse it, and a flagged record is one they could not open anyway.
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()"
Handles model selection change and loads vendors for that model
Handles result selector selection
Handles template content changes from the editor
Use OnTemplateIdChange.
Handles template ID changes in the form
Handles when test harness is closed
Opens a flagged candidate the way the form opens any record: a Navigate event the host
handles, never a router call. It asks for a new tab, so the record being entered is kept.
Opens the current template in a new window
Use OpenTestHarness.
Opens the test harness
The last known row count for a section, regardless of whether its badge shows.
ProtectedPendingProtectedPopulateOverride PopulatePendingRecords to add AI prompt model changes
ProtectedRaiseRe-fetches the current record from the database, updating field values in-place and resetting dirty flags. No-op in edit mode or on an unsaved record. Related-entity grids are notified via the form container's FormRecordRefreshCoordinator after this emits RecordRefreshed.
true if the record was reloaded from the database.
Slot hosts register every mounted panel so validation can include panel-owned checks.
Registers a dynamic toolbar action item / button. Can be called during ngOnInit or at runtime.
Removes a model from the prompt (deferred until save)
Show or hide a section's row-count badge (metadata showCount). The count itself is still tracked.
Sets the numeric display order for a toolbar item (lower numbers appear earlier).
Checks if vendor dropdown should be shown (more than one vendor)
Use SortExecutionHistory.
Sort execution history based on current sort field and direction
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.
Override StartEditMode to capture original state for cancel functionality
Unregisters a previously registered dynamic toolbar item by key.
Record + pending-record validation, merged with whatever panel validity is already known.
Synchronous, and therefore blind to a panel validator that has not reported yet — any path that gates a save must use ValidateAsync. The signature stays synchronous because this is published API with external callers.
Validate, merged with every mounted panel's validator, awaited. This is what
SaveRecord() calls.
It starts from Validate(), so a subclass that overrides Validate() still gates the
save; the panels' last-known state is left out of that call, because their awaited
results replace it.
A panel's Validate() may be async — anything checking server state will be — and
reading such a result synchronously yields a Promise, which tests as "no opinion"
and lets an invalid record save with no error and no log.
ProtectedValidate
Size of the bottom area as a percentage (0-100) for angular-split. Used by CodeGen-generated templates with as-split.