@memberjunction/ng-base-forms 5.36.0 → 5.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/base-form-component.d.ts +28 -0
- package/dist/lib/base-form-component.d.ts.map +1 -1
- package/dist/lib/base-form-component.js +45 -1
- package/dist/lib/base-form-component.js.map +1 -1
- package/dist/lib/container/record-form-container.component.d.ts +63 -1
- package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
- package/dist/lib/container/record-form-container.component.js +134 -42
- package/dist/lib/container/record-form-container.component.js.map +1 -1
- package/dist/lib/interactive-form/interactive-form.component.d.ts +181 -0
- package/dist/lib/interactive-form/interactive-form.component.d.ts.map +1 -0
- package/dist/lib/interactive-form/interactive-form.component.js +560 -0
- package/dist/lib/interactive-form/interactive-form.component.js.map +1 -0
- package/dist/lib/panel-slot/base-form-panel.d.ts +97 -0
- package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -0
- package/dist/lib/panel-slot/base-form-panel.js +64 -0
- package/dist/lib/panel-slot/base-form-panel.js.map +1 -0
- package/dist/lib/panel-slot/form-panel-slot.component.d.ts +78 -0
- package/dist/lib/panel-slot/form-panel-slot.component.d.ts.map +1 -0
- package/dist/lib/panel-slot/form-panel-slot.component.js +227 -0
- package/dist/lib/panel-slot/form-panel-slot.component.js.map +1 -0
- package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts +57 -0
- package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts.map +1 -0
- package/dist/lib/panel-slot/form-slot-coordinator.service.js +104 -0
- package/dist/lib/panel-slot/form-slot-coordinator.service.js.map +1 -0
- package/dist/lib/toolbar/form-toolbar.component.d.ts +56 -1
- package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
- package/dist/lib/toolbar/form-toolbar.component.js +294 -136
- package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
- package/dist/lib/types/navigation-events.d.ts +19 -1
- package/dist/lib/types/navigation-events.d.ts.map +1 -1
- package/dist/lib/types/navigation-events.js.map +1 -1
- package/dist/lib/types/toolbar-config.d.ts +11 -0
- package/dist/lib/types/toolbar-config.d.ts.map +1 -1
- package/dist/lib/types/toolbar-config.js +3 -0
- package/dist/lib/types/toolbar-config.js.map +1 -1
- package/dist/module.d.ts +10 -7
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +21 -7
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +4 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +7 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +12 -10
- package/dist/__tests__/sanity.test.d.ts +0 -2
- package/dist/__tests__/sanity.test.d.ts.map +0 -1
- package/dist/__tests__/sanity.test.js +0 -12
- package/dist/__tests__/sanity.test.js.map +0 -1
- package/dist/__tests__/tag-count-badge.test.d.ts +0 -2
- package/dist/__tests__/tag-count-badge.test.d.ts.map +0 -1
- package/dist/__tests__/tag-count-badge.test.js +0 -70
- package/dist/__tests__/tag-count-badge.test.js.map +0 -1
- package/dist/lib/__tests__/base-forms.test.d.ts +0 -2
- package/dist/lib/__tests__/base-forms.test.d.ts.map +0 -1
- package/dist/lib/__tests__/base-forms.test.js +0 -256
- package/dist/lib/__tests__/base-forms.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-form-container.component.js","sourceRoot":"","sources":["../../../src/lib/container/record-form-container.component.ts","../../../src/lib/container/record-form-container.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject, NgZone,\n ContentChildren, QueryList, AfterContentInit, OnDestroy,\n ViewChild, ViewEncapsulation\n} from '@angular/core';\nimport { BaseEntity, CompositeKey, EntityInfo, Metadata, RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { FormToolbarConfig, DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { FormWidthMode } from '../types/form-types';\nimport { MjCollapsiblePanelComponent } from '../panel/collapsible-panel.component';\nimport { SectionManagerItem } from '../section-manager/section-manager.component';\nimport {\n BeforeSaveEventArgs,\n BeforeDeleteEventArgs,\n BeforeCancelEventArgs,\n BeforeHistoryViewEventArgs,\n BeforeListManagementEventArgs,\n CustomToolbarButtonClickEventArgs\n} from '../types/form-events';\nimport { BaseFormComponent } from '../base-form-component';\nimport { RestoreVersionEvent, RecordChangesComponent } from '@memberjunction/ng-record-changes';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * Top-level container that composes the toolbar, content slots, and sticky behavior.\n *\n * **Two usage modes:**\n *\n * 1. **With FormComponent** (generated forms): Pass `[FormComponent]=\"this\"` and the\n * container derives all state from the BaseFormComponent instance. Save/Cancel/Edit\n * are handled internally by calling FormComponent methods.\n *\n * 2. **Standalone**: Pass individual @Input properties and handle all @Output events.\n *\n * @example Generated form usage:\n * ```html\n * <mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n * (Navigate)=\"OnFormNavigate($event)\"\n * (DeleteRequested)=\"OnDeleteRequested()\"\n * (FavoriteToggled)=\"OnFavoriteToggled()\"\n * (HistoryRequested)=\"OnHistoryRequested()\"\n * (ListManagementRequested)=\"OnListManagementRequested()\">\n *\n * <mj-collapsible-panel SectionKey=\"details\" ...>\n * <mj-form-field ...></mj-form-field>\n * </mj-collapsible-panel>\n *\n * <mj-collapsible-panel SectionKey=\"relatedOrders\" Variant=\"related-entity\" ...>\n * <!-- related entity grid -->\n * </mj-collapsible-panel>\n * </mj-record-form-container>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-record-form-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './record-form-container.component.html',\n styleUrls: ['./record-form-container.component.css']\n})\nexport class MjRecordFormContainerComponent extends BaseAngularComponent implements AfterContentInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private notificationService = inject(MJNotificationService);\n private destroy$ = new Subject<void>();\n private panelNavReset$ = new Subject<void>();\n\n // ---- Internal State ----\n\n /** Reference to the record changes drawer (when visible) for triggering refresh after save */\n @ViewChild(RecordChangesComponent) private recordChangesDrawer?: RecordChangesComponent;\n\n /** Controls visibility of record changes drawer */\n ShowRecordChanges = false;\n\n /** Controls visibility of tags panel */\n ShowTagsPanel = false;\n\n /** Persisted tags panel width */\n TagsPanelWidth = 0;\n private static readonly TAGS_WIDTH_KEY = 'MJ_TagsPanel_Width';\n\n /** Number of tags on this record */\n TagCount = 0;\n\n /** Number of tracked record change versions for this record */\n VersionCount = 0;\n\n /** Controls visibility of list management dialog */\n ShowListManagement = false;\n\n /** Controls visibility of section manager drawer */\n ShowSectionManager = false;\n\n // ---- Primary Inputs ----\n\n /** The entity record being displayed/edited */\n @Input() Record!: BaseEntity;\n\n /**\n * Reference to the parent form component (e.g. BaseFormComponent subclass).\n * When provided, the container derives toolbar state from this reference and\n * handles Save/Cancel/Edit internally by calling its methods.\n */\n @Input() FormComponent: BaseFormComponent | null = null;\n\n // ---- Fallback Inputs (used when FormComponent is NOT provided) ----\n\n @Input() EntityInfo: EntityInfo | null = null;\n @Input() EditMode = false;\n @Input() UserCanEdit = false;\n @Input() UserCanDelete = false;\n @Input() IsFavorite = false;\n @Input() FavoriteInitDone = false;\n @Input() IsDirty = false;\n @Input() DirtyFieldNames: string[] = [];\n @Input() ListCount = 0;\n @Input() IsSaving = false;\n @Input() ToolbarConfig: FormToolbarConfig = DEFAULT_TOOLBAR_CONFIG;\n @Input() WidthMode: FormWidthMode = 'centered';\n\n // ---- Outputs ----\n\n /** Emitted for all navigation actions (the host app maps these to its routing) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n /** Emitted when edit mode changes (only in standalone mode; FormComponent mode handled internally) */\n @Output() EditModeChange = new EventEmitter<boolean>();\n\n /** Emitted BEFORE save - can be cancelled by setting event.Cancel = true */\n @Output() BeforeSave = new EventEmitter<BeforeSaveEventArgs>();\n\n /** Emitted when save is requested (only in standalone mode) */\n @Output() SaveRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE cancel - can be cancelled by setting event.Cancel = true */\n @Output() BeforeCancel = new EventEmitter<BeforeCancelEventArgs>();\n\n /** Emitted when cancel is requested (only in standalone mode) */\n @Output() CancelRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE delete - can be cancelled by setting event.Cancel = true */\n @Output() BeforeDelete = new EventEmitter<BeforeDeleteEventArgs>();\n\n /** Emitted when delete is confirmed (host app handles actual deletion) */\n @Output() DeleteRequested = new EventEmitter<void>();\n\n /** Emitted when favorite toggle is requested */\n @Output() FavoriteToggled = new EventEmitter<void>();\n\n /** Emitted BEFORE history view - can be cancelled by setting event.Cancel = true */\n @Output() BeforeHistoryView = new EventEmitter<BeforeHistoryViewEventArgs>();\n\n /** Emitted when history view is requested */\n @Output() HistoryRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE list management - can be cancelled by setting event.Cancel = true */\n @Output() BeforeListManagement = new EventEmitter<BeforeListManagementEventArgs>();\n\n /** Emitted when list management is requested */\n @Output() ListManagementRequested = new EventEmitter<void>();\n\n /** Emitted when show-changes is requested */\n @Output() ShowChangesRequested = new EventEmitter<void>();\n\n /** Emitted when a custom toolbar button is clicked */\n @Output() CustomButtonClick = new EventEmitter<CustomToolbarButtonClickEventArgs>();\n\n // ---- Content Children ----\n\n @ContentChildren(MjCollapsiblePanelComponent, { descendants: true })\n Panels!: QueryList<MjCollapsiblePanelComponent>;\n\n // ---- FormComponent accessor ----\n\n /** Typed accessor for the form component reference */\n private get fc(): BaseFormComponent | null {\n return this.FormComponent;\n }\n\n // ---- Effective state (bridges FormComponent → toolbar inputs) ----\n\n get EffectiveRecord(): BaseEntity {\n return this.fc?.record ?? this.Record;\n }\n\n get EffectiveEditMode(): boolean {\n return this.fc?.EditMode ?? this.EditMode;\n }\n\n get EffectiveUserCanEdit(): boolean {\n return this.fc?.UserCanEdit ?? this.UserCanEdit;\n }\n\n get EffectiveUserCanDelete(): boolean {\n return this.fc?.UserCanDelete ?? this.UserCanDelete;\n }\n\n get EffectiveIsFavorite(): boolean {\n return this.fc?.IsFavorite ?? this.IsFavorite;\n }\n\n get EffectiveFavoriteInitDone(): boolean {\n return this.fc?.FavoriteInitDone ?? this.FavoriteInitDone;\n }\n\n get EffectiveEntityInfo(): EntityInfo | null {\n return (this.fc?.EntityInfo as EntityInfo) ?? this.EntityInfo;\n }\n\n get EffectiveIsDirty(): boolean {\n if (this.fc) {\n return this.fc.record?.Dirty ?? false;\n }\n return this.IsDirty;\n }\n\n get EffectiveDirtyFieldNames(): string[] {\n if (this.fc?.record?.Fields) {\n return this.fc.record.Fields.filter(f => f.Dirty).map(f => f.Name);\n }\n return this.DirtyFieldNames;\n }\n\n get EffectiveIsSaving(): boolean {\n return this.IsSaving;\n }\n\n get EffectiveWidthMode(): FormWidthMode {\n if (this.fc?.getFormWidthMode) {\n return this.fc.getFormWidthMode();\n }\n return this.WidthMode;\n }\n\n get EffectiveSearchFilter(): string {\n return this.fc?.searchFilter ?? '';\n }\n\n get EffectiveShowEmptyFields(): boolean {\n return this.fc?.showEmptyFields ?? false;\n }\n\n get EffectiveHasCustomSectionOrder(): boolean {\n if (this.fc?.hasCustomSectionOrder) {\n return this.fc.hasCustomSectionOrder();\n }\n return false;\n }\n\n // ---- Section counts ----\n\n get TotalSectionCount(): number {\n if (this.fc?.getTotalSectionCount) {\n return this.fc.getTotalSectionCount();\n }\n return this.Panels?.length ?? 0;\n }\n\n get VisibleSectionCount(): number {\n if (this.fc?.getVisibleSectionCount) {\n return this.fc.getVisibleSectionCount();\n }\n if (!this.Panels) return 0;\n return this.Panels.filter(p => p.IsVisible).length;\n }\n\n get ExpandedSectionCount(): number {\n if (this.fc?.getExpandedCount) {\n return this.fc.getExpandedCount();\n }\n if (!this.Panels) return 0;\n return this.Panels.filter(p => p.Expanded && p.IsVisible).length;\n }\n\n // ---- IS-A Related Panel ----\n\n /** Whether the current record has IS-A related items to display in the side panel */\n get HasIsaRelatedItems(): boolean {\n const record = this.EffectiveRecord;\n if (!record?.EntityInfo) return false;\n\n const entityInfo = record.EntityInfo;\n\n // Child entity with overlapping parent — may have siblings\n if (entityInfo.IsChildType && entityInfo.ParentEntityInfo?.AllowMultipleSubtypes) {\n const parent = record.ISAParent;\n if (parent?.ISAChildren && parent.ISAChildren.length > 1) return true;\n }\n\n // Parent entity with children\n if (entityInfo.IsParentType) {\n if (entityInfo.AllowMultipleSubtypes && record.ISAChildren && record.ISAChildren.length > 0) return true;\n if (!entityInfo.AllowMultipleSubtypes && record.ISAChild) return true;\n }\n\n return false;\n }\n\n // ---- Section Manager ----\n\n /** Builds section info array from projected panels for the section manager drawer */\n get SectionManagerItems(): SectionManagerItem[] {\n if (!this.Panels) return [];\n return this.Panels.map(p => ({\n SectionKey: p.SectionKey,\n SectionName: p.SectionName,\n Variant: p.Variant,\n Icon: p.Icon\n }));\n }\n\n /** Current section order from the form component */\n get SectionManagerOrder(): string[] {\n if (this.fc?.getSectionOrder) {\n return this.fc.getSectionOrder();\n }\n return [];\n }\n\n // ---- Lifecycle ----\n\n ngAfterContentInit(): void {\n // Load saved tags panel width\n const savedWidth = UserInfoEngine.Instance.GetSetting(MjRecordFormContainerComponent.TAGS_WIDTH_KEY);\n if (savedWidth) this.TagsPanelWidth = parseInt(savedWidth, 10) || 0;\n\n // Subscribe to panel Navigate events and relay them\n this.SubscribeToPanelNavigateEvents();\n\n // Watch for panel changes to update counts and re-subscribe\n this.Panels.changes.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.SubscribeToPanelNavigateEvents();\n this.cdr.markForCheck();\n });\n\n // Watch for changes to record dirty state\n this.watchRecordChanges();\n\n // Badge counts are loaded when the form emits RecordReady (see SubscribeToPanelNavigateEvents)\n }\n\n ngOnDestroy(): void {\n this.panelNavReset$.next();\n this.panelNavReset$.complete();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribes to Navigate events from all child collapsible panels\n * and relays them through this container's Navigate output.\n */\n private SubscribeToPanelNavigateEvents(): void {\n this.panelNavReset$.next(); // tear down previous subscriptions\n // Subscribe to RecordReady on the form component — fires once after record is fully initialized\n if (this.fc) {\n this.fc.RecordReady.pipe(takeUntil(this.panelNavReset$)).subscribe(() => {\n this.LoadBadgeCounts();\n });\n }\n\n this.Panels.forEach(panel => {\n panel.Navigate.pipe(takeUntil(this.panelNavReset$)).subscribe((event: FormNavigationEvent) => {\n this.Navigate.emit(event);\n });\n });\n }\n\n /**\n * Monitor record dirty state changes and trigger change detection.\n * This ensures the edit banner updates when fields are modified.\n */\n private watchRecordChanges(): void {\n // Poll for dirty state changes (BaseEntity doesn't expose observables)\n const checkInterval = setInterval(() => {\n if (this.EffectiveRecord?.Dirty !== undefined) {\n this.cdr.markForCheck();\n }\n }, 200);\n\n // Cleanup on destroy\n this.destroy$.subscribe(() => clearInterval(checkInterval));\n }\n\n // ---- Badge Count Loading ----\n\n /**\n * Loads tag count and record change version count for toolbar badges.\n * Both queries run in parallel for performance.\n */\n private badgeCountsLoaded = false;\n\n private LoadBadgeCounts(): void {\n if (this.badgeCountsLoaded) return;\n\n const record = this.EffectiveRecord;\n if (!record?.EntityInfo) return;\n\n this.badgeCountsLoaded = true;\n\n // Fire both queries in parallel — no await needed, they update state async\n this.LoadTagCount(record);\n this.LoadVersionCount(record);\n }\n\n /**\n * Queries the count of tagged items for the current entity + record\n * and updates the TagCount badge on the toolbar.\n */\n private async LoadTagCount(record: BaseEntity): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n // Don't narrow Fields — the server caches RunView results by entity+filter (ignoring Fields),\n // so a narrow query here would poison the cache for the subsequent full-field load in the Tags panel.\n const result = await rv.RunView({\n EntityName: 'MJ: Tagged Items',\n ExtraFilter: `EntityID='${record.EntityInfo.ID}' AND RecordID='${record.PrimaryKey.Values()}'`,\n ResultType: 'simple'\n });\n if (result.Success) {\n this.TagCount = result.Results.length;\n this.cdr.detectChanges();\n }\n } catch {\n // Non-critical — badge just stays at 0\n }\n }\n\n /**\n * Queries the count of record change entries for the current entity + record\n * and updates the VersionCount badge on the toolbar.\n */\n private async LoadVersionCount(record: BaseEntity): Promise<void> {\n if (!record.EntityInfo.TrackRecordChanges) return;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Record Changes',\n Fields: ['ID'],\n ExtraFilter: `EntityID='${record.EntityInfo.ID}' AND RecordID='${record.PrimaryKey.ToConcatenatedString()}'`,\n ResultType: 'simple'\n });\n if (result.Success) {\n this.VersionCount = result.Results.length;\n this.cdr.detectChanges();\n }\n } catch {\n // Non-critical — badge just stays at 0\n }\n }\n\n // ---- Toolbar Event Handlers ----\n\n /**\n * Navigation events are always re-emitted for the host app to handle.\n */\n OnNavigate(event: FormNavigationEvent): void {\n this.Navigate.emit(event);\n }\n\n /**\n * Edit mode change: delegate to FormComponent if available, otherwise re-emit.\n */\n OnEditModeChange(editMode: boolean): void {\n if (this.fc) {\n if (editMode) {\n this.fc.StartEditMode();\n } else {\n this.fc.EndEditMode();\n }\n this.cdr.markForCheck();\n } else {\n this.EditModeChange.emit(editMode);\n }\n }\n\n /**\n * Save: delegate to FormComponent if available, otherwise re-emit.\n */\n async OnSaveRequested(): Promise<void> {\n if (this.fc?.SaveRecord) {\n // Mark as saving to prevent double-click\n this.IsSaving = true;\n this.cdr.markForCheck();\n\n try {\n await this.fc.SaveRecord(true);\n\n // After successful save, refresh version count badge and record changes drawer\n this.RefreshAfterSave();\n } finally {\n // Use microtask timing to avoid ExpressionChangedAfterItHasBeenCheckedError\n await Promise.resolve();\n this.ngZone.run(() => {\n this.IsSaving = false;\n this.cdr.markForCheck();\n });\n }\n } else {\n this.SaveRequested.emit();\n }\n }\n\n /**\n * Refreshes the version count badge and record changes drawer after a save.\n * The save operation creates a new RecordChange entry server-side, so we need\n * to update the UI to reflect the new version.\n */\n private RefreshAfterSave(): void {\n const record = this.EffectiveRecord;\n if (!record?.EntityInfo?.TrackRecordChanges) return;\n\n // Refresh version count badge\n this.LoadVersionCount(record);\n\n // If the record changes drawer is open, refresh it too\n if (this.ShowRecordChanges && this.recordChangesDrawer) {\n this.recordChangesDrawer.Refresh();\n }\n }\n\n /**\n * Cancel: delegate to FormComponent if available, otherwise re-emit.\n */\n OnCancelRequested(): void {\n if (this.fc?.CancelEdit) {\n this.fc.CancelEdit();\n this.cdr.markForCheck();\n } else {\n this.CancelRequested.emit();\n }\n }\n\n /**\n * Delete, Favorite, History, Lists, ShowChanges: always re-emit for host app.\n */\n OnDeleteRequested(): void {\n this.DeleteRequested.emit();\n }\n\n OnFavoriteToggled(): void {\n this.FavoriteToggled.emit();\n }\n\n OnHistoryRequested(): void {\n // Check if event should be cancelled\n const beforeEvent = new BeforeHistoryViewEventArgs();\n this.BeforeHistoryView.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n // If not cancelled, show built-in record changes drawer\n this.ShowRecordChanges = true;\n this.cdr.markForCheck();\n\n // Also emit for backward compatibility\n this.HistoryRequested.emit();\n }\n\n OnListManagementRequested(): void {\n // Check if event should be cancelled\n const beforeEvent = new BeforeListManagementEventArgs();\n this.BeforeListManagement.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n // If not cancelled, show built-in list management dialog\n this.ShowListManagement = true;\n this.cdr.markForCheck();\n\n // Also emit for backward compatibility\n this.ListManagementRequested.emit();\n }\n\n OnTagsPanelToggled(): void {\n this.ShowTagsPanel = !this.ShowTagsPanel;\n this.cdr.detectChanges();\n }\n\n OnTagsPanelClosed(): void {\n this.ShowTagsPanel = false;\n this.cdr.detectChanges();\n\n // Refresh tag count — tags may have been added/removed while panel was open\n const record = this.EffectiveRecord;\n if (record?.EntityInfo) {\n this.LoadTagCount(record);\n }\n }\n\n /**\n * Handles live tag count updates from the tags panel component.\n */\n OnTagCountChanged(count: number): void {\n this.TagCount = count;\n this.cdr.markForCheck();\n }\n\n OnTagsPanelWidthChanged(width: number): void {\n this.TagsPanelWidth = width;\n UserInfoEngine.Instance.SetSettingDebounced(MjRecordFormContainerComponent.TAGS_WIDTH_KEY, String(width));\n }\n\n OnTagsRecordNavigate(event: { EntityName: string; RecordID: string }): void {\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => e.Name === event.EntityName);\n const pkey = new CompositeKey();\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, event.RecordID);\n } else {\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: event.RecordID }];\n }\n this.Navigate.emit({ Kind: 'record', EntityName: event.EntityName, PrimaryKey: pkey });\n }\n\n OnRecordChangesClosed(): void {\n this.ShowRecordChanges = false;\n this.cdr.markForCheck();\n\n // Refresh version count — new changes may have occurred\n const record = this.EffectiveRecord;\n if (record?.EntityInfo) {\n this.LoadVersionCount(record);\n }\n }\n\n /**\n * Handles a restore request from the record-changes panel.\n *\n * The event payload now carries the FULL snapshot the user opted to apply\n * (the panel computes current-vs-snapshot diffs using the source change's\n * FullRecordJSON, and the user can deselect individual fields). Setting\n * the restore context before Save() causes the data provider to write the\n * resulting RecordChange row with `Source='Restore'`, `RestoredFromID`,\n * and `RestoreReason` populated — building the auditable lineage chain.\n */\n async OnRestoreRequested(event: RestoreVersionEvent): Promise<void> {\n const record = this.EffectiveRecord;\n if (!record) return;\n\n try {\n // Apply each selected snapshot field\n for (const fv of event.FieldValues) {\n record.Set(fv.FieldName, fv.Value);\n }\n\n // Mark the next save as a restore so the provider populates the\n // lineage columns. ClearRestoreContext is called in finally{} below\n // so it doesn't leak into subsequent saves on this entity instance.\n record.SetRestoreContext(event.SourceChangeID, event.Reason);\n\n try {\n const saved = await record.Save();\n if (saved) {\n const fieldCount = event.FieldValues.length;\n const reasonSuffix = event.Reason ? ` — \"${event.Reason}\"` : '';\n this.notificationService.CreateSimpleNotification(\n `Restored ${fieldCount} field${fieldCount === 1 ? '' : 's'} from version dated ${new Date(event.ChangedAt).toLocaleDateString()}${reasonSuffix}`,\n 'info', 3500,\n );\n\n // Refresh version count — the save just produced a new restore-tagged change.\n this.LoadVersionCount(record);\n this.cdr.markForCheck();\n } else {\n const errMsg = record.LatestResult?.CompleteMessage ?? 'unknown error';\n this.notificationService.CreateSimpleNotification(\n `Failed to save restored values: ${errMsg}`,\n 'error', 4500,\n );\n }\n } finally {\n record.ClearRestoreContext();\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n this.notificationService.CreateSimpleNotification(\n `Restore failed: ${message}`,\n 'error', 4000,\n );\n }\n }\n\n OnListManagementClosed(): void {\n this.ShowListManagement = false;\n this.cdr.markForCheck();\n }\n\n OnShowChangesRequested(): void {\n if (this.fc?.ShowChanges) {\n this.fc.ShowChanges();\n } else {\n this.ShowChangesRequested.emit();\n }\n }\n\n // ---- Section Control Handlers ----\n\n OnFilterChange(filter: string): void {\n if (this.fc?.onFilterChange) {\n this.fc.onFilterChange(filter);\n this.cdr.markForCheck();\n }\n }\n\n OnExpandAll(): void {\n if (this.fc?.expandAllSections) {\n this.fc.expandAllSections();\n this.cdr.markForCheck();\n }\n }\n\n OnCollapseAll(): void {\n if (this.fc?.collapseAllSections) {\n this.fc.collapseAllSections();\n this.cdr.markForCheck();\n }\n }\n\n OnShowEmptyFieldsChange(show: boolean): void {\n if (this.fc) {\n this.fc.showEmptyFields = show;\n this.cdr.markForCheck();\n }\n }\n\n OnWidthModeChange(mode: FormWidthMode): void {\n if (this.fc?.setFormWidthMode) {\n this.fc.setFormWidthMode(mode);\n this.cdr.markForCheck();\n } else {\n this.WidthMode = mode;\n this.cdr.markForCheck();\n }\n }\n\n OnResetSectionOrder(): void {\n if (this.fc?.resetSectionOrder) {\n this.fc.resetSectionOrder();\n this.cdr.markForCheck();\n }\n }\n\n // ---- Section Manager Handlers ----\n\n OnManageSections(): void {\n this.ShowSectionManager = true;\n this.cdr.markForCheck();\n }\n\n OnSectionOrderChange(newOrder: string[]): void {\n if (this.fc?.setSectionOrder) {\n this.fc.setSectionOrder(newOrder);\n this.cdr.markForCheck();\n }\n }\n\n OnSectionManagerReset(): void {\n this.OnResetSectionOrder();\n }\n\n OnSectionManagerClosed(): void {\n this.ShowSectionManager = false;\n this.cdr.markForCheck();\n }\n}\n","<!-- ============================================\n BEFORE-TOOLBAR SLOT\n ============================================ -->\n<ng-content select=\"[before-toolbar]\"></ng-content>\n\n<!-- ============================================\n TOOLBAR (bridges FormComponent state → toolbar inputs)\n ============================================ -->\n<mj-form-toolbar\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [UserCanEdit]=\"EffectiveUserCanEdit\"\n [UserCanDelete]=\"EffectiveUserCanDelete\"\n [IsFavorite]=\"EffectiveIsFavorite\"\n [FavoriteInitDone]=\"EffectiveFavoriteInitDone\"\n [IsDirty]=\"EffectiveIsDirty\"\n [DirtyFieldNames]=\"EffectiveDirtyFieldNames\"\n [ListCount]=\"ListCount\"\n [TagCount]=\"TagCount\"\n [VersionCount]=\"VersionCount\"\n [EntityInfo]=\"EffectiveEntityInfo\"\n [Config]=\"ToolbarConfig\"\n [IsSaving]=\"EffectiveIsSaving\"\n [VisibleSectionCount]=\"VisibleSectionCount\"\n [TotalSectionCount]=\"TotalSectionCount\"\n [ExpandedSectionCount]=\"ExpandedSectionCount\"\n [SearchFilter]=\"EffectiveSearchFilter\"\n [ShowEmptyFields]=\"EffectiveShowEmptyFields\"\n [WidthMode]=\"EffectiveWidthMode\"\n [HasCustomSectionOrder]=\"EffectiveHasCustomSectionOrder\"\n (Navigate)=\"OnNavigate($event)\"\n (EditModeChange)=\"OnEditModeChange($event)\"\n (BeforeSave)=\"BeforeSave.emit($event)\"\n (SaveRequested)=\"OnSaveRequested()\"\n (BeforeCancel)=\"BeforeCancel.emit($event)\"\n (CancelRequested)=\"OnCancelRequested()\"\n (BeforeDelete)=\"BeforeDelete.emit($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (BeforeHistoryView)=\"BeforeHistoryView.emit($event)\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (BeforeListManagement)=\"BeforeListManagement.emit($event)\"\n (ListManagementRequested)=\"OnListManagementRequested()\"\n (ShowChangesRequested)=\"OnShowChangesRequested()\"\n (CustomButtonClick)=\"CustomButtonClick.emit($event)\"\n (FilterChange)=\"OnFilterChange($event)\"\n (ExpandAllRequested)=\"OnExpandAll()\"\n (CollapseAllRequested)=\"OnCollapseAll()\"\n (ShowEmptyFieldsChange)=\"OnShowEmptyFieldsChange($event)\"\n (WidthModeChange)=\"OnWidthModeChange($event)\"\n (ResetSectionOrderRequested)=\"OnResetSectionOrder()\"\n (ManageSectionsRequested)=\"OnManageSections()\"\n (TagsPanelToggled)=\"OnTagsPanelToggled()\">\n</mj-form-toolbar>\n\n<!-- ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n ============================================ -->\n<div class=\"mj-forms-scroll-area\">\n <div class=\"mj-forms-panels-container\"\n [class.mj-forms-panels--full-width]=\"EffectiveWidthMode === 'full-width'\"\n [class.mj-forms-panels--edit-mode]=\"EffectiveEditMode\"\n [class.mj-forms-panels--has-isa-panel]=\"HasIsaRelatedItems\">\n <!-- Flex row: form panels on left, ISA side panel on right -->\n <div class=\"mj-forms-layout-row\">\n <!-- All panels in a single flex container — CSS order drives sequencing -->\n <div class=\"mj-forms-all-panels\">\n <ng-content></ng-content>\n\n <!-- Empty state when no sections match search -->\n @if (EffectiveSearchFilter && VisibleSectionCount === 0) {\n <div class=\"mj-forms-empty-search-state\">\n <div class=\"mj-forms-empty-search-icon\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n </div>\n <h3 class=\"mj-forms-empty-search-title\">No sections found</h3>\n <p class=\"mj-forms-empty-search-message\">\n No sections match \"<strong>{{ EffectiveSearchFilter }}</strong>\".\n <br>Try a different search term or <a href=\"#\" (click)=\"OnFilterChange(''); $event.preventDefault()\" class=\"mj-forms-empty-search-link\">clear the search</a>.\n </p>\n </div>\n }\n </div>\n\n <!-- IS-A Related Records Side Panel -->\n <mj-isa-related-panel\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [Collapsed]=\"EffectiveWidthMode === 'full-width'\"\n (Navigate)=\"OnNavigate($event)\">\n </mj-isa-related-panel>\n </div>\n </div>\n</div>\n\n<!-- ============================================\n RECORD CHANGES DRAWER (shown when history button clicked)\n ============================================ -->\n@if (ShowRecordChanges && EffectiveRecord) {\n <mj-record-changes\n [record]=\"EffectiveRecord\"\n [AllowRestore]=\"EffectiveUserCanEdit\"\n (RestoreRequested)=\"OnRestoreRequested($event)\"\n (dialogClosed)=\"OnRecordChangesClosed()\">\n </mj-record-changes>\n}\n\n<!-- ============================================\n TAGS PANEL (shown when tags button clicked)\n ============================================ -->\n@if (ShowTagsPanel && EffectiveRecord) {\n <mj-record-tags\n [Record]=\"EffectiveRecord\"\n [WidthPx]=\"TagsPanelWidth\"\n (PanelClosed)=\"OnTagsPanelClosed()\"\n (TagCountChanged)=\"OnTagCountChanged($event)\"\n (RecordNavigate)=\"OnTagsRecordNavigate($event)\"\n (WidthChanged)=\"OnTagsPanelWidthChanged($event)\">\n </mj-record-tags>\n}\n\n<!-- ============================================\n LIST MANAGEMENT DIALOG (shown when lists button clicked)\n ============================================ -->\n@if (ShowListManagement && EffectiveRecord) {\n <mj-list-management-dialog\n [visible]=\"ShowListManagement\"\n [config]=\"{\n mode: 'manage',\n entityId: EffectiveRecord.EntityInfo.ID,\n entityName: EffectiveRecord.EntityInfo.Name,\n recordIds: [EffectiveRecord.PrimaryKey.Values()[0]],\n allowCreate: true\n }\"\n (complete)=\"OnListManagementClosed()\"\n (cancel)=\"OnListManagementClosed()\">\n </mj-list-management-dialog>\n}\n\n<!-- ============================================\n SECTION MANAGER DRAWER (shown when manage-sections button clicked)\n ============================================ -->\n<mj-section-manager\n [Sections]=\"SectionManagerItems\"\n [SectionOrder]=\"SectionManagerOrder\"\n [Visible]=\"ShowSectionManager\"\n (SectionOrderChange)=\"OnSectionOrderChange($event)\"\n (ResetRequested)=\"OnSectionManagerReset()\"\n (Closed)=\"OnSectionManagerClosed()\">\n</mj-section-manager>\n"]}
|
|
1
|
+
{"version":3,"file":"record-form-container.component.js","sourceRoot":"","sources":["../../../src/lib/container/record-form-container.component.ts","../../../src/lib/container/record-form-container.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject, NgZone,\n ContentChildren, QueryList, AfterContentInit, OnDestroy,\n ViewChild, ViewEncapsulation\n} from '@angular/core';\nimport { BaseEntity, CompositeKey, EntityInfo, Metadata, RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { FormToolbarConfig, DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { FormWidthMode } from '../types/form-types';\nimport { MjCollapsiblePanelComponent } from '../panel/collapsible-panel.component';\nimport { SectionManagerItem } from '../section-manager/section-manager.component';\nimport {\n BeforeSaveEventArgs,\n BeforeDeleteEventArgs,\n BeforeCancelEventArgs,\n BeforeHistoryViewEventArgs,\n BeforeListManagementEventArgs,\n CustomToolbarButtonClickEventArgs\n} from '../types/form-events';\nimport { BaseFormComponent } from '../base-form-component';\nimport { RestoreVersionEvent, RecordChangesComponent } from '@memberjunction/ng-record-changes';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { FormSlotCoordinator } from '../panel-slot/form-slot-coordinator.service';\n\n/**\n * Display shape for the variant picker. Kept minimal so the Generic\n * container doesn't pull in resolver types; the Explorer-level component\n * that owns the resolver shapes its rows into this.\n */\nexport interface VariantPickerItem {\n ID: string;\n Label: string;\n Scope: 'User' | 'Role' | 'Global';\n Status: 'Active' | 'Pending' | 'Inactive';\n}\n\n/**\n * Top-level container that composes the toolbar, content slots, and sticky behavior.\n *\n * **Two usage modes:**\n *\n * 1. **With FormComponent** (generated forms): Pass `[FormComponent]=\"this\"` and the\n * container derives all state from the BaseFormComponent instance. Save/Cancel/Edit\n * are handled internally by calling FormComponent methods.\n *\n * 2. **Standalone**: Pass individual @Input properties and handle all @Output events.\n *\n * @example Generated form usage:\n * ```html\n * <mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n * (Navigate)=\"OnFormNavigate($event)\"\n * (DeleteRequested)=\"OnDeleteRequested()\"\n * (FavoriteToggled)=\"OnFavoriteToggled()\"\n * (HistoryRequested)=\"OnHistoryRequested()\"\n * (ListManagementRequested)=\"OnListManagementRequested()\">\n *\n * <mj-collapsible-panel SectionKey=\"details\" ...>\n * <mj-form-field ...></mj-form-field>\n * </mj-collapsible-panel>\n *\n * <mj-collapsible-panel SectionKey=\"relatedOrders\" Variant=\"related-entity\" ...>\n * <!-- related entity grid -->\n * </mj-collapsible-panel>\n * </mj-record-form-container>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-record-form-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './record-form-container.component.html',\n styleUrls: ['./record-form-container.component.css'],\n // FormSlotCoordinator scoped per-container so each form has its own\n // slot-presence map for fallback resolution. See FormPanelSlotComponent.\n providers: [FormSlotCoordinator],\n})\nexport class MjRecordFormContainerComponent extends BaseAngularComponent implements AfterContentInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private notificationService = inject(MJNotificationService);\n private destroy$ = new Subject<void>();\n private panelNavReset$ = new Subject<void>();\n\n // ---- Internal State ----\n\n /** Reference to the record changes drawer (when visible) for triggering refresh after save */\n @ViewChild(RecordChangesComponent) private recordChangesDrawer?: RecordChangesComponent;\n\n /** Controls visibility of record changes drawer */\n ShowRecordChanges = false;\n\n /** Controls visibility of tags panel */\n ShowTagsPanel = false;\n\n /** Persisted tags panel width */\n TagsPanelWidth = 0;\n private static readonly TAGS_WIDTH_KEY = 'MJ_TagsPanel_Width';\n\n /** Number of tags on this record */\n TagCount = 0;\n\n /** Number of tracked record change versions for this record */\n VersionCount = 0;\n\n /** Controls visibility of list management dialog */\n ShowListManagement = false;\n\n /** Controls visibility of section manager drawer */\n ShowSectionManager = false;\n\n // ---- Primary Inputs ----\n\n /** The entity record being displayed/edited */\n @Input() Record!: BaseEntity;\n\n /**\n * Reference to the parent form component (e.g. BaseFormComponent subclass).\n * When provided, the container derives toolbar state from this reference and\n * handles Save/Cancel/Edit internally by calling its methods.\n */\n @Input() FormComponent: BaseFormComponent | null = null;\n\n // ---- Fallback Inputs (used when FormComponent is NOT provided) ----\n\n @Input() EntityInfo: EntityInfo | null = null;\n @Input() EditMode = false;\n @Input() UserCanEdit = false;\n @Input() UserCanDelete = false;\n @Input() IsFavorite = false;\n @Input() FavoriteInitDone = false;\n @Input() IsDirty = false;\n @Input() DirtyFieldNames: string[] = [];\n @Input() ListCount = 0;\n @Input() IsSaving = false;\n @Input() ToolbarConfig: FormToolbarConfig = DEFAULT_TOOLBAR_CONFIG;\n @Input() WidthMode: FormWidthMode = 'centered';\n\n /**\n * Variants available for this entity record. When more than one variant is\n * provided, a compact picker appears between the toolbar and the form body\n * letting the user switch which form is rendered. Empty / single-variant\n * lists hide the picker entirely.\n *\n * Each item is a plain object — we don't take a hard dep on the resolver's\n * row type from here (this is a Generic component; the Explorer-level\n * single-record component shapes the resolver row into this minimal form).\n */\n @Input() Variants: VariantPickerItem[] = [];\n\n /**\n * Override ID currently rendered. The picker highlights this entry. May be\n * null when the active form is a class-based @RegisterClass form (no\n * override is currently active) — in that case the picker still appears\n * with \"Default form\" as the leading row.\n */\n @Input() CurrentVariantID: string | null = null;\n\n // ---- Outputs ----\n\n /** Emitted for all navigation actions (the host app maps these to its routing) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n /** Emitted when edit mode changes (only in standalone mode; FormComponent mode handled internally) */\n @Output() EditModeChange = new EventEmitter<boolean>();\n\n /** Emitted BEFORE save - can be cancelled by setting event.Cancel = true */\n @Output() BeforeSave = new EventEmitter<BeforeSaveEventArgs>();\n\n /** Emitted when save is requested (only in standalone mode) */\n @Output() SaveRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE cancel - can be cancelled by setting event.Cancel = true */\n @Output() BeforeCancel = new EventEmitter<BeforeCancelEventArgs>();\n\n /** Emitted when cancel is requested (only in standalone mode) */\n @Output() CancelRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE delete - can be cancelled by setting event.Cancel = true */\n @Output() BeforeDelete = new EventEmitter<BeforeDeleteEventArgs>();\n\n /** Emitted when delete is confirmed (host app handles actual deletion) */\n @Output() DeleteRequested = new EventEmitter<void>();\n\n /** Emitted when favorite toggle is requested */\n @Output() FavoriteToggled = new EventEmitter<void>();\n\n /** Emitted BEFORE history view - can be cancelled by setting event.Cancel = true */\n @Output() BeforeHistoryView = new EventEmitter<BeforeHistoryViewEventArgs>();\n\n /** Emitted when history view is requested */\n @Output() HistoryRequested = new EventEmitter<void>();\n\n /** Emitted BEFORE list management - can be cancelled by setting event.Cancel = true */\n @Output() BeforeListManagement = new EventEmitter<BeforeListManagementEventArgs>();\n\n /** Emitted when list management is requested */\n @Output() ListManagementRequested = new EventEmitter<void>();\n\n /** Emitted when show-changes is requested */\n @Output() ShowChangesRequested = new EventEmitter<void>();\n\n /** Emitted when a custom toolbar button is clicked */\n @Output() CustomButtonClick = new EventEmitter<CustomToolbarButtonClickEventArgs>();\n\n /**\n * Emitted when the user chooses a different form variant from the picker.\n * Carries the selected variant's override ID, or null when the user picks\n * the \"Default form\" row. The host is responsible for persisting the choice\n * (via FormResolverService.SetSelectedVariant) and reloading the record so\n * the new form mounts.\n */\n @Output() VariantChange = new EventEmitter<string | null>();\n\n // ---- Content Children ----\n\n @ContentChildren(MjCollapsiblePanelComponent, { descendants: true })\n Panels!: QueryList<MjCollapsiblePanelComponent>;\n\n // ---- FormComponent accessor ----\n\n /** Typed accessor for the form component reference */\n private get fc(): BaseFormComponent | null {\n return this.FormComponent;\n }\n\n // ---- Effective state (bridges FormComponent → toolbar inputs) ----\n\n get EffectiveRecord(): BaseEntity {\n return this.fc?.record ?? this.Record;\n }\n\n get EffectiveEditMode(): boolean {\n return this.fc?.EditMode ?? this.EditMode;\n }\n\n get EffectiveUserCanEdit(): boolean {\n return this.fc?.UserCanEdit ?? this.UserCanEdit;\n }\n\n get EffectiveUserCanDelete(): boolean {\n return this.fc?.UserCanDelete ?? this.UserCanDelete;\n }\n\n get EffectiveIsFavorite(): boolean {\n return this.fc?.IsFavorite ?? this.IsFavorite;\n }\n\n get EffectiveFavoriteInitDone(): boolean {\n return this.fc?.FavoriteInitDone ?? this.FavoriteInitDone;\n }\n\n get EffectiveEntityInfo(): EntityInfo | null {\n return (this.fc?.EntityInfo as EntityInfo) ?? this.EntityInfo;\n }\n\n get EffectiveIsDirty(): boolean {\n if (this.fc) {\n return this.fc.record?.Dirty ?? false;\n }\n return this.IsDirty;\n }\n\n get EffectiveDirtyFieldNames(): string[] {\n if (this.fc?.record?.Fields) {\n return this.fc.record.Fields.filter(f => f.Dirty).map(f => f.Name);\n }\n return this.DirtyFieldNames;\n }\n\n get EffectiveIsSaving(): boolean {\n return this.IsSaving;\n }\n\n get EffectiveWidthMode(): FormWidthMode {\n if (this.fc?.getFormWidthMode) {\n return this.fc.getFormWidthMode();\n }\n return this.WidthMode;\n }\n\n get EffectiveSearchFilter(): string {\n return this.fc?.searchFilter ?? '';\n }\n\n get EffectiveShowEmptyFields(): boolean {\n return this.fc?.showEmptyFields ?? false;\n }\n\n get EffectiveHasCustomSectionOrder(): boolean {\n if (this.fc?.hasCustomSectionOrder) {\n return this.fc.hasCustomSectionOrder();\n }\n return false;\n }\n\n // ---- Section counts ----\n\n get TotalSectionCount(): number {\n if (this.fc?.getTotalSectionCount) {\n return this.fc.getTotalSectionCount();\n }\n return this.Panels?.length ?? 0;\n }\n\n get VisibleSectionCount(): number {\n if (this.fc?.getVisibleSectionCount) {\n return this.fc.getVisibleSectionCount();\n }\n if (!this.Panels) return 0;\n return this.Panels.filter(p => p.IsVisible).length;\n }\n\n get ExpandedSectionCount(): number {\n if (this.fc?.getExpandedCount) {\n return this.fc.getExpandedCount();\n }\n if (!this.Panels) return 0;\n return this.Panels.filter(p => p.Expanded && p.IsVisible).length;\n }\n\n // ---- IS-A Related Panel ----\n\n /** Whether the current record has IS-A related items to display in the side panel */\n get HasIsaRelatedItems(): boolean {\n const record = this.EffectiveRecord;\n if (!record?.EntityInfo) return false;\n\n const entityInfo = record.EntityInfo;\n\n // Child entity with overlapping parent — may have siblings\n if (entityInfo.IsChildType && entityInfo.ParentEntityInfo?.AllowMultipleSubtypes) {\n const parent = record.ISAParent;\n if (parent?.ISAChildren && parent.ISAChildren.length > 1) return true;\n }\n\n // Parent entity with children\n if (entityInfo.IsParentType) {\n if (entityInfo.AllowMultipleSubtypes && record.ISAChildren && record.ISAChildren.length > 0) return true;\n if (!entityInfo.AllowMultipleSubtypes && record.ISAChild) return true;\n }\n\n return false;\n }\n\n // ---- Section Manager ----\n\n /** Builds section info array from projected panels for the section manager drawer */\n get SectionManagerItems(): SectionManagerItem[] {\n if (!this.Panels) return [];\n return this.Panels.map(p => ({\n SectionKey: p.SectionKey,\n SectionName: p.SectionName,\n Variant: p.Variant,\n Icon: p.Icon\n }));\n }\n\n /** Current section order from the form component */\n get SectionManagerOrder(): string[] {\n if (this.fc?.getSectionOrder) {\n return this.fc.getSectionOrder();\n }\n return [];\n }\n\n // ---- Lifecycle ----\n\n ngAfterContentInit(): void {\n // Load saved tags panel width\n const savedWidth = UserInfoEngine.Instance.GetSetting(MjRecordFormContainerComponent.TAGS_WIDTH_KEY);\n if (savedWidth) this.TagsPanelWidth = parseInt(savedWidth, 10) || 0;\n\n // Subscribe to panel Navigate events and relay them\n this.SubscribeToPanelNavigateEvents();\n\n // Watch for panel changes to update counts and re-subscribe\n this.Panels.changes.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.SubscribeToPanelNavigateEvents();\n this.cdr.markForCheck();\n });\n\n // Watch for changes to record dirty state\n this.watchRecordChanges();\n\n // Badge counts are loaded when the form emits RecordReady (see SubscribeToPanelNavigateEvents)\n }\n\n ngOnDestroy(): void {\n this.panelNavReset$.next();\n this.panelNavReset$.complete();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribes to Navigate events from all child collapsible panels\n * and relays them through this container's Navigate output.\n */\n private SubscribeToPanelNavigateEvents(): void {\n this.panelNavReset$.next(); // tear down previous subscriptions\n // Subscribe to RecordReady on the form component — fires once after record is fully initialized\n if (this.fc) {\n this.fc.RecordReady.pipe(takeUntil(this.panelNavReset$)).subscribe(() => {\n this.LoadBadgeCounts();\n });\n }\n\n this.Panels.forEach(panel => {\n panel.Navigate.pipe(takeUntil(this.panelNavReset$)).subscribe((event: FormNavigationEvent) => {\n this.Navigate.emit(event);\n });\n });\n }\n\n /**\n * Monitor record dirty state changes and trigger change detection.\n * This ensures the edit banner updates when fields are modified.\n */\n private watchRecordChanges(): void {\n // Poll for dirty state changes (BaseEntity doesn't expose observables)\n const checkInterval = setInterval(() => {\n if (this.EffectiveRecord?.Dirty !== undefined) {\n this.cdr.markForCheck();\n }\n }, 200);\n\n // Cleanup on destroy\n this.destroy$.subscribe(() => clearInterval(checkInterval));\n }\n\n // ---- Badge Count Loading ----\n\n /**\n * Loads tag count and record change version count for toolbar badges.\n * Both queries run in parallel for performance.\n */\n private badgeCountsLoaded = false;\n\n private LoadBadgeCounts(): void {\n if (this.badgeCountsLoaded) return;\n\n const record = this.EffectiveRecord;\n if (!record?.EntityInfo) return;\n\n this.badgeCountsLoaded = true;\n\n // Fire both queries in parallel — no await needed, they update state async\n this.LoadTagCount(record);\n this.LoadVersionCount(record);\n }\n\n /**\n * Queries the count of tagged items for the current entity + record\n * and updates the TagCount badge on the toolbar.\n */\n private async LoadTagCount(record: BaseEntity): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n // Don't narrow Fields — the server caches RunView results by entity+filter (ignoring Fields),\n // so a narrow query here would poison the cache for the subsequent full-field load in the Tags panel.\n const result = await rv.RunView({\n EntityName: 'MJ: Tagged Items',\n ExtraFilter: `EntityID='${record.EntityInfo.ID}' AND RecordID='${record.PrimaryKey.Values()}'`,\n ResultType: 'simple'\n });\n if (result.Success) {\n this.TagCount = result.Results.length;\n this.cdr.detectChanges();\n }\n } catch {\n // Non-critical — badge just stays at 0\n }\n }\n\n /**\n * Queries the count of record change entries for the current entity + record\n * and updates the VersionCount badge on the toolbar.\n */\n private async LoadVersionCount(record: BaseEntity): Promise<void> {\n if (!record.EntityInfo.TrackRecordChanges) return;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Record Changes',\n Fields: ['ID'],\n ExtraFilter: `EntityID='${record.EntityInfo.ID}' AND RecordID='${record.PrimaryKey.ToConcatenatedString()}'`,\n ResultType: 'simple'\n });\n if (result.Success) {\n this.VersionCount = result.Results.length;\n this.cdr.detectChanges();\n }\n } catch {\n // Non-critical — badge just stays at 0\n }\n }\n\n // ---- Toolbar Event Handlers ----\n\n /**\n * Navigation events are always re-emitted for the host app to handle.\n */\n OnNavigate(event: FormNavigationEvent): void {\n this.Navigate.emit(event);\n }\n\n /**\n * Edit mode change: delegate to FormComponent if available, otherwise re-emit.\n */\n OnEditModeChange(editMode: boolean): void {\n if (this.fc) {\n if (editMode) {\n this.fc.StartEditMode();\n } else {\n this.fc.EndEditMode();\n }\n this.cdr.markForCheck();\n } else {\n this.EditModeChange.emit(editMode);\n }\n }\n\n /**\n * Save: delegate to FormComponent if available, otherwise re-emit.\n */\n async OnSaveRequested(): Promise<void> {\n if (this.fc?.SaveRecord) {\n // Mark as saving to prevent double-click\n this.IsSaving = true;\n this.cdr.markForCheck();\n\n try {\n await this.fc.SaveRecord(true);\n\n // After successful save, refresh version count badge and record changes drawer\n this.RefreshAfterSave();\n } finally {\n // Use microtask timing to avoid ExpressionChangedAfterItHasBeenCheckedError\n await Promise.resolve();\n this.ngZone.run(() => {\n this.IsSaving = false;\n this.cdr.markForCheck();\n });\n }\n } else {\n this.SaveRequested.emit();\n }\n }\n\n /**\n * Refreshes the version count badge and record changes drawer after a save.\n * The save operation creates a new RecordChange entry server-side, so we need\n * to update the UI to reflect the new version.\n */\n private RefreshAfterSave(): void {\n const record = this.EffectiveRecord;\n if (!record?.EntityInfo?.TrackRecordChanges) return;\n\n // Refresh version count badge\n this.LoadVersionCount(record);\n\n // If the record changes drawer is open, refresh it too\n if (this.ShowRecordChanges && this.recordChangesDrawer) {\n this.recordChangesDrawer.Refresh();\n }\n }\n\n /**\n * Cancel: delegate to FormComponent if available, otherwise re-emit.\n */\n OnCancelRequested(): void {\n if (this.fc?.CancelEdit) {\n this.fc.CancelEdit();\n this.cdr.markForCheck();\n } else {\n this.CancelRequested.emit();\n }\n }\n\n /**\n * Delete, Favorite, History, Lists, ShowChanges: always re-emit for host app.\n */\n OnDeleteRequested(): void {\n this.DeleteRequested.emit();\n }\n\n OnFavoriteToggled(): void {\n this.FavoriteToggled.emit();\n }\n\n OnHistoryRequested(): void {\n // Check if event should be cancelled\n const beforeEvent = new BeforeHistoryViewEventArgs();\n this.BeforeHistoryView.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n // If not cancelled, show built-in record changes drawer\n this.ShowRecordChanges = true;\n this.cdr.markForCheck();\n\n // Also emit for backward compatibility\n this.HistoryRequested.emit();\n }\n\n OnListManagementRequested(): void {\n // Check if event should be cancelled\n const beforeEvent = new BeforeListManagementEventArgs();\n this.BeforeListManagement.emit(beforeEvent);\n if (beforeEvent.Cancel) return;\n\n // If not cancelled, show built-in list management dialog\n this.ShowListManagement = true;\n this.cdr.markForCheck();\n\n // Also emit for backward compatibility\n this.ListManagementRequested.emit();\n }\n\n OnTagsPanelToggled(): void {\n this.ShowTagsPanel = !this.ShowTagsPanel;\n this.cdr.detectChanges();\n }\n\n OnTagsPanelClosed(): void {\n this.ShowTagsPanel = false;\n this.cdr.detectChanges();\n\n // Refresh tag count — tags may have been added/removed while panel was open\n const record = this.EffectiveRecord;\n if (record?.EntityInfo) {\n this.LoadTagCount(record);\n }\n }\n\n /**\n * Handles live tag count updates from the tags panel component.\n */\n OnTagCountChanged(count: number): void {\n this.TagCount = count;\n this.cdr.markForCheck();\n }\n\n OnTagsPanelWidthChanged(width: number): void {\n this.TagsPanelWidth = width;\n UserInfoEngine.Instance.SetSettingDebounced(MjRecordFormContainerComponent.TAGS_WIDTH_KEY, String(width));\n }\n\n OnTagsRecordNavigate(event: { EntityName: string; RecordID: string }): void {\n const md = this.ProviderToUse;\n const entityInfo = md.Entities.find(e => e.Name === event.EntityName);\n const pkey = new CompositeKey();\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, event.RecordID);\n } else {\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: event.RecordID }];\n }\n this.Navigate.emit({ Kind: 'record', EntityName: event.EntityName, PrimaryKey: pkey });\n }\n\n OnRecordChangesClosed(): void {\n this.ShowRecordChanges = false;\n this.cdr.markForCheck();\n\n // Refresh version count — new changes may have occurred\n const record = this.EffectiveRecord;\n if (record?.EntityInfo) {\n this.LoadVersionCount(record);\n }\n }\n\n /**\n * Handles a restore request from the record-changes panel.\n *\n * The event payload now carries the FULL snapshot the user opted to apply\n * (the panel computes current-vs-snapshot diffs using the source change's\n * FullRecordJSON, and the user can deselect individual fields). Setting\n * the restore context before Save() causes the data provider to write the\n * resulting RecordChange row with `Source='Restore'`, `RestoredFromID`,\n * and `RestoreReason` populated — building the auditable lineage chain.\n */\n async OnRestoreRequested(event: RestoreVersionEvent): Promise<void> {\n const record = this.EffectiveRecord;\n if (!record) return;\n\n try {\n // Apply each selected snapshot field\n for (const fv of event.FieldValues) {\n record.Set(fv.FieldName, fv.Value);\n }\n\n // Mark the next save as a restore so the provider populates the\n // lineage columns. ClearRestoreContext is called in finally{} below\n // so it doesn't leak into subsequent saves on this entity instance.\n record.SetRestoreContext(event.SourceChangeID, event.Reason);\n\n try {\n const saved = await record.Save();\n if (saved) {\n const fieldCount = event.FieldValues.length;\n const reasonSuffix = event.Reason ? ` — \"${event.Reason}\"` : '';\n this.notificationService.CreateSimpleNotification(\n `Restored ${fieldCount} field${fieldCount === 1 ? '' : 's'} from version dated ${new Date(event.ChangedAt).toLocaleDateString()}${reasonSuffix}`,\n 'info', 3500,\n );\n\n // Refresh version count — the save just produced a new restore-tagged change.\n this.LoadVersionCount(record);\n this.cdr.markForCheck();\n } else {\n const errMsg = record.LatestResult?.CompleteMessage ?? 'unknown error';\n this.notificationService.CreateSimpleNotification(\n `Failed to save restored values: ${errMsg}`,\n 'error', 4500,\n );\n }\n } finally {\n record.ClearRestoreContext();\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n this.notificationService.CreateSimpleNotification(\n `Restore failed: ${message}`,\n 'error', 4000,\n );\n }\n }\n\n OnListManagementClosed(): void {\n this.ShowListManagement = false;\n this.cdr.markForCheck();\n }\n\n OnShowChangesRequested(): void {\n if (this.fc?.ShowChanges) {\n this.fc.ShowChanges();\n } else {\n this.ShowChangesRequested.emit();\n }\n }\n\n // ---- Section Control Handlers ----\n\n OnFilterChange(filter: string): void {\n if (this.fc?.onFilterChange) {\n this.fc.onFilterChange(filter);\n this.cdr.markForCheck();\n }\n }\n\n OnExpandAll(): void {\n if (this.fc?.expandAllSections) {\n this.fc.expandAllSections();\n this.cdr.markForCheck();\n }\n }\n\n OnCollapseAll(): void {\n if (this.fc?.collapseAllSections) {\n this.fc.collapseAllSections();\n this.cdr.markForCheck();\n }\n }\n\n OnShowEmptyFieldsChange(show: boolean): void {\n if (this.fc) {\n this.fc.showEmptyFields = show;\n this.cdr.markForCheck();\n }\n }\n\n OnWidthModeChange(mode: FormWidthMode): void {\n if (this.fc?.setFormWidthMode) {\n this.fc.setFormWidthMode(mode);\n this.cdr.markForCheck();\n } else {\n this.WidthMode = mode;\n this.cdr.markForCheck();\n }\n }\n\n OnResetSectionOrder(): void {\n if (this.fc?.resetSectionOrder) {\n this.fc.resetSectionOrder();\n this.cdr.markForCheck();\n }\n }\n\n // ---- Variant picker ----\n\n /** Whether the variant dropdown menu is currently open. Toggled by the\n * control's click handler; closed on blur or after a row is picked. */\n _variantMenuOpen = false;\n\n /**\n * Effective variants — prefer the form component's list (set by the host\n * resolver) when present, fall back to the directly-bound @Input. This\n * means generated form templates don't need to bind [Variants] explicitly;\n * the host populates `instance.Variants` post-construction and the\n * container reads it through this accessor.\n */\n get EffectiveVariants(): VariantPickerItem[] {\n return (this.fc?.Variants as VariantPickerItem[] | undefined)\n ?? this.Variants\n ?? [];\n }\n\n get EffectiveCurrentVariantID(): string | null {\n return this.fc?.CurrentVariantID ?? this.CurrentVariantID;\n }\n\n /** Whether to show the variant picker at all. Hidden when the entity has\n * zero or one applicable variant — there's nothing to switch between. */\n get ShowVariantPicker(): boolean {\n return (this.EffectiveVariants?.length ?? 0) > 1;\n }\n\n /** Label for the currently-selected variant (or \"Default form\" if none). */\n get CurrentVariantLabel(): string {\n const v = this.EffectiveVariants?.find(x => UUIDsEqual(x.ID, this.EffectiveCurrentVariantID));\n return v?.Label ?? 'Default form';\n }\n\n /** Compact subtitle: scope + status, e.g. \"User · Active\". */\n variantSubtitle(v: VariantPickerItem): string {\n return `${v.Scope} · ${v.Status}`;\n }\n\n /**\n * User picked an item from the variant menu. If the host installed a\n * handler via `instance.OnVariantChanged`, call it; otherwise emit the\n * VariantChange event for standalone consumers.\n */\n OnVariantPicked(variantID: string | null): void {\n if (variantID === this.EffectiveCurrentVariantID) return;\n if (this.fc && typeof this.fc.OnVariantChanged === 'function') {\n this.fc.OnVariantChanged(variantID);\n } else {\n this.VariantChange.emit(variantID);\n }\n }\n\n // ---- Section Manager Handlers ----\n\n OnManageSections(): void {\n this.ShowSectionManager = true;\n this.cdr.markForCheck();\n }\n\n OnSectionOrderChange(newOrder: string[]): void {\n if (this.fc?.setSectionOrder) {\n this.fc.setSectionOrder(newOrder);\n this.cdr.markForCheck();\n }\n }\n\n OnSectionManagerReset(): void {\n this.OnResetSectionOrder();\n }\n\n OnSectionManagerClosed(): void {\n this.ShowSectionManager = false;\n this.cdr.markForCheck();\n }\n}\n","<!-- ============================================\n BEFORE-TOOLBAR SLOT\n ============================================ -->\n<ng-content select=\"[before-toolbar]\"></ng-content>\n\n<!-- ============================================\n TOOLBAR (bridges FormComponent state → toolbar inputs)\n ============================================ -->\n<mj-form-toolbar\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [UserCanEdit]=\"EffectiveUserCanEdit\"\n [UserCanDelete]=\"EffectiveUserCanDelete\"\n [IsFavorite]=\"EffectiveIsFavorite\"\n [FavoriteInitDone]=\"EffectiveFavoriteInitDone\"\n [IsDirty]=\"EffectiveIsDirty\"\n [DirtyFieldNames]=\"EffectiveDirtyFieldNames\"\n [ListCount]=\"ListCount\"\n [TagCount]=\"TagCount\"\n [VersionCount]=\"VersionCount\"\n [EntityInfo]=\"EffectiveEntityInfo\"\n [Config]=\"ToolbarConfig\"\n [IsSaving]=\"EffectiveIsSaving\"\n [VisibleSectionCount]=\"VisibleSectionCount\"\n [TotalSectionCount]=\"TotalSectionCount\"\n [ExpandedSectionCount]=\"ExpandedSectionCount\"\n [SearchFilter]=\"EffectiveSearchFilter\"\n [ShowEmptyFields]=\"EffectiveShowEmptyFields\"\n [WidthMode]=\"EffectiveWidthMode\"\n [HasCustomSectionOrder]=\"EffectiveHasCustomSectionOrder\"\n [Variants]=\"EffectiveVariants\"\n [CurrentVariantID]=\"EffectiveCurrentVariantID\"\n (Navigate)=\"OnNavigate($event)\"\n (EditModeChange)=\"OnEditModeChange($event)\"\n (BeforeSave)=\"BeforeSave.emit($event)\"\n (SaveRequested)=\"OnSaveRequested()\"\n (BeforeCancel)=\"BeforeCancel.emit($event)\"\n (CancelRequested)=\"OnCancelRequested()\"\n (BeforeDelete)=\"BeforeDelete.emit($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (BeforeHistoryView)=\"BeforeHistoryView.emit($event)\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (BeforeListManagement)=\"BeforeListManagement.emit($event)\"\n (ListManagementRequested)=\"OnListManagementRequested()\"\n (ShowChangesRequested)=\"OnShowChangesRequested()\"\n (CustomButtonClick)=\"CustomButtonClick.emit($event)\"\n (FilterChange)=\"OnFilterChange($event)\"\n (ExpandAllRequested)=\"OnExpandAll()\"\n (CollapseAllRequested)=\"OnCollapseAll()\"\n (ShowEmptyFieldsChange)=\"OnShowEmptyFieldsChange($event)\"\n (WidthModeChange)=\"OnWidthModeChange($event)\"\n (ResetSectionOrderRequested)=\"OnResetSectionOrder()\"\n (ManageSectionsRequested)=\"OnManageSections()\"\n (TagsPanelToggled)=\"OnTagsPanelToggled()\"\n (VariantPicked)=\"OnVariantPicked($event)\">\n</mj-form-toolbar>\n\n<!-- ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n Variant picker is now embedded in <mj-form-toolbar> as a right-side\n button — see the [Variants]/[CurrentVariantID] inputs + (VariantPicked)\n output on the toolbar above. Inline strip was removed.\n ============================================ -->\n<div class=\"mj-forms-scroll-area\">\n <div class=\"mj-forms-panels-container\"\n [class.mj-forms-panels--full-width]=\"EffectiveWidthMode === 'full-width'\"\n [class.mj-forms-panels--edit-mode]=\"EffectiveEditMode\"\n [class.mj-forms-panels--has-isa-panel]=\"HasIsaRelatedItems\">\n <!-- Flex row: form panels on left, ISA side panel on right -->\n <div class=\"mj-forms-layout-row\">\n <!-- All panels in a single flex container — CSS order drives sequencing -->\n <div class=\"mj-forms-all-panels\">\n <ng-content></ng-content>\n\n <!--\n Container-provided fallback slot. ALWAYS present — last in document\n order — so any panel whose registered slot isn't found in the current\n form falls through here via FormSlotCoordinator's chain. Downstream\n consumers that haven't rerun CodeGen against the slot-emitting\n template still see every panel; they just render at the bottom\n instead of at their preferred position.\n -->\n @if (Record && FormComponent) {\n <mj-form-panel-slot\n [Entity]=\"Record.EntityInfo.Name\"\n Slot=\"after-everything\"\n [Record]=\"Record\"\n [FormComponent]=\"FormComponent\">\n </mj-form-panel-slot>\n }\n\n <!-- Empty state when no sections match search -->\n @if (EffectiveSearchFilter && VisibleSectionCount === 0) {\n <div class=\"mj-forms-empty-search-state\">\n <div class=\"mj-forms-empty-search-icon\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n </div>\n <h3 class=\"mj-forms-empty-search-title\">No sections found</h3>\n <p class=\"mj-forms-empty-search-message\">\n No sections match \"<strong>{{ EffectiveSearchFilter }}</strong>\".\n <br>Try a different search term or <a href=\"#\" (click)=\"OnFilterChange(''); $event.preventDefault()\" class=\"mj-forms-empty-search-link\">clear the search</a>.\n </p>\n </div>\n }\n </div>\n\n <!-- IS-A Related Records Side Panel -->\n <mj-isa-related-panel\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [Collapsed]=\"EffectiveWidthMode === 'full-width'\"\n (Navigate)=\"OnNavigate($event)\">\n </mj-isa-related-panel>\n </div>\n </div>\n</div>\n\n<!-- ============================================\n RECORD CHANGES DRAWER (shown when history button clicked)\n ============================================ -->\n@if (ShowRecordChanges && EffectiveRecord) {\n <mj-record-changes\n [record]=\"EffectiveRecord\"\n [AllowRestore]=\"EffectiveUserCanEdit\"\n (RestoreRequested)=\"OnRestoreRequested($event)\"\n (dialogClosed)=\"OnRecordChangesClosed()\">\n </mj-record-changes>\n}\n\n<!-- ============================================\n TAGS PANEL (shown when tags button clicked)\n ============================================ -->\n@if (ShowTagsPanel && EffectiveRecord) {\n <mj-record-tags\n [Record]=\"EffectiveRecord\"\n [WidthPx]=\"TagsPanelWidth\"\n (PanelClosed)=\"OnTagsPanelClosed()\"\n (TagCountChanged)=\"OnTagCountChanged($event)\"\n (RecordNavigate)=\"OnTagsRecordNavigate($event)\"\n (WidthChanged)=\"OnTagsPanelWidthChanged($event)\">\n </mj-record-tags>\n}\n\n<!-- ============================================\n LIST MANAGEMENT DIALOG (shown when lists button clicked)\n ============================================ -->\n@if (ShowListManagement && EffectiveRecord) {\n <mj-list-management-dialog\n [visible]=\"ShowListManagement\"\n [config]=\"{\n mode: 'manage',\n entityId: EffectiveRecord.EntityInfo.ID,\n entityName: EffectiveRecord.EntityInfo.Name,\n recordIds: [EffectiveRecord.PrimaryKey.Values()[0]],\n allowCreate: true\n }\"\n (complete)=\"OnListManagementClosed()\"\n (cancel)=\"OnListManagementClosed()\">\n </mj-list-management-dialog>\n}\n\n<!-- ============================================\n SECTION MANAGER DRAWER (shown when manage-sections button clicked)\n ============================================ -->\n<mj-section-manager\n [Sections]=\"SectionManagerItems\"\n [SectionOrder]=\"SectionManagerOrder\"\n [Visible]=\"ShowSectionManager\"\n (SectionOrderChange)=\"OnSectionOrderChange($event)\"\n (ResetRequested)=\"OnSectionManagerReset()\"\n (Closed)=\"OnSectionManagerClosed()\">\n</mj-section-manager>\n"]}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
|
|
2
|
+
import { BaseEntity } from '@memberjunction/core';
|
|
3
|
+
import { ComponentSpec } from '@memberjunction/interactive-component-types';
|
|
4
|
+
import { FormHostProps } from '@memberjunction/interactive-component-types/forms';
|
|
5
|
+
import { MJReactComponent, ReactComponentEvent } from '@memberjunction/ng-react';
|
|
6
|
+
import { BaseFormComponent } from '../base-form-component';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
/**
|
|
9
|
+
* Wraps a Component (the IC kind — declared `componentRole: 'form'`) so it can
|
|
10
|
+
* stand in for an Angular form on any entity.
|
|
11
|
+
*
|
|
12
|
+
* **Layering invariant:** the React component never touches BaseEntity. This
|
|
13
|
+
* wrapper owns the entity lifecycle (`record.Save`, `record.Delete`, mode
|
|
14
|
+
* transitions). The React component sees only the snapshot in
|
|
15
|
+
* {@link FormHostProps} and communicates back via `BeforeSave` /
|
|
16
|
+
* `BeforeDelete` / `EditModeChangeRequested` events plus its dirty-field diff.
|
|
17
|
+
*
|
|
18
|
+
* Instantiated by `SingleRecordComponent.LoadForm` when the resolver finds an
|
|
19
|
+
* `EntityFormOverride` matching the user's scope. Behaves exactly like the
|
|
20
|
+
* generated Angular form from the host's perspective: same `record` setter,
|
|
21
|
+
* same `EditMode` toggle, same outputs.
|
|
22
|
+
*/
|
|
23
|
+
export declare class InteractiveFormComponent extends BaseFormComponent implements OnInit, OnDestroy {
|
|
24
|
+
/**
|
|
25
|
+
* The bound record. Backed by a setter so swapping records *after*
|
|
26
|
+
* the component has mounted (e.g. Form Builder cockpit preview record
|
|
27
|
+
* picker) triggers a fresh `originalSnapshot` capture + a
|
|
28
|
+
* `formHostProps` rebuild — without this, the React form keeps
|
|
29
|
+
* rendering the original record's values even after the input
|
|
30
|
+
* changes. Guarded on `_recordInitialized` so the post-mount path
|
|
31
|
+
* doesn't fire during the first input assignment (handled by
|
|
32
|
+
* `ngOnInit`, which sets both `originalSnapshot` and `formHostProps`).
|
|
33
|
+
*/
|
|
34
|
+
private _record;
|
|
35
|
+
private _recordInitialized;
|
|
36
|
+
set record(value: BaseEntity);
|
|
37
|
+
get record(): BaseEntity;
|
|
38
|
+
/**
|
|
39
|
+
* The Component row ID resolved for this (entity, user, roles) tuple. Set
|
|
40
|
+
* by `SingleRecordComponent.LoadForm` after the resolver returns an
|
|
41
|
+
* override.
|
|
42
|
+
*/
|
|
43
|
+
ComponentID: string | null;
|
|
44
|
+
/**
|
|
45
|
+
* Loaded ComponentSpec, parsed from the Component row's `Specification` JSON.
|
|
46
|
+
*
|
|
47
|
+
* Two ways to populate this:
|
|
48
|
+
* 1. **Via `ComponentID`** (the standard path): set the input, ngOnInit
|
|
49
|
+
* fetches the row from `MJ: Components` and assigns the parsed spec.
|
|
50
|
+
* 2. **Direct assignment** (the artifact-viewer path): the caller already
|
|
51
|
+
* has the spec in hand (parsed from an artifact JSON blob) and sets
|
|
52
|
+
* `componentSpec` directly. In that case `ComponentID` should be left
|
|
53
|
+
* null and the DB fetch is skipped.
|
|
54
|
+
*/
|
|
55
|
+
componentSpec: ComponentSpec | null;
|
|
56
|
+
/**
|
|
57
|
+
* When true, render the React component **without** the
|
|
58
|
+
* `<mj-record-form-container>` wrapper — i.e. no toolbar (no Save /
|
|
59
|
+
* Cancel / Edit / Delete / History / Tags / Lists).
|
|
60
|
+
*
|
|
61
|
+
* Used by the Form Builder cockpit's Preview tab where the toolbar's
|
|
62
|
+
* actions don't apply (Save would save the *record*, but the cockpit's
|
|
63
|
+
* own Save button saves the *spec*; History/Tags assume a real
|
|
64
|
+
* persistent record, but the preview record can be a synthetic
|
|
65
|
+
* NewRecord). Keeping just the form body produces a clean "this is
|
|
66
|
+
* what the form looks like" view.
|
|
67
|
+
*/
|
|
68
|
+
previewMode: boolean;
|
|
69
|
+
/** FormHostProps passed to the React component. Recomputed when record or mode changes. */
|
|
70
|
+
formHostProps: FormHostProps | null;
|
|
71
|
+
/** Loaded-spec error (component row missing, JSON parse failure, etc.). */
|
|
72
|
+
private _loadError;
|
|
73
|
+
/**
|
|
74
|
+
* Loaded-spec error (component row missing, JSON parse failure,
|
|
75
|
+
* React-runtime bootstrap failure, etc.). Setter auto-emits
|
|
76
|
+
* `LoadErrorChanged` so host surfaces (e.g. Form Builder cockpit
|
|
77
|
+
* Preview tab) can show their own error state — retrospective fix #10.
|
|
78
|
+
*/
|
|
79
|
+
get loadError(): string | null;
|
|
80
|
+
set loadError(v: string | null);
|
|
81
|
+
LoadErrorChanged: EventEmitter<string | null>;
|
|
82
|
+
/** Tracks last-known field snapshot for computing the dirty-field diff on save. */
|
|
83
|
+
private originalSnapshot;
|
|
84
|
+
/**
|
|
85
|
+
* Reference to the mounted React component. Used by the SaveRecord /
|
|
86
|
+
* CancelEdit overrides below to invoke the component's registered
|
|
87
|
+
* `RequestSave` / `RequestCancel` methods when the host toolbar fires
|
|
88
|
+
* Save/Cancel — so the single user-visible Save lives on the toolbar
|
|
89
|
+
* (consistent with every other entity form in MJ) and not duplicated
|
|
90
|
+
* inside the form body.
|
|
91
|
+
*/
|
|
92
|
+
reactComponent?: MJReactComponent;
|
|
93
|
+
/**
|
|
94
|
+
* Promise resolver populated when `SaveRecord` invokes `RequestSave`
|
|
95
|
+
* on the React component. `handleBeforeSave` resolves it after the
|
|
96
|
+
* BeforeSave-driven entity save completes, so SaveRecord can return
|
|
97
|
+
* a meaningful success boolean and honor `StopEditModeAfterSave`.
|
|
98
|
+
*/
|
|
99
|
+
private pendingSaveResolver;
|
|
100
|
+
private readonly changeDetector;
|
|
101
|
+
private readonly reactBridge;
|
|
102
|
+
ngOnInit(): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Called by the React component via `mj-react-component`'s `componentEvent`
|
|
105
|
+
* @Output. Maps the form-role event names to BaseEntity operations.
|
|
106
|
+
*/
|
|
107
|
+
OnReactComponentEvent(event: ReactComponentEvent): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Apply the React component's dirty-field diff to the BaseEntity, save,
|
|
110
|
+
* and refresh the snapshot. Errors surface via `LatestResult.CompleteMessage`
|
|
111
|
+
* per the BaseEntity Save contract.
|
|
112
|
+
*
|
|
113
|
+
* Resolves `pendingSaveResolver` if {@link SaveRecord} initiated this
|
|
114
|
+
* flow via the toolbar — so the toolbar can return a meaningful boolean
|
|
115
|
+
* and honor `StopEditModeAfterSave`.
|
|
116
|
+
*/
|
|
117
|
+
private handleBeforeSave;
|
|
118
|
+
private resolvePendingSave;
|
|
119
|
+
private handleBeforeDelete;
|
|
120
|
+
private handleEditModeChangeRequested;
|
|
121
|
+
/**
|
|
122
|
+
* Propagate Angular-toolbar-driven mode changes into the React component's
|
|
123
|
+
* `FormHostProps.mode`. Without these overrides, clicking Edit on the
|
|
124
|
+
* `<mj-record-form-container>` toolbar flips `this.EditMode` but the React
|
|
125
|
+
* side still sees `mode: 'view'`.
|
|
126
|
+
*/
|
|
127
|
+
StartEditMode(): void;
|
|
128
|
+
EndEditMode(): void;
|
|
129
|
+
/**
|
|
130
|
+
* Toolbar **Save** override. Routes the click through the React
|
|
131
|
+
* component's registered `RequestSave` method so the React layer can
|
|
132
|
+
* (a) run its own validation, (b) flush its draft state, (c) emit
|
|
133
|
+
* `BeforeSave` with the dirty-field diff — exactly the flow the
|
|
134
|
+
* in-form Save button would trigger. The wrapper then awaits the
|
|
135
|
+
* BeforeSave handler via `pendingSaveResolver`, gets a real
|
|
136
|
+
* success/failure boolean, and honors `StopEditModeAfterSave`.
|
|
137
|
+
*
|
|
138
|
+
* Falls back to the base implementation for components that haven't
|
|
139
|
+
* registered `RequestSave` — preserves correctness for forms that
|
|
140
|
+
* keep their own in-form Save button (older sample, hand-authored
|
|
141
|
+
* forms that pre-date this contract).
|
|
142
|
+
*/
|
|
143
|
+
SaveRecord(StopEditModeAfterSave: boolean): Promise<boolean>;
|
|
144
|
+
/**
|
|
145
|
+
* Toolbar **Cancel** override. Asks the React component to discard
|
|
146
|
+
* its draft via `RequestCancel`, then flips out of edit mode the
|
|
147
|
+
* same way the base implementation would. The React component is
|
|
148
|
+
* expected to (a) clear its local draft state and (b) emit
|
|
149
|
+
* `EditModeChangeRequested({ requestedMode: 'view' })` — though we
|
|
150
|
+
* call `EndEditMode` here directly anyway, so even a no-op handler
|
|
151
|
+
* leaves the form in a coherent state.
|
|
152
|
+
*/
|
|
153
|
+
CancelEdit(): void;
|
|
154
|
+
/**
|
|
155
|
+
* Resolve the Component row, parse its `Specification`, and surface either
|
|
156
|
+
* the spec or an error. Backed by `InteractiveFormsEngine` (in-memory
|
|
157
|
+
* cache, BaseEntity event-driven invalidation) so this is a sub-ms JS
|
|
158
|
+
* lookup once the engine has loaded — the engine handles freshness
|
|
159
|
+
* via remote-invalidate events, replacing the prior RunView's
|
|
160
|
+
* `BypassCache: true` escape hatch. Falls through to a one-shot
|
|
161
|
+
* RunView only on engine-cache miss (defensive — the engine should
|
|
162
|
+
* always have a Type='Form' Component, but if a brand-new Component
|
|
163
|
+
* was just created on the server and the invalidation event hasn't
|
|
164
|
+
* propagated yet, we still want to render rather than blank-screen).
|
|
165
|
+
*/
|
|
166
|
+
private loadComponentSpec;
|
|
167
|
+
/**
|
|
168
|
+
* Build `FormHostProps` from the current record + permissions + edit mode.
|
|
169
|
+
* Called whenever the record loads, mode changes, or save completes.
|
|
170
|
+
*/
|
|
171
|
+
private rebuildFormHostProps;
|
|
172
|
+
private primaryKeyToPlain;
|
|
173
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<InteractiveFormComponent, never>;
|
|
174
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<InteractiveFormComponent, "mj-interactive-form", never, { "record": { "alias": "record"; "required": false; }; "ComponentID": { "alias": "ComponentID"; "required": false; }; "componentSpec": { "alias": "componentSpec"; "required": false; }; "previewMode": { "alias": "previewMode"; "required": false; }; }, { "LoadErrorChanged": "LoadErrorChanged"; }, never, never, false, never>;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Tree-shaking guard. Imported and called from public-api.ts so bundlers don't
|
|
178
|
+
* drop the component when no consumer references it by name.
|
|
179
|
+
*/
|
|
180
|
+
export declare function LoadInteractiveFormComponent(): void;
|
|
181
|
+
//# sourceMappingURL=interactive-form.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-form.component.d.ts","sourceRoot":"","sources":["../../../src/lib/interactive-form/interactive-form.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,YAAY,EAAS,SAAS,EAAE,MAAM,EAA6B,MAAM,eAAe,CAAC;AAChI,OAAO,EAAE,UAAU,EAAmC,MAAM,sBAAsB,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EACH,aAAa,EAOhB,MAAM,mDAAmD,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAsB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;;AAE3D;;;;;;;;;;;;;;GAcG;AACH,qBAKa,wBAAyB,SAAQ,iBAAkB,YAAW,MAAM,EAAE,SAAS;IAExF;;;;;;;;;OASG;IACH,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,kBAAkB,CAAS;IAEnC,IACoB,MAAM,CAAC,KAAK,EAAE,UAAU,EAQ3C;IACD,IAAoB,MAAM,IAAI,UAAU,CAAyB;IAEjE;;;;OAIG;IACa,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAElD;;;;;;;;;;OAUG;IACa,aAAa,EAAE,aAAa,GAAG,IAAI,CAAQ;IAE3D;;;;;;;;;;;OAWG;IACa,WAAW,UAAS;IAEpC,2FAA2F;IACpF,aAAa,EAAE,aAAa,GAAG,IAAI,CAAQ;IAElD,2EAA2E;IAC3E,OAAO,CAAC,UAAU,CAAuB;IAEzC;;;;;OAKG;IACH,IAAW,SAAS,IAAI,MAAM,GAAG,IAAI,CAA4B;IACjE,IAAW,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,EAIpC;IAEgB,gBAAgB,8BAAqC;IAEtE,mFAAmF;IACnF,OAAO,CAAC,gBAAgB,CAA+B;IAEvD;;;;;;;OAOG;IACiC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAEtE;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB,CAA6C;IAExE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAEpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B/C;;;OAGG;IACU,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7E;;;;;;;;OAQG;YACW,gBAAgB;IAgD9B,OAAO,CAAC,kBAAkB;YAOZ,kBAAkB;IAahC,OAAO,CAAC,6BAA6B;IAWrC;;;;;OAKG;IACa,aAAa,IAAI,IAAI;IAKrB,WAAW,IAAI,IAAI;IAKnC;;;;;;;;;;;;;OAaG;IACmB,UAAU,CAAC,qBAAqB,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBlF;;;;;;;;OAQG;IACa,UAAU,IAAI,IAAI;IAiBlC;;;;;;;;;;;OAWG;YACW,iBAAiB;IAoE/B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA6B5B,OAAO,CAAC,iBAAiB;yCAnbhB,wBAAwB;2CAAxB,wBAAwB;CA0bpC;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAMnD"}
|