Member Junction
    Preparing search index...

    Abstract base for every dynamically-injectable form panel.

    Subclasses are standalone Angular components decorated with @RegisterClass(BaseFormPanel, { metadata: { entity, slot, sortKey? } }). At runtime, <mj-form-panel-slot> discovers matching registrations via ClassFactory.GetAllRegistrationsByMetadata, instantiates each via ViewContainerRef.createComponent, and wires Record + FormComponent + FormContext into the inputs.

    Lifecycle hooks: standard Angular ngOnInit / ngOnDestroy work as usual. Record is guaranteed to be set before the first change-detection pass.

    Optional Validate() returns a validation result, or a Promise of one. BaseFormComponent.SaveRecord() awaits every mounted panel's result and refuses the save when one fails. Panels that don't validate anything beyond what the record itself does can leave this method off.

    Hierarchy (View Summary)

    Implements

    • OnInit
    Index

    Constructors

    Properties

    FormComponent: BaseFormComponent

    The host form component (use for EditMode, dirty notifications, etc). Set by the slot host.

    FormContext?: FormContext

    Optional form context — same shape the collapsible-panel chrome expects. Set by the slot host.

    HostDisplay: "contents"

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

    LoadError: string | null = null

    Set when the query fails, so the card shows the failure instead of an empty list.

    Record: MJUserEntity

    The entity record being edited. Set by the slot host before view init.

    RegistrationMetadata?: FormPanelRegistrationMetadata

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

    Roles: UserRoleRow[] = []
    SlotElement: HTMLElement | null

    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.

    "ɵdir": unknown
    "ɵfac": ɵɵFactoryDeclaration<BaseFormPanel<any>, never>

    Accessors

    • get DisplayOrder(): number

      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.

      Returns number

    • get EditMode(): boolean

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

      Returns boolean

    Methods

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

      Parameters

      Returns void

    • The panel's validity as already known, with no awaiting and no work.

      Synchronous callers (BaseFormComponent.Validate()) use this; it reports valid unless the panel has cached a failing result from an earlier validation. A panel whose Validate() is asynchronous should override this to return its last reported state so synchronous callers are not simply blind to it.

      Returns ValidationResult

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

      Returns void

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

      Parameters

      Returns void

    • Unregisters a previously registered dynamic toolbar item by key.

      Parameters

      • key: string

      Returns void

    • Override to add per-panel validation that should block the parent form's SaveRecord(). Return { Success: true, Errors: [] } when valid, or include ValidationErrorInfo entries to surface field-level errors. The default implementation reports valid (panels that don't need extra validation can leave this method off).

      May return a Promise: a panel that validates against the server has no synchronous answer. BaseFormComponent.ValidateAsync() awaits it, which is what SaveRecord() calls.

      Returns ValidationResult | Promise<ValidationResult>