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> + <mj-form-contributions>Inject custom sections; claim a related-entity grid; fill in unbaked DisplayInForm relationships. See PANELS.md and /plans/form-contributions.md.
Form chromeResolveFormChrome, BaseFormPolicy, MJ: Form Chrome RulesL0–L4 stack: inclusion, Auto ranker, install overlay, user order. Policy is cosmetics only. Left-nav related grids fill leftover column height (display: contents on slot hosts; no accordion pixel pin). SetSectionRowCount upserts so contribution badges appear. Section search matches title/MatchesSearch, not IsVisible. See Forms Architecture §7d.
New-record defaultsBaseFormComponent.NewRecordValues / NewRecordValuesForJoinFieldsRelated grids copy every join field onto the child. Explorer persists them as /record/:entity/new?NewRecordValues=....
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>