@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.
Files changed (56) hide show
  1. package/dist/lib/base-form-component.d.ts +28 -0
  2. package/dist/lib/base-form-component.d.ts.map +1 -1
  3. package/dist/lib/base-form-component.js +45 -1
  4. package/dist/lib/base-form-component.js.map +1 -1
  5. package/dist/lib/container/record-form-container.component.d.ts +63 -1
  6. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  7. package/dist/lib/container/record-form-container.component.js +134 -42
  8. package/dist/lib/container/record-form-container.component.js.map +1 -1
  9. package/dist/lib/interactive-form/interactive-form.component.d.ts +181 -0
  10. package/dist/lib/interactive-form/interactive-form.component.d.ts.map +1 -0
  11. package/dist/lib/interactive-form/interactive-form.component.js +560 -0
  12. package/dist/lib/interactive-form/interactive-form.component.js.map +1 -0
  13. package/dist/lib/panel-slot/base-form-panel.d.ts +97 -0
  14. package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -0
  15. package/dist/lib/panel-slot/base-form-panel.js +64 -0
  16. package/dist/lib/panel-slot/base-form-panel.js.map +1 -0
  17. package/dist/lib/panel-slot/form-panel-slot.component.d.ts +78 -0
  18. package/dist/lib/panel-slot/form-panel-slot.component.d.ts.map +1 -0
  19. package/dist/lib/panel-slot/form-panel-slot.component.js +227 -0
  20. package/dist/lib/panel-slot/form-panel-slot.component.js.map +1 -0
  21. package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts +57 -0
  22. package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts.map +1 -0
  23. package/dist/lib/panel-slot/form-slot-coordinator.service.js +104 -0
  24. package/dist/lib/panel-slot/form-slot-coordinator.service.js.map +1 -0
  25. package/dist/lib/toolbar/form-toolbar.component.d.ts +56 -1
  26. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
  27. package/dist/lib/toolbar/form-toolbar.component.js +294 -136
  28. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
  29. package/dist/lib/types/navigation-events.d.ts +19 -1
  30. package/dist/lib/types/navigation-events.d.ts.map +1 -1
  31. package/dist/lib/types/navigation-events.js.map +1 -1
  32. package/dist/lib/types/toolbar-config.d.ts +11 -0
  33. package/dist/lib/types/toolbar-config.d.ts.map +1 -1
  34. package/dist/lib/types/toolbar-config.js +3 -0
  35. package/dist/lib/types/toolbar-config.js.map +1 -1
  36. package/dist/module.d.ts +10 -7
  37. package/dist/module.d.ts.map +1 -1
  38. package/dist/module.js +21 -7
  39. package/dist/module.js.map +1 -1
  40. package/dist/public-api.d.ts +4 -0
  41. package/dist/public-api.d.ts.map +1 -1
  42. package/dist/public-api.js +7 -0
  43. package/dist/public-api.js.map +1 -1
  44. package/package.json +12 -10
  45. package/dist/__tests__/sanity.test.d.ts +0 -2
  46. package/dist/__tests__/sanity.test.d.ts.map +0 -1
  47. package/dist/__tests__/sanity.test.js +0 -12
  48. package/dist/__tests__/sanity.test.js.map +0 -1
  49. package/dist/__tests__/tag-count-badge.test.d.ts +0 -2
  50. package/dist/__tests__/tag-count-badge.test.d.ts.map +0 -1
  51. package/dist/__tests__/tag-count-badge.test.js +0 -70
  52. package/dist/__tests__/tag-count-badge.test.js.map +0 -1
  53. package/dist/lib/__tests__/base-forms.test.d.ts +0 -2
  54. package/dist/lib/__tests__/base-forms.test.d.ts.map +0 -1
  55. package/dist/lib/__tests__/base-forms.test.js +0 -256
  56. 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":"AAAA,OAAO,EACL,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EACtC,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAC1D,eAAe,EACf,SAAS,EAAE,iBAAiB,EAC7B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAc,YAAY,EAAwB,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAqB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAEnF,OAAO,EAIL,0BAA0B,EAC1B,6BAA6B,EAE9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAuB,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;;;;;;;;;;;;;;ICwDxE,wCAKqB;;;IADnB,AADA,AAFA,sDAAiC,yBAEhB,uCACc;;;;IAO/B,AADF,8BAAyC,cACC;IACtC,wBAA4C;IAC9C,iBAAM;IACN,8BAAwC;IAAA,iCAAiB;IAAA,iBAAK;IAC9D,6BAAyC;IACvC,qCAAmB;IAAA,8BAAQ;IAAA,YAA2B;IAAA,iBAAS;IAAA,oBAC/D;IAAA,sBAAI;IAAA,gDAA+B;IAAA,8BAAqG;IAAzF,8KAAS,sBAAe,EAAE,CAAC,wBAAE,uBAAuB,KAAC;IAAoC,iCAAgB;IAAA,iBAAI;IAAA,mBAC9J;IACF,AADE,iBAAI,EACA;;;IAHyB,eAA2B;IAA3B,kDAA2B;;;;IAsBlE,6CAI2C;IAAzC,AADA,0OAAoB,iCAA0B,KAAC,+MAC/B,8BAAuB,KAAC;IAC1C,iBAAoB;;;IAHlB,AADA,+CAA0B,6CACW;;;;IAUvC,0CAMmD;IAAjD,AADA,AADA,AADA,uNAAe,0BAAmB,KAAC,wNAChB,gCAAyB,KAAC,sNAC3B,mCAA4B,KAAC,kNAC/B,sCAA+B,KAAC;IAClD,iBAAiB;;;IALf,AADA,+CAA0B,kCACA;;;;IAY5B,qDAUsC;IAApC,AADA,4NAAY,+BAAwB,KAAC,2MAC3B,+BAAwB,KAAC;IACrC,iBAA4B;;;IAT1B,AADA,mDAA8B,+LAO5B;;ADlHN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAYH,MAAM,OAAO,8BAA+B,SAAQ,oBAAoB;IAC9D,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACpD,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAC/B,cAAc,GAAG,IAAI,OAAO,EAAQ,CAAC;IAE7C,2BAA2B;IAE3B,8FAA8F;IACnD,mBAAmB,CAA0B;IAExF,mDAAmD;IACnD,iBAAiB,GAAG,KAAK,CAAC;IAE1B,wCAAwC;IACxC,aAAa,GAAG,KAAK,CAAC;IAEtB,iCAAiC;IACjC,cAAc,GAAG,CAAC,CAAC;IACX,MAAM,CAAU,cAAc,GAAG,oBAAoB,CAAC;IAE9D,oCAAoC;IACpC,QAAQ,GAAG,CAAC,CAAC;IAEb,+DAA+D;IAC/D,YAAY,GAAG,CAAC,CAAC;IAEjB,oDAAoD;IACpD,kBAAkB,GAAG,KAAK,CAAC;IAE3B,oDAAoD;IACpD,kBAAkB,GAAG,KAAK,CAAC;IAE3B,2BAA2B;IAE3B,+CAA+C;IACtC,MAAM,CAAc;IAE7B;;;;OAIG;IACM,aAAa,GAA6B,IAAI,CAAC;IAExD,sEAAsE;IAE7D,UAAU,GAAsB,IAAI,CAAC;IACrC,QAAQ,GAAG,KAAK,CAAC;IACjB,WAAW,GAAG,KAAK,CAAC;IACpB,aAAa,GAAG,KAAK,CAAC;IACtB,UAAU,GAAG,KAAK,CAAC;IACnB,gBAAgB,GAAG,KAAK,CAAC;IACzB,OAAO,GAAG,KAAK,CAAC;IAChB,eAAe,GAAa,EAAE,CAAC;IAC/B,SAAS,GAAG,CAAC,CAAC;IACd,QAAQ,GAAG,KAAK,CAAC;IACjB,aAAa,GAAsB,sBAAsB,CAAC;IAC1D,SAAS,GAAkB,UAAU,CAAC;IAE/C;;;;;;;;;OASG;IACM,QAAQ,GAAwB,EAAE,CAAC;IAE5C;;;;;OAKG;IACM,gBAAgB,GAAkB,IAAI,CAAC;IAEhD,oBAAoB;IAEpB,kFAAkF;IACxE,QAAQ,GAAG,IAAI,YAAY,EAAuB,CAAC;IAE7D,sGAAsG;IAC5F,cAAc,GAAG,IAAI,YAAY,EAAW,CAAC;IAEvD,4EAA4E;IAClE,UAAU,GAAG,IAAI,YAAY,EAAuB,CAAC;IAE/D,+DAA+D;IACrD,aAAa,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEnD,8EAA8E;IACpE,YAAY,GAAG,IAAI,YAAY,EAAyB,CAAC;IAEnE,iEAAiE;IACvD,eAAe,GAAG,IAAI,YAAY,EAAQ,CAAC;IAErD,8EAA8E;IACpE,YAAY,GAAG,IAAI,YAAY,EAAyB,CAAC;IAEnE,0EAA0E;IAChE,eAAe,GAAG,IAAI,YAAY,EAAQ,CAAC;IAErD,gDAAgD;IACtC,eAAe,GAAG,IAAI,YAAY,EAAQ,CAAC;IAErD,oFAAoF;IAC1E,iBAAiB,GAAG,IAAI,YAAY,EAA8B,CAAC;IAE7E,6CAA6C;IACnC,gBAAgB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEtD,uFAAuF;IAC7E,oBAAoB,GAAG,IAAI,YAAY,EAAiC,CAAC;IAEnF,gDAAgD;IACtC,uBAAuB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE7D,6CAA6C;IACnC,oBAAoB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE1D,sDAAsD;IAC5C,iBAAiB,GAAG,IAAI,YAAY,EAAqC,CAAC;IAEpF;;;;;;OAMG;IACO,aAAa,GAAG,IAAI,YAAY,EAAiB,CAAC;IAE5D,6BAA6B;IAG7B,MAAM,CAA0C;IAEhD,mCAAmC;IAEnC,sDAAsD;IACtD,IAAY,EAAE;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,qEAAqE;IAErE,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;IAC5C,CAAC;IAED,IAAI,oBAAoB;QACtB,OAAO,IAAI,CAAC,EAAE,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;IAClD,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,EAAE,EAAE,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC;IACtD,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,EAAE,EAAE,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;IAChD,CAAC;IAED,IAAI,yBAAyB;QAC3B,OAAO,IAAI,CAAC,EAAE,EAAE,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC;IAC5D,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAQ,IAAI,CAAC,EAAE,EAAE,UAAyB,IAAI,IAAI,CAAC,UAAU,CAAC;IAChE,CAAC;IAED,IAAI,gBAAgB;QAClB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,wBAAwB;QAC1B,IAAI,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,kBAAkB;QACpB,IAAI,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,IAAI,CAAC,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,wBAAwB;QAC1B,OAAO,IAAI,CAAC,EAAE,EAAE,eAAe,IAAI,KAAK,CAAC;IAC3C,CAAC;IAED,IAAI,8BAA8B;QAChC,IAAI,IAAI,CAAC,EAAE,EAAE,qBAAqB,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2BAA2B;IAE3B,IAAI,iBAAiB;QACnB,IAAI,IAAI,CAAC,EAAE,EAAE,oBAAoB,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,mBAAmB;QACrB,IAAI,IAAI,CAAC,EAAE,EAAE,sBAAsB,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IACrD,CAAC;IAED,IAAI,oBAAoB;QACtB,IAAI,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IACnE,CAAC;IAED,+BAA+B;IAE/B,qFAAqF;IACrF,IAAI,kBAAkB;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE,UAAU;YAAE,OAAO,KAAK,CAAC;QAEtC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAErC,2DAA2D;QAC3D,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,CAAC;YACjF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;YAChC,IAAI,MAAM,EAAE,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACxE,CAAC;QAED,8BAA8B;QAC9B,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YAC5B,IAAI,UAAU,CAAC,qBAAqB,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YACzG,IAAI,CAAC,UAAU,CAAC,qBAAqB,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;QACxE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4BAA4B;IAE5B,qFAAqF;IACrF,IAAI,mBAAmB;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC,CAAC;IACN,CAAC;IAED,oDAAoD;IACpD,IAAI,mBAAmB;QACrB,IAAI,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,sBAAsB;IAEtB,kBAAkB;QAChB,8BAA8B;QAC9B,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,8BAA8B,CAAC,cAAc,CAAC,CAAC;QACrG,IAAI,UAAU;YAAE,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAEpE,oDAAoD;QACpD,IAAI,CAAC,8BAA8B,EAAE,CAAC;QAEtC,4DAA4D;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;YAChE,IAAI,CAAC,8BAA8B,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,0CAA0C;QAC1C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,+FAA+F;IACjG,CAAC;IAED,WAAW;QACT,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACK,8BAA8B;QACpC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,mCAAmC;QAC/D,gGAAgG;QAChG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;gBACtE,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC1B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAA0B,EAAE,EAAE;gBAC3F,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,kBAAkB;QACxB,uEAAuE;QACvE,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9C,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,qBAAqB;QACrB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,gCAAgC;IAEhC;;;OAGG;IACK,iBAAiB,GAAG,KAAK,CAAC;IAE1B,eAAe;QACrB,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE,UAAU;YAAE,OAAO;QAEhC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAE9B,2EAA2E;QAC3E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,YAAY,CAAC,MAAkB;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,8FAA8F;YAC9F,sGAAsG;YACtG,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;gBAC9B,UAAU,EAAE,kBAAkB;gBAC9B,WAAW,EAAE,aAAa,MAAM,CAAC,UAAU,CAAC,EAAE,mBAAmB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG;gBAC9F,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBACtC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,gBAAgB,CAAC,MAAkB;QAC/C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB;YAAE,OAAO;QAClD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAiB;gBAC9C,UAAU,EAAE,oBAAoB;gBAChC,MAAM,EAAE,CAAC,IAAI,CAAC;gBACd,WAAW,EAAE,aAAa,MAAM,CAAC,UAAU,CAAC,EAAE,mBAAmB,MAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE,GAAG;gBAC5G,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC1C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAED,mCAAmC;IAEnC;;OAEG;IACH,UAAU,CAAC,KAA0B;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAiB;QAChC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC;YACxB,yCAAyC;YACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAExB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAE/B,+EAA+E;gBAC/E,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,CAAC;oBAAS,CAAC;gBACT,4EAA4E;gBAC5E,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;oBACnB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;oBACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC1B,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,gBAAgB;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,kBAAkB;YAAE,OAAO;QAEpD,8BAA8B;QAC9B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE9B,uDAAuD;QACvD,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACvD,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC;YACxB,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,kBAAkB;QAChB,qCAAqC;QACrC,MAAM,WAAW,GAAG,IAAI,0BAA0B,EAAE,CAAC;QACrD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,WAAW,CAAC,MAAM;YAAE,OAAO;QAE/B,wDAAwD;QACxD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,uCAAuC;QACvC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,yBAAyB;QACvB,qCAAqC;QACrC,MAAM,WAAW,GAAG,IAAI,6BAA6B,EAAE,CAAC;QACxD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,WAAW,CAAC,MAAM;YAAE,OAAO;QAE/B,yDAAyD;QACzD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,uCAAuC;QACvC,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,4EAA4E;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,KAAa;QAC7B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,uBAAuB,CAAC,KAAa;QACnC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC,8BAA8B,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5G,CAAC;IAED,oBAAoB,CAAC,KAA+C;QAClE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAC9B,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,wDAAwD;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,kBAAkB,CAAC,KAA0B;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,CAAC;YACH,qCAAqC;YACrC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YAED,gEAAgE;YAChE,oEAAoE;YACpE,oEAAoE;YACpE,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAE7D,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClC,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;oBAC5C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChE,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,YAAY,UAAU,SAAS,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,uBAAuB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,GAAG,YAAY,EAAE,EAChJ,MAAM,EAAE,IAAI,CACb,CAAC;oBAEF,8EAA8E;oBAC9E,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;oBAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,CAAC;oBACvE,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,mCAAmC,MAAM,EAAE,EAC3C,OAAO,EAAE,IAAI,CACd,CAAC;gBACJ,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,mBAAmB,OAAO,EAAE,EAC5B,OAAO,EAAE,IAAI,CACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,sBAAsB;QACpB,IAAI,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAED,qCAAqC;IAErC,cAAc,CAAC,MAAc;QAC3B,IAAI,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,EAAE,EAAE,iBAAiB,EAAE,CAAC;YAC/B,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,EAAE,EAAE,mBAAmB,EAAE,CAAC;YACjC,IAAI,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,uBAAuB,CAAC,IAAa;QACnC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,eAAe,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,IAAmB;QACnC,IAAI,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,mBAAmB;QACjB,IAAI,IAAI,CAAC,EAAE,EAAE,iBAAiB,EAAE,CAAC;YAC/B,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,2BAA2B;IAE3B;4EACwE;IACxE,gBAAgB,GAAG,KAAK,CAAC;IAEzB;;;;;;OAMG;IACH,IAAI,iBAAiB;QACnB,OAAQ,IAAI,CAAC,EAAE,EAAE,QAA4C;eACtD,IAAI,CAAC,QAAQ;eACb,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,yBAAyB;QAC3B,OAAO,IAAI,CAAC,EAAE,EAAE,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC;IAC5D,CAAC;IAED;8EAC0E;IAC1E,IAAI,iBAAiB;QACnB,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,4EAA4E;IAC5E,IAAI,mBAAmB;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,EAAE,KAAK,IAAI,cAAc,CAAC;IACpC,CAAC;IAED,8DAA8D;IAC9D,eAAe,CAAC,CAAoB;QAClC,OAAO,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,SAAwB;QACtC,IAAI,SAAS,KAAK,IAAI,CAAC,yBAAyB;YAAE,OAAO;QACzD,IAAI,IAAI,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;YAC9D,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,qCAAqC;IAErC,gBAAgB;QACd,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,oBAAoB,CAAC,QAAkB;QACrC,IAAI,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC;YAC7B,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;qSAlxBU,8BAA8B,yBAA9B,8BAA8B;6DAA9B,8BAA8B;wCA2IxB,2BAA2B;;;;;2BAjIjC,sBAAsB;;;;klCAZtB,CAAC,mBAAmB,CAAC;;YC9ElC,kBAAmD;YAKnD,0CA+C4C;YAA1C,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,gIAAY,sBAAkB,IAAC,+HACb,4BAAwB,IAAC,uHAC7B,2BAAuB,IAAC,uHACrB,qBAAiB,IAAC,2HACnB,6BAAyB,IAAC,2HACvB,uBAAmB,IAAC,2HACvB,6BAAyB,IAAC,2HACvB,uBAAmB,IAAC,2HACpB,uBAAmB,IAAC,qIAClB,kCAA8B,IAAC,6HAChC,wBAAoB,IAAC,2IACjB,qCAAiC,IAAC,2IAC/B,+BAA2B,IAAC,qIAC/B,4BAAwB,IAAC,qIAC5B,kCAA8B,IAAC,2HACpC,0BAAsB,IAAC,iIACjB,iBAAa,IAAC,qIACZ,mBAAe,IAAC,6IACf,mCAA+B,IAAC,iIACtC,6BAAyB,IAAC,iJACf,yBAAqB,IAAC,2IACzB,sBAAkB,IAAC,6HAC1B,wBAAoB,IAAC,6HACxB,2BAAuB,IAAC;YAC3C,iBAAkB;YAgBZ,AAFF,AALF,AADF,8BAAkC,aAIiC,aAE9B,aAEE;YAC/B,qBAAyB;YAUzB,+GAA+B;YAU/B,iGAA0D;YAY5D,iBAAM;YAGN,+CAIkC;YAAhC,qIAAY,sBAAkB,IAAC;YAIvC,AADE,AADE,AADE,iBAAuB,EACnB,EACF,EACF;YAKN,gHAA4C;YAY5C,6GAAwC;YAcxC,yHAA6C;YAkB7C,+CAMsC;YAApC,AADA,AADA,wJAAsB,gCAA4B,IAAC,6HACjC,2BAAuB,IAAC,6GAChC,4BAAwB,IAAC;YACrC,iBAAqB;;YAnKnB,cAA0B;YAsB1B,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,4CAA0B,mCACI,yCACM,6CACI,uCACN,mDACY,iCAClB,iDACgB,4BACrB,0BACF,kCACQ,uCACK,6BACV,mCACM,gDACa,4CACJ,kDACM,2CACP,iDACM,qCACZ,6DACwB,mCAC1B,mDACgB;YAmCzC,eAAyE;YAEzE,AADA,AADA,sFAAyE,qDACnB,0DACK;YAe1D,eAOC;YAPD,0DAOC;YAGD,cAWC;YAXD,qFAWC;YAKD,cAA0B;YAE1B,AADA,AADA,4CAA0B,mCACI,sDACmB;YAUzD,cAOC;YAPD,wEAOC;YAKD,cASC;YATD,oEASC;YAKD,cAaC;YAbD,yEAaC;YAMC,cAAgC;YAEhC,AADA,AADA,kDAAgC,yCACI,mCACN;;;iFDrFnB,8BAA8B;cAX1C,SAAS;6BACI,KAAK,YACP,0BAA0B,mBACnB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,aAK1B,CAAC,mBAAmB,CAAC;;kBAY/B,SAAS;mBAAC,sBAAsB;;kBA2BhC,KAAK;;kBAOL,KAAK;;kBAIL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAYL,KAAK;;kBAQL,KAAK;;kBAKL,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBASN,MAAM;;kBAIN,eAAe;mBAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;;kFA3IxD,8BAA8B","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"}