@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 aBaseEntityand an import ofBaseFormsModule.
What’s in here
Section titled “What’s in here”| Area | Key exports | Notes |
|---|---|---|
| Form base | BaseFormComponent, BaseFormSectionComponent, MjRecordFormContainerComponent, MjCollapsiblePanelComponent, MjFormFieldComponent | The form itself + its toolbar/section container. Generated forms extend BaseFormComponent. |
| Form host | MjEntityFormHostComponent (<mj-entity-form-host>) | Presentation-agnostic: resolve → load → create → bind → re-emit → teardown. Supports full forms and single sections (SectionName). |
| Overlay shells | MjFormDialogComponent, MjFormSlideInComponent, MjFormWindowComponent (standalone) | Declarative dialog / slide-in / floating-window around the host. |
| Imperative API | MJFormPresenterService.Open(...) → MJFormRef | One call to open any form on any surface. |
| Per-instance config | EntityFormConfig + TAB_/DIALOG_/SLIDEIN_FORM_CONFIG | Toolbar / related sections / collapsibility / width / record-links. Applied via the form reference — no regeneration. |
| Form resolution | FormResolverService | Picks generated / custom / interactive-override form + variants (cached via InteractiveFormsEngine). |
| Form extension | BaseFormPanel + <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 chrome | ResolveFormChrome, BaseFormPolicy, MJ: Form Chrome Rules | L0–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 defaults | BaseFormComponent.NewRecordValues / NewRecordValuesForJoinFields | Related grids copy every join field onto the child. Explorer persists them as /record/:entity/new?NewRecordValues=.... |
Quick start
Section titled “Quick start”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>Related docs
Section titled “Related docs”- Architecture (read first): /guides/FORMS_ARCHITECTURE_GUIDE.md
- Inject custom sections into a form: PANELS.md
- Form chrome (rail / More / inclusion): Forms Architecture §7d
- Custom-form override + toolbar pattern: packages/Angular/CLAUDE.md