Member Junction
    Preparing search index...

    World-class Entity Explorer form component that provides an exploration-focused interface for understanding entities in the MemberJunction system.

    This component replaces the traditional edit-focused entity form with a rich exploration experience featuring:

    • Three-zone architecture (Header, Nav Rail, Main Canvas)
    • Seven exploration sections: Overview, Fields, Relationships, Permissions, Lineage, History, Settings
    • Semantic field grouping by purpose (Primary Keys, Foreign Keys, Encrypted, etc.)
    • Visual ERD integration for relationship exploration
    • Slide-in detail panels for contextual information

    Hierarchy

    • MJEntityFormComponent
      • MJEntityFormComponentExtended

    Implements

    • OnInit
    • OnDestroy
    Index

    Constructors

    Properties

    Accessors

    Methods

    BuildOrganicKeyViewParams BuildOrganicKeyViewParamsByNames BuildRelationshipViewParams BuildRelationshipViewParamsByEntityName BuildRelationshipViewParamsForJoinFields CancelEdit CheckUserPermission closeDetailPanel collapseAllFieldGroups collapseAllSections ConfigureToolbarItem DisableToolbarItem EnableToolbarItem EndEditMode expandAllFieldGroups expandAllSections FormatField formatFieldType formatJsonValue FormatValue getDefaultFormWidthMode getEntityName GetEntityRelationshipByRelatedEntityName getExpandedCount getFieldTypeIcon getFilteredFieldGroups getFilteredFieldsList getFirstClassSectionKeys getFormWidthMode GetISAFieldSource GetListsCanAddTo getMoreSectionKeys GetRecordDependencies getRelatedEntity getRelatedEntityName GetRelatedEntityTabDisplayName getRoleName getSection getSectionDisplayOrder getSectionOrder GetSectionPanelHeight GetSectionRowCount getTotalSectionCount getVisibleSectionCount GridEditMode handleHistoryDialog HandleTagsPanel hasCustomSectionOrder HideToolbarItem initSections InternalSaveRecord isFieldGroupExpanded IsFieldSelected IsInheritedField isJsonValue IsSectionExpanded MakeFavorite NavigateToEntity NavigateToEntityByID navigateToRelatedEntity NewRecordValues NewRecordValuesByEntityRelationship NewRecordValuesForJoinFields ngAfterViewInit ngOnDestroy ngOnInit OnAddRequested OnCustomToolbarButtonClick OnDeleteRequested onERDOpenRecord onERDStateChange OnFavoriteToggled onFieldGroupExpandedChange onFieldSearch onFilterChange OnFormChromeConfigChange OnFormNavigate OnHistoryRequested OnListManagementRequested OnRecordOpened openRelatedEntityFromField PendingRecordsDirty PopulatePendingRecords RaiseEvent RefreshRecord RegisterToolbarItem RemoveFavorite resetSectionOrder SaveRecord selectField selectRelationship setActiveSection setChromeMembership setErdDepth SetFavoriteStatus setFormWidthMode SetSectionExpanded setSectionOrder SetSectionPanelHeight SetSectionRowCount SetToolbarItemOrder ShowChanges ShowDependencies ShowToolbarItem sortFieldList splitterLayoutChange StartEditMode toggleFieldGroup toggleFormWidthMode toggleRelationshipView toggleSection UnregisterToolbarItem Validate ValidatePendingRecords Wait

    Constructors

    Properties

    activeSection: ExplorerSection = 'overview'

    Current active section in the explorer

    allEntities: EntityInfo[] = []

    All entities for relationship lookups

    allEntityFields: EntityFieldInfo[] = []

    All entity fields (flattened from all entities) for ERD details panel

    AvailableParentEntities: EntityInfo[] = []

    All entities available as potential IS-A parents (excluding self and descendants), sorted by name. Precomputed by recomputeIsaEntityLists whenever entity changes — previously a getter that filtered/sorted md.Entities (hundreds of rows) with per-item UUIDsEqual on every CD cycle while bound inside a template @for.

    BottomAreaSize: number

    Size of the bottom area as a percentage (0-100) for angular-split. Used by CodeGen-generated templates with as-split.

    cdr: ChangeDetectorRef
    childEntityCounts: ChildEntityCount[] = []

    Child entity record counts for the IS-A parent type summary

    collapsiblePanels: QueryList<MjCollapsiblePanelComponent>
    Config: EntityFormConfig | null

    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).

    CurrentVariantID: string | null

    ID of the currently-rendered variant (null when no override is active and the form is the CodeGen /

    default).

    detailPanelOpen: boolean = false

    Whether detail panel is open

    EditMode: boolean
    elementRef: ElementRef<any>
    entity: EntityInfo | null = null

    Runtime EntityInfo metadata (populated from record.ID)

    erdDepth: number = 1

    ERD depth level (1-5)

    expandedFieldGroups: Set<string> = ...

    Set of expanded field group IDs

    explorerError: string | null = null

    Error message if loading fails

    FavoriteInitDone: boolean
    fieldGroups: FieldGroup[] = []

    Semantically grouped fields

    fieldListSortColumn: string = 'Sequence'

    Field list sort configuration

    fieldListSortDirection: "asc" | "desc" = 'asc'
    fieldSearchTerm: string = ''

    Field search term for filtering

    fieldViewMode: "grouped" | "list" = 'grouped'

    Field view mode: grouped by category or flat list

    formStateService: FormStateService
    groupedIncomingRelationships: GroupedIncomingRelationship[] = []

    Grouped incoming relationships by source entity

    groupedOutgoingRelationships: GroupedOutgoingRelationship[] = []

    Grouped outgoing relationships by target entity

    incomingRelationships: EntityRelationshipInfo[] = []

    Incoming relationships (other entities reference this one)

    isaFieldGroups: ISAFieldGroup[] = []

    IS-A field groups organized by source entity

    isaFieldInspectorExpanded: boolean = true

    Whether the IS-A field inspector panel is expanded

    isExplorerLoading: boolean = true

    Loading state

    isHistoryDialogOpen: boolean
    IsRefreshing: boolean
    isRowCountLoading: boolean = false

    Whether the row count is loading

    IsTagsPanelOpen: boolean
    Navigate: EventEmitter<FormNavigationEvent>

    Emitted when navigation is requested (record link, external link, email, new record, etc.)

    navItems: NavItem[] = ...

    Navigation items for the rail - world-class minimalist icons

    Notification: EventEmitter<FormNotificationEvent>

    Emitted when a user-facing notification should be shown

    OnVariantChanged: (variantID: string | null) => void

    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.

    organicKeysIncoming: OrganicKeyIncoming[] = []

    Incoming organic keys (other entities targeting THIS entity)

    organicKeysOutgoing: OrganicKeyOutgoing[] = []

    Outgoing organic keys (defined on THIS entity)

    outgoingRelationships: EntityRelationshipInfo[] = []

    Outgoing relationships (this entity references others)

    Provider: IMetadataProvider | null

    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.

    The Entity record being displayed

    RecordDeleted: EventEmitter<RecordDeletedEvent>

    Emitted after a record is deleted successfully

    RecordDeleteFailed: EventEmitter<RecordDeleteFailedEvent>

    Emitted when a record delete fails

    RecordReady: EventEmitter<BaseEntity<unknown>>

    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.

    RecordRefreshed: EventEmitter<RecordRefreshedEvent>

    Emitted after a record is refreshed from the database successfully

    RecordSaved: EventEmitter<RecordSavedEvent>

    Emitted after a record is saved successfully

    RecordSaveFailed: EventEmitter<RecordSaveFailedEvent>

    Emitted when a record save fails

    relationshipViewMode: "list" | "diagram" = 'diagram'

    Relationship view mode toggle

    searchFilter: string
    sections: BaseFormSectionInfo<any>[]
    selectedField: EntityFieldInfo | null = null

    Currently selected field for detail panel

    selectedRelationship: EntityRelationshipInfo | null = null

    Currently selected relationship for detail panel

    showCreateDialog: boolean
    showDeleteDialog: boolean
    showEmptyFields: boolean
    SiblingEntities: EntityInfo[] = []

    Sibling entities that share the same IS-A parent type. Precomputed by recomputeIsaEntityLists when entity changes — previously a per-CD getter filtering ParentEntityInfo.ChildEntities with UUIDsEqual.

    stats: EntityStats = ...

    Computed statistics for the entity

    TagCount: number
    TopAreaHeight: string

    Height of the top area when a splitter layout is used. Referenced by CodeGen-generated templates for entities with "top area" sections.

    TopAreaSize: number

    Size of the top area as a percentage (0-100) for angular-split. Used by CodeGen-generated templates with as-split.

    ValidationFailed: EventEmitter<ValidationFailedEvent>

    Emitted when validation fails before save

    Variants: {
        ID: string;
        Label: string;
        Scope: "User" | "Role" | "Global";
        Status: "Active" | "Inactive" | "Pending";
    }[]

    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.

    "ɵdir": unknown
    "ɵfac": ɵɵFactoryDeclaration<BaseFormComponent, never>

    Accessors

    • get EntityInfo(): EntityInfo | undefined

      Returns EntityInfo | undefined

    • get formContext(): FormContext

      Returns FormContext

    • get HasAdditionalUnsavedChanges(): boolean

      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.

      Returns boolean

    • get HasOrganicKeys(): boolean

      Whether the current entity has any active organic keys with related entities configured.

      Returns boolean

    • get HasRelatedEntities(): boolean

      Returns boolean

    • get IsFavorite(): boolean

      Returns boolean

    • get OrganicKeys(): EntityOrganicKeyInfo[]

      Returns all active organic keys for the current entity, or an empty array if none.

      Returns EntityOrganicKeyInfo[]

    • get PendingRecords(): PendingRecordItem[]

      Returns PendingRecordItem[]

    • get ProviderToUse(): IMetadataProvider

      Returns either the default Metadata provider or the one specified in the Provider property, if it was specified

      Returns IMetadataProvider

    • get RegisteredToolbarItems(): FormToolbarItemConfig[]

      Returns all dynamically registered toolbar items.

      Returns FormToolbarItemConfig[]

    • get RunQueryToUse(): IRunQueryProvider

      Returns either the default RunQuery provider or the one specified in the Provider property, if it was specified

      Returns IRunQueryProvider

    • get RunViewToUse(): IRunViewProvider

      Returns either the default RunView provider or the one specified in the Provider property, if it was specified

      Returns IRunViewProvider

    • get ToolbarItemOverrides(): ReadonlyMap<string, Partial<FormToolbarItemConfig>>

      Returns the map of toolbar item overrides.

      Returns ReadonlyMap<string, Partial<FormToolbarItemConfig>>

    • get UserCanCreate(): boolean

      Returns boolean

    • get UserCanDelete(): boolean

      Returns boolean

    • get UserCanEdit(): boolean

      Returns boolean

    • get UserCanRead(): boolean

      Returns boolean

    Methods

    • Convenience method to build organic key view params by organic key name and related entity name.

      Parameters

      • organicKeyName: string
      • relatedEntityName: string

      Returns RunViewParams

    • Parameters

      • relatedEntityName: string
      • OptionalrelatedEntityJoinField: string

      Returns RunViewParams

    • One grid over several FKs to the same related entity (Bill-To OR Ship-To).

      Parameters

      • relatedEntityName: string
      • joinFields: readonly string[]

      Returns RunViewParams

    • Returns void

    • Parameters

      Returns boolean

    • Returns void

    • 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.

      Parameters

      Returns void

    • Dynamically disables a toolbar item by key, with an optional reason string for the tooltip.

      Parameters

      Returns void

    • Dynamically enables a toolbar item by key.

      Parameters

      Returns void

    • Returns void

    • Returns void

    • Parameters

      • entityFieldInfo: EntityFieldInfo
      • value: any
      • Optionaldecimals: number
      • Optionalcurrency: string

      Returns string

    • Parameters

      • fieldName: string
      • Optionaldecimals: number
      • Optionalcurrency: string

      Returns string

    • 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.

      Returns "centered" | "full-width"

    • Returns string

    • Parameters

      • relatedEntityName: string
      • OptionalrelatedEntityJoinField: string

      Returns EntityRelationshipInfo | undefined

    • Returns number

    • Returns string[]

    • Returns "centered" | "full-width"

    • Returns Promise<MJListEntity[]>

    • Returns string[]

    • Returns Promise<RecordDependency[]>

    • Parameters

      • relatedEntityName: string

      Returns string

    • Parameters

      • sectionKey: string

      Returns BaseFormSectionInfo<any> | undefined

    • Parameters

      • sectionKey: string

      Returns number

    • Returns string[]

    • Parameters

      • sectionKey: string

      Returns number | undefined

    • Parameters

      • sectionKey: string

      Returns number | undefined

    • Returns number

    • Returns number

    • Returns "None" | "Save" | "Queue"

    • Returns void

    • Returns void

    • Returns boolean

    • Dynamically hides a toolbar item by key.

      Parameters

      Returns void

    • Parameters

      • sections: (
            | BaseFormSectionInfo<any>
            | {
                isExpanded: boolean;
                metadata?: unknown;
                rowCount?: number;
                sectionKey: string;
                sectionName: string;
            }
        )[]

      Returns void

    • Returns Promise<boolean>

    • Parameters

      • sectionKey: string
      • OptionaldefaultExpanded: boolean

      Returns boolean

    • Returns Promise<void>

    • 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.

      Parameters

      • relatedEntityName: string
      • OptionalrelatedEntityJoinField: string

      Returns Record<string, unknown>

    • Parameters

      Returns Record<string, unknown>

    • Default values for a new related record, setting every listed join field to this record's key. Pair with BuildRelationshipViewParamsForJoinFields.

      Parameters

      • relatedEntityName: string
      • joinFields: readonly string[]

      Returns Record<string, unknown>

    • 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.

      Returns void

    • Hook invoked when a custom or dynamic toolbar item is clicked. Subclasses can override this method to handle custom button clicks.

      Returns void

    • Handles delete requests from the form container. Emits RecordDeleted on success, RecordDeleteFailed on failure. Generated form templates bind this as: (DeleteRequested)="OnDeleteRequested()"

      Returns Promise<void>

    • Handles favorite toggle from the form container. Generated form templates bind this as: (FavoriteToggled)="OnFavoriteToggled()"

      Returns Promise<void>

    • Applies the expanded/collapsed state emitted by an mj-accordion-panel for a field group. Sets (not flips) the value so it stays in sync with the panel, and marks for check (OnPush change detection).

      Parameters

      • groupId: string
      • expanded: boolean

      Returns void

    • Parameters

      • searchTerm: string

      Returns void

    • Handles navigation events from the form container and related entity grids. Relays the event upward via the Navigate

      Parameters

      Returns void

      for the host application to handle. Generated form templates bind this as: (Navigate)="OnFormNavigate($event)"

    • Handles history view requests from the form container. Generated form templates bind this as: (HistoryRequested)="OnHistoryRequested()"

      Returns void

    • Handles list management requests from the form container. Generated form templates bind this as: (ListManagementRequested)="OnListManagementRequested()"

      Returns void

    • Returns boolean

    • Returns void

    • Re-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.

      Returns Promise<boolean>

      true if the record was reloaded from the database.

    • Registers a dynamic toolbar action item / button. Can be called during ngOnInit or at runtime.

      Parameters

      Returns void

    • Returns Promise<void>

    • Returns void

    • Parameters

      • StopEditModeAfterSave: boolean

      Returns Promise<boolean>

    • Parameters

      • moreSectionKeys: string[]
      • firstClassSectionKeys: string[]

      Returns void

    • Parameters

      • isFavorite: boolean

      Returns Promise<void>

    • Parameters

      • widthMode: "centered" | "full-width"

      Returns void

    • Parameters

      • sectionKey: string
      • isExpanded: boolean

      Returns void

    • Parameters

      • sectionOrder: string[]

      Returns void

    • Parameters

      • sectionKey: string
      • height: number

      Returns void

    • Parameters

      • sectionKey: string
      • rowCount: number

      Returns void

    • Sets the numeric display order for a toolbar item (lower numbers appear earlier).

      Parameters

      Returns void

    • Returns void

    • Returns Promise<void>

    • Dynamically shows a toolbar item by key.

      Parameters

      Returns void

    • 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.

      Returns void

    • Returns void

    • Returns void

    • Parameters

      • sectionKey: string

      Returns void

    • Unregisters a previously registered dynamic toolbar item by key.

      Parameters

      • key: string

      Returns void

    • Returns ValidationResult

    • Returns ValidationResult[]

    • Parameters

      • duration: number

      Returns Promise<void>