Skip to content

@memberjunction/ng-base-forms

The foundation for rendering and editing MemberJunction entity records in Angular — and for presenting any entity form as a full-page tab, a modal dialog, a slide-in panel, or a floating window, from one set of forms with no per-surface code and no regeneration.

Start with the architecture guide: /guides/FORMS_ARCHITECTURE_GUIDE.md — the big picture, how generated/custom/interactive forms coexist, and how to use every surface. This README is a quick map of the package.

Using these as general-purpose database controls (outside a form)? See STANDALONE_USAGE.md<mj-form-field>, <mj-entity-form-host>, the overlay shells, <mj-explorer-entity-data-grid>, and <mj-collapsible-panel> are all data-bindable controls you can drop into any Angular component with just a BaseEntity and an import of BaseFormsModule.

AreaKey exportsNotes
Form baseBaseFormComponent, BaseFormSectionComponent, MjRecordFormContainerComponent, MjCollapsiblePanelComponent, MjFormFieldComponentThe form itself + its toolbar/section container. Generated forms extend BaseFormComponent.
Form hostMjEntityFormHostComponent (<mj-entity-form-host>)Presentation-agnostic: resolve → load → create → bind → re-emit → teardown. Supports full forms and single sections (SectionName).
Overlay shellsMjFormDialogComponent, MjFormSlideInComponent, MjFormWindowComponent (standalone)Declarative dialog / slide-in / floating-window around the host.
Imperative APIMJFormPresenterService.Open(...)MJFormRefOne call to open any form on any surface.
Per-instance configEntityFormConfig + TAB_/DIALOG_/SLIDEIN_FORM_CONFIGToolbar / related sections / collapsibility / width / record-links. Applied via the form reference — no regeneration.
Form resolutionFormResolverServicePicks generated / custom / interactive-override form + variants (cached via InteractiveFormsEngine).
Form extensionBaseFormPanel + <mj-form-panel-slot>Inject custom sections into a generated form. See PANELS.md.
import { MJFormPresenterService, DIALOG_FORM_CONFIG } from '@memberjunction/ng-base-forms';
const ref = this.forms.Open({
EntityName: 'MJ: AI Agents',
RecordId: id, // omit → new record
Presentation: 'slide-in', // 'dialog' | 'slide-in' | 'window'
Config: { ShowRelatedEntities: false },
});
const saved = await ref.AfterSaved(); // BaseEntity | null
<mj-form-dialog [EntityName]="'Users'" [RecordID]="id"
[(Visible)]="show" (Saved)="onSaved($event)"></mj-form-dialog>