@memberjunction/ng-base-forms 5.27.1 → 5.28.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.
@@ -209,7 +209,13 @@ export declare class MjRecordFormContainerComponent implements AfterContentInit,
209
209
  OnRecordChangesClosed(): void;
210
210
  /**
211
211
  * Handles a restore request from the record-changes panel.
212
- * Applies the old field values to the current record, saves, then refreshes version count.
212
+ *
213
+ * The event payload now carries the FULL snapshot the user opted to apply
214
+ * (the panel computes current-vs-snapshot diffs using the source change's
215
+ * FullRecordJSON, and the user can deselect individual fields). Setting
216
+ * the restore context before Save() causes the data provider to write the
217
+ * resulting RecordChange row with `Source='Restore'`, `RestoredFromID`,
218
+ * and `RestoreReason` populated — building the auditable lineage chain.
213
219
  */
214
220
  OnRestoreRequested(event: RestoreVersionEvent): Promise<void>;
215
221
  OnListManagementClosed(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"record-form-container.component.d.ts","sourceRoot":"","sources":["../../../src/lib/container/record-form-container.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"record-form-container.component.d.ts","sourceRoot":"","sources":["../../../src/lib/container/record-form-container.component.ts"],"names":[],"mappings":"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"}
@@ -583,27 +583,44 @@ export class MjRecordFormContainerComponent {
583
583
  }
584
584
  /**
585
585
  * Handles a restore request from the record-changes panel.
586
- * Applies the old field values to the current record, saves, then refreshes version count.
586
+ *
587
+ * The event payload now carries the FULL snapshot the user opted to apply
588
+ * (the panel computes current-vs-snapshot diffs using the source change's
589
+ * FullRecordJSON, and the user can deselect individual fields). Setting
590
+ * the restore context before Save() causes the data provider to write the
591
+ * resulting RecordChange row with `Source='Restore'`, `RestoredFromID`,
592
+ * and `RestoreReason` populated — building the auditable lineage chain.
587
593
  */
588
594
  async OnRestoreRequested(event) {
589
595
  const record = this.EffectiveRecord;
590
596
  if (!record)
591
597
  return;
592
598
  try {
593
- // Apply old values from the version to the current record
594
- for (const [fieldName, values] of Object.entries(event.FieldChanges)) {
595
- record.Set(fieldName, values.OldValue);
599
+ // Apply each selected snapshot field
600
+ for (const fv of event.FieldValues) {
601
+ record.Set(fv.FieldName, fv.Value);
596
602
  }
597
- // Save the record — this creates a new Record Change entry automatically
598
- const saved = await record.Save();
599
- if (saved) {
600
- this.notificationService.CreateSimpleNotification(`Restored ${Object.keys(event.FieldChanges).length} field(s) from version dated ${new Date(event.ChangedAt).toLocaleDateString()}`, 'info', 3000);
601
- // Refresh version count since a new change was created by the save
602
- this.LoadVersionCount(record);
603
- this.cdr.markForCheck();
603
+ // Mark the next save as a restore so the provider populates the
604
+ // lineage columns. ClearRestoreContext is called in finally{} below
605
+ // so it doesn't leak into subsequent saves on this entity instance.
606
+ record.SetRestoreContext(event.SourceChangeID, event.Reason);
607
+ try {
608
+ const saved = await record.Save();
609
+ if (saved) {
610
+ const fieldCount = event.FieldValues.length;
611
+ const reasonSuffix = event.Reason ? ` — "${event.Reason}"` : '';
612
+ this.notificationService.CreateSimpleNotification(`Restored ${fieldCount} field${fieldCount === 1 ? '' : 's'} from version dated ${new Date(event.ChangedAt).toLocaleDateString()}${reasonSuffix}`, 'info', 3500);
613
+ // Refresh version count — the save just produced a new restore-tagged change.
614
+ this.LoadVersionCount(record);
615
+ this.cdr.markForCheck();
616
+ }
617
+ else {
618
+ const errMsg = record.LatestResult?.CompleteMessage ?? 'unknown error';
619
+ this.notificationService.CreateSimpleNotification(`Failed to save restored values: ${errMsg}`, 'error', 4500);
620
+ }
604
621
  }
605
- else {
606
- this.notificationService.CreateSimpleNotification('Failed to save restored values. Please try again.', 'error', 4000);
622
+ finally {
623
+ record.ClearRestoreContext();
607
624
  }
608
625
  }
609
626
  catch (err) {
@@ -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 { 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 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 = new RunView();\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 = new RunView();\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 = new Metadata();\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 * Applies the old field values to the current record, saves, then refreshes version count.\n */\n async OnRestoreRequested(event: RestoreVersionEvent): Promise<void> {\n const record = this.EffectiveRecord;\n if (!record) return;\n\n try {\n // Apply old values from the version to the current record\n for (const [fieldName, values] of Object.entries(event.FieldChanges)) {\n record.Set(fieldName, values.OldValue);\n }\n\n // Save the record — this creates a new Record Change entry automatically\n const saved = await record.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n `Restored ${Object.keys(event.FieldChanges).length} field(s) from version dated ${new Date(event.ChangedAt).toLocaleDateString()}`,\n 'info', 3000\n );\n\n // Refresh version count since a new change was created by the save\n this.LoadVersionCount(record);\n this.cdr.markForCheck();\n } else {\n this.notificationService.CreateSimpleNotification(\n 'Failed to save restored values. Please try again.',\n 'error', 4000\n );\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 { 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 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 = new RunView();\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 = new RunView();\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 = new Metadata();\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-base-forms",
3
- "version": "5.27.1",
3
+ "version": "5.28.0",
4
4
  "description": "MemberJunction: Generic Angular form components for rendering and editing entity records. Provides configurable toolbar, modern form fields (PrimeNG unstyled), collapsible panels with IS-A inheritance support, and event-driven navigation. Zero Explorer dependencies - usable in any Angular application.",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -36,15 +36,15 @@
36
36
  "primeng": "21.1.1"
37
37
  },
38
38
  "dependencies": {
39
- "@memberjunction/core": "5.27.1",
40
- "@memberjunction/core-entities": "5.27.1",
41
- "@memberjunction/global": "5.27.1",
42
- "@memberjunction/ng-base-types": "5.27.1",
43
- "@memberjunction/ng-list-management": "5.27.1",
44
- "@memberjunction/ng-notifications": "5.27.1",
45
- "@memberjunction/ng-record-changes": "5.27.1",
46
- "@memberjunction/ng-record-tags": "5.27.1",
47
- "@memberjunction/ng-entity-viewer": "5.27.1",
39
+ "@memberjunction/core": "5.28.0",
40
+ "@memberjunction/core-entities": "5.28.0",
41
+ "@memberjunction/global": "5.28.0",
42
+ "@memberjunction/ng-base-types": "5.28.0",
43
+ "@memberjunction/ng-list-management": "5.28.0",
44
+ "@memberjunction/ng-notifications": "5.28.0",
45
+ "@memberjunction/ng-record-changes": "5.28.0",
46
+ "@memberjunction/ng-record-tags": "5.28.0",
47
+ "@memberjunction/ng-entity-viewer": "5.28.0",
48
48
  "rxjs": "^7.8.2",
49
49
  "tslib": "^2.8.1"
50
50
  },